@alteriom/painlessmesh 1.6.1 → 1.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/CHANGELOG.md +435 -144
  2. package/LICENSE +674 -674
  3. package/README.md +491 -434
  4. package/RELEASE_GUIDE.md +504 -418
  5. package/docs/DOCUMENTATION_MIGRATION_PLAN.md +175 -175
  6. package/docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md +1062 -0
  7. package/docs/MESH_TOPOLOGY_GUIDE.md +992 -0
  8. package/docs/MESH_TOPOLOGY_PROGRESS.md +422 -0
  9. package/docs/MQTT_BRIDGE_COMMANDS.md +894 -0
  10. package/docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md +324 -0
  11. package/docs/MQTT_COMMAND_SCHEMA_PROPOSAL.md +576 -0
  12. package/docs/MQTT_SCHEMA_COMPLIANCE.md +285 -0
  13. package/docs/MQTT_SCHEMA_PROPOSALS.md +446 -0
  14. package/docs/MQTT_SCHEMA_REVIEW.md +690 -0
  15. package/docs/OTA_COMMANDS_REFERENCE.md +554 -0
  16. package/docs/PHASE1_GUIDE.md +349 -0
  17. package/docs/PHASE2_GUIDE.md +543 -0
  18. package/docs/README.md +130 -71
  19. package/docs/SCHEMA_VALIDATION_CHECKLIST.md +222 -0
  20. package/docs/alteriom/overview.md +507 -507
  21. package/docs/api/core-api.md +606 -606
  22. package/docs/architecture/mesh-architecture.md +378 -378
  23. package/docs/architecture/plugin-system.md +516 -516
  24. package/docs/archive/DOCUSAURUS_DEPLOYMENT.md +166 -0
  25. package/docs/archive/FEATURE_PROPOSALS.md +337 -0
  26. package/docs/archive/LIBRARY_JSON_FIX.md +98 -0
  27. package/docs/archive/LIBRARY_STRUCTURE_FIX.md +215 -0
  28. package/docs/archive/PHASE1_IMPLEMENTATION.md +325 -0
  29. package/docs/archive/PHASE2_IMPLEMENTATION.md +567 -0
  30. package/docs/archive/RELEASE_SUMMARY.md +173 -0
  31. package/docs/archive/SCONS_BUILD_FIX.md +313 -0
  32. package/docs/archive/TRIGGER_RELEASE.md +280 -0
  33. package/docs/archive/VECTOR_INCLUDE_FIX.md +129 -0
  34. package/docs/archive/ota-and-status-enhancements.md +911 -0
  35. package/docs/archive/ota-status-architecture-diagrams.md +658 -0
  36. package/docs/archive/ota-status-quick-reference.md +284 -0
  37. package/docs/development/ARDUINO_COMPLIANCE_SUMMARY.md +71 -0
  38. package/docs/development/CODE_REFACTORING_RECOMMENDATIONS.md +1011 -0
  39. package/docs/development/DOCKER_TESTING.md +196 -0
  40. package/docs/development/PLATFORMIO_USAGE.md +180 -0
  41. package/docs/development/TESTING_SUMMARY.md +126 -0
  42. package/docs/development/contributing.md +301 -0
  43. package/docs/development/documentation.md +583 -0
  44. package/docs/getting-started/first-mesh.md +409 -409
  45. package/docs/getting-started/installation.md +274 -274
  46. package/docs/getting-started/quickstart.md +157 -157
  47. package/docs/improvements/FUTURE_PROPOSALS.md +1016 -0
  48. package/docs/improvements/IMPLEMENTATION_HISTORY.md +1091 -0
  49. package/docs/improvements/OTA_STATUS_ENHANCEMENTS.md +709 -0
  50. package/docs/improvements/README.md +212 -69
  51. package/docs/platformio-publishing.md +255 -0
  52. package/docs/platformio-setup-summary.md +121 -0
  53. package/docs/releases/FEATURE_HISTORY.md +543 -0
  54. package/docs/releases/PATCH_v1.7.3.md +262 -0
  55. package/docs/releases/PHASE1_SUMMARY.md +246 -0
  56. package/docs/releases/PHASE2_SUMMARY.md +499 -0
  57. package/docs/releases/RELEASE_NOTES_1.7.0.md +539 -0
  58. package/docs/troubleshooting/common-issues.md +520 -520
  59. package/docs/troubleshooting/debugging.md +455 -0
  60. package/docs/troubleshooting/faq.md +472 -472
  61. package/docs/tutorials/basic-examples.md +717 -717
  62. package/docs/wiki/API-Reference.md +245 -245
  63. package/docs/wiki/Complete-Documentation.md +122 -122
  64. package/examples/alteriom/README.md +139 -81
  65. package/examples/alteriom/alteriom.ino +186 -185
  66. package/examples/alteriom/alteriom_sensor_package.hpp +240 -127
  67. package/examples/alteriom/platformio.ini +24 -24
  68. package/examples/alteriomImproved/alteriom_sensor_package.hpp +224 -0
  69. package/examples/{alteriom → alteriomImproved}/improved_sensor_node.ino +245 -245
  70. package/examples/alteriomImproved/platformio.ini +25 -0
  71. package/examples/alteriomPhase1/alteriom_sensor_package.hpp +224 -0
  72. package/examples/alteriomPhase1/phase1_features.ino +242 -0
  73. package/examples/alteriomPhase1/platformio.ini +25 -0
  74. package/examples/alteriomPhase2/alteriom_sensor_package.hpp +224 -0
  75. package/examples/alteriomPhase2/phase2_features.ino +186 -0
  76. package/examples/alteriomPhase2/platformio.ini +25 -0
  77. package/examples/{alteriom → alteriomSensorNode}/alteriom_sensor_node.ino +183 -183
  78. package/examples/alteriomSensorNode/alteriom_sensor_package.hpp +224 -0
  79. package/examples/alteriomSensorNode/platformio.ini +25 -0
  80. package/examples/basic/basic.ino +66 -66
  81. package/examples/basic/platformio.ini +25 -25
  82. package/examples/bridge/bridge.ino +51 -51
  83. package/examples/bridge/mesh_event_publisher.hpp +253 -0
  84. package/examples/bridge/mesh_topology_reporter.hpp +303 -0
  85. package/examples/bridge/mqtt_command_bridge.hpp +459 -0
  86. package/examples/bridge/mqtt_status_bridge.hpp +519 -0
  87. package/examples/bridge/platformio.ini +25 -25
  88. package/examples/echoNode/echoNode.ino +33 -33
  89. package/examples/echoNode/platformio.ini +25 -25
  90. package/examples/logClient/logClient.ino +109 -109
  91. package/examples/logClient/platformio.ini +25 -25
  92. package/examples/logServer/logServer.ino +81 -81
  93. package/examples/logServer/platformio.ini +25 -25
  94. package/examples/meshCommandNode/alteriom_sensor_package.hpp +235 -0
  95. package/examples/meshCommandNode/meshCommandNode.ino +263 -0
  96. package/examples/meshCommandNode/platformio.ini +25 -0
  97. package/examples/mqttBridge/mqttBridge.ino +118 -118
  98. package/examples/mqttBridge/platformio.ini +26 -26
  99. package/examples/mqttCommandBridge/alteriom_sensor_package.hpp +235 -0
  100. package/examples/mqttCommandBridge/mesh_event_publisher.hpp +253 -0
  101. package/examples/mqttCommandBridge/mesh_topology_reporter.hpp +303 -0
  102. package/examples/mqttCommandBridge/mqttCommandBridge.ino +252 -0
  103. package/examples/mqttCommandBridge/mqtt_command_bridge.hpp +459 -0
  104. package/examples/mqttCommandBridge/platformio.ini +26 -0
  105. package/examples/mqttStatusBridge/mqttStatusBridge.ino +216 -0
  106. package/examples/mqttStatusBridge/mqtt_status_bridge.hpp +522 -0
  107. package/examples/mqttStatusBridge/platformio.ini +26 -0
  108. package/examples/mqttTopologyTest/README.md +467 -0
  109. package/examples/mqttTopologyTest/mqttTopologyTest.ino +748 -0
  110. package/examples/mqttTopologyTest/platformio.ini +26 -0
  111. package/examples/namedMesh/namedMesh.ino +97 -97
  112. package/examples/namedMesh/platformio.ini +25 -25
  113. package/examples/otaReceiver/otaReceiver.ino +79 -79
  114. package/examples/otaReceiver/platformio.ini +25 -25
  115. package/examples/otaSender/otaSender.ino +160 -151
  116. package/examples/otaSender/platformio.ini +25 -25
  117. package/examples/startHere/platformio.ini +25 -25
  118. package/examples/startHere/startHere.ino +159 -159
  119. package/examples/webServer/platformio.ini +27 -27
  120. package/examples/webServer/webServer.ino +89 -89
  121. package/keywords.txt +48 -48
  122. package/library.json +55 -34
  123. package/library.properties +10 -10
  124. package/package.json +86 -78
  125. package/src/AlteriomPainlessMesh.h +97 -97
  126. package/src/arduino/wifi.hpp +365 -365
  127. package/src/boost/asynctcp.hpp +279 -279
  128. package/src/painlessMesh.h +70 -70
  129. package/src/painlessMeshSTA.cpp +236 -236
  130. package/src/painlessMeshSTA.h +58 -58
  131. package/src/painlessTaskOptions.h +4 -4
  132. package/src/painlessmesh/base64.hpp +111 -111
  133. package/src/painlessmesh/buffer.hpp +229 -229
  134. package/src/painlessmesh/callback.hpp +91 -91
  135. package/src/painlessmesh/configuration.hpp +77 -77
  136. package/src/painlessmesh/connection.hpp +192 -192
  137. package/src/painlessmesh/layout.hpp +188 -188
  138. package/src/painlessmesh/logger.hpp +158 -158
  139. package/src/painlessmesh/memory.hpp +119 -119
  140. package/src/painlessmesh/mesh.hpp +761 -560
  141. package/src/painlessmesh/metrics.hpp +322 -322
  142. package/src/painlessmesh/ntp.hpp +263 -263
  143. package/src/painlessmesh/ota.hpp +582 -553
  144. package/src/painlessmesh/plugin.hpp +188 -188
  145. package/src/painlessmesh/protocol.hpp +813 -813
  146. package/src/painlessmesh/router.hpp +338 -322
  147. package/src/painlessmesh/tcp.hpp +71 -71
  148. package/src/painlessmesh/validation.hpp +238 -238
  149. package/src/plugin/performance.hpp +214 -214
  150. package/src/plugin/remote.hpp +64 -64
  151. package/src/scheduler.cpp +10 -10
  152. package/src/wifi.cpp +2 -2
@@ -0,0 +1,543 @@
1
+ # Phase 2 Features Guide
2
+
3
+ ## Quick Summary
4
+
5
+ Phase 2 adds production-ready features for scalable OTA distribution and professional monitoring:
6
+
7
+ - ✅ **Broadcast OTA** - True mesh-wide firmware distribution scaling to 50+ nodes
8
+ - ✅ **MQTT Status Bridge** - Professional monitoring integration with Grafana, InfluxDB, Prometheus
9
+
10
+ ## Features Overview
11
+
12
+ ### 1. Broadcast OTA (Option 1A)
13
+
14
+ **What it does:** Distributes firmware to all nodes simultaneously via broadcast, dramatically reducing network traffic.
15
+
16
+ **Key Benefits:**
17
+ - **~98% network traffic reduction** vs unicast (1 broadcast vs N unicasts)
18
+ - **Faster distribution** - All nodes receive chunks in parallel
19
+ - **Scales to 50-100+ nodes** efficiently
20
+ - **Backward compatible** - Works with Phase 1 compression
21
+ - **Memory efficient** - Only +2-5KB per node
22
+
23
+ **Architecture:**
24
+ ```
25
+ Root Node All Nodes
26
+ ├─> Broadcast: Announce ─┐
27
+ ├─> Broadcast: Chunk 0 ─┼─> Listen & Cache
28
+ ├─> Broadcast: Chunk 1 ─┼─> Assemble Firmware
29
+ └─> Broadcast: Chunk N ─┘ Reboot When Complete
30
+ ```
31
+
32
+ ### 2. MQTT Status Bridge (Option 2E)
33
+
34
+ **What it does:** Publishes comprehensive mesh status to MQTT topics for professional monitoring tools.
35
+
36
+ **Key Benefits:**
37
+ - **Cloud integration** via MQTT
38
+ - **Professional monitoring** - Grafana, InfluxDB, Prometheus, Home Assistant
39
+ - **Real-time visibility** into mesh health
40
+ - **Automated alerting** for critical conditions
41
+ - **Configurable publishing** intervals and topics
42
+
43
+ **MQTT Topics:**
44
+ - `mesh/status/nodes` - List of all nodes in mesh
45
+ - `mesh/status/topology` - Complete mesh structure JSON
46
+ - `mesh/status/metrics` - Performance statistics
47
+ - `mesh/status/alerts` - Active alert conditions
48
+ - `mesh/status/node/{id}` - Per-node detailed status (optional)
49
+
50
+ ---
51
+
52
+ ## Getting Started
53
+
54
+ ### Prerequisites
55
+
56
+ - Phase 1 features installed (Compressed OTA + Enhanced Status)
57
+ - ESP32 or ESP8266 hardware
58
+ - For MQTT Bridge: MQTT broker (Mosquitto, HiveMQ, etc.)
59
+ - For MQTT Bridge: External WiFi connection
60
+
61
+ ### Quick Start: Broadcast OTA
62
+
63
+ ```cpp
64
+ #include "painlessMesh.h"
65
+
66
+ painlessMesh mesh;
67
+
68
+ void setup() {
69
+ mesh.init(MESH_PREFIX, MESH_PASSWORD, &scheduler, MESH_PORT);
70
+
71
+ #ifdef PAINLESSMESH_ENABLE_OTA
72
+ // Phase 2: Enable broadcast mode
73
+ mesh.offerOTA(
74
+ "sensor", // Role
75
+ "ESP32", // Hardware
76
+ firmwareMD5, // MD5 hash
77
+ numParts, // Number of chunks
78
+ false, // Not forced
79
+ true, // *** BROADCAST MODE ***
80
+ true // Compressed (Phase 1)
81
+ );
82
+ #endif
83
+ }
84
+ ```
85
+
86
+ ### Quick Start: MQTT Status Bridge
87
+
88
+ ```cpp
89
+ #include <PubSubClient.h>
90
+ #include "examples/bridge/mqtt_status_bridge.hpp"
91
+
92
+ painlessMesh mesh;
93
+ PubSubClient mqttClient(mqttBroker, 1883, mqttCallback, wifiClient);
94
+ MqttStatusBridge* statusBridge;
95
+
96
+ void setup() {
97
+ // Initialize mesh as bridge node
98
+ mesh.init(MESH_PREFIX, MESH_PASSWORD, MESH_PORT, WIFI_AP_STA, 6);
99
+ mesh.setRoot(true);
100
+ mesh.setContainsRoot(true);
101
+
102
+ // Connect to external WiFi for MQTT
103
+ mesh.stationManual(STATION_SSID, STATION_PASSWORD);
104
+
105
+ // Initialize status bridge
106
+ statusBridge = new MqttStatusBridge(mesh, mqttClient);
107
+ statusBridge->setPublishInterval(30000); // 30 seconds
108
+ statusBridge->begin();
109
+ }
110
+ ```
111
+
112
+ ---
113
+
114
+ ## API Reference
115
+
116
+ ### Broadcast OTA
117
+
118
+ #### mesh.offerOTA()
119
+
120
+ ```cpp
121
+ std::shared_ptr<Task> offerOTA(
122
+ TSTRING role,
123
+ TSTRING hardware,
124
+ TSTRING md5,
125
+ size_t noPart,
126
+ bool forced = false,
127
+ bool broadcasted = false, // Phase 2: Broadcast mode
128
+ bool compressed = false // Phase 1: Compression
129
+ )
130
+ ```
131
+
132
+ **Parameters:**
133
+ - `role` - Node role this firmware is for (e.g., "sensor", "gateway")
134
+ - `hardware` - Hardware type: "ESP32" or "ESP8266"
135
+ - `md5` - MD5 hash of firmware (for version checking)
136
+ - `noPart` - Number of firmware chunks
137
+ - `forced` - Force update even if MD5 matches (default: false)
138
+ - **`broadcasted`** - **[Phase 2]** Enable broadcast mode (default: false)
139
+ - `compressed` - [Phase 1] Enable compression (default: false)
140
+
141
+ **Returns:** Shared pointer to Task that manages OTA announcements
142
+
143
+ **Example:**
144
+ ```cpp
145
+ auto otaTask = mesh.offerOTA(
146
+ "sensor", "ESP32", md5, 100,
147
+ false, // not forced
148
+ true, // BROADCAST MODE
149
+ true // compressed
150
+ );
151
+ ```
152
+
153
+ ### MQTT Status Bridge
154
+
155
+ #### Constructor
156
+
157
+ ```cpp
158
+ MqttStatusBridge(painlessMesh& mesh, PubSubClient& mqttClient)
159
+ ```
160
+
161
+ #### Configuration Methods
162
+
163
+ ```cpp
164
+ void setPublishInterval(uint32_t interval)
165
+ ```
166
+ Set publishing interval in milliseconds (default: 30000)
167
+
168
+ ```cpp
169
+ void setTopicPrefix(const String& prefix)
170
+ ```
171
+ Set MQTT topic prefix (default: "mesh/status/")
172
+
173
+ ```cpp
174
+ void enableTopology(bool enable)
175
+ ```
176
+ Enable/disable topology publishing (default: true)
177
+
178
+ ```cpp
179
+ void enableMetrics(bool enable)
180
+ ```
181
+ Enable/disable metrics publishing (default: true)
182
+
183
+ ```cpp
184
+ void enableAlerts(bool enable)
185
+ ```
186
+ Enable/disable alerts publishing (default: true)
187
+
188
+ ```cpp
189
+ void enablePerNode(bool enable)
190
+ ```
191
+ Enable/disable per-node status publishing (default: false)
192
+ ⚠️ **Warning:** Can be expensive for large meshes (50+ nodes)
193
+
194
+ #### Control Methods
195
+
196
+ ```cpp
197
+ void begin()
198
+ ```
199
+ Start publishing status to MQTT
200
+
201
+ ```cpp
202
+ void stop()
203
+ ```
204
+ Stop publishing
205
+
206
+ ```cpp
207
+ void publishNow()
208
+ ```
209
+ Trigger immediate status publish (useful for testing)
210
+
211
+ ---
212
+
213
+ ## Usage Examples
214
+
215
+ ### Example 1: Basic Broadcast OTA
216
+
217
+ ```cpp
218
+ #include "painlessMesh.h"
219
+
220
+ #define MESH_PREFIX "myMesh"
221
+ #define MESH_PASSWORD "password"
222
+ #define MESH_PORT 5555
223
+ #define OTA_PART_SIZE 1024
224
+
225
+ painlessMesh mesh;
226
+
227
+ void setup() {
228
+ mesh.init(MESH_PREFIX, MESH_PASSWORD, MESH_PORT);
229
+
230
+ #ifdef PAINLESSMESH_ENABLE_OTA
231
+ // Setup OTA sender
232
+ mesh.initOTASend(firmwareCallback, OTA_PART_SIZE);
233
+
234
+ // Announce firmware with broadcast + compression
235
+ mesh.offerOTA(
236
+ "sensor", // role
237
+ "ESP32", // hardware
238
+ "abc123...", // MD5
239
+ 150, // number of chunks
240
+ false, // not forced
241
+ true, // BROADCAST
242
+ true // compressed
243
+ );
244
+ #endif
245
+ }
246
+
247
+ size_t firmwareCallback(ota::DataRequest pkg, char* buffer) {
248
+ // Read firmware chunk from storage
249
+ // Return bytes read into buffer
250
+ }
251
+ ```
252
+
253
+ ### Example 2: MQTT Status Bridge with Custom Configuration
254
+
255
+ ```cpp
256
+ #include <PubSubClient.h>
257
+ #include "examples/bridge/mqtt_status_bridge.hpp"
258
+
259
+ MqttStatusBridge* bridge;
260
+
261
+ void setup() {
262
+ // ... initialize mesh and MQTT ...
263
+
264
+ bridge = new MqttStatusBridge(mesh, mqttClient);
265
+
266
+ // Custom configuration
267
+ bridge->setPublishInterval(60000); // Publish every minute
268
+ bridge->setTopicPrefix("alteriom/"); // Custom topic prefix
269
+ bridge->enableTopology(true); // Publish topology
270
+ bridge->enableMetrics(true); // Publish metrics
271
+ bridge->enableAlerts(true); // Publish alerts
272
+ bridge->enablePerNode(false); // Disable per-node (too many nodes)
273
+
274
+ bridge->begin();
275
+ }
276
+
277
+ void loop() {
278
+ mesh.update();
279
+ mqttClient.loop();
280
+
281
+ // Trigger manual publish on demand
282
+ if (buttonPressed()) {
283
+ bridge->publishNow();
284
+ }
285
+ }
286
+ ```
287
+
288
+ ### Example 3: Combined Phase 1 + Phase 2 Features
289
+
290
+ ```cpp
291
+ #include "painlessMesh.h"
292
+ #include "examples/alteriom/alteriom_sensor_package.hpp"
293
+ #include "examples/bridge/mqtt_status_bridge.hpp"
294
+
295
+ void setup() {
296
+ mesh.init(...);
297
+
298
+ // Phase 1: Enhanced Status
299
+ alteriom::EnhancedStatusPackage status;
300
+ status.uptime = millis() / 1000;
301
+ status.nodeCount = mesh.getNodeList().size();
302
+ mesh.sendBroadcast(status.toJsonString());
303
+
304
+ // Phase 2: Broadcast OTA
305
+ mesh.offerOTA("sensor", "ESP32", md5, parts, false, true, true);
306
+
307
+ // Phase 2: MQTT Bridge
308
+ statusBridge->begin();
309
+ }
310
+ ```
311
+
312
+ ---
313
+
314
+ ## Performance & Scaling
315
+
316
+ ### Broadcast OTA Performance
317
+
318
+ | Mesh Size | Unicast Traffic | Broadcast Traffic | Reduction |
319
+ |-----------|----------------|-------------------|-----------|
320
+ | 10 nodes | 10x chunks | 1x chunks | 90% |
321
+ | 50 nodes | 50x chunks | 1x chunks | 98% |
322
+ | 100 nodes | 100x chunks | 1x chunks | 99% |
323
+
324
+ **Example:** 150 chunk firmware update
325
+ - **Unicast mode:** 50 nodes × 150 chunks = 7,500 transmissions
326
+ - **Broadcast mode:** 1 × 150 chunks = 150 transmissions
327
+ - **Reduction:** 7,350 fewer transmissions (98%)
328
+
329
+ ### Memory Usage
330
+
331
+ | Feature | Memory Impact | Notes |
332
+ |---------|--------------|-------|
333
+ | Broadcast OTA | +2-5KB per node | Chunk bitmap + buffer |
334
+ | MQTT Bridge | +5-8KB root node | Status collection |
335
+
336
+ ### MQTT Traffic
337
+
338
+ | Feature | Messages/Interval | Size | Total/Interval |
339
+ |---------|------------------|------|----------------|
340
+ | Node List | 1 | ~200 bytes | 200 bytes |
341
+ | Topology | 1 | ~1-5KB | 1-5KB |
342
+ | Metrics | 1 | ~300 bytes | 300 bytes |
343
+ | Alerts | 1 | ~400 bytes | 400 bytes |
344
+ | Per-node (50 nodes) | 50 | ~150 bytes | ~7.5KB |
345
+
346
+ **Recommended:** Disable per-node publishing for meshes >20 nodes
347
+
348
+ ---
349
+
350
+ ## Integration with Monitoring Tools
351
+
352
+ ### Grafana Dashboard
353
+
354
+ ```json
355
+ {
356
+ "datasource": "MQTT",
357
+ "targets": [
358
+ {
359
+ "topic": "mesh/status/metrics",
360
+ "field": "nodeCount"
361
+ }
362
+ ]
363
+ }
364
+ ```
365
+
366
+ ### InfluxDB Telegraf
367
+
368
+ ```toml
369
+ [[inputs.mqtt_consumer]]
370
+ servers = ["tcp://localhost:1883"]
371
+ topics = [
372
+ "mesh/status/metrics",
373
+ "mesh/status/alerts"
374
+ ]
375
+ data_format = "json"
376
+ ```
377
+
378
+ ### Prometheus MQTT Exporter
379
+
380
+ ```yaml
381
+ mqtt:
382
+ server: tcp://localhost:1883
383
+ topics:
384
+ - mesh/status/metrics
385
+ - mesh/status/alerts
386
+ ```
387
+
388
+ ### Home Assistant
389
+
390
+ ```yaml
391
+ sensor:
392
+ - platform: mqtt
393
+ name: "Mesh Node Count"
394
+ state_topic: "mesh/status/metrics"
395
+ value_template: "{{ value_json.nodeCount }}"
396
+
397
+ - platform: mqtt
398
+ name: "Mesh Free Heap"
399
+ state_topic: "mesh/status/metrics"
400
+ value_template: "{{ value_json.freeHeap }}"
401
+ unit_of_measurement: "bytes"
402
+ ```
403
+
404
+ ---
405
+
406
+ ## Troubleshooting
407
+
408
+ ### Broadcast OTA Issues
409
+
410
+ **Problem:** Nodes not receiving broadcast chunks
411
+
412
+ **Solutions:**
413
+ 1. Ensure `broadcasted=true` in offerOTA()
414
+ 2. Check mesh connectivity (all nodes must be connected)
415
+ 3. Verify nodes are running receiver code with `initOTAReceive()`
416
+ 4. Check for mesh congestion (add delays between chunks)
417
+
418
+ **Problem:** Out-of-sequence chunks
419
+
420
+ **Solution:** This is normal! Broadcast mode handles out-of-order delivery automatically.
421
+
422
+ ### MQTT Bridge Issues
423
+
424
+ **Problem:** No status published to MQTT
425
+
426
+ **Solutions:**
427
+ 1. Check MQTT broker connectivity
428
+ 2. Verify mqttClient.connected() returns true
429
+ 3. Check publish interval (default 30s)
430
+ 4. Enable Serial debug output
431
+
432
+ **Problem:** High MQTT traffic
433
+
434
+ **Solutions:**
435
+ 1. Increase publish interval (30s → 60s → 120s)
436
+ 2. Disable per-node publishing
437
+ 3. Disable topology publishing if mesh structure is static
438
+
439
+ ---
440
+
441
+ ## Migration Guide
442
+
443
+ ### From Phase 1 to Phase 2
444
+
445
+ **Step 1:** Update offerOTA() calls
446
+ ```cpp
447
+ // Phase 1
448
+ mesh.offerOTA(role, hardware, md5, parts, false, false, true);
449
+
450
+ // Phase 2 - just add broadcast flag
451
+ mesh.offerOTA(role, hardware, md5, parts, false, true, true);
452
+ // ^^^^
453
+ ```
454
+
455
+ **Step 2:** Add MQTT bridge (optional)
456
+ ```cpp
457
+ #include "examples/bridge/mqtt_status_bridge.hpp"
458
+
459
+ MqttStatusBridge* bridge = new MqttStatusBridge(mesh, mqttClient);
460
+ bridge->begin();
461
+ ```
462
+
463
+ ### Backward Compatibility
464
+
465
+ ✅ **Fully backward compatible**
466
+ - Broadcast defaults to `false` (unicast mode)
467
+ - Non-broadcast nodes work alongside broadcast nodes
468
+ - MQTT bridge is optional add-on
469
+ - All Phase 1 features continue to work
470
+
471
+ ---
472
+
473
+ ## Best Practices
474
+
475
+ ### When to Use Broadcast OTA
476
+
477
+ ✅ **Use broadcast mode when:**
478
+ - Mesh has 10+ nodes
479
+ - All nodes need same firmware
480
+ - Network bandwidth is limited
481
+ - Fast distribution is critical
482
+
483
+ ❌ **Don't use broadcast mode when:**
484
+ - Mesh has <5 nodes (unicast is sufficient)
485
+ - Different nodes need different firmware
486
+ - Targeting specific nodes only
487
+
488
+ ### When to Use MQTT Status Bridge
489
+
490
+ ✅ **Use MQTT bridge when:**
491
+ - Production deployment
492
+ - Remote monitoring required
493
+ - Integration with existing tools (Grafana, etc.)
494
+ - Automated alerting needed
495
+ - Cloud connectivity available
496
+
497
+ ❌ **Don't use MQTT bridge when:**
498
+ - Development/testing environment
499
+ - No external WiFi available
500
+ - No MQTT broker available
501
+ - Mesh is purely offline
502
+
503
+ ### Configuration Recommendations
504
+
505
+ **Small meshes (1-10 nodes):**
506
+ - Publish interval: 30 seconds
507
+ - Enable all features
508
+ - Enable per-node status
509
+
510
+ **Medium meshes (10-50 nodes):**
511
+ - Publish interval: 60 seconds
512
+ - Enable topology, metrics, alerts
513
+ - Disable per-node status
514
+
515
+ **Large meshes (50+ nodes):**
516
+ - Publish interval: 120 seconds
517
+ - Enable metrics and alerts only
518
+ - Disable topology and per-node
519
+
520
+ ---
521
+
522
+ ## Next Steps
523
+
524
+ ### Phase 3 Features (Future)
525
+ - Progressive rollout OTA (Option 1B)
526
+ - Real-time telemetry streams (Option 2C)
527
+ - Proactive alerting system
528
+ - Large-scale mesh support (100+ nodes)
529
+
530
+ ### Further Reading
531
+ - [PHASE2_IMPLEMENTATION.md](improvements/PHASE2_IMPLEMENTATION.md) - Technical details
532
+ - [examples/alteriom/phase2_features.ino](../examples/alteriom/phase2_features.ino) - Complete example
533
+ - [examples/bridge/mqtt_status_bridge_example.ino](../examples/bridge/mqtt_status_bridge_example.ino) - MQTT example
534
+ - [FEATURE_PROPOSALS.md](improvements/FEATURE_PROPOSALS.md) - All features overview
535
+
536
+ ---
537
+
538
+ **Questions?** Open an issue on GitHub with logs and configuration details.
539
+
540
+ **Status:** ✅ Phase 2 Complete - Production Ready
541
+ **Recommended For:** Medium to large mesh deployments (10-100+ nodes)
542
+ **Risk:** Low (backward compatible, well-tested)
543
+ **Value:** High (scalability + professional monitoring)