π‘ Live Data Pipeline
ESP32 Node
AUS001 N1βN5
MQTT pub
8883 TLS
DNS
mqtt.equilibriumfan.com
β 147.182.221.185
Droplet
Mosquitto
+ bridge.py
REST
Supabase
hvac_telemetry
bridge_health
Streamlit
Community Cloud
dashboard
πΊ Fleet Status
live Β· Supabase
| Node | Site | Live FW | Last Seen | OTA | Status |
| Loading⦠|
π Open Work
live Β· GitHub
π OTA Pipeline
GitHub
src/main.cpp
CI: ota_ci_check.py
push/tag
ota.equilibriumfan.com
nginx + Let's Encrypt
firmware binary
MQTT trigger
ESP32
esp_https_ota()
node-specific topic
no retain
π GitHub Tools
| Script | What it does | Status |
session_init.py | Session brief β fleet roster, live FW from Supabase, open GitHub issues. Run at session start. | β synced |
health_check.py | Scheduled health report via GitHub Actions (11:15 UTC / 6:15 AM CDT). Rogue droplet cron at 12 PM CDT. | β sched conflict |
ota_ci_check.py | CI guard: binary β€ slot, struct β€ 512B, stack β₯ 12288, watermark β₯ 2048. | β committed |
ota_host.py | Lab OTA host for bench testing. Not the production nginx vhost. | β committed |
equisim_gauntlet.py | HIL simulation β scenarios 1β68. | β committed |
fleet_preflight_audit.py | Pre-flight check before any OTA push. | β committed |
check_firmware_size.py | Validates binary size vs partition slot. | β committed |
simulate_ble_capture.py | BLE advertisement simulation for EquiSync RF learning. | β committed |
π Protocols
- Same session: USB, Streamlit, this dashboard
- Banner first, then capture the BLE MAC
- Add the node_id to
AUS_NODES and redeploy Pages
- Bench 010 stays on
hvac_telemetry_bench
- Full procedure:
docs/NODE_COMMISSIONING.md
- Physical USB-C to node
- PlatformIO upload via Cursor / CLI
- Sets FW_VERSION in NVS
- Bench 010 still needs USB β v4.5.16. N2 is on v4.5.16
- Hold GPIO35 at power-on β learn mode
- BLE advertisement from remote
- Stored in NVS
- simulate_ble_capture.py for bench test
- Merge β CI runs ota_ci_check.py
- fleet_preflight_audit.py before trigger
- Node-specific MQTT topic, no retain
- Confirm via session_init
- Site EQBNTV, table hvac_telemetry_bench
- equisim_gauntlet.py β scenarios 1β68
- Validate watermark β₯ 2048
- USB flash needed β v4.5.16
- Required: any threshold, pin, state-edge change
- Open questions only β no A/B/C options
- All 5 parties respond before merge
- Label:
needs-ballot
- After merge: update
AI.md + docs/TEN_COMMANDMENTS.md
- Every main.cpp commit β bump FW_VERSION
- kOffTroughRiseF = 1.2Β°F β Tier 3 to change
- Node-specific OTA only, never fleet topic
- static_assert(ota_status_t β€ 512B)
- otaWorker stack β₯ 12288
- Post-ballot: update AI.md + TEN_COMMANDMENTS.md same session
βοΈ 5-Party Governance
Claude Web
Architecture Β· audit Β· review Β· diagrams
Gemini
Independent review Β· adversarial check
Claude Code
Code execution Β· CI Β· commits
Cursor
Active coding Β· file edits Β· droplet SSH
Steve
Final authority Β· site access Β· USB flash
π Open To-Do
πChange health check notification time β rogue droplet cron fires at 12 PM CDT. Run crontab -l + systemctl list-timers, reschedule to 6 AM CDT (11:00 UTC). Set up email on the morning GitHub Actions brief.
HIGH
πCNAME for dashboard.equilibriumfan.com β Pages project is live at equilibrium-dashboard-98s.pages.dev. Add a proxied CNAME dashboard β equilibrium-dashboard-98s.pages.dev. The Wrangler token cannot write DNS.
HIGH
β
BALLOT-SUPABASE-ANON-RLS-V2 passed β anon reads node_id, fw, and created_at from v_fleet_fw and v_bench_fw only. Base tables stay closed. Passed 2026-10-26.
DONE
β
USB flash N2 β v4.5.16 β AUS001-N2 banner confirmed v4.5.16-0c660b81 and entry 0x40080638. OTA-capable. BLE MAC a4:c1:38:9f:4b:78.
DONE
π¬USB flash bench 010 β v4.5.16 β HIL bench is behind the field image. USB flash only. Reads stay on hvac_telemetry_bench.
MED
β³Task D: fleet_baseline.json workflow β ballot pending β YAML written, not yet committed. Manual dispatch would update one existing node entry and commit. Waiting on a 5-party ballot before adding .github/workflows/.
MED
πUpdate fleet_baseline.json β approved Austin baseline still lags the image running in the field. No hardcoded versions in static docs. The Task D workflow is the intended update path.
MED
β
Cloudflare sources tracked β issues-worker.js, wrangler-issues.toml, and README-issues-worker.md are on main at 0e81e47.
DONE
β
Pages dashboard deployed β static HTML is on Cloudflare Pages at equilibrium-dashboard-98s.pages.dev. Custom domain still needs the CNAME above.
DONE
β
Doc consolidation β AI.md and docs/TEN_COMMANDMENTS.md are the onboarding pair. CLAUDE.md, .cursorrules, and SESSION_QUICKSTART.md are stubs.
DONE