@alteriom/painlessmesh 1.8.14 → 1.9.0

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 (208) hide show
  1. package/BRIDGE_TO_INTERNET.md +229 -0
  2. package/CHANGELOG.md +89 -1
  3. package/CONTRIBUTING.md +79 -0
  4. package/README.md +70 -143
  5. package/docs/README.md +1 -0
  6. package/docs/api/shared-gateway.md +1207 -0
  7. package/docs/troubleshooting/common-issues.md +28 -0
  8. package/docs/troubleshooting/faq.md +113 -12
  9. package/examples/basic/test/simulator/CMakeLists.txt +40 -0
  10. package/examples/basic/test/simulator/README.md +149 -0
  11. package/examples/basic/test/simulator/firmware/basic_firmware.hpp +117 -0
  12. package/examples/basic/test/simulator/scenarios/basic_mesh_test.yaml +81 -0
  13. package/examples/bridge/bridge.ino +17 -4
  14. package/examples/bridge_failover/README.md +81 -0
  15. package/examples/bridge_failover/bridge_failover.ino +51 -6
  16. package/examples/sharedGateway/README.md +235 -0
  17. package/examples/{meshCommandNode → sharedGateway}/platformio.ini +3 -2
  18. package/examples/sharedGateway/sharedGateway.ino +303 -0
  19. package/library.json +3 -22
  20. package/library.properties +1 -1
  21. package/package.json +3 -3
  22. package/src/arduino/wifi.hpp +380 -13
  23. package/src/painlessmesh/gateway.hpp +2120 -0
  24. package/src/painlessmesh/mesh.hpp +1034 -6
  25. package/src/painlessmesh/message_tracker.hpp +311 -0
  26. package/src/painlessmesh/protocol.hpp +6 -0
  27. package/DOCUMENTATION_INDEX.md +0 -146
  28. package/docs/API_DESIGN_GUIDELINES.md +0 -414
  29. package/docs/ARDUINO_LIBRARY_MANAGER_SUBMISSION.md +0 -331
  30. package/docs/BOOLEAN_NAMING_CONVENTION.md +0 -235
  31. package/docs/BRIDGE_FAILOVER.md +0 -512
  32. package/docs/BRIDGE_HEALTH_MONITORING.md +0 -293
  33. package/docs/CHANNEL_SYNCHRONIZATION.md +0 -209
  34. package/docs/CREATE_MISSING_RELEASES.md +0 -321
  35. package/docs/DOCUMENTATION_MIGRATION_PLAN.md +0 -176
  36. package/docs/FAQ_VERSION_NUMBERS.md +0 -152
  37. package/docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md +0 -1062
  38. package/docs/MESH_TOPOLOGY_GUIDE.md +0 -992
  39. package/docs/MESH_TOPOLOGY_PROGRESS.md +0 -422
  40. package/docs/MQTT_BRIDGE_COMMANDS.md +0 -894
  41. package/docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md +0 -324
  42. package/docs/MQTT_COMMAND_SCHEMA_PROPOSAL.md +0 -576
  43. package/docs/MQTT_SCHEMA_COMPLIANCE.md +0 -340
  44. package/docs/MQTT_SCHEMA_PROPOSALS.md +0 -446
  45. package/docs/MQTT_SCHEMA_REVIEW.md +0 -690
  46. package/docs/OTA_COMMANDS_REFERENCE.md +0 -554
  47. package/docs/PHASE1_GUIDE.md +0 -349
  48. package/docs/PHASE2_GUIDE.md +0 -543
  49. package/docs/QUICK_REFERENCE_VERSIONING.md +0 -127
  50. package/docs/RELEASE_AGENT_SUMMARY.md +0 -386
  51. package/docs/SCHEMA_VALIDATION_CHECKLIST.md +0 -222
  52. package/docs/VERSION_MANAGEMENT.md +0 -213
  53. package/docs/archive/DOCUSAURUS_DEPLOYMENT.md +0 -166
  54. package/docs/archive/FEATURE_PROPOSALS.md +0 -337
  55. package/docs/archive/LIBRARY_JSON_FIX.md +0 -98
  56. package/docs/archive/LIBRARY_STRUCTURE_FIX.md +0 -215
  57. package/docs/archive/PHASE1_IMPLEMENTATION.md +0 -325
  58. package/docs/archive/PHASE2_IMPLEMENTATION.md +0 -567
  59. package/docs/archive/RELEASE_SUMMARY.md +0 -173
  60. package/docs/archive/SCONS_BUILD_FIX.md +0 -313
  61. package/docs/archive/TRIGGER_RELEASE.md +0 -280
  62. package/docs/archive/VECTOR_INCLUDE_FIX.md +0 -129
  63. package/docs/archive/ota-and-status-enhancements.md +0 -911
  64. package/docs/archive/ota-status-architecture-diagrams.md +0 -658
  65. package/docs/archive/ota-status-quick-reference.md +0 -284
  66. package/docs/design/.gitkeep +0 -1
  67. package/docs/design/STATION_CREDENTIALS_DESIGN.md +0 -182
  68. package/docs/development/ARDUINO_COMPLIANCE_SUMMARY.md +0 -71
  69. package/docs/development/CODE_REFACTORING_RECOMMENDATIONS.md +0 -1011
  70. package/docs/development/DOCKER_TESTING.md +0 -196
  71. package/docs/development/PLATFORMIO_USAGE.md +0 -180
  72. package/docs/development/TESTING_SUMMARY.md +0 -126
  73. package/docs/development/contributing.md +0 -301
  74. package/docs/development/documentation.md +0 -583
  75. package/docs/features/DIAGNOSTICS_API.md +0 -534
  76. package/docs/implementation/BRIDGE_ARCHITECTURE_IMPLEMENTATION.md +0 -340
  77. package/docs/implementation/BRIDGE_HEALTH_MONITORING_IMPLEMENTATION.md +0 -213
  78. package/docs/implementation/BRIDGE_STATUS_FEATURE.md +0 -635
  79. package/docs/implementation/DIAGNOSTICS_API_IMPLEMENTATION.md +0 -232
  80. package/docs/implementation/IMPLEMENTATION_COMPLETE.md +0 -228
  81. package/docs/implementation/IMPLEMENTATION_NTP_TIME_SYNC.md +0 -325
  82. package/docs/implementation/IMPLEMENTATION_SUMMARY.md +0 -316
  83. package/docs/implementation/MESSAGE_QUEUE_IMPLEMENTATION.md +0 -405
  84. package/docs/implementation/MULTI_BRIDGE_IMPLEMENTATION.md +0 -520
  85. package/docs/implementation/NTP_TIME_SYNC_FEATURE.md +0 -392
  86. package/docs/improvements/FUTURE_PROPOSALS.md +0 -1016
  87. package/docs/improvements/IMPLEMENTATION_HISTORY.md +0 -1091
  88. package/docs/improvements/OTA_STATUS_ENHANCEMENTS.md +0 -709
  89. package/docs/improvements/README.md +0 -212
  90. package/docs/internal/CUSTOM_AGENT_ANALYSIS.md +0 -391
  91. package/docs/internal/ISSUE_65_VERIFICATION.md +0 -947
  92. package/docs/internal/ISSUE_66_CLOSURE.md +0 -249
  93. package/docs/internal/ISSUE_66_STATUS.md +0 -316
  94. package/docs/internal/PR_SUMMARY.md +0 -315
  95. package/docs/internal/REVIEW_SUMMARY.md +0 -332
  96. package/docs/multi-bridge-setup.md +0 -1025
  97. package/docs/platformio-publishing.md +0 -255
  98. package/docs/platformio-setup-summary.md +0 -121
  99. package/docs/releases/ANNOUNCEMENT_v1.8.6.md +0 -63
  100. package/docs/releases/ANNOUNCEMENT_v1.8.7.md +0 -113
  101. package/docs/releases/BRIDGE_STATUS_SELF_REGISTRATION_FIX.md +0 -221
  102. package/docs/releases/FEATURE_HISTORY.md +0 -543
  103. package/docs/releases/GITHUB_RELEASE_v1.8.6.md +0 -71
  104. package/docs/releases/GITHUB_RELEASE_v1.8.7.md +0 -90
  105. package/docs/releases/PATCH_v1.7.2.md +0 -262
  106. package/docs/releases/PATCH_v1.7.3.md +0 -262
  107. package/docs/releases/PATCH_v1.7.4.md +0 -219
  108. package/docs/releases/PHASE1_SUMMARY.md +0 -246
  109. package/docs/releases/PHASE2_SUMMARY.md +0 -499
  110. package/docs/releases/PUBLISH_v1.8.0_INSTRUCTIONS.md +0 -163
  111. package/docs/releases/QUICK_START_RELEASES.md +0 -113
  112. package/docs/releases/RELEASE_CHECKLIST_1.8.10.md +0 -331
  113. package/docs/releases/RELEASE_CHECKLIST_1.8.9.md +0 -207
  114. package/docs/releases/RELEASE_CHECKLIST_v1.7.4.md +0 -253
  115. package/docs/releases/RELEASE_CHECKLIST_v1.7.5.md +0 -315
  116. package/docs/releases/RELEASE_CHECKLIST_v1.7.6.md +0 -389
  117. package/docs/releases/RELEASE_CHECKLIST_v1.8.0.md +0 -331
  118. package/docs/releases/RELEASE_CHECKLIST_v1.8.2.md +0 -309
  119. package/docs/releases/RELEASE_NOTES_1.7.0.md +0 -539
  120. package/docs/releases/RELEASE_NOTES_1.8.10.md +0 -239
  121. package/docs/releases/RELEASE_NOTES_1.8.9.md +0 -213
  122. package/docs/releases/RELEASE_NOTES_v1.8.0.md +0 -685
  123. package/docs/releases/RELEASE_NOTES_v1.8.1.md +0 -221
  124. package/docs/releases/RELEASE_NOTES_v1.8.2.md +0 -421
  125. package/docs/releases/RELEASE_NOTES_v1.8.3.md +0 -292
  126. package/docs/releases/RELEASE_NOTES_v1.8.4.md +0 -277
  127. package/docs/releases/RELEASE_NOTES_v1.8.6.md +0 -205
  128. package/docs/releases/RELEASE_NOTES_v1.8.7.md +0 -184
  129. package/docs/releases/RELEASE_PLAN_v1.7.6.md +0 -816
  130. package/docs/releases/RELEASE_SUMMARY_1.8.10.md +0 -193
  131. package/docs/releases/RELEASE_SUMMARY_v1.7.4.md +0 -276
  132. package/docs/releases/RELEASE_SUMMARY_v1.7.5.md +0 -322
  133. package/docs/releases/RELEASE_SUMMARY_v1.7.6.md +0 -436
  134. package/docs/releases/RELEASE_SUMMARY_v1.7.7.md +0 -391
  135. package/docs/releases/RELEASE_SUMMARY_v1.7.8.md +0 -523
  136. package/docs/releases/RELEASE_SUMMARY_v1.7.9.md +0 -542
  137. package/docs/troubleshooting/ARDUINO_IDE_VERSION_FIX_SUMMARY.md +0 -229
  138. package/docs/troubleshooting/ARDUINO_LIBRARY_NAME_FIX.md +0 -197
  139. package/docs/troubleshooting/CRASH_QUICK_REF.md +0 -93
  140. package/docs/troubleshooting/ESP32_C6_COMPATIBILITY.md +0 -157
  141. package/docs/troubleshooting/FREERTOS_ASSERTION_FAILURE.md +0 -288
  142. package/docs/troubleshooting/FREERTOS_FIX_IMPLEMENTATION.md +0 -267
  143. package/docs/troubleshooting/NPM_PUBLISHING_ISSUE_SUMMARY.md +0 -110
  144. package/docs/troubleshooting/PAINLESSMESH_V1.7.4_COMPILATION_ISSUES.md +0 -547
  145. package/docs/troubleshooting/QUICK_FIX_FREERTOS.md +0 -164
  146. package/docs/troubleshooting/SENSOR_NODE_CONNECTION_CRASH.md +0 -264
  147. package/docs/troubleshooting/station-reconnection-issues.md +0 -172
  148. package/docs/v1.7.7_MQTT_IMPROVEMENTS.md +0 -794
  149. package/docs/wiki/API-Reference.md +0 -246
  150. package/docs/wiki/Complete-Documentation.md +0 -123
  151. package/examples/alteriomImproved/alteriom_sensor_package.hpp +0 -224
  152. package/examples/alteriomImproved/improved_sensor_node.ino +0 -248
  153. package/examples/alteriomImproved/platformio.ini +0 -32
  154. package/examples/alteriomMetricsHealth/alteriom_sensor_package.hpp +0 -796
  155. package/examples/alteriomMetricsHealth/metrics_health_node.ino +0 -429
  156. package/examples/alteriomMetricsHealth/platformio.ini +0 -26
  157. package/examples/alteriomPhase1/alteriom_sensor_package.hpp +0 -224
  158. package/examples/alteriomPhase1/phase1_features.ino +0 -242
  159. package/examples/alteriomPhase1/platformio.ini +0 -26
  160. package/examples/alteriomPhase2/alteriom_sensor_package.hpp +0 -224
  161. package/examples/alteriomPhase2/phase2_features.ino +0 -186
  162. package/examples/alteriomPhase2/platformio.ini +0 -26
  163. package/examples/alteriomSensorNode/alteriom_sensor_node.ino +0 -186
  164. package/examples/alteriomSensorNode/alteriom_sensor_package.hpp +0 -1227
  165. package/examples/alteriomSensorNode/platformio.ini +0 -26
  166. package/examples/bridge/alteriom_sensor_package.hpp +0 -1170
  167. package/examples/bridge/bridge_health_monitoring_example.ino +0 -188
  168. package/examples/bridge/enhanced_mqtt_bridge.hpp +0 -610
  169. package/examples/bridge/enhanced_mqtt_bridge_example.ino +0 -226
  170. package/examples/bridge/mesh_event_publisher.hpp +0 -253
  171. package/examples/bridge/mesh_topology_reporter.hpp +0 -303
  172. package/examples/bridge/mqtt_command_bridge.hpp +0 -459
  173. package/examples/bridge/mqtt_status_bridge.hpp +0 -519
  174. package/examples/bridgeAwareSensorNode/alteriom_sensor_package.hpp +0 -1227
  175. package/examples/bridgeAwareSensorNode/bridgeAwareSensorNode.ino +0 -342
  176. package/examples/bridgeAwareSensorNode/platformio.ini +0 -26
  177. package/examples/diagnosticsExample/diagnosticsExample.ino +0 -171
  178. package/examples/diagnosticsExample/platformio.ini +0 -26
  179. package/examples/echoNode/echoNode.ino +0 -33
  180. package/examples/echoNode/platformio.ini +0 -26
  181. package/examples/meshCommandNode/alteriom_sensor_package.hpp +0 -235
  182. package/examples/meshCommandNode/meshCommandNode.ino +0 -265
  183. package/examples/mqttCommandBridge/alteriom_sensor_package.hpp +0 -235
  184. package/examples/mqttCommandBridge/mesh_event_publisher.hpp +0 -253
  185. package/examples/mqttCommandBridge/mesh_topology_reporter.hpp +0 -303
  186. package/examples/mqttCommandBridge/mqttCommandBridge.ino +0 -254
  187. package/examples/mqttCommandBridge/mqtt_command_bridge.hpp +0 -462
  188. package/examples/mqttCommandBridge/platformio.ini +0 -27
  189. package/examples/mqttStatusBridge/mqttStatusBridge.ino +0 -218
  190. package/examples/mqttStatusBridge/mqtt_status_bridge.hpp +0 -522
  191. package/examples/mqttStatusBridge/platformio.ini +0 -27
  192. package/examples/mqttTopologyTest/README.md +0 -467
  193. package/examples/mqttTopologyTest/mqttTopologyTest.ino +0 -754
  194. package/examples/mqttTopologyTest/platformio.ini +0 -27
  195. package/examples/multi_bridge/README.md +0 -346
  196. package/examples/multi_bridge/primary_bridge.ino +0 -96
  197. package/examples/multi_bridge/regular_node.ino +0 -141
  198. package/examples/multi_bridge/secondary_bridge.ino +0 -111
  199. package/examples/ntpTimeSyncBridge/alteriom_sensor_package.hpp +0 -1383
  200. package/examples/ntpTimeSyncBridge/ntpTimeSyncBridge.ino +0 -86
  201. package/examples/ntpTimeSyncNode/alteriom_sensor_package.hpp +0 -1383
  202. package/examples/ntpTimeSyncNode/ntpTimeSyncNode.ino +0 -109
  203. package/examples/queued_alarms/README.md +0 -390
  204. package/examples/queued_alarms/queued_alarms.ino +0 -265
  205. package/examples/routing_demo/README.md +0 -172
  206. package/examples/routing_demo/routing_demo.ino +0 -102
  207. package/examples/rtcIntegration/README.md +0 -294
  208. package/examples/rtcIntegration/rtcIntegration.ino +0 -210
@@ -1,284 +0,0 @@
1
- # OTA and Status Enhancements - Quick Reference
2
-
3
- **TL;DR:** Five options each for OTA distribution improvements and mesh status monitoring, with phased implementation recommendations.
4
-
5
- ---
6
-
7
- ## 🚀 OTA Distribution Options
8
-
9
- ### ⚡ Option 1A: Mesh-Wide Broadcast OTA ★★★★★ (RECOMMENDED - Phase 2)
10
- **What:** Broadcast firmware chunks to all nodes simultaneously
11
- **Speed:** Very Fast | **Memory:** +2-5KB | **Complexity:** Medium
12
- **Best For:** Medium to large meshes (10-100 nodes)
13
-
14
- ### 🛡️ Option 1B: Progressive Rollout OTA ★★★★☆ (RECOMMENDED - Phase 3)
15
- **What:** Deploy firmware in waves (canary → early adopters → all)
16
- **Speed:** Slow | **Memory:** +3-7KB | **Complexity:** High
17
- **Best For:** Production deployments requiring safety
18
-
19
- ### 🌐 Option 1C: Peer-to-Peer Distribution ★★★☆☆
20
- **What:** Updated nodes become distribution sources
21
- **Speed:** Very Fast | **Memory:** +200-500KB | **Complexity:** Very High
22
- **Best For:** Very large meshes (50+ nodes) with sufficient flash
23
-
24
- ### 🔗 Option 1D: MQTT-Integrated OTA ★★★★☆
25
- **What:** Standardized MQTT interface for OTA operations
26
- **Speed:** Medium | **Memory:** +5-10KB | **Complexity:** Medium
27
- **Best For:** Existing MQTT infrastructure
28
-
29
- ### 📦 Option 1E: Compressed OTA Transfer ★★★★★ (RECOMMENDED - Phase 1)
30
- **What:** Gzip compression for firmware transfers
31
- **Speed:** Fast | **Memory:** +4-8KB | **Complexity:** Low
32
- **Best For:** All deployments (40-60% bandwidth reduction)
33
-
34
- ---
35
-
36
- ## 📊 Mesh Status Options
37
-
38
- ### 📡 Option 2A: Enhanced StatusPackage ★★★★★ (RECOMMENDED - Phase 1)
39
- **What:** Extend Alteriom StatusPackage with comprehensive metrics
40
- **Overhead:** Low | **Memory:** +500 bytes | **Complexity:** Low
41
- **Best For:** Alteriom users, simple integration
42
-
43
- ### 🔍 Option 2B: Mesh Status Service ★★★★☆ (RECOMMENDED - Phase 2)
44
- **What:** Query-based status collection with aggregation
45
- **Overhead:** Medium | **Memory:** +2-4KB node, +10-20KB root | **Complexity:** Medium
46
- **Best For:** Centralized monitoring, on-demand queries
47
-
48
- ### 📈 Option 2C: Telemetry Stream ★★★★☆ (RECOMMENDED - Phase 3)
49
- **What:** Continuous low-bandwidth telemetry with delta encoding
50
- **Overhead:** Low | **Memory:** +1-2KB node, +50-100KB root | **Complexity:** High
51
- **Best For:** Real-time monitoring, large-scale deployments
52
-
53
- ### 🖥️ Option 2D: Health Dashboard ★★★☆☆
54
- **What:** Complete web-based monitoring solution
55
- **Overhead:** Medium | **Memory:** +50-100KB code, +200KB assets | **Complexity:** Very High
56
- **Best For:** User-facing applications, visual monitoring
57
-
58
- ### 🔗 Option 2E: MQTT Status Bridge ★★★★★ (RECOMMENDED - Phase 2)
59
- **What:** Publish mesh status to MQTT topics
60
- **Overhead:** Low | **Memory:** +5-8KB | **Complexity:** Low
61
- **Best For:** Cloud integration, existing monitoring tools
62
-
63
- ---
64
-
65
- ## 🎯 Recommended Implementation Path
66
-
67
- ### ✅ Phase 1: Quick Wins (3-4 weeks)
68
- ```
69
- Option 1E (Compressed OTA) + Option 2A (Enhanced StatusPackage)
70
- ```
71
- - Immediate 40-60% OTA speed improvement
72
- - Standardized status reporting
73
- - Low risk, high value
74
- - Builds on existing code
75
-
76
- ### ✅ Phase 2: Production Ready (6-8 weeks)
77
- ```
78
- Option 1A (Broadcast OTA) + Option 2E (MQTT Bridge)
79
- ```
80
- - Scalable OTA for larger meshes
81
- - Cloud monitoring integration
82
- - Enterprise features
83
- - Professional deployment
84
-
85
- ### ✅ Phase 3: Advanced (3-4 months)
86
- ```
87
- Option 1B (Progressive OTA) + Option 2C (Telemetry)
88
- ```
89
- - Zero-downtime updates
90
- - Real-time monitoring
91
- - Proactive alerting
92
- - Large-scale support
93
-
94
- ---
95
-
96
- ## 📋 Quick Comparison
97
-
98
- ### OTA Options at a Glance
99
-
100
- | Option | Speed | Memory | Complexity | When to Use |
101
- |--------|-------|--------|------------|-------------|
102
- | **1E: Compression** | ⭐⭐⭐⭐ | +4-8KB | ⭐⭐ | **Start here** - Universal benefit |
103
- | **1A: Broadcast** | ⭐⭐⭐⭐⭐ | +2-5KB | ⭐⭐⭐ | Medium-large mesh (10-100 nodes) |
104
- | **1B: Progressive** | ⭐⭐ | +3-7KB | ⭐⭐⭐⭐ | Production safety critical |
105
- | 1C: P2P | ⭐⭐⭐⭐⭐ | +200KB | ⭐⭐⭐⭐⭐ | Very large mesh (50+ nodes) |
106
- | 1D: MQTT | ⭐⭐⭐ | +5-10KB | ⭐⭐⭐ | Already using MQTT |
107
-
108
- ### Status Options at a Glance
109
-
110
- | Option | Real-time | Overhead | Complexity | When to Use |
111
- |--------|-----------|----------|------------|-------------|
112
- | **2A: Enhanced Pkg** | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ | **Start here** - Simple integration |
113
- | **2E: MQTT Bridge** | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ | Cloud monitoring needed |
114
- | **2B: Status Service** | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | Centralized control |
115
- | 2C: Telemetry | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ | Real-time critical |
116
- | 2D: Dashboard | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | User-facing app |
117
-
118
- ---
119
-
120
- ## 💡 Decision Guide
121
-
122
- ### Choose OTA Option Based On:
123
-
124
- **If mesh size < 10 nodes:**
125
- - Start with **1E (Compression)** only
126
- - Add **1A (Broadcast)** if frequent updates
127
-
128
- **If mesh size 10-50 nodes:**
129
- - Use **1E + 1A** (Compression + Broadcast)
130
- - Add **1B (Progressive)** for production
131
-
132
- **If mesh size > 50 nodes:**
133
- - Use **1E + 1C** (Compression + P2P)
134
- - Or **1E + 1A + 1B** if flash limited
135
-
136
- **If MQTT already used:**
137
- - Consider **1D (MQTT Bridge)** for integration
138
- - Combine with **1E** for speed
139
-
140
- ### Choose Status Option Based On:
141
-
142
- **For simple monitoring:**
143
- - **2A (Enhanced StatusPackage)** - easiest start
144
-
145
- **For cloud integration:**
146
- - **2E (MQTT Bridge)** - Grafana, InfluxDB, etc.
147
-
148
- **For real-time monitoring:**
149
- - **2C (Telemetry Stream)** - continuous updates
150
-
151
- **For user dashboards:**
152
- - **2D (Health Dashboard)** - visual interface
153
-
154
- **For API access:**
155
- - **2B (Status Service)** - RESTful queries
156
-
157
- ---
158
-
159
- ## 🔧 Implementation Examples
160
-
161
- ### Phase 1 Code (Compression + Enhanced Status)
162
-
163
- **Enable Compressed OTA:**
164
- ```cpp
165
- // In sender node
166
- #define PAINLESSMESH_ENABLE_OTA
167
- #define OTA_COMPRESSION_ENABLED
168
-
169
- mesh.initOTASend(firmwareCallback, OTA_PART_SIZE);
170
- mesh.offerOTA("sensor", "ESP32", md5, parts, false, false, true); // last param = compressed
171
- ```
172
-
173
- **Enhanced Status Reporting:**
174
- ```cpp
175
- #include "examples/alteriom/alteriom_sensor_package.hpp"
176
-
177
- alteriom::EnhancedStatusPackage status;
178
- status.uptime = millis() / 1000;
179
- status.freeMemory = ESP.getFreeHeap() / 1024;
180
- status.nodeCount = mesh.getNodeList().size();
181
- status.firmwareVersion = "v1.2.3";
182
-
183
- mesh.sendBroadcast(status.toJsonString());
184
- ```
185
-
186
- ### Phase 2 Code (Broadcast OTA + MQTT Status)
187
-
188
- **Broadcast OTA:**
189
- ```cpp
190
- // Sender enables broadcast mode
191
- mesh.offerOTA("sensor", "ESP32", md5, parts,
192
- false, // not forced
193
- true); // broadcast mode
194
-
195
- // Receivers auto-detect broadcast
196
- mesh.initOTAReceive("sensor", progressCallback);
197
- ```
198
-
199
- **MQTT Status Bridge:**
200
- ```cpp
201
- #include "examples/bridge/mqtt_status_bridge.hpp"
202
-
203
- MqttStatusBridge bridge(mesh, mqttClient);
204
- bridge.setPublishInterval(30000); // 30s
205
- bridge.enableTopology(true);
206
- bridge.enableMetrics(true);
207
- bridge.begin();
208
-
209
- // Status published to:
210
- // - mesh/status/nodes
211
- // - mesh/status/topology
212
- // - mesh/status/metrics
213
- ```
214
-
215
- ---
216
-
217
- ## 📈 Performance Expectations
218
-
219
- ### OTA Distribution Time (100KB firmware, 10 nodes)
220
-
221
- | Method | Time | Bandwidth | Memory |
222
- |--------|------|-----------|--------|
223
- | Current | ~60s | 1MB | +1KB |
224
- | + Compression (1E) | ~35s | 600KB | +5KB |
225
- | + Broadcast (1A) | ~25s | 600KB | +7KB |
226
- | + P2P (1C) | ~15s | 400KB | +205KB |
227
-
228
- ### Status Update Overhead
229
-
230
- | Method | Frequency | Per Update | Total/hour |
231
- |--------|-----------|------------|------------|
232
- | Manual | On-demand | ~200B | Varies |
233
- | Enhanced Pkg (2A) | 5 min | ~500B | ~6KB |
234
- | MQTT Bridge (2E) | 30s | ~800B | ~96KB |
235
- | Telemetry (2C) | 60s | ~64B | ~3.8KB |
236
-
237
- ---
238
-
239
- ## ⚠️ Common Pitfalls
240
-
241
- ### OTA Implementation
242
- - ❌ Don't forget to include OTA support in updated firmware (will brick nodes)
243
- - ❌ Don't skip MD5 validation (corrupted firmware)
244
- - ❌ Don't update all nodes at once without testing (mesh failure)
245
- - ✅ DO test OTA on single node first
246
- - ✅ DO implement rollback mechanism
247
- - ✅ DO use progressive rollout for production
248
-
249
- ### Status Monitoring
250
- - ❌ Don't poll status too frequently (network congestion)
251
- - ❌ Don't ignore memory warnings (node crashes)
252
- - ❌ Don't assume all nodes respond (timeouts happen)
253
- - ✅ DO use appropriate update intervals (30-60s typically)
254
- - ✅ DO implement timeout handling
255
- - ✅ DO cache status at collection point
256
-
257
- ---
258
-
259
- ## 🔗 Related Resources
260
-
261
- - **Full Proposal:** `docs/improvements/ota-and-status-enhancements.md`
262
- - **Current OTA Example:** `examples/otaSender/otaSender.ino`
263
- - **Metrics System:** `src/painlessmesh/metrics.hpp`
264
- - **Alteriom Packages:** `examples/alteriom/alteriom_sensor_package.hpp`
265
- - **MQTT Bridge:** `examples/mqttBridge/mqttBridge.ino`
266
-
267
- ---
268
-
269
- ## 🤝 Contributing
270
-
271
- To implement any of these features:
272
-
273
- 1. Review full proposal document
274
- 2. Create design doc for specific option
275
- 3. Submit RFC to team
276
- 4. Implement with tests
277
- 5. Create examples
278
- 6. Update documentation
279
-
280
- ---
281
-
282
- **Quick Start:** Begin with **Phase 1** (Option 1E + 2A) for immediate benefits with minimal risk.
283
-
284
- **Questions?** See full proposal or open a GitHub issue.
@@ -1 +0,0 @@
1
- Created
@@ -1,182 +0,0 @@
1
- # Station Credentials Design Rationale
2
-
3
- ## Question
4
-
5
- Why does `mesh.init()` require a separate `mesh.stationManual()` call to connect to a router, instead of accepting station credentials directly?
6
-
7
- ## Answer: Multiple Valid Approaches
8
-
9
- The library now supports **three approaches** for connecting a bridge node to a router, each with different use cases:
10
-
11
- ### 1. Separate stationManual() Call (Original Design)
12
-
13
- ```cpp
14
- mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT, WIFI_AP_STA, 6);
15
- mesh.stationManual(STATION_SSID, STATION_PASSWORD);
16
- mesh.setRoot(true);
17
- mesh.setContainsRoot(true);
18
- ```
19
-
20
- **When to use:**
21
- - Maximum flexibility - can change router connection without reinitializing mesh
22
- - Dynamic router selection at runtime
23
- - Need to call `setHostname()` or other WiFi configuration between init and connection
24
- - Following existing examples or legacy code
25
-
26
- **Advantages:**
27
- - Separation of concerns: mesh setup vs router connection
28
- - Can reconnect to different routers without mesh reinitialization
29
- - More control over connection timing and error handling
30
-
31
- ### 2. Optional Parameters in init() (New Convenience Feature)
32
-
33
- ```cpp
34
- mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT,
35
- WIFI_AP_STA, 6, 0, MAX_CONN,
36
- STATION_SSID, STATION_PASSWORD); // Optional parameters
37
- mesh.setRoot(true);
38
- mesh.setContainsRoot(true);
39
- ```
40
-
41
- **When to use:**
42
- - Simple bridge setup with known credentials
43
- - Static configuration (credentials won't change)
44
- - Want slightly more concise code
45
- - Don't need hostname or other WiFi customization
46
-
47
- **Advantages:**
48
- - One line instead of two for basic bridge setup
49
- - All connection parameters in one place
50
- - Still maintains full flexibility of other options
51
-
52
- ### 3. initAsBridge() Method (Recommended for New Projects)
53
-
54
- ```cpp
55
- mesh.initAsBridge(MESH_PREFIX, MESH_PASSWORD,
56
- STATION_SSID, STATION_PASSWORD,
57
- &userScheduler, MESH_PORT);
58
- ```
59
-
60
- **When to use:**
61
- - New bridge implementations (recommended)
62
- - Want automatic channel detection
63
- - Need simplest possible setup
64
- - Following modern best practices
65
-
66
- **Advantages:**
67
- - **Automatic channel detection** - no manual channel configuration needed
68
- - Automatically sets node as root
69
- - Maintains router connection through channel switches
70
- - Broadcasts bridge status (Type 610) automatically
71
- - Comprehensive initialization in one call
72
-
73
- ## Design Rationale for Original Separation
74
-
75
- The original design separated `init()` and `stationManual()` for good architectural reasons:
76
-
77
- ### 1. Separation of Concerns
78
-
79
- **Mesh Setup (`init()`):**
80
- - Creates mesh network (AP mode)
81
- - Sets up mesh routing and protocol
82
- - Configures mesh-specific parameters
83
- - Lifetime: typically never changes
84
-
85
- **Router Connection (`stationManual()`):**
86
- - Connects to external WiFi (STA mode)
87
- - Different lifecycle - may connect/disconnect/change
88
- - Network-specific credentials and settings
89
- - Can be reconfigured at runtime
90
-
91
- This separation allows clean code organization and different lifecycles for each concern.
92
-
93
- ### 2. Not All Nodes Need Router Connection
94
-
95
- In a typical mesh network:
96
- - **1 bridge node**: Needs router connection (AP+STA mode)
97
- - **N regular nodes**: Mesh only (AP mode, or AP+STA for mesh connections)
98
-
99
- Regular nodes use:
100
- ```cpp
101
- mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT, WIFI_AP_STA);
102
- // No stationManual() call - not a bridge
103
- ```
104
-
105
- If `init()` always required station credentials, it would be confusing for regular nodes.
106
-
107
- ### 3. Dynamic Router Switching
108
-
109
- Some advanced use cases require changing router connections at runtime:
110
-
111
- ```cpp
112
- // Initial setup
113
- mesh.init(...);
114
- mesh.stationManual("Router1", "pass1");
115
-
116
- // Later, switch to different router
117
- mesh.stationManual("Router2", "pass2");
118
-
119
- // Or respond to failover
120
- void onRouterDisconnect() {
121
- mesh.stationManual(backupSSID, backupPassword);
122
- }
123
- ```
124
-
125
- With station credentials baked into `init()`, this flexibility would be lost.
126
-
127
- ### 4. Additional WiFi Configuration
128
-
129
- Many users need to configure WiFi settings between initialization and connection:
130
-
131
- ```cpp
132
- mesh.init(...);
133
- mesh.setHostname("MESH_BRIDGE"); // Must be before stationManual()
134
- mesh.stationManual(...);
135
- ```
136
-
137
- The separation provides a natural place for these configurations.
138
-
139
- ### 5. Error Handling and Retry Logic
140
-
141
- Separating the calls allows better error handling:
142
-
143
- ```cpp
144
- mesh.init(...); // This typically doesn't fail
145
-
146
- // Retry router connection with backoff
147
- for (int retry = 0; retry < 3; retry++) {
148
- if (tryStationConnect()) break;
149
- delay(1000 * (retry + 1));
150
- }
151
- ```
152
-
153
- ## Comparison Table
154
-
155
- | Approach | Setup Complexity | Flexibility | Channel Detection | Best For |
156
- |----------|-----------------|-------------|-------------------|----------|
157
- | **stationManual()** | Medium | Highest | Manual | Dynamic configs, legacy code |
158
- | **init() params** | Low-Medium | High | Manual | Simple static bridges |
159
- | **initAsBridge()** | Lowest | Medium | Automatic | New projects, recommended |
160
-
161
- ## Recommendation
162
-
163
- **For new projects:** Use `initAsBridge()` - it's the modern, recommended approach with automatic channel detection.
164
-
165
- **For existing projects:** The original `init()` + `stationManual()` pattern remains fully supported and appropriate.
166
-
167
- **For simple bridges:** The new optional parameters in `init()` provide a middle ground with good flexibility.
168
-
169
- All three approaches are valid and will continue to be supported. Choose based on your specific needs.
170
-
171
- ## Implementation Note
172
-
173
- When station credentials are passed to `init()`, the implementation internally calls `stationManual()` after mesh initialization. This maintains consistency and code reuse while providing convenience.
174
-
175
- ```cpp
176
- // Inside init() implementation
177
- if (!stationSSID.empty() && (connectMode & WIFI_STA)) {
178
- this->stationManual(stationSSID, stationPassword);
179
- }
180
- ```
181
-
182
- This design ensures all three approaches use the same underlying connection logic.
@@ -1,71 +0,0 @@
1
- # Arduino Library Manager Compliance - Summary of Changes
2
-
3
- ## Issues Fixed
4
-
5
- ### 1. Library Name Conflict (Fixed ✅)
6
- - **Problem**: Library name "Alteriom painlessMesh" contained spaces and was not unique
7
- - **Solution**: Changed to "AlteriomPainlessMesh" (no spaces, unique identifier)
8
- - **Files Modified**: `library.properties`
9
-
10
- ### 2. Missing Primary Header File (Fixed ✅)
11
- - **Problem**: No header file matching the library name
12
- - **Solution**: Created `src/AlteriomPainlessMesh.h` as the primary include
13
- - **Files Created**: `src/AlteriomPainlessMesh.h`
14
- - **Files Modified**: `library.properties` (updated includes field)
15
-
16
- ### 3. Example Sketch Naming Mismatch (Fixed ✅)
17
- - **Problem**: Example folder `alteriom` didn't have a matching `alteriom.ino` file
18
- - **Solution**: Created `examples/alteriom/alteriom.ino` with proper header inclusion
19
- - **Files Created**: `examples/alteriom/alteriom.ino`
20
-
21
- ### 4. Test Sketches in Wrong Location (Fixed ✅)
22
- - **Problem**: Arduino sketches found in `test/` directory (not allowed by Library Manager)
23
- - **Solution**: Moved problematic sketches to `extras/test-sketches/`
24
- - **Directories Moved**:
25
- - `test/issue_521/` → `extras/test-sketches/issue_521/`
26
- - `test/performance/` → `extras/test-sketches/performance/`
27
- - `test/startHere/` → `extras/test-sketches/startHere/`
28
- - `test/start_stop/` → `extras/test-sketches/start_stop/`
29
- - `test/wifi/` → `extras/test-sketches/wifi/`
30
-
31
- ## Current Compliance Status
32
-
33
- ✅ **Library Properties**: All required fields present and valid
34
- ✅ **Naming Convention**: Library name "AlteriomPainlessMesh" is unique and compliant
35
- ✅ **Header File**: Primary header `src/AlteriomPainlessMesh.h` exists and matches library name
36
- ✅ **Examples Structure**: All example folders have matching .ino files
37
- ✅ **Directory Structure**: No Arduino sketches in prohibited locations
38
-
39
- ## Files Created/Modified
40
-
41
- ### New Files
42
- - `src/AlteriomPainlessMesh.h` - Primary library header with comprehensive documentation
43
- - `examples/alteriom/alteriom.ino` - Primary example matching folder name
44
- - `extras/test-sketches/` - Directory for test sketches (moved from test/)
45
-
46
- ### Modified Files
47
- - `library.properties` - Updated name, includes, and description for compliance
48
-
49
- ## Validation Results
50
-
51
- The custom validation script confirms all major Arduino Library Manager requirements are met:
52
-
53
- ```
54
- 🎉 All checks passed! Library should be compliant.
55
- ```
56
-
57
- ## Next Steps
58
-
59
- 1. **Optional**: Run official Arduino Lint tool when available for final verification
60
- 2. **Submit**: Library is ready for Arduino Library Manager submission
61
- 3. **Monitor**: Check for any additional feedback from Arduino Library Manager review process
62
-
63
- ## Documentation Integration
64
-
65
- The library now includes:
66
- - Complete Docsify documentation website in `docsify-site/`
67
- - Automated Doxygen API documentation generation
68
- - GitHub Actions workflow for documentation deployment
69
- - Embedded API documentation viewing within the website
70
-
71
- All changes maintain compatibility with existing painlessMesh functionality while adding Alteriom-specific enhancements and ensuring Arduino Library Manager compliance.