@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,534 +0,0 @@
1
- # Enhanced Diagnostics API for Bridge Operations
2
-
3
- ## Overview
4
-
5
- The Enhanced Diagnostics API provides comprehensive tools for monitoring, debugging, and analyzing painlessMesh bridge operations. This API gives developers programmatic access to bridge state, election history, network topology, and connectivity testing.
6
-
7
- ## Features
8
-
9
- ✅ Bridge status monitoring
10
- ✅ Election history tracking
11
- ✅ Network topology visualization
12
- ✅ Connectivity testing
13
- ✅ Comprehensive diagnostic reports
14
- ✅ Minimal overhead when enabled
15
-
16
- ## Table of Contents
17
-
18
- - [Getting Started](#getting-started)
19
- - [Bridge State API](#bridge-state-api)
20
- - [Network Topology API](#network-topology-api)
21
- - [Diagnostics API](#diagnostics-api)
22
- - [Data Structures](#data-structures)
23
- - [Examples](#examples)
24
- - [Best Practices](#best-practices)
25
-
26
- ## Getting Started
27
-
28
- ### Enable Diagnostics
29
-
30
- Diagnostics must be explicitly enabled to track election history and bridge changes:
31
-
32
- ```cpp
33
- void setup() {
34
- mesh.init(MESH_SSID, MESH_PASSWORD, &scheduler, MESH_PORT);
35
-
36
- // Enable diagnostics tracking
37
- mesh.enableDiagnostics(true);
38
- }
39
- ```
40
-
41
- **Note:** Diagnostics have minimal overhead and only track data when enabled.
42
-
43
- ## Bridge State API
44
-
45
- ### getBridgeStatus()
46
-
47
- Get current bridge status and role information for this node.
48
-
49
- ```cpp
50
- BridgeStatus status = mesh.getBridgeStatus();
51
-
52
- Serial.printf("Role: %s\n", status.role.c_str());
53
- Serial.printf("Is Bridge: %s\n", status.isBridge ? "Yes" : "No");
54
- Serial.printf("Internet: %s\n", status.internetConnected ? "Yes" : "No");
55
-
56
- if (status.bridgeNodeId != 0) {
57
- Serial.printf("Bridge Node: %u (RSSI: %d dBm)\n",
58
- status.bridgeNodeId, status.bridgeRSSI);
59
- }
60
- ```
61
-
62
- **Returns:** `BridgeStatus` structure containing:
63
- - `isBridge` - Is this node acting as a bridge?
64
- - `internetConnected` - Is Internet available?
65
- - `role` - Node role: "regular", "bridge", or "root"
66
- - `bridgeNodeId` - Current bridge node ID (0 if none)
67
- - `bridgeRSSI` - Signal strength to bridge/router (dBm)
68
- - `timeSinceBridgeChange` - Time since last bridge change (ms)
69
-
70
- ### getElectionHistory()
71
-
72
- Get list of recent bridge elections (requires diagnostics enabled).
73
-
74
- ```cpp
75
- auto history = mesh.getElectionHistory();
76
-
77
- for (const auto& election : history) {
78
- Serial.printf("Election: Winner=%u, RSSI=%d dBm, Candidates=%u\n",
79
- election.winnerNodeId, election.winnerRSSI,
80
- election.candidateCount);
81
- Serial.printf(" Reason: %s\n", election.reason.c_str());
82
- }
83
- ```
84
-
85
- **Returns:** `std::vector<ElectionRecord>` (limited to last 10 elections)
86
-
87
- **Note:** Returns empty vector if diagnostics are not enabled.
88
-
89
- ### getLastBridgeChange()
90
-
91
- Get information about the most recent bridge change event.
92
-
93
- ```cpp
94
- auto event = mesh.getLastBridgeChange();
95
-
96
- if (event.timestamp > 0) {
97
- Serial.printf("Bridge changed from %u to %u\n",
98
- event.oldBridgeId, event.newBridgeId);
99
- Serial.printf("Reason: %s\n", event.reason.c_str());
100
- Serial.printf("Internet available: %s\n",
101
- event.internetAvailable ? "Yes" : "No");
102
- }
103
- ```
104
-
105
- **Returns:** `BridgeChangeEvent` structure
106
-
107
- ## Network Topology API
108
-
109
- ### getInternetPath(nodeId)
110
-
111
- Find the routing path from a specific node to the Internet bridge.
112
-
113
- ```cpp
114
- auto path = mesh.getInternetPath(targetNodeId);
115
-
116
- if (path.size() > 0) {
117
- Serial.print("Path to Internet: ");
118
- for (auto nodeId : path) {
119
- Serial.printf("%u -> ", nodeId);
120
- }
121
- Serial.println("Internet");
122
- } else {
123
- Serial.println("No path to Internet available");
124
- }
125
- ```
126
-
127
- **Parameters:**
128
- - `nodeId` - Node to find path from
129
-
130
- **Returns:** `std::vector<uint32_t>` containing node IDs in the path (empty if no path)
131
-
132
- ### getBridgeForNodeId(nodeId)
133
-
134
- Get the bridge node ID that a specific node should use to reach the Internet.
135
-
136
- ```cpp
137
- uint32_t bridgeId = mesh.getBridgeForNodeId(targetNodeId);
138
-
139
- if (bridgeId != 0) {
140
- Serial.printf("Node %u uses bridge %u\n", targetNodeId, bridgeId);
141
- } else {
142
- Serial.println("No bridge available");
143
- }
144
- ```
145
-
146
- **Parameters:**
147
- - `nodeId` - Node to find bridge for
148
-
149
- **Returns:** Bridge node ID, or 0 if no bridge available
150
-
151
- ### exportTopologyDOT()
152
-
153
- Export mesh topology in GraphViz DOT format for visualization.
154
-
155
- ```cpp
156
- String dot = mesh.exportTopologyDOT();
157
- Serial.println(dot);
158
-
159
- // Save to file or send to visualization tool
160
- // Visualize at: http://www.webgraphviz.com/
161
- ```
162
-
163
- **Returns:** String containing DOT format graph
164
-
165
- **Example Output:**
166
- ```dot
167
- digraph mesh {
168
- rankdir=TB;
169
- node [shape=box];
170
-
171
- "12345" [style=filled,fillcolor=lightblue,label="12345\nBridge"];
172
- "Internet" [shape=cloud,style=filled,fillcolor=lightgreen];
173
- "12345" -> "Internet" [style=dashed,color=green];
174
- "67890";
175
- "12345" -> "67890" [label="25ms"];
176
- }
177
- ```
178
-
179
- ## Diagnostics API
180
-
181
- ### enableDiagnostics(enabled)
182
-
183
- Enable or disable diagnostics collection.
184
-
185
- ```cpp
186
- // Enable diagnostics
187
- mesh.enableDiagnostics(true);
188
-
189
- // Disable diagnostics
190
- mesh.enableDiagnostics(false);
191
- ```
192
-
193
- **Parameters:**
194
- - `enabled` - true to enable, false to disable
195
-
196
- **Note:** Must be enabled before calling `getElectionHistory()` or to track bridge changes.
197
-
198
- ### testBridgeConnectivity()
199
-
200
- Test connectivity to the primary bridge and measure latency.
201
-
202
- ```cpp
203
- auto result = mesh.testBridgeConnectivity();
204
-
205
- if (result.success) {
206
- Serial.printf("✓ Bridge test PASSED: %s\n", result.message.c_str());
207
- Serial.printf(" Latency: %u ms\n", result.latencyMs);
208
- Serial.printf(" Internet reachable: %s\n",
209
- result.internetReachable ? "Yes" : "No");
210
- } else {
211
- Serial.printf("✗ Bridge test FAILED: %s\n", result.message.c_str());
212
- }
213
- ```
214
-
215
- **Returns:** `BridgeTestResult` structure containing:
216
- - `success` - Overall test success
217
- - `bridgeReachable` - Can reach bridge node
218
- - `internetReachable` - Can reach Internet through bridge
219
- - `latencyMs` - Round-trip latency to bridge
220
- - `message` - Detailed test message
221
-
222
- ### isBridgeReachable(bridgeNodeId)
223
-
224
- Check if a specific bridge node is reachable from this node.
225
-
226
- ```cpp
227
- if (mesh.isBridgeReachable(bridgeNodeId)) {
228
- Serial.println("Bridge is reachable");
229
- } else {
230
- Serial.println("Bridge is NOT reachable");
231
- }
232
- ```
233
-
234
- **Parameters:**
235
- - `bridgeNodeId` - Bridge node ID to test
236
-
237
- **Returns:** true if reachable, false otherwise
238
-
239
- ### getDiagnosticReport()
240
-
241
- Generate a comprehensive, human-readable diagnostic report.
242
-
243
- ```cpp
244
- Serial.println(mesh.getDiagnosticReport());
245
- ```
246
-
247
- **Example Output:**
248
- ```
249
- === painlessMesh Diagnostics ===
250
- Node ID: 12345
251
- Mode: regular
252
- Mesh Nodes: 5
253
- Bridge: 99999 (RSSI: -45 dBm, Internet: ✓)
254
- Direct Connections: 2
255
- Messages RX: 1234
256
- Messages TX: 987
257
- Messages Dropped: 5
258
- Avg Latency: 25 ms
259
- Uptime: 02:15:33
260
- Last Election: 00:45:12 ago (Winner: 99999, 3 candidates)
261
- ================================
262
- ```
263
-
264
- **Returns:** String containing formatted diagnostic report
265
-
266
- ## Data Structures
267
-
268
- ### BridgeStatus
269
-
270
- ```cpp
271
- struct BridgeStatus {
272
- bool isBridge; // Is this node acting as a bridge?
273
- bool internetConnected; // Is Internet available?
274
- TSTRING role; // "regular", "bridge", or "root"
275
- uint32_t bridgeNodeId; // Current bridge node ID (0 if none)
276
- int8_t bridgeRSSI; // Signal strength to bridge (dBm)
277
- uint32_t timeSinceBridgeChange; // Time since last bridge change (ms)
278
- };
279
- ```
280
-
281
- ### ElectionRecord
282
-
283
- ```cpp
284
- struct ElectionRecord {
285
- uint32_t timestamp; // When election occurred (millis)
286
- uint32_t winnerNodeId; // Node that won election
287
- int8_t winnerRSSI; // Winner's router RSSI
288
- uint32_t candidateCount; // Number of candidates
289
- TSTRING reason; // Why election was triggered
290
- };
291
- ```
292
-
293
- ### BridgeChangeEvent
294
-
295
- ```cpp
296
- struct BridgeChangeEvent {
297
- uint32_t timestamp; // When change occurred (millis)
298
- uint32_t oldBridgeId; // Previous bridge node ID
299
- uint32_t newBridgeId; // New bridge node ID
300
- TSTRING reason; // Reason for change
301
- bool internetAvailable; // Internet available after change
302
- };
303
- ```
304
-
305
- ### BridgeTestResult
306
-
307
- ```cpp
308
- struct BridgeTestResult {
309
- bool success; // Overall test success
310
- bool bridgeReachable; // Can reach bridge node
311
- bool internetReachable; // Can reach Internet
312
- uint32_t latencyMs; // Round-trip latency (ms)
313
- TSTRING message; // Detailed test message
314
- };
315
- ```
316
-
317
- ## Examples
318
-
319
- ### Basic Diagnostics Monitoring
320
-
321
- ```cpp
322
- void setup() {
323
- mesh.init(MESH_SSID, MESH_PASSWORD, &scheduler, MESH_PORT);
324
- mesh.enableDiagnostics(true);
325
-
326
- // Print diagnostics every 30 seconds
327
- userScheduler.addTask(Task(30000, TASK_FOREVER, []() {
328
- Serial.println(mesh.getDiagnosticReport());
329
- }));
330
- }
331
- ```
332
-
333
- ### Bridge Status Monitoring with Callback
334
-
335
- ```cpp
336
- void setup() {
337
- mesh.onBridgeStatusChanged([](uint32_t bridgeId, bool hasInternet) {
338
- if (hasInternet) {
339
- Serial.println("Internet available - sending queued data");
340
- sendQueuedMessages();
341
- } else {
342
- Serial.println("Internet offline - queueing messages");
343
- }
344
- });
345
- }
346
- ```
347
-
348
- ### Periodic Bridge Connectivity Testing
349
-
350
- ```cpp
351
- Task testTask(60000, TASK_FOREVER, []() {
352
- auto result = mesh.testBridgeConnectivity();
353
-
354
- if (!result.success) {
355
- Serial.printf("Bridge issue: %s\n", result.message.c_str());
356
- // Trigger failover or alert
357
- } else if (result.latencyMs > 100) {
358
- Serial.println("Warning: High latency to bridge");
359
- }
360
- });
361
- ```
362
-
363
- ### Topology Visualization Export
364
-
365
- ```cpp
366
- // Export topology every 5 minutes for external visualization
367
- Task exportTask(300000, TASK_FOREVER, []() {
368
- String dot = mesh.exportTopologyDOT();
369
-
370
- // Send to monitoring server or save to SD card
371
- sendToMonitoringServer(dot);
372
-
373
- // Or save locally
374
- File file = SD.open("/topology.dot", FILE_WRITE);
375
- file.print(dot);
376
- file.close();
377
- });
378
- ```
379
-
380
- ## Best Practices
381
-
382
- ### 1. Enable Diagnostics Selectively
383
-
384
- Only enable diagnostics when needed for debugging or monitoring:
385
-
386
- ```cpp
387
- #ifdef DEBUG
388
- mesh.enableDiagnostics(true);
389
- #endif
390
- ```
391
-
392
- ### 2. Monitor Bridge Changes
393
-
394
- Always set up a bridge status callback to react to connectivity changes:
395
-
396
- ```cpp
397
- mesh.onBridgeStatusChanged([](uint32_t bridgeId, bool hasInternet) {
398
- // Handle bridge state changes
399
- if (!hasInternet) {
400
- startOfflineMode();
401
- } else {
402
- resumeOnlineMode();
403
- }
404
- });
405
- ```
406
-
407
- ### 3. Test Connectivity Before Critical Operations
408
-
409
- Before sending important data, test bridge connectivity:
410
-
411
- ```cpp
412
- void sendCriticalData(String data) {
413
- auto result = mesh.testBridgeConnectivity();
414
-
415
- if (result.success && result.internetReachable) {
416
- mesh.sendSingle(bridgeId, data);
417
- } else {
418
- queueForLater(data);
419
- }
420
- }
421
- ```
422
-
423
- ### 4. Use Diagnostic Reports for Troubleshooting
424
-
425
- When users report issues, ask them to copy the diagnostic report:
426
-
427
- ```cpp
428
- // Add a command to print diagnostics on demand
429
- if (Serial.available()) {
430
- char cmd = Serial.read();
431
- if (cmd == 'd') {
432
- Serial.println(mesh.getDiagnosticReport());
433
- }
434
- }
435
- ```
436
-
437
- ### 5. Export Topology for Visualization
438
-
439
- Regularly export topology to understand mesh structure:
440
-
441
- ```cpp
442
- // Export topology to help visualize network issues
443
- void exportTopology() {
444
- String dot = mesh.exportTopologyDOT();
445
-
446
- // Save or transmit for later analysis
447
- // Visualize at http://www.webgraphviz.com/
448
- }
449
- ```
450
-
451
- ## Performance Considerations
452
-
453
- - **Memory:** Election history limited to 10 records (approximately 200 bytes)
454
- - **CPU:** Minimal overhead when diagnostics enabled (<1% CPU)
455
- - **Network:** No additional network traffic (uses existing bridge status messages)
456
-
457
- ## Integration with Monitoring Systems
458
-
459
- ### MQTT Example
460
-
461
- ```cpp
462
- void publishDiagnostics() {
463
- String report = mesh.getDiagnosticReport();
464
- mqttClient.publish("mesh/diagnostics", report.c_str());
465
-
466
- auto status = mesh.getBridgeStatus();
467
- String json = String("{\"role\":\"") + status.role +
468
- "\",\"internet\":" + (status.internetConnected ? "true" : "false") +
469
- ",\"bridge\":" + status.bridgeNodeId + "}";
470
- mqttClient.publish("mesh/status", json.c_str());
471
- }
472
- ```
473
-
474
- ### HTTP REST API Example
475
-
476
- ```cpp
477
- void handleDiagnosticsRequest() {
478
- server.send(200, "text/plain", mesh.getDiagnosticReport());
479
- }
480
-
481
- void handleTopologyRequest() {
482
- server.send(200, "text/plain", mesh.exportTopologyDOT());
483
- }
484
- ```
485
-
486
- ## Troubleshooting
487
-
488
- ### Q: getElectionHistory() returns empty vector
489
-
490
- **A:** Ensure diagnostics are enabled with `mesh.enableDiagnostics(true)` before elections occur.
491
-
492
- ### Q: testBridgeConnectivity() always fails
493
-
494
- **A:** Check that:
495
- 1. A bridge node exists in the mesh
496
- 2. The bridge is broadcasting status (enabled by default)
497
- 3. Your node can route to the bridge
498
-
499
- ### Q: getDiagnosticReport() shows "Bridge: None available"
500
-
501
- **A:** This means no healthy bridge with Internet connection was found. Check:
502
- 1. Bridge node is running and configured correctly
503
- 2. Bridge has Internet connectivity
504
- 3. Bridge status broadcasts are enabled
505
-
506
- ## API Reference Summary
507
-
508
- | Method | Description | Returns |
509
- |--------|-------------|---------|
510
- | `enableDiagnostics(bool)` | Enable/disable diagnostics tracking | void |
511
- | `getBridgeStatus()` | Get current bridge status | BridgeStatus |
512
- | `getElectionHistory()` | Get recent elections | vector<ElectionRecord> |
513
- | `getLastBridgeChange()` | Get last bridge change | BridgeChangeEvent |
514
- | `getInternetPath(nodeId)` | Get path to Internet | vector<uint32_t> |
515
- | `getBridgeForNodeId(nodeId)` | Get bridge for node | uint32_t |
516
- | `exportTopologyDOT()` | Export topology | String |
517
- | `testBridgeConnectivity()` | Test bridge connection | BridgeTestResult |
518
- | `isBridgeReachable(id)` | Check bridge reachability | bool |
519
- | `getDiagnosticReport()` | Get comprehensive report | String |
520
-
521
- ## See Also
522
-
523
- - [Bridge Architecture](BRIDGE_ARCHITECTURE_IMPLEMENTATION.md)
524
- - [Bridge Health Monitoring](BRIDGE_HEALTH_MONITORING_IMPLEMENTATION.md)
525
- - [Example Sketch](examples/diagnosticsExample/diagnosticsExample.ino)
526
- - [API Documentation](docs/)
527
-
528
- ## Version History
529
-
530
- - **v1.8.1** - Initial release of Enhanced Diagnostics API
531
-
532
- ## License
533
-
534
- This feature is part of painlessMesh and follows the same license terms.