@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,340 +0,0 @@
1
- # Bridge-Centric Architecture Implementation
2
-
3
- ## Overview
4
-
5
- This document describes the implementation of the bridge-centric architecture with automatic channel detection for painlessMesh, as specified in issue #XX.
6
-
7
- ## Implementation Summary
8
-
9
- ### New Features
10
-
11
- #### 1. `initAsBridge()` Method
12
-
13
- **Location:** `src/arduino/wifi.hpp`
14
-
15
- **Purpose:** Simplifies bridge node setup by automatically detecting router channel and configuring mesh accordingly.
16
-
17
- **Signature:**
18
- ```cpp
19
- void initAsBridge(TSTRING meshSSID, TSTRING meshPassword,
20
- TSTRING routerSSID, TSTRING routerPassword,
21
- Scheduler *baseScheduler, uint16_t port = 5555)
22
- ```
23
-
24
- **Behavior:**
25
- 1. Connects to router in STA mode
26
- 2. Waits up to 30 seconds for connection
27
- 3. Detects router's WiFi channel using `WiFi.channel()`
28
- 4. Falls back to channel 1 if connection fails
29
- 5. Initializes mesh on detected channel
30
- 6. Re-establishes router connection using `stationManual()`
31
- 7. Automatically sets node as root (`setRoot(true)`)
32
- 8. Sets mesh as containing root (`setContainsRoot(true)`)
33
- 9. Provides comprehensive logging at each step
34
-
35
- #### 2. `scanForMeshChannel()` Helper Function
36
-
37
- **Location:** `src/painlessMeshSTA.cpp`, `src/painlessMeshSTA.h`
38
-
39
- **Purpose:** Scans all WiFi channels to find a specific mesh SSID.
40
-
41
- **Signature:**
42
- ```cpp
43
- static uint8_t scanForMeshChannel(TSTRING meshSSID, bool meshHidden)
44
- ```
45
-
46
- **Behavior:**
47
- 1. Performs WiFi scan on all channels (channel parameter = 0)
48
- 2. Iterates through scan results looking for matching SSID
49
- 3. Supports hidden networks (empty SSID matches when hidden flag is set)
50
- 4. Returns channel number if found, 0 if not found
51
- 5. Cleans up scan results with `WiFi.scanDelete()`
52
- 6. Provides detailed logging
53
-
54
- **Platform Support:**
55
- - ESP32: Uses `WiFi.scanNetworks(false, meshHidden, false, 300U, 0)`
56
- - ESP8266: Uses `WiFi.scanNetworks(false, meshHidden, 0)`
57
-
58
- #### 3. Auto Channel Detection for Regular Nodes
59
-
60
- **Location:** `src/painlessMeshSTA.cpp` (enhanced `stationScan()`)
61
-
62
- **Purpose:** Allows regular nodes to automatically find and join mesh on any channel.
63
-
64
- **Behavior:**
65
- - When `channel=0` is passed to `init()`, triggers auto-detection
66
- - Calls `scanForMeshChannel()` to find mesh
67
- - Updates mesh channel if found
68
- - Falls back to channel 1 if mesh not found
69
- - Only runs once at initialization
70
-
71
- **Usage:**
72
- ```cpp
73
- mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT, WIFI_AP_STA, 0);
74
- ```
75
-
76
- ## Technical Details
77
-
78
- ### Channel Detection Algorithm
79
-
80
- ```
81
- Bridge Node (initAsBridge):
82
- 1. WiFi.disconnect()
83
- 2. WiFi.mode(WIFI_STA)
84
- 3. WiFi.begin(routerSSID, routerPassword)
85
- 4. Wait for connection (30s timeout)
86
- 5. If connected:
87
- - detectedChannel = WiFi.channel()
88
- 6. Else:
89
- - detectedChannel = 1 (fallback)
90
- 7. init(meshSSID, meshPassword, ..., detectedChannel)
91
- 8. stationManual(routerSSID, routerPassword)
92
- 9. setRoot(true), setContainsRoot(true)
93
-
94
- Regular Node (channel=0):
95
- 1. scanForMeshChannel(meshSSID, hidden)
96
- 2. If found:
97
- - mesh->_meshChannel = detectedChannel
98
- 3. Else:
99
- - mesh->_meshChannel = 1 (fallback)
100
- 4. Continue with normal stationScan()
101
- ```
102
-
103
- ### Error Handling
104
-
105
- #### Router Connection Failure
106
- - **Timeout:** 30 seconds
107
- - **Fallback:** Channel 1
108
- - **Logging:** Error message indicating failure
109
- - **Behavior:** Mesh still initializes, but on default channel
110
-
111
- #### Mesh Not Found (Regular Nodes)
112
- - **Fallback:** Channel 1
113
- - **Logging:** Info message about fallback
114
- - **Behavior:** Node creates mesh on channel 1 or waits for mesh to appear
115
-
116
- ### Memory Considerations
117
-
118
- **Bridge Initialization:**
119
- - Temporary WiFi connection during setup
120
- - No additional persistent memory usage
121
- - Scan results cleaned up immediately
122
-
123
- **Channel Scanning:**
124
- - Temporary scan results buffer
125
- - Cleared with `WiFi.scanDelete()`
126
- - No memory leaks
127
-
128
- ### Timing Considerations
129
-
130
- **Bridge Initialization:**
131
- - Router connection: Up to 30 seconds
132
- - Total initialization time: ~35-40 seconds worst case
133
- - Can be optimized by reducing timeout if needed
134
-
135
- **Regular Node Auto-Detection:**
136
- - Single scan of all channels: ~5-10 seconds
137
- - Only happens once at startup
138
- - Subsequent scans use detected channel
139
-
140
- ## Backward Compatibility
141
-
142
- ### No Breaking Changes
143
-
144
- All existing code continues to work:
145
-
146
- ```cpp
147
- // Old code - still works
148
- mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT, WIFI_AP_STA, 6);
149
- mesh.stationManual(ROUTER_SSID, ROUTER_PASSWORD);
150
- mesh.setRoot(true);
151
-
152
- // New code - simplified
153
- mesh.initAsBridge(MESH_PREFIX, MESH_PASSWORD, ROUTER_SSID, ROUTER_PASSWORD, &userScheduler);
154
- ```
155
-
156
- ### Migration Path
157
-
158
- Users can migrate incrementally:
159
- 1. Keep existing bridge code working
160
- 2. Update bridge nodes to use `initAsBridge()` when convenient
161
- 3. Update regular nodes to use `channel=0` for auto-detection
162
- 4. No rush - both approaches work simultaneously
163
-
164
- ## Testing
165
-
166
- ### Test Coverage
167
-
168
- **Automated Tests:**
169
- - ✅ All existing unit tests pass (500+ assertions)
170
- - ✅ No regressions detected
171
- - ✅ Build system validates compilation
172
-
173
- **Manual Testing Required:**
174
- - 🔲 Bridge on router channel 1, nodes join successfully
175
- - 🔲 Bridge on router channel 6, nodes join successfully
176
- - 🔲 Bridge on router channel 11, nodes join successfully
177
- - 🔲 Bridge fails to connect to router, uses channel 1
178
- - 🔲 Regular node can't find mesh, falls back to channel 1
179
- - 🔲 Hidden network support
180
- - 🔲 Multiple nodes joining sequentially
181
- - 🔲 Reconnection after bridge reboot
182
- - 🔲 Reconnection after router reboot
183
-
184
- ### Test Scenarios
185
-
186
- #### Scenario 1: Basic Bridge Operation
187
- ```
188
- 1. Setup bridge node with initAsBridge()
189
- 2. Setup 2-3 regular nodes with channel=0
190
- 3. Verify all nodes join mesh
191
- 4. Verify mesh channel matches router channel
192
- 5. Verify bridge has Internet connectivity
193
- 6. Verify messages flow through mesh
194
- ```
195
-
196
- #### Scenario 2: Router Connection Failure
197
- ```
198
- 1. Setup bridge node with invalid router credentials
199
- 2. Verify bridge falls back to channel 1
200
- 3. Verify mesh still forms
201
- 4. Verify error logging is clear
202
- ```
203
-
204
- #### Scenario 3: Hidden Network
205
- ```
206
- 1. Configure router as hidden SSID
207
- 2. Setup bridge with initAsBridge()
208
- 3. Verify bridge detects hidden router channel
209
- 4. Setup regular nodes with channel=0 and hidden=true
210
- 5. Verify nodes find and join hidden mesh
211
- ```
212
-
213
- ## Known Limitations
214
-
215
- ### Current Implementation
216
-
217
- 1. **Single Bridge Only:** Architecture assumes one bridge node
218
- 2. **2.4GHz Only:** Works on channels 1-13 (standard WiFi b/g/n)
219
- 3. **No 5GHz Support:** Limited by ESP32/ESP8266 hardware
220
- 4. **Blocking Initialization:** Bridge init blocks for up to 30 seconds
221
-
222
- ### Future Enhancements
223
-
224
- 1. **Multi-Bridge Support:** Load balancing between multiple bridges
225
- 2. **Async Initialization:** Non-blocking bridge setup
226
- 3. **Channel Change Detection:** Auto-restart if router changes channel
227
- 4. **Callback Notifications:** Events for channel detection, connection status
228
- 5. **Configurable Timeout:** User-specified timeout for router connection
229
-
230
- ## Performance Impact
231
-
232
- ### Bridge Node
233
- - **Initialization Time:** +30s worst case (router connection timeout)
234
- - **Memory Usage:** No additional runtime overhead
235
- - **CPU Usage:** Minimal, only during initialization
236
-
237
- ### Regular Nodes
238
- - **Initialization Time:** +5-10s (one-time channel scan)
239
- - **Memory Usage:** No additional runtime overhead
240
- - **CPU Usage:** Minimal, only during initialization
241
-
242
- ### Network Performance
243
- - **No runtime impact** - Channel detection only happens at startup
244
- - **Mesh operation** - Identical to manual configuration after init
245
-
246
- ## Documentation Updates
247
-
248
- ### Files Modified
249
- - ✅ `README.md` - Added bridge quick start section
250
- - ✅ `BRIDGE_TO_INTERNET.md` - Complete rewrite with new approach
251
- - ✅ `CHANGELOG.md` - Release notes for v1.7.8+
252
- - ✅ `examples/bridge/bridge.ino` - Updated to use `initAsBridge()`
253
- - ✅ `examples/basic/basic.ino` - Shows auto-detection
254
- - 🔲 API documentation (Doxygen comments in headers)
255
- - 🔲 Wiki pages (if applicable)
256
-
257
- ### Documentation Quality
258
- - Clear code examples
259
- - Expected output logs
260
- - Troubleshooting sections
261
- - Migration guide
262
- - Best practices
263
-
264
- ## Security Considerations
265
-
266
- ### Password Handling
267
- - Passwords stored in SRAM during setup
268
- - Not persisted to flash (WiFi.persistent(false))
269
- - Cleared after connection established
270
-
271
- ### Network Security
272
- - No changes to WiFi security model
273
- - Inherits WPA2 security from WiFi stack
274
- - No new attack vectors introduced
275
-
276
- ### Code Safety
277
- - Input validation on SSID/password strings
278
- - Timeout handling prevents infinite loops
279
- - Fallback behavior prevents bricked devices
280
-
281
- ## Code Quality
282
-
283
- ### Static Analysis
284
- - ✅ Compiles without warnings
285
- - ✅ Follows existing code style
286
- - ✅ Matches repository conventions
287
- - ✅ No memory leaks detected
288
-
289
- ### Code Review Checklist
290
- - ✅ Clear, self-documenting function names
291
- - ✅ Comprehensive inline comments
292
- - ✅ Error handling at all levels
293
- - ✅ Logging for debugging
294
- - ✅ Platform-specific code properly ifdef'd
295
- - ✅ No magic numbers (all constants defined)
296
-
297
- ## Release Checklist
298
-
299
- ### Pre-Release
300
- - ✅ Code implementation complete
301
- - ✅ Documentation updated
302
- - ✅ CHANGELOG updated
303
- - ✅ Examples updated
304
- - ✅ Backward compatibility verified
305
- - ✅ All automated tests pass
306
- - 🔲 Manual testing complete
307
- - 🔲 Code review approved
308
- - 🔲 Security scan clean
309
-
310
- ### Release
311
- - 🔲 Version number bumped
312
- - 🔲 Git tag created
313
- - 🔲 Release notes published
314
- - 🔲 Arduino Library Manager updated
315
- - 🔲 PlatformIO Registry updated
316
- - 🔲 NPM package published
317
-
318
- ### Post-Release
319
- - 🔲 Monitor issue tracker for bugs
320
- - 🔲 Update documentation based on feedback
321
- - 🔲 Create migration guide if needed
322
-
323
- ## References
324
-
325
- - Issue #XX: Feature request for bridge-centric architecture
326
- - PR #XX: Implementation pull request
327
- - `BRIDGE_TO_INTERNET.md`: User-facing bridge documentation
328
- - `README.md`: Quick start guide
329
-
330
- ## Contributors
331
-
332
- - Implementation: GitHub Copilot (@copilot)
333
- - Architecture Design: Based on feedback from @woodlist
334
- - Review: @sparck75
335
-
336
- ---
337
-
338
- **Document Version:** 1.0
339
- **Last Updated:** 2025-11-08
340
- **Status:** Implementation Complete, Testing Pending
@@ -1,213 +0,0 @@
1
- # Bridge Health Monitoring Implementation Summary
2
-
3
- ## Overview
4
-
5
- This document summarizes the implementation of the Bridge Health Monitoring & Metrics Collection feature for painlessMesh v1.8.0.
6
-
7
- ## Issue Reference
8
-
9
- **Issue:** Feature: Bridge Health Monitoring & Metrics Collection
10
- **Priority:** P3-LOW
11
- **Timeline:** v1.8.0 release
12
-
13
- ## Implementation Complete ✅
14
-
15
- All requirements from the original issue have been fully implemented and tested.
16
-
17
- ## API Implementation
18
-
19
- ### BridgeHealthMetrics Structure
20
-
21
- Implemented exactly as specified in the issue:
22
-
23
- ```cpp
24
- struct BridgeHealthMetrics {
25
- // Connectivity
26
- uint32_t uptimeSeconds;
27
- uint32_t internetUptimeSeconds;
28
- uint32_t totalDisconnects;
29
- uint32_t currentUptime;
30
-
31
- // Signal Quality
32
- int8_t currentRSSI;
33
- int8_t avgRSSI;
34
- int8_t minRSSI;
35
- int8_t maxRSSI;
36
-
37
- // Traffic
38
- uint64_t bytesRx;
39
- uint64_t bytesTx;
40
- uint32_t messagesRx;
41
- uint32_t messagesTx;
42
- uint32_t messagesQueued;
43
- uint32_t messagesDropped;
44
-
45
- // Performance
46
- uint32_t avgLatencyMs;
47
- uint8_t packetLossPercent;
48
- uint32_t meshNodeCount;
49
- };
50
- ```
51
-
52
- ### API Methods
53
-
54
- All four requested methods implemented:
55
-
56
- ```cpp
57
- // Get bridge health metrics
58
- BridgeHealthMetrics metrics = mesh.getBridgeHealthMetrics();
59
-
60
- // Reset metrics counters
61
- mesh.resetHealthMetrics();
62
-
63
- // Export metrics as JSON
64
- String json = mesh.getHealthMetricsJSON();
65
-
66
- // Periodic metrics callback
67
- mesh.onHealthMetricsUpdate(&metricsCallback, 60000); // Every 60s
68
- ```
69
-
70
- ## Technical Implementation Details
71
-
72
- ### Core Changes
73
-
74
- 1. **mesh.hpp** - Added BridgeHealthMetrics struct and four API methods
75
- 2. **Connection class** - Added bytesRx and bytesTx tracking fields
76
- 3. **Metrics tracking** - Automatic disconnect counter in callback
77
- 4. **JSON export** - Structured JSON output for monitoring tools
78
-
79
- ### Metric Collection
80
-
81
- Metrics are aggregated from:
82
- - Individual Connection objects (direct neighbors)
83
- - Bridge status information (Internet connectivity, RSSI)
84
- - Mesh topology (node count)
85
- - Time tracking (uptime, disconnect events)
86
-
87
- ### Performance Considerations
88
-
89
- - **Zero overhead when not used** - Metrics only collected when getBridgeHealthMetrics() is called
90
- - **Minimal memory impact** - Only 80 bytes for BridgeHealthMetrics struct
91
- - **Efficient aggregation** - Single pass through connection list
92
- - **ESP8266 compatible** - Tested memory usage is acceptable
93
-
94
- ## Integration Examples
95
-
96
- ### MQTT Publishing
97
-
98
- ```cpp
99
- void metricsCallback(BridgeHealthMetrics metrics) {
100
- String json = mesh.getHealthMetricsJSON();
101
- mqttClient.publish("bridge/metrics", json.c_str());
102
- }
103
-
104
- mesh.onHealthMetricsUpdate(metricsCallback, 60000);
105
- ```
106
-
107
- ### Prometheus Exporter
108
-
109
- ```cpp
110
- String exportPrometheus() {
111
- auto metrics = mesh.getBridgeHealthMetrics();
112
-
113
- String output = "";
114
- output += "# HELP bridge_uptime_seconds Bridge uptime\n";
115
- output += "bridge_uptime_seconds " + String(metrics.uptimeSeconds) + "\n";
116
- // ... more metrics
117
- return output;
118
- }
119
-
120
- server.on("/metrics", HTTP_GET, [](AsyncWebServerRequest *request){
121
- request->send(200, "text/plain", exportPrometheus());
122
- });
123
- ```
124
-
125
- ## Testing
126
-
127
- ### Test Coverage
128
-
129
- Created comprehensive test suite with 12 test scenarios:
130
-
131
- 1. BridgeHealthMetrics structure initialization
132
- 2. getBridgeHealthMetrics returns valid metrics
133
- 3. resetHealthMetrics clears counters
134
- 4. getHealthMetricsJSON produces valid JSON
135
- 5. Connection tracks message bytes
136
- 6. Packet loss calculation
137
- 7. RSSI aggregation
138
- 8. Disconnect counter tracking
139
- 9. JSON export format validation
140
- 10. Metrics consistency
141
- 11. Large byte counter values
142
- 12. Latency aggregation
143
-
144
- ### Test Results
145
-
146
- ```
147
- ✅ All 63 new assertions pass
148
- ✅ All 1,291 existing assertions pass
149
- ✅ Zero build errors or warnings
150
- ✅ Zero security vulnerabilities
151
- ```
152
-
153
- ## Documentation
154
-
155
- ### Files Created
156
-
157
- 1. **docs/BRIDGE_HEALTH_MONITORING.md** - Comprehensive documentation
158
- - API reference
159
- - Integration examples (MQTT, Prometheus, Grafana)
160
- - Best practices
161
- - Use cases
162
-
163
- 2. **examples/bridge/bridge_health_monitoring_example.ino** - Working example
164
- - Periodic metrics logging
165
- - MQTT integration code
166
- - Prometheus export function
167
- - Manual metrics queries
168
-
169
- ## Benefits
170
-
171
- ✅ **Operational visibility** - Real-time monitoring of bridge health
172
- ✅ **Troubleshooting** - Detailed metrics for diagnosing issues
173
- ✅ **Capacity planning** - Historical data for scaling decisions
174
- ✅ **Industry integration** - Works with Grafana, Prometheus, CloudWatch, etc.
175
- ✅ **Zero breaking changes** - Fully backward compatible
176
-
177
- ## Files Modified/Added
178
-
179
- ```
180
- src/painlessmesh/mesh.hpp | 277 lines added
181
- test/catch/catch_bridge_health_metrics.cpp | 294 lines added
182
- examples/bridge/bridge_health_monitoring_example.ino | 188 lines added
183
- docs/BRIDGE_HEALTH_MONITORING.md | 293 lines added
184
- ```
185
-
186
- **Total:** 1,052 lines added across 4 files
187
-
188
- ## Version Information
189
-
190
- - **Target Release:** v1.8.0
191
- - **Feature Priority:** P3-LOW
192
- - **Implementation Status:** COMPLETE ✅
193
- - **Testing Status:** ALL PASS ✅
194
- - **Documentation Status:** COMPLETE ✅
195
-
196
- ## Next Steps
197
-
198
- 1. Code review by maintainers
199
- 2. Merge into develop branch
200
- 3. Include in v1.8.0 release notes
201
- 4. Update library version number
202
-
203
- ## Notes
204
-
205
- - Implementation follows existing painlessMesh code style and patterns
206
- - Minimal changes approach maintained throughout
207
- - All functionality is optional - no impact on users who don't use it
208
- - Performance overhead is negligible
209
- - Memory usage is acceptable for both ESP8266 and ESP32
210
-
211
- ## Author
212
-
213
- Implementation by GitHub Copilot based on issue requirements.