01

Pi #1 — data hub install

Install sequence
1. OSRaspberry Pi OS Lite 64-bit (bookworm) · headless
2. Mosquittoapt install mosquitto mosquitto-clients · enable + start
3. InfluxDB 2influxdata.com ARM64 repo · systemctl enable influxdb
4. Grafanainfluxdata Grafana OSS repo · connect InfluxDB datasource
5. Reticulumpip3 install rns · rnsd as systemd service
6. rtl_433apt install rtl-433 · configure -F mqtt output
7. Direwolfapt install direwolf · 144.390 MHz decode
8. dump1090apt install dump1090-fa · optional ADS-B
9. Node-REDOfficial install script · npm global
10. Meshtastic GWpip3 install meshtastic · USB bridge to Mosquitto
Validation checks
Test 1Dummy Python MQTT publisher → confirm data lands in InfluxDB panel
Test 2rtl_433 running → publish to radio/433 topic → confirm in MQTT explorer
Test 3Meshtastic gateway node powered → Python bridge running → sensor message appears in nodes/A/env
Test 4InfluxDB query: from(bucket:"mesh") |> range(start:-1h) returns data
Test 5Grafana dashboard renders time-series from InfluxDB — confirm axes, tags, units
Do not proceedDeploy nodes outdoors only after all 5 pass
02

MQTT topic schema

TopicPublisherPayload fields
nodes/A/envMeshtastic GW bridgetemp_c · humidity_pct · pressure_hpa · lux · uv_a · uv_b
nodes/B/envMeshtastic GW bridgetemp_c · humidity_pct · pressure_hpa · lux · uv_a · uv_b · co2_ppm
nodes/A/soilNode A scriptvwc_pct · soil_temp_c
nodes/B/soilNode B scriptvwc_pct · soil_temp_c
nodes/A/wxNode A scriptwind_speed_ms · wind_dir_deg · rain_mm_tip · rain_mm_total
radio/433rtl_433Auto-decoded JSON per protocol (model · id · fields)
radio/aprsDirewolfAPRS packet JSON · call · lat · lon · wx fields
radio/noaartl_fm decoderWX bulletin text
external/openmeteoPython API ingestRegional hourly actuals + 48 hr forecast
external/noaa_nceiPython API ingest30-year climate normals for location
drone/telemDJI GCS → Wi-Fi bridgelat · lon · alt_m · battery_pct · speed_ms · mode
03

InfluxDB 2 measurement schema

MeasurementTagsFields
environmentnode · location · sourcetemp_c · humidity_pct · pressure_hpa · lux · uv_a · uv_b · co2_ppm
soilnode · depth_cmvwc_pct · temp_c
weather_localnode=Awind_speed_ms · wind_dir_deg · rain_mm
regionalsource · station_idtemp_c · humidity_pct · pressure_hpa · precip_mm · wind_ms
droneflight_id · sessionlat · lon · alt_m · battery_pct · speed_ms
radio_decodesource · model · device_idAll auto-decoded rtl_433 fields
04

Pi #2 — spatial processing install

1. DockerOfficial Docker Engine for Raspberry Pi OS
2. WebODMgit clone https://github.com/OpenDroneMap/WebODM && ./webodm.sh start
3. Potree ConverterBuild from source or prebuilt ARM binary — converts LAZ/LAS to Potree format
4. Potree viewerStatic files served via nginx or Node.js
5. QGISapt install qgis
6. Python venvopenmeteo-requests · requests-cache · influxdb-client · shapely
7. ODM note200 photo survey ≈ 4–12 hrs on Pi 4. If an x86 laptop is available, run ODM there and copy outputs to Pi #2 for serving.