@alteriom/painlessmesh 1.8.15 → 1.9.1

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 +101 -1
  3. package/CONTRIBUTING.md +79 -0
  4. package/README.md +69 -144
  5. package/docs/README.md +1 -0
  6. package/docs/api/shared-gateway.md +1207 -0
  7. package/examples/bridge_failover/README.md +113 -0
  8. package/examples/bridge_failover/bridge_failover.ino +38 -4
  9. package/examples/sharedGateway/README.md +235 -0
  10. package/examples/{meshCommandNode → sharedGateway}/platformio.ini +3 -2
  11. package/examples/sharedGateway/sharedGateway.ino +303 -0
  12. package/library.json +3 -22
  13. package/library.properties +1 -1
  14. package/package.json +3 -6
  15. package/src/arduino/wifi.hpp +504 -4
  16. package/src/painlessmesh/gateway.hpp +2120 -0
  17. package/src/painlessmesh/mesh.hpp +1034 -6
  18. package/src/painlessmesh/message_tracker.hpp +311 -0
  19. package/src/painlessmesh/protocol.hpp +6 -0
  20. package/DOCUMENTATION_INDEX.md +0 -146
  21. package/RELEASE_NOTES_1.8.15.md +0 -160
  22. package/RELEASE_READINESS_PLAN.md +0 -323
  23. package/TESTING_WITH_SIMULATOR.md +0 -259
  24. package/docs/API_DESIGN_GUIDELINES.md +0 -414
  25. package/docs/ARDUINO_LIBRARY_MANAGER_SUBMISSION.md +0 -331
  26. package/docs/BOOLEAN_NAMING_CONVENTION.md +0 -235
  27. package/docs/BRIDGE_FAILOVER.md +0 -512
  28. package/docs/BRIDGE_HEALTH_MONITORING.md +0 -293
  29. package/docs/BRIDGE_INITIALIZATION_FALLBACK.md +0 -357
  30. package/docs/CHANNEL_SYNCHRONIZATION.md +0 -209
  31. package/docs/CREATE_MISSING_RELEASES.md +0 -321
  32. package/docs/DOCUMENTATION_MIGRATION_PLAN.md +0 -176
  33. package/docs/FAQ_VERSION_NUMBERS.md +0 -152
  34. package/docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md +0 -1062
  35. package/docs/MESH_TOPOLOGY_GUIDE.md +0 -992
  36. package/docs/MESH_TOPOLOGY_PROGRESS.md +0 -422
  37. package/docs/MQTT_BRIDGE_COMMANDS.md +0 -894
  38. package/docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md +0 -324
  39. package/docs/MQTT_COMMAND_SCHEMA_PROPOSAL.md +0 -576
  40. package/docs/MQTT_SCHEMA_COMPLIANCE.md +0 -340
  41. package/docs/MQTT_SCHEMA_PROPOSALS.md +0 -446
  42. package/docs/MQTT_SCHEMA_REVIEW.md +0 -690
  43. package/docs/OTA_COMMANDS_REFERENCE.md +0 -554
  44. package/docs/PHASE1_GUIDE.md +0 -349
  45. package/docs/PHASE2_GUIDE.md +0 -543
  46. package/docs/QUICK_REFERENCE_VERSIONING.md +0 -127
  47. package/docs/RELEASE_AGENT_SUMMARY.md +0 -386
  48. package/docs/SCHEMA_VALIDATION_CHECKLIST.md +0 -222
  49. package/docs/SIMULATOR_TESTING.md +0 -408
  50. package/docs/VERSION_MANAGEMENT.md +0 -213
  51. package/docs/archive/DOCUSAURUS_DEPLOYMENT.md +0 -166
  52. package/docs/archive/FEATURE_PROPOSALS.md +0 -337
  53. package/docs/archive/LIBRARY_JSON_FIX.md +0 -98
  54. package/docs/archive/LIBRARY_STRUCTURE_FIX.md +0 -215
  55. package/docs/archive/PHASE1_IMPLEMENTATION.md +0 -325
  56. package/docs/archive/PHASE2_IMPLEMENTATION.md +0 -567
  57. package/docs/archive/RELEASE_SUMMARY.md +0 -173
  58. package/docs/archive/SCONS_BUILD_FIX.md +0 -313
  59. package/docs/archive/TRIGGER_RELEASE.md +0 -280
  60. package/docs/archive/VECTOR_INCLUDE_FIX.md +0 -129
  61. package/docs/archive/ota-and-status-enhancements.md +0 -911
  62. package/docs/archive/ota-status-architecture-diagrams.md +0 -658
  63. package/docs/archive/ota-status-quick-reference.md +0 -284
  64. package/docs/design/.gitkeep +0 -1
  65. package/docs/design/STATION_CREDENTIALS_DESIGN.md +0 -182
  66. package/docs/development/ARDUINO_COMPLIANCE_SUMMARY.md +0 -71
  67. package/docs/development/CODE_REFACTORING_RECOMMENDATIONS.md +0 -1011
  68. package/docs/development/DOCKER_TESTING.md +0 -196
  69. package/docs/development/PLATFORMIO_USAGE.md +0 -180
  70. package/docs/development/TESTING_SUMMARY.md +0 -126
  71. package/docs/development/contributing.md +0 -301
  72. package/docs/development/documentation.md +0 -583
  73. package/docs/features/DIAGNOSTICS_API.md +0 -534
  74. package/docs/implementation/BRIDGE_ARCHITECTURE_IMPLEMENTATION.md +0 -340
  75. package/docs/implementation/BRIDGE_HEALTH_MONITORING_IMPLEMENTATION.md +0 -213
  76. package/docs/implementation/BRIDGE_STATUS_FEATURE.md +0 -635
  77. package/docs/implementation/DIAGNOSTICS_API_IMPLEMENTATION.md +0 -232
  78. package/docs/implementation/IMPLEMENTATION_COMPLETE.md +0 -228
  79. package/docs/implementation/IMPLEMENTATION_NTP_TIME_SYNC.md +0 -325
  80. package/docs/implementation/IMPLEMENTATION_SUMMARY.md +0 -316
  81. package/docs/implementation/MESSAGE_QUEUE_IMPLEMENTATION.md +0 -405
  82. package/docs/implementation/MULTI_BRIDGE_IMPLEMENTATION.md +0 -520
  83. package/docs/implementation/NTP_TIME_SYNC_FEATURE.md +0 -392
  84. package/docs/improvements/FUTURE_PROPOSALS.md +0 -1016
  85. package/docs/improvements/IMPLEMENTATION_HISTORY.md +0 -1091
  86. package/docs/improvements/OTA_STATUS_ENHANCEMENTS.md +0 -709
  87. package/docs/improvements/README.md +0 -212
  88. package/docs/internal/CUSTOM_AGENT_ANALYSIS.md +0 -391
  89. package/docs/internal/ISSUE_65_VERIFICATION.md +0 -947
  90. package/docs/internal/ISSUE_66_CLOSURE.md +0 -249
  91. package/docs/internal/ISSUE_66_STATUS.md +0 -316
  92. package/docs/internal/PR_SUMMARY.md +0 -315
  93. package/docs/internal/REVIEW_SUMMARY.md +0 -332
  94. package/docs/multi-bridge-setup.md +0 -1025
  95. package/docs/platformio-publishing.md +0 -255
  96. package/docs/platformio-setup-summary.md +0 -121
  97. package/docs/releases/ANNOUNCEMENT_v1.8.6.md +0 -63
  98. package/docs/releases/ANNOUNCEMENT_v1.8.7.md +0 -113
  99. package/docs/releases/BRIDGE_STATUS_SELF_REGISTRATION_FIX.md +0 -221
  100. package/docs/releases/FEATURE_HISTORY.md +0 -543
  101. package/docs/releases/GITHUB_RELEASE_v1.8.6.md +0 -71
  102. package/docs/releases/GITHUB_RELEASE_v1.8.7.md +0 -90
  103. package/docs/releases/PATCH_v1.7.2.md +0 -262
  104. package/docs/releases/PATCH_v1.7.3.md +0 -262
  105. package/docs/releases/PATCH_v1.7.4.md +0 -219
  106. package/docs/releases/PHASE1_SUMMARY.md +0 -246
  107. package/docs/releases/PHASE2_SUMMARY.md +0 -499
  108. package/docs/releases/PUBLISH_v1.8.0_INSTRUCTIONS.md +0 -163
  109. package/docs/releases/QUICK_START_RELEASES.md +0 -113
  110. package/docs/releases/RELEASE_CHECKLIST_1.8.10.md +0 -331
  111. package/docs/releases/RELEASE_CHECKLIST_1.8.9.md +0 -207
  112. package/docs/releases/RELEASE_CHECKLIST_v1.7.4.md +0 -253
  113. package/docs/releases/RELEASE_CHECKLIST_v1.7.5.md +0 -315
  114. package/docs/releases/RELEASE_CHECKLIST_v1.7.6.md +0 -389
  115. package/docs/releases/RELEASE_CHECKLIST_v1.8.0.md +0 -331
  116. package/docs/releases/RELEASE_CHECKLIST_v1.8.2.md +0 -309
  117. package/docs/releases/RELEASE_NOTES_1.7.0.md +0 -539
  118. package/docs/releases/RELEASE_NOTES_1.8.10.md +0 -239
  119. package/docs/releases/RELEASE_NOTES_1.8.9.md +0 -213
  120. package/docs/releases/RELEASE_NOTES_v1.8.0.md +0 -685
  121. package/docs/releases/RELEASE_NOTES_v1.8.1.md +0 -221
  122. package/docs/releases/RELEASE_NOTES_v1.8.2.md +0 -421
  123. package/docs/releases/RELEASE_NOTES_v1.8.3.md +0 -292
  124. package/docs/releases/RELEASE_NOTES_v1.8.4.md +0 -277
  125. package/docs/releases/RELEASE_NOTES_v1.8.6.md +0 -205
  126. package/docs/releases/RELEASE_NOTES_v1.8.7.md +0 -184
  127. package/docs/releases/RELEASE_PLAN_v1.7.6.md +0 -816
  128. package/docs/releases/RELEASE_SUMMARY_1.8.10.md +0 -193
  129. package/docs/releases/RELEASE_SUMMARY_v1.7.4.md +0 -276
  130. package/docs/releases/RELEASE_SUMMARY_v1.7.5.md +0 -322
  131. package/docs/releases/RELEASE_SUMMARY_v1.7.6.md +0 -436
  132. package/docs/releases/RELEASE_SUMMARY_v1.7.7.md +0 -391
  133. package/docs/releases/RELEASE_SUMMARY_v1.7.8.md +0 -523
  134. package/docs/releases/RELEASE_SUMMARY_v1.7.9.md +0 -542
  135. package/docs/troubleshooting/ARDUINO_IDE_VERSION_FIX_SUMMARY.md +0 -229
  136. package/docs/troubleshooting/ARDUINO_LIBRARY_NAME_FIX.md +0 -197
  137. package/docs/troubleshooting/CRASH_QUICK_REF.md +0 -93
  138. package/docs/troubleshooting/ESP32_C6_COMPATIBILITY.md +0 -157
  139. package/docs/troubleshooting/FREERTOS_ASSERTION_FAILURE.md +0 -288
  140. package/docs/troubleshooting/FREERTOS_FIX_IMPLEMENTATION.md +0 -267
  141. package/docs/troubleshooting/NPM_PUBLISHING_ISSUE_SUMMARY.md +0 -110
  142. package/docs/troubleshooting/PAINLESSMESH_V1.7.4_COMPILATION_ISSUES.md +0 -547
  143. package/docs/troubleshooting/QUICK_FIX_FREERTOS.md +0 -164
  144. package/docs/troubleshooting/SENSOR_NODE_CONNECTION_CRASH.md +0 -264
  145. package/docs/troubleshooting/common-architecture-mistakes.md +0 -438
  146. package/docs/troubleshooting/internet-access-faq.md +0 -299
  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 -108
  197. package/examples/multi_bridge/regular_node.ino +0 -141
  198. package/examples/multi_bridge/secondary_bridge.ino +0 -123
  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.