The logic is covered by host tests (`pio test -e native`, 20/20) and CI proves the firmware builds for both boards — but on-device behavior has not been verified on physical hardware yet. This issue tracks running the hardware bring-up checklist once per board and reporting results.
Boards
Acceptance criteria (per the checklist)
1. Radio mutual exclusion (WiFi ⊕ BT)
2. Free heap reclaimed across a switch (the heap guarantee)
3. BLE transport (ESP32 only)
4. Optional WireGuard tunnel (WiFi mode)
5. Token-gated TCP (WiFi mode)
Notes
- Flash via the bundled pio (Python ≤ 3.13):
~/.platformio/penv/bin/pio run -e <env> -d app/tailnet-sensor-node --target upload --target monitor
- On the ESP32-PICO-D4 the WiFi→BT teardown is the tightest heap case; the S3 has ample headroom.
The logic is covered by host tests (`pio test -e native`, 20/20) and CI proves the firmware builds for both boards — but on-device behavior has not been verified on physical hardware yet. This issue tracks running the hardware bring-up checklist once per board and reporting results.
Boards
Acceptance criteria (per the checklist)
1. Radio mutual exclusion (WiFi ⊕ BT)
DEFAULT_MODE_WIFI→WiFi OK, no BLE advertisingmode bt→ serial showsWiFi OFFthenBLE advertising…(ordered, never overlapping); BLE scanner sees the device only in BT modemode wifi→BLE OFFthenWiFi OK2. Free heap reclaimed across a switch (the heap guarantee)
setModeswitch3. BLE transport (ESP32 only)
read, get the{"temp_c":..,"uptime_s":..}notification; wrong token → silent drop4. Optional WireGuard tunnel (WiFi mode)
WG_CONFIGdefined → tunnel reaches UP; route approved in Tailscale adminping <device tunnel IP>succeedsnmap -sU -p51820 <gateway>returns no WireGuard reply (scanner-silent)5. Token-gated TCP (WiFi mode)
printf 'TOKEN\nread\n' | nc <device> 4242returns sensor JSON; wrong token closes with no dataNotes
~/.platformio/penv/bin/pio run -e <env> -d app/tailnet-sensor-node --target upload --target monitor