doc: add gateway README
This commit is contained in:
98
gateway/README.md
Normal file
98
gateway/README.md
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
# Gateway — BLE to MQTT
|
||||||
|
|
||||||
|
This component runs on a Raspberry Pi 4 and acts as the communication bridge
|
||||||
|
between the Nordic Thingy:52 sensor nodes and the rest of the system.
|
||||||
|
It reads environmental data from the nodes over BLE and publishes it to a
|
||||||
|
local MQTT broker (Mosquitto) in a structured JSON format.
|
||||||
|
|
||||||
|
## Role in the architecture
|
||||||
|
```
|
||||||
|
Thingy:52 nodes --> (BLE) --> Raspberry Pi --> (MQTT) --> Database / ML / Notifications
|
||||||
|
```
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
Install the required Python libraries:
|
||||||
|
```bash
|
||||||
|
pip3 install bleak paho-mqtt --break-system-packages
|
||||||
|
```
|
||||||
|
|
||||||
|
Install and start the Mosquitto MQTT broker:
|
||||||
|
```bash
|
||||||
|
sudo apt install -y mosquitto mosquitto-clients
|
||||||
|
sudo systemctl enable mosquitto
|
||||||
|
sudo systemctl start mosquitto
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
```bash
|
||||||
|
python3 gateway.py
|
||||||
|
```
|
||||||
|
|
||||||
|
At startup, the script asks for the room ID (e.g. C1, A2, B5).
|
||||||
|
It then automatically discovers all Thingy:52 nodes in range by filtering
|
||||||
|
BLE advertising packets on the Nordic Configuration service UUID (ef680100).
|
||||||
|
Each detected node is assigned a name based on the room ID and a counter
|
||||||
|
(e.g. C1_thingy1, C1_thingy2).
|
||||||
|
|
||||||
|
To run the gateway in the background and keep it running after closing SSH:
|
||||||
|
```bash
|
||||||
|
nohup python3 gateway.py > log.txt 2>&1 &
|
||||||
|
```
|
||||||
|
|
||||||
|
## MQTT topic structure
|
||||||
|
```
|
||||||
|
classroom/{room_id}/{node_id}
|
||||||
|
```
|
||||||
|
|
||||||
|
Example: `classroom/C1/C1_thingy1`
|
||||||
|
|
||||||
|
## Message format
|
||||||
|
|
||||||
|
Each message is published as a JSON object with the following structure:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"timestamp": "2026-03-26T13:24:05.176072+00:00",
|
||||||
|
"room_id": "C1",
|
||||||
|
"node_id": "C1_thingy1",
|
||||||
|
"sensors": {
|
||||||
|
"co2_ppm": 400,
|
||||||
|
"temperature_c": 25.37,
|
||||||
|
"humidity_pct": 44
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
| Field | Type | Description |
|
||||||
|
|---|---|---|
|
||||||
|
| timestamp | string (ISO 8601 UTC) | Time of measurement, added by the gateway |
|
||||||
|
| room_id | string | Identifier of the monitored room |
|
||||||
|
| node_id | string | Identifier of the Thingy:52 node |
|
||||||
|
| co2_ppm | integer | eCO2 concentration in parts per million |
|
||||||
|
| temperature_c | float | Indoor air temperature in degrees Celsius |
|
||||||
|
| humidity_pct | integer | Relative humidity in percent |
|
||||||
|
|
||||||
|
## Output files
|
||||||
|
|
||||||
|
For each session, two local files are created in the gateway directory:
|
||||||
|
|
||||||
|
- `data_{room_id}.csv` — comma-separated file for local analysis
|
||||||
|
- `data_{room_id}.json` — JSON file following the database team format
|
||||||
|
|
||||||
|
## Publishing interval
|
||||||
|
|
||||||
|
The default publishing interval is 5 minutes (300 seconds).
|
||||||
|
This can be adjusted by modifying the `INTERVAL` variable in `gateway.py`.
|
||||||
|
|
||||||
|
## Utility scripts
|
||||||
|
|
||||||
|
- `scan.py` — scans for nearby BLE devices and prints their name and MAC address
|
||||||
|
- `check_uuid.py` — connects to Thingy:52 nodes and prints their advertised service UUIDs
|
||||||
|
|
||||||
|
## Notes on the CO2 sensor
|
||||||
|
|
||||||
|
The Thingy:52 uses a CCS811 sensor which measures eCO2 (equivalent CO2),
|
||||||
|
estimated from volatile organic compound (VOC) levels rather than directly
|
||||||
|
measuring CO2 concentration. Values should be interpreted as indicative trends
|
||||||
|
rather than precise measurements, particularly during the first 24 to 48 hours
|
||||||
|
of operation while the sensor calibrates.
|
||||||
Reference in New Issue
Block a user