# dungnd989-dev/esp32-wifi-csi-activity-recognition architecture

> Architecture diagram of the GitHub repository dungnd989-dev/esp32-wifi-csi-activity-recognition, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/dungnd989-dev/esp32-wifi-csi-activity-recognition
- Repository: https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition

## Overview

This repository implements a Wi-Fi CSI activity-monitoring workflow: capture or generate CSI measurements, train a classifier, then publish real-time activity predictions and link health over MQTT for a browser dashboard. It also supports offline evaluation and CSI plotting. The README is empty; dashboard implementation and its MQTT wiring are not shown in the sampled source, so that relationship is marked unverified.

Main entry points: [`csi_common.py`](https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/csi_common.py) (CSI Processing), [`config.py`](https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/config.py) (Runtime Settings), [`train.py`](https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/train.py) (Model Training), [`evaluate.py`](https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/evaluate.py) (TX Evaluation)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_capture["CSI Capture"]
  node_serial["Serial Capture<br/>[serial_reader.py]"]
  node_synthetic["Synthetic CSI<br/>[gen_fake_csi.py]"]
  node_data[("CSI Session CSVs")]
end

subgraph group_analysis["Training and Analysis"]
  node_common["CSI Processing<br/>[csi_common.py]"]
  node_training["Model Training<br/>[train.py]"]
  node_evaluation["TX Evaluation<br/>[evaluate.py]"]
  node_plotting["CSI Plotting<br/>[plot_csi.py]"]
  node_results["Evaluation Results<br/>[experiments.csv]"]
end

subgraph group_runtime["Live Inference"]
  node_config["Runtime Settings<br/>[config.py]"]
  node_model["Trained Model<br/>[rf_model.pkl]"]
  node_inference["Live Inference<br/>[realtime.py]"]
  node_fake_mqtt["MQTT Simulator<br/>[mqtt_fake.py]"]
end

subgraph group_presentation["Dashboard"]
  node_web_config["Dashboard Settings<br/>[config.js]"]
  node_dashboard["Browser Dashboard<br/>[index.html]"]
end

node_receiver(("CSI Receiver"))
node_broker(("MQTT Broker"))

node_receiver -->|"streams CSI"| node_serial
node_serial -->|"parses records"| node_common
node_serial -->|"writes sessions"| node_data
node_synthetic -->|"reads classes"| node_config
node_synthetic -->|"generates sessions"| node_data
node_training -->|"reads settings"| node_config
node_training -->|"loads and windows"| node_common
node_training -->|"reads sessions"| node_data
node_training -->|"saves classifier"| node_model
node_evaluation -->|"reads settings"| node_config
node_evaluation -->|"loads and windows"| node_common
node_evaluation -->|"reads sessions"| node_data
node_evaluation -->|"writes metrics"| node_results
node_plotting -->|"converts amplitudes"| node_common
node_plotting -->|"reads session"| node_data
node_inference -->|"reads settings"| node_config
node_inference -->|"parses and windows"| node_common
node_inference -->|"loads classifier"| node_model
node_inference -->|"publishes predictions"| node_broker
node_fake_mqtt -->|"reads topic"| node_config
node_fake_mqtt -->|"publishes samples"| node_broker
node_web_config -.->|"configures connection"| node_broker
node_broker -.->|"delivers activity data"| node_dashboard
node_web_config -.->|"configures display"| node_dashboard

click node_serial "https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/serial_reader.py"
click node_synthetic "https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/gen_fake_csi.py"
click node_common "https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/csi_common.py"
click node_config "https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/config.py"
click node_training "https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/train.py"
click node_evaluation "https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/evaluate.py"
click node_plotting "https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/plot_csi.py"
click node_model "https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/models/rf_model.pkl"
click node_inference "https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/realtime.py"
click node_fake_mqtt "https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/mqtt_fake.py"
click node_web_config "https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/config.js"
click node_dashboard "https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/index.html"
click node_results "https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/results/experiments.csv"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_serial,node_synthetic,node_data toneBlue
class node_common,node_training,node_evaluation,node_plotting,node_results toneAmber
class node_config,node_model,node_inference,node_fake_mqtt toneMint
class node_web_config,node_dashboard toneRose
class node_receiver,node_broker toneIndigo
```

## Components

### CSI Capture

- [Serial Capture](https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/serial_reader.py): `serial_reader.py`
- [Synthetic CSI](https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/gen_fake_csi.py): `gen_fake_csi.py`
- **CSI Session CSVs**

### Training and Analysis

- [CSI Processing](https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/csi_common.py): `csi_common.py`
- [Model Training](https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/train.py): `train.py`
- [TX Evaluation](https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/evaluate.py): `evaluate.py`
- [CSI Plotting](https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/plot_csi.py): `plot_csi.py`
- [Evaluation Results](https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/results/experiments.csv): `results/experiments.csv`

### Live Inference

- [Runtime Settings](https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/config.py): `config.py`
- [Trained Model](https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/models/rf_model.pkl): `models/rf_model.pkl`
- [Live Inference](https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/realtime.py): `realtime.py`
- [MQTT Simulator](https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/mqtt_fake.py): `mqtt_fake.py`

### Dashboard

- [Dashboard Settings](https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/config.js): `config.js`
- [Browser Dashboard](https://github.com/dungnd989-dev/esp32-wifi-csi-activity-recognition/blob/main/index.html): `index.html`

### Other components

- **CSI Receiver**
- **MQTT Broker**

## Connections

- CSI Receiver → Serial Capture: streams CSI (evidence: `serial_reader.py`)
- Serial Capture → CSI Processing: parses records (evidence: `serial_reader.py`)
- Serial Capture → CSI Session CSVs: writes sessions (evidence: `serial_reader.py`)
- Synthetic CSI → Runtime Settings: reads classes (evidence: `gen_fake_csi.py`)
- Synthetic CSI → CSI Session CSVs: generates sessions (evidence: `gen_fake_csi.py`)
- Model Training → Runtime Settings: reads settings (evidence: `train.py`)
- Model Training → CSI Processing: loads and windows (evidence: `train.py`)
- Model Training → CSI Session CSVs: reads sessions (evidence: `train.py`)
- Model Training → Trained Model: saves classifier (evidence: `train.py`)
- TX Evaluation → Runtime Settings: reads settings (evidence: `evaluate.py`)
- TX Evaluation → CSI Processing: loads and windows (evidence: `evaluate.py`)
- TX Evaluation → CSI Session CSVs: reads sessions (evidence: `evaluate.py`)
- TX Evaluation → Evaluation Results: writes metrics (evidence: `evaluate.py`)
- CSI Plotting → CSI Processing: converts amplitudes (evidence: `plot_csi.py`)
- CSI Plotting → CSI Session CSVs: reads session (evidence: `plot_csi.py`)
- Live Inference → Runtime Settings: reads settings (evidence: `realtime.py`)
- Live Inference → CSI Processing: parses and windows (evidence: `realtime.py`)
- Live Inference → Trained Model: loads classifier (evidence: `realtime.py`)
- Live Inference → MQTT Broker: publishes predictions (evidence: `realtime.py`)
- MQTT Simulator → Runtime Settings: reads topic (evidence: `mqtt_fake.py`)
- MQTT Simulator → MQTT Broker: publishes samples (evidence: `mqtt_fake.py`)
- Dashboard Settings → MQTT Broker: configures connection (evidence: `config.js`)
- MQTT Broker → Browser Dashboard: delivers activity data
- Dashboard Settings → Browser Dashboard: configures display
