|
| 1 | +# Two-Node Meshtastic Field Test |
| 2 | + |
| 3 | +Last updated: 2026-05-13 |
| 4 | + |
| 5 | +This plan covers issues #12 and #33 and uses the simulator outputs from `../simulator/` as dry-run packet fixtures before radio transmission. |
| 6 | + |
| 7 | +## Objective |
| 8 | + |
| 9 | +Validate that two FlowRouter-like nodes can exchange compact advisory control packets over Meshtastic while normal FlowMemory data remains on WiFi/Ethernet. |
| 10 | + |
| 11 | +## Hardware |
| 12 | + |
| 13 | +Node A: |
| 14 | + |
| 15 | +- Certified OpenWrt router or lab LAN gateway. |
| 16 | +- Raspberry Pi 5 or mini PC. |
| 17 | +- NVMe/local cache candidate. |
| 18 | +- Meshtastic sidecar in the correct regional variant. |
| 19 | + |
| 20 | +Node B: |
| 21 | + |
| 22 | +- Laptop, Raspberry Pi, or second FlowRouter-like node. |
| 23 | +- Meshtastic sidecar in the same region/channel settings. |
| 24 | + |
| 25 | +## Dry Run |
| 26 | + |
| 27 | +Before using radios: |
| 28 | + |
| 29 | +```powershell |
| 30 | +python hardware/simulator/flowrouter_sim.py --seed 42 --out hardware/fixtures/flowrouter_sample_seed42.json |
| 31 | +python hardware/simulator/flowrouter_sim.py --validate-file hardware/fixtures/flowrouter_sample_seed42.json |
| 32 | +``` |
| 33 | + |
| 34 | +Review the generated heartbeat, gateway discovery, receipt relay, cache status, sidecar status, dashboard feed, and failure/offline packet. |
| 35 | + |
| 36 | +## Radio Setup |
| 37 | + |
| 38 | +- Confirm region and frequency variant. |
| 39 | +- Attach antennas before transmit. |
| 40 | +- Record firmware version, modem preset, hop limit, channel name, and MQTT settings. |
| 41 | +- Prefer private channel settings. |
| 42 | +- Keep public MQTT disabled by default. |
| 43 | +- Keep operator command warning packets non-executing. |
| 44 | + |
| 45 | +## Test Sequence |
| 46 | + |
| 47 | +1. Baseline both nodes on normal LAN/internet. |
| 48 | +2. Send node heartbeat from Node A. |
| 49 | +3. Send gateway discovery from Node A. |
| 50 | +4. Send local cache status digest from Node A. |
| 51 | +5. Send compact receipt relay from Node A. |
| 52 | +6. Disable upstream internet for Node A. |
| 53 | +7. Confirm local dashboard feed still reports LAN-local state. |
| 54 | +8. Send emergency/offline signal from Node A. |
| 55 | +9. Restore upstream internet. |
| 56 | +10. Record reconciliation notes and operator confusion points. |
| 57 | + |
| 58 | +## Success Criteria |
| 59 | + |
| 60 | +- Node B receives heartbeat and gateway discovery packets. |
| 61 | +- Digest and receipt packets fit the compact schema. |
| 62 | +- Offline/failure packet is distinguishable from verified state. |
| 63 | +- No heavy payload or secret crosses LoRa. |
| 64 | +- Operators can explain local, advisory, and verified status. |
| 65 | + |
| 66 | +## Metrics |
| 67 | + |
| 68 | +- Packet count sent/received. |
| 69 | +- RSSI/SNR if available. |
| 70 | +- Hop count. |
| 71 | +- Delay observations. |
| 72 | +- Duplicate/lost packets. |
| 73 | +- Node A upstream outage detection time. |
| 74 | +- Local dashboard availability. |
| 75 | +- Cache status before/during/after outage. |
| 76 | +- Sidecar temperature and power notes if available. |
| 77 | + |
| 78 | +## Stop Conditions |
| 79 | + |
| 80 | +- Wrong region, antenna, or transmit configuration. |
| 81 | +- Suspected harmful interference. |
| 82 | +- Thermal or power instability. |
| 83 | +- Secret, credential, channel key, model data, media, raw memory, or large artifact appears in a payload. |
| 84 | +- Operator command warning starts to execute privileged behavior. |
| 85 | +- Public MQTT exposure is discovered unexpectedly. |
0 commit comments