Ota_status_architecture_diagrams - Alteriom/painlessMesh GitHub Wiki
OTA and Status Architecture Diagrams
Visual reference for understanding the different implementation options.
OTA Distribution Architectures
Current Implementation (Sequential)
ββββββββββββββββ
β Sender Node β
β (Root/SD) β
ββββββββ¬ββββββββ
β Announce broadcast every 60s
β
βΌ
ββββββββββββββββββββββββββββββββββββββββ
β All Nodes Receive Announce β
ββββ¬ββββββββ¬ββββββββ¬ββββββββ¬βββββββββββ
β β β β
βΌ βΌ βΌ βΌ
βββββββ βββββββ βββββββ βββββββ
βNode1β βNode2β βNode3β βNode4β
ββββ¬βββ ββββ¬βββ ββββ¬βββ ββββ¬βββ
β β β β
β Request chunk 0
ββββββββββββββββββββββββββββββββββββΊ
β β β β
βββββββββ€ β β
β Data chunk 0 β β
β β β β
β Request chunk 1 β
ββββββββββββββββββββββββββββββββββββΊ
β β β β
βββββββββ€ β β
β Data chunk 1 β β
β β β β
β β Request chunk 0
β ββββββββββββββββββββββββββββΊ
β β β β
β βββββββββ€ β
β β Data chunk 0 β
βββββββββ΄ββββββββ΄ββββββββ΄βββββββββββ
Time: 60-120s for 4 nodes
Network: N * Firmware_Size (each node gets full copy)
Option 1A: Mesh-Wide Broadcast
ββββββββββββββββ
β Sender Node β
β (Root/SD) β
ββββββββ¬ββββββββ
β
β Broadcast: Announce
βββββββββββββββββββββββββββββββββββ
β β
β Broadcast: Chunk 0 (1s delay) β
βββββββββββββββββββββββββββββββββββ€
β β
β Broadcast: Chunk 1 (1s delay) β
βββββββββββββββββββββββββββββββββββ€
β β
β Broadcast: Chunk N (1s delay) β
βββββββββββββββββββββββββββββββββββ€
β β
βΌ βΌ
ββββββββββββββββββββββββββββββββββββββββββββββ
β All Nodes Receive All Broadcasts β
β (Assemble chunks, handle out-of-order) β
ββ¬ββββββββββ¬ββββββββββ¬ββββββββββ¬βββββββββββββ
β β β β
βΌ βΌ βΌ βΌ
ββββββ ββββββ ββββββ ββββββ
βNodeβ βNodeβ βNodeβ βNodeβ
β 1 β β 2 β β 3 β β 4 β
βββ¬βββ βββ¬βββ βββ¬βββ βββ¬βββ
β β β β
β NAK: Missing chunk 5 β
βββββββββββββββββββββββββββββ€
β β β β
β Broadcast: Chunk 5 resend β
ββββββββββ΄βββββββββ΄ββββββββββ
Time: ~30s for any number of nodes
Network: 1 * Firmware_Size (broadcast to all)
Memory: +2-5KB per node (chunk tracking)
Option 1B: Progressive Rollout
Phase 1: Canary (5-10 minutes)
ββββββββββββ
β Sender β
ββββββ¬ββββββ
β
β OTA to 1-2 test nodes
ββββββββββββββββ
β β
βΌ βΌ
ββββββ ββββββ
β N1 β β N2 β
βββ¬βββ βββ¬βββ
β β
β Monitor for errors/crashes
ββββββββ¬ββββββββ
β
βΌ
[Health Check]
β
ββ OK βββΊ Phase 2
β
ββ FAIL ββΊ ABORT & ALERT
Phase 2: Early Adopters (10-20% of nodes)
ββββββββββββ
β Sender β
ββββββ¬ββββββ
β
β OTA to 20% of remaining nodes
βββββββ¬ββββββ¬ββββββ¬ββββββ
β β β β β
βΌ βΌ βΌ βΌ βΌ
ββββ ββββ ββββ ββββ ββββ
βN3β βN4β βN5β βN6β βN7β
ββ¬ββ ββ¬ββ ββ¬ββ ββ¬ββ ββ¬ββ
β β β β β
β Monitor for stability
βββββββ΄ββββββ΄ββββββ΄ββββββ
β
βΌ
[Health Check]
β
ββ OK βββΊ Phase 3
β
ββ FAIL ββΊ ROLLBACK
Phase 3: Full Rollout (All remaining)
ββββββββββββ
β Sender β
ββββββ¬ββββββ
β
β OTA to all remaining nodes
β
βΌ
[All Other Nodes]
β
βΌ
[Complete]
Time: 30-60 minutes (safe but slow)
Safety: High (early failure detection)
Option 1C: Peer-to-Peer Distribution
Initial Wave:
ββββββββββββββββ
β Sender Node β
β (Source) β
ββββββββ¬ββββββββ
β
β Direct OTA to first 3 nodes
βββββββββ¬ββββββββ¬ββββββββ
β β β β
βΌ βΌ βΌ βΌ
βββββ βββββ βββββ
β A β β B β β C β
βββ¬ββ βββ¬ββ βββ¬ββ
β β β
β Cache firmware in flash
β β β
Second Wave (exponential growth):
ββββββββββ¬βββββββββ¬βββββββββ¬βββββββββ
β β β β β
βΌ βΌ βΌ βΌ βΌ
Sender A B C
β β β β
βββββ¬βββββ€ β β
β β β β β
βΌ βΌ βΌ βΌ βΌ
D E F G H
Third Wave:
D, E, F, G, H all become sources...
β β β β β
βΌ βΌ βΌ βΌ βΌ
I J K L M, etc.
Time: ~15s for large mesh (exponential)
Memory: +200-500KB flash (cached firmware)
Scalability: Excellent (viral propagation)
Option 1E: Compressed OTA Transfer
Build Process:
ββββββββββββββββ
βfirmware.bin β
β (200KB) β
ββββββββ¬ββββββββ
β
β gzip -9
βΌ
ββββββββββββββββ
βfirmware.bin.gzβ
β (~100KB) β 40-60% size reduction
ββββββββ¬ββββββββ
β
β Split into chunks
βΌ
Distribution (same topology as current):
ββββββββββββββββ
β Sender Node β
ββββββββ¬ββββββββ
β
β Announce (with compression flag)
β
βΌ
Node receives compressed chunks
β
β βββββββββββββββββββ
β β Decompression β
β β Buffer (8KB) β
βββ€ β
β β Streaming β
β β decompress to β
β β flash β
β βββββββββββββββββββ
βΌ
Flash Write
Time Saved: 40-60% (less data to transfer)
Memory: +4-8KB (decompression buffer)
CPU: Minimal (streaming decompression)
Compatibility: Works with all distribution methods
Mesh Status Monitoring Architectures
Current State (Manual)
Application Code:
βββββββββββββββββββββββββββββ
β User Application β
β β
β Manually poll nodes: β
β - getNodeList() β
β - subConnectionJson() β
β - getNodeTime() β
β β
β Store and process data β
βββββββββββββββββββββββββββββ
β
β Multiple API calls
β
βΌ
βββββββββββββββββββββββββββββ
β painlessMesh Library β
βββββββββββββββββββββββββββββ
β
βΌ
[Mesh Nodes]
Manual status collection
No standardization
Application-specific
Option 2A: Enhanced StatusPackage
Each Node (periodic broadcast):
ββββββββββββββββββββββββββββ
β Node Application β
ββββββββ¬ββββββββββββββββββββ
β
β Create status (every 60s)
βΌ
ββββββββββββββββββββββββββββ
β EnhancedStatusPackage β
β - uptime β
β - memory β
β - message stats β
β - network info β
β - alerts β
ββββββββ¬ββββββββββββββββββββ
β
β mesh.sendBroadcast()
βΌ
ββββββββββββββββββββββββββββ
β Mesh Network β
ββββββββ¬ββββββββββββββββββββ
β
β All nodes receive
βΌ
Collection Node:
ββββββββββββββββββββββββββββ
β onReceive() callback β
β β
β if (type == 202) { β
β processStatus() β
β storeMetrics() β
β checkAlerts() β
β } β
ββββββββββββββββββββββββββββ
Frequency: 30-60s typical
Overhead: ~500 bytes per update
Integration: Simple, builds on existing
Option 2B: Mesh Status Service
Root/Bridge Node initiates:
ββββββββββββββββββββββββββββ
β Root Node β
β (Status Collector) β
ββββββββ¬ββββββββββββββββββββ
β
β StatusQuery(node_list)
ββββββββββ¬βββββββββ¬βββββββββ
β β β β
βΌ βΌ βΌ βΌ
βββββ βββββ βββββ βββββ
β A β β B β β C β β D β
βββ¬ββ βββ¬ββ βββ¬ββ βββ¬ββ
β β β β
β StatusReport (metrics)
ββββββββββΌβββββββββΌβββββββββ€
β β β β
βΌ βΌ βΌ βΌ
ββββββββββββββββββββββββββββββββββββ
β Root Node Aggregation β
β β
β { β
β "nodeA": {...}, β
β "nodeB": {...}, β
β "nodeC": {...}, β
β "nodeD": {...} β
β } β
ββββββββ¬ββββββββββββββββββββββββββββ
β
β Publish via MQTT or API
βΌ
ββββββββββββββββββββββββββββββββββββ
β External Monitoring System β
ββββββββββββββββββββββββββββββββββββ
Query Mode: On-demand or periodic
Aggregation: Centralized at root
Response Timeout: 5-10 seconds
Option 2C: Telemetry Stream
Continuous streaming from all nodes:
Node 1: Node 2: Node 3: Node 4:
β β β β
β Telemetry (every 60s) β β
βββββββββββββ΄ββββββββββββ΄ββββββββββββ€
β β
βΌ βΌ
βββββββββββββββββββββββββββββββββββββββββββ
β Root Node β
β (State Maintenance) β
β β
β βββββββββββββββββββββββββββββββββββββ β
β β Internal State Model β β
β β - Node 1: [metrics] β β
β β - Node 2: [metrics] β β
β β - Node 3: [metrics] β β
β β - Node 4: [metrics] β β
β βββββββββββββββββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββ β
β β Anomaly Detection β β
β β - Memory critically low on N2 β β
β β - High packet loss on N3 β β
β βββββββββββββββββββββββββββββββββββββ β
βββββββββββ¬ββββββββββββββββββββββββββββββββ
β
β Export alerts & metrics
βΌ
βββββββββββββββββββββββββββββββββββββββββββ
β Time-Series Database / MQTT β
β (InfluxDB, Prometheus, etc.) β
βββββββββββββββββββββββββββββββββββββββββββ
Format: Compact binary (64 bytes)
Encoding: Delta (only changes)
Frequency: 30-60s
Overhead: Very low (~1KB/hour per node)
Option 2D: Health Dashboard
βββββββββββββββββββββββββββββββββββββββββββ
β Dashboard Node (ESP32) β
β β
β βββββββββββββββββββββββββββββββββββββ β
β β Status Collector Service β β
β β (Polls all nodes every 30s) β β
β βββββββββ¬ββββββββββββββββββββββββββββ β
β β β
β βββββββββΌββββββββββββββββββββββββββββ β
β β LittleFS Storage β β
β β - Current status β β
β β - Historical data (24h) β β
β β - Alert history β β
β βββββββββ¬ββββββββββββββββββββββββββββ β
β β β
β βββββββββΌββββββββββββββββββββββββββββ β
β β AsyncWebServer β β
β β - REST API β β
β β - WebSocket (live updates) β β
β β - Static files (HTML/CSS/JS) β β
β βββββββββ¬ββββββββββββββββββββββββββββ β
ββββββββββββΌββββββββββββββββββββββββββββββ
β
β HTTP/WebSocket
βΌ
βββββββββββββββββββββββββββββββββββββββββββ
β Web Browser / Mobile β
β β
β βββββββββββββββββββββββββββββββββββ β
β β Real-Time Mesh Visualization β β
β β βββββββ βββββββ βββββββ β β
β β β A ββββ€ B ββββ€ C β β β
β β βββββββ βββββββ ββββ¬βββ β β
β β β β β
β β ββββ΄βββ β β
β β β D β β β
β β βββββββ β β
β βββββββββββββββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββ β
β β Per-Node Metrics β β
β β - Memory: [====> ] 60% β β
β β - Uptime: 2d 14h β β
β β - Messages: 12,345 β β
β βββββββββββββββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββ β
β β Alerts & Events β β
β β β Node 3: Low memory β β
β β β Node 7: High packet loss β β
β βββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββ
Features:
- Live topology visualization
- Historical graphs (ChartJS)
- Alert management
- Firmware tracking
- Mobile responsive
Option 2E: MQTT Status Bridge
Mesh Network:
ββββββ ββββββ ββββββ ββββββ
β N1 β β N2 β β N3 β β N4 β
βββ¬βββ βββ¬βββ βββ¬βββ βββ¬βββ
β β β β
β Mesh communication β
βββββββββ΄ββββββββ΄βββββββββ
β
β Status collection
βΌ
βββββββββββββββββββββββββββββββ
β Bridge Node (Root) β
β β
β ββββββββββββββββββββββββ β
β β Status Collector β β
β β - Polls mesh nodes β β
β β - Aggregates data β β
β ββββββββ¬ββββββββββββββββ β
β β β
β ββββββββΌββββββββββββββββ β
β β MQTT Publisher β β
β β - JSON formatting β β
β β - Topic routing β β
β ββββββββ¬ββββββββββββββββ β
βββββββββββΌββββββββββββββββββββ
β
β MQTT/TLS
βΌ
βββββββββββββββββββββββββββββββ
β MQTT Broker β
β (Mosquitto, HiveMQ) β
βββββββββββ¬ββββββββββββββββββββ
β
β Topics:
β - mesh/status/nodes
β - mesh/status/topology
β - mesh/status/metrics
β - mesh/status/alerts
β - mesh/status/node/{id}
β
ββββββββ¬βββββββ¬βββββββ¬βββββββ
βΌ βΌ βΌ βΌ βΌ
βββββββ ββββββ ββββββ ββββββ ββββββ
βGrafaβ βPromβ βHomeβ βNodeβ βCustβ
β na β βeth β βAsstβ βRED β β om β
βββββββ ββββββ ββββββ ββββββ ββββββ
JSON Payload Example:
{
"timestamp": 1638360000,
"nodes": [
{
"id": 123456789,
"uptime": 86400,
"memory": 45000,
"rssi": -65,
"version": "v2.1.0"
},
...
]
}
Comparison: OTA Performance
Time to Update 20 Nodes (200KB firmware)
Current (Sequential):
[ββββββββββββββββββββ] 20 min
+ Compression (1E):
[ββββββββββββ] 12 min (40% faster)
+ Broadcast (1A):
[βββββ] 5 min (75% faster)
+ Broadcast + Compression:
[βββ] 3 min (85% faster)
+ Peer-to-Peer (1C):
[β] 1 min (95% faster)
Network Bandwidth Usage
Current: 20 nodes Γ 200KB = 4000KB total
Broadcast: 1 Γ 200KB = 200KB total
(20x reduction!)
Compressed: 20 Γ 100KB = 2000KB
(or 1 Γ 100KB = 100KB if broadcast)
Peer-to-Peer: ~400KB total
(viral propagation, shared load)
Comparison: Status Monitoring Overhead
Network Traffic (10 nodes, 1 hour)
Option 2A (StatusPackage @ 5min):
βββββββββββββββββββββββ ~60KB/hour
(12 updates Γ 500B Γ 10 nodes)
Option 2B (Status Service @ 30s):
βββββ ~15KB/hour
(Queries + responses, aggregated)
Option 2C (Telemetry @ 60s):
βββ ~4KB/hour
(Delta encoding, very efficient)
Option 2D (Dashboard - polling @ 30s):
ββββ ~10KB/hour
(Collector queries nodes)
Option 2E (MQTT Bridge @ 30s):
βββββ ~20KB/hour
(JSON overhead, but external)
Decision Tree
βββββββββββββββββββ
β Do you need β
β OTA or Status? β
ββββββ¬βββββ¬ββββββββ
β β
βββββββββββββ ββββββββββββ
β β
βΌ βΌ
βββββββββββββββ βββββββββββββββ
β OTA β β STATUS β
ββββββββ¬βββββββ ββββββββ¬βββββββ
β β
βΌ βΌ
What's your How many nodes?
priority? β
β β
ββββββββΌβββββββ ββββββββ¬βββββββ
βΌ βΌ βΌ βΌ βΌ βΌ
Speed Safety Simple <10 10-50 >50
β β β β β β
βΌ βΌ βΌ βΌ βΌ βΌ
1A+1E 1B+1E 1E 2A 2E 2C+2E
See also: