@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
@@ -0,0 +1,229 @@
1
+ # Bridging painlessMesh to Internet via Router
2
+
3
+ You can bridge your mesh network to the Internet by creating a **gateway node** that connects to both the mesh network and your WiFi router simultaneously.
4
+
5
+ ## Quick Start (Recommended: Auto Channel Detection)
6
+
7
+ The **new bridge-centric approach** automatically detects your router's channel and configures the mesh accordingly. No manual channel configuration required!
8
+
9
+ ```cpp
10
+ #include "painlessMesh.h"
11
+
12
+ #define MESH_PREFIX "MyMeshNetwork"
13
+ #define MESH_PASSWORD "somethingSneaky"
14
+ #define MESH_PORT 5555
15
+
16
+ // Your router credentials
17
+ #define ROUTER_SSID "YourRouterSSID"
18
+ #define ROUTER_PASSWORD "YourRouterPassword"
19
+
20
+ Scheduler userScheduler;
21
+ painlessMesh mesh;
22
+
23
+ void setup() {
24
+ Serial.begin(115200);
25
+ mesh.setDebugMsgTypes(ERROR | STARTUP | CONNECTION);
26
+
27
+ // Single call does everything:
28
+ // 1. Connects to router and detects its channel
29
+ // 2. Initializes mesh on detected channel
30
+ // 3. Sets node as root/bridge
31
+ // 4. Maintains router connection
32
+ mesh.initAsBridge(MESH_PREFIX, MESH_PASSWORD,
33
+ ROUTER_SSID, ROUTER_PASSWORD,
34
+ &userScheduler, MESH_PORT);
35
+
36
+ mesh.onReceive(&receivedCallback);
37
+ }
38
+
39
+ void loop() {
40
+ mesh.update();
41
+ }
42
+
43
+ void receivedCallback(uint32_t from, String& msg) {
44
+ Serial.printf("Received from mesh node %u: %s\n", from, msg.c_str());
45
+ // Forward to Internet services (HTTP, MQTT, etc.)
46
+ }
47
+ ```
48
+
49
+ **Expected Output:**
50
+ ```
51
+ === Bridge Mode Initialization ===
52
+ Step 1: Connecting to router YourRouterSSID...
53
+ ✓ Router connected on channel 6
54
+ ✓ Router IP: 192.168.1.100
55
+ Step 2: Initializing mesh on channel 6...
56
+ STARTUP: init(): Mesh channel set to 6
57
+ Step 3: Establishing bridge connection...
58
+ === Bridge Mode Active ===
59
+ Mesh SSID: MyMeshNetwork
60
+ Mesh Channel: 6 (matches router)
61
+ Router: YourRouterSSID
62
+ Port: 5555
63
+ ```
64
+
65
+ ### Regular Nodes with Auto-Detection
66
+
67
+ Regular mesh nodes can also auto-detect the mesh channel:
68
+
69
+ ```cpp
70
+ void setup() {
71
+ Serial.begin(115200);
72
+ mesh.setDebugMsgTypes(ERROR | STARTUP | CONNECTION);
73
+
74
+ // channel=0 means auto-detect
75
+ mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT,
76
+ WIFI_AP_STA, 0);
77
+
78
+ mesh.onReceive(&receivedCallback);
79
+ }
80
+ ```
81
+
82
+ **Expected Output:**
83
+ ```
84
+ STARTUP: Auto-detecting mesh channel...
85
+ CONNECTION: Scanning all channels for mesh 'MyMeshNetwork'...
86
+ CONNECTION: Found mesh on channel 6 (RSSI: -45)
87
+ STARTUP: Mesh channel auto-detected: 6
88
+ ```
89
+
90
+ ### Automatic Channel Re-synchronization
91
+
92
+ Nodes automatically follow the mesh if the bridge changes channels:
93
+
94
+ - When nodes can't find the mesh on their current channel for ~30 seconds, they trigger a full channel scan
95
+ - If the mesh is found on a different channel, nodes automatically switch to that channel
96
+ - This ensures the mesh stays connected even if the bridge switches channels (e.g., during bridge election)
97
+
98
+ For detailed information about channel synchronization, see [Channel Synchronization Documentation](docs/CHANNEL_SYNCHRONIZATION.md).
99
+
100
+ ## Manual Configuration (Legacy Approach)
101
+
102
+ If you prefer the traditional approach or need more control, you can still manually configure the channel:
103
+
104
+ ```cpp
105
+ void setup() {
106
+ Serial.begin(115200);
107
+ mesh.setDebugMsgTypes(ERROR | STARTUP | CONNECTION);
108
+
109
+ // Initialize mesh with AP+STA mode on specific channel
110
+ mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT, WIFI_AP_STA, 6);
111
+
112
+ // Connect to your router
113
+ mesh.stationManual(ROUTER_SSID, ROUTER_PASSWORD);
114
+ mesh.setHostname("MESH_BRIDGE");
115
+
116
+ // Configure as root/bridge node
117
+ mesh.setRoot(true);
118
+ mesh.setContainsRoot(true);
119
+
120
+ mesh.onReceive(&receivedCallback);
121
+ }
122
+ ```
123
+
124
+ ## Important Requirements
125
+
126
+ ### WiFi Channel Behavior
127
+
128
+ #### With initAsBridge() (Recommended)
129
+
130
+ The new `initAsBridge()` method automatically handles all channel detection and configuration:
131
+
132
+ 1. Connects to your router first in STA mode
133
+ 2. Detects the router's actual channel
134
+ 3. Initializes the mesh AP on the detected channel
135
+ 4. Maintains both connections on the same channel
136
+
137
+ **No manual channel configuration needed!** Just provide your router and mesh credentials.
138
+
139
+ #### With Manual Configuration
140
+
141
+ When using the legacy `stationManual()` approach, the library will automatically handle channel switching. The ESP32/ESP8266 will:
142
+
143
+ 1. Initially operate the mesh AP on your specified channel (e.g., channel 6)
144
+ 2. Automatically switch to the router's channel when connecting via `stationManual()`
145
+ 3. The mesh AP channel will adjust to match the router's channel
146
+
147
+ **Note:** While ESP32/ESP8266 hardware can only operate on one channel at a time in AP+STA mode, the WiFi stack automatically coordinates this. When connected to a router on a different channel, the mesh AP will operate on that channel instead.
148
+
149
+ **Best Practices:**
150
+
151
+ - Use `initAsBridge()` for new projects - it handles everything automatically
152
+ - Use channels 1, 6, or 11 (non-overlapping 2.4GHz channels) if not using a router
153
+ - Regular nodes should use `channel=0` to auto-detect the mesh
154
+ - For optimal performance, you may choose to configure your router to use your preferred mesh channel
155
+
156
+ ### Other Requirements
157
+
158
+ 1. **WIFI_AP_STA Mode**: This enables simultaneous AP (for mesh) and Station (for router) operation.
159
+
160
+ 2. **Root Configuration**:
161
+ - Call `mesh.setRoot(true)` on the bridge node
162
+ - Call `mesh.setContainsRoot(true)` on all mesh nodes for optimal routing
163
+
164
+ 3. **ESP32-C6 Compatibility**: If using ESP32-C6 or experiencing crashes with `tcp_alloc` errors, ensure you have AsyncTCP v3.3.0+ installed. See the [ESP32-C6 Compatibility Guide](docs/troubleshooting/ESP32_C6_COMPATIBILITY.md) for details.
165
+
166
+ ## Complete Examples
167
+
168
+ We provide several working bridge examples in the repository:
169
+
170
+ - **Basic Bridge**: `examples/bridge/bridge.ino`
171
+ - **MQTT Bridge**: `examples/mqttBridge/mqttBridge.ino` - Bridges mesh to MQTT broker
172
+ - **Web Server Bridge**: `examples/webServer/webServer.ino` - Provides web interface
173
+ - **Enhanced MQTT Bridge**: `examples/bridge/enhanced_mqtt_bridge_example.ino` - Advanced MQTT integration with metrics and health monitoring
174
+
175
+ ## Forwarding Data to Internet
176
+
177
+ Once the bridge is established, you can forward mesh data to Internet services:
178
+
179
+ ```cpp
180
+ void receivedCallback(uint32_t from, String& msg) {
181
+ // Check if connected to router
182
+ if (WiFi.status() == WL_CONNECTED) {
183
+ // Forward to MQTT broker
184
+ mqttClient.publish("mesh/data", msg.c_str());
185
+
186
+ // Or send via HTTP
187
+ HTTPClient http;
188
+ http.begin("http://myserver.com/api/data");
189
+ http.POST(msg);
190
+ http.end();
191
+ }
192
+ }
193
+ ```
194
+
195
+ ## Architecture Diagram
196
+
197
+ ```text
198
+ Internet
199
+ |
200
+ Router (WiFi)
201
+ |
202
+ Bridge Node (AP+STA mode)
203
+ |
204
+ Mesh Network
205
+ / | \
206
+ Node1 Node2 Node3...
207
+ ```
208
+
209
+ ## Frequently Asked Questions
210
+
211
+ ### Why does `mesh.init()` require a separate `mesh.stationManual()` call?
212
+
213
+ Great question! The library now offers **three ways** to connect a bridge:
214
+
215
+ 1. **Original**: `init()` + `stationManual()` (most flexible)
216
+ 2. **Convenience**: Pass credentials directly to `init()` (new feature)
217
+ 3. **Modern**: Use `initAsBridge()` with auto-detection (recommended)
218
+
219
+ See [Station Credentials Design Rationale](docs/design/STATION_CREDENTIALS_DESIGN.md) for detailed explanations and comparisons.
220
+
221
+ ## Additional Resources
222
+
223
+ - [painlessMesh Wiki](https://github.com/Alteriom/painlessMesh/wiki)
224
+ - [Bridge Examples](https://github.com/Alteriom/painlessMesh/tree/main/examples/bridge)
225
+ - [MQTT Bridge Example](https://github.com/Alteriom/painlessMesh/tree/main/examples/mqttBridge)
226
+ - [Configuration API Reference](https://github.com/Alteriom/painlessMesh/wiki)
227
+ - [Station Credentials Design](docs/design/STATION_CREDENTIALS_DESIGN.md) - Why three approaches exist
228
+
229
+ Feel free to ask if you need help with specific use cases like MQTT integration, web servers, or custom data forwarding!
package/CHANGELOG.md CHANGED
@@ -5,7 +5,95 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [Unreleased]
8
+ ## [1.9.0] - 2025-11-30
9
+
10
+ ### Added
11
+
12
+ - **Mesh Connectivity Detection** - New APIs to detect mesh connection state
13
+ - `hasActiveMeshConnections()` - Check if node has active mesh connections
14
+ - `getLastKnownBridge()` - Get last known bridge regardless of timeout
15
+ - Allows distinguishing between "bridge unavailable" vs "disconnected from mesh"
16
+
17
+ - **Improved Bridge Detection** - Enhanced `getPrimaryBridge()` behavior
18
+ - When disconnected from mesh, returns last known bridge instead of nullptr
19
+ - Stale bridge info is better than no info for reconnection scenarios
20
+ - `hasInternetConnection()` now uses last known state when disconnected
21
+
22
+ - **Election Guard** - Skip election trigger when node is disconnected from mesh
23
+ - Prevents unnecessary elections when issue is local connectivity
24
+ - More accurate diagnosis of bridge availability problems
25
+
26
+ - **Configurable Bridge Election Timing** - New API methods to prevent split-brain scenarios
27
+ - `setElectionStartupDelay(delayMs)` - Configure startup delay before first election (default: 60s, min: 10s)
28
+ - `setElectionRandomDelay(minMs, maxMs)` - Configure random delay range for elections (default: 1-3s)
29
+ - Longer delays allow more time for mesh formation when nodes start simultaneously
30
+ - Prevents race condition where multiple nodes become bridges in isolation
31
+ - All timing parameters are user-configurable without hard-coded values
32
+ - **Impact**: Users can now tune election timing for their specific deployment scenarios
33
+
34
+ ### Fixed
35
+
36
+ - **Bridge Discovery** - Fixed regular nodes unable to discover bridge nodes in bridge failover examples
37
+ - **Root Cause**: Regular nodes were using default channel=1 instead of channel=0 (auto-detect)
38
+ - Bridge nodes operate on router's WiFi channel (e.g., channel 6), not channel 1
39
+ - Nodes on fixed channel cannot discover bridges on different channels
40
+ - **Solution**: Updated examples to use `channel=0` for automatic mesh channel detection
41
+ - **Affected Examples**:
42
+ - `bridge_failover/bridge_failover.ino` - Both regular node and fallback initialization
43
+ - `multi_bridge/regular_node.ino` - Regular node initialization
44
+ - `bridgeAwareSensorNode/bridgeAwareSensorNode.ino` - Sensor node initialization
45
+ - `ntpTimeSyncNode/ntpTimeSyncNode.ino` - Time sync node initialization
46
+ - **Documentation**: Added channel detection explanation to bridge_failover README
47
+ - **Impact**: Regular nodes now properly discover and connect to bridges regardless of router channel
48
+ - Users experiencing "No primary bridge available!" / "Known bridges: 0" should update to this version
49
+
50
+ - **Split-Brain Prevention** - Addressed race condition when multiple nodes start simultaneously
51
+ - **Root Cause**: 60-63s window insufficient for mesh formation before elections start
52
+ - Both nodes detect "no bridge", run isolated elections, each wins and becomes bridge
53
+ - **Solution**: Added configurable timing parameters (see Added section above)
54
+ - **Documentation**: Added comprehensive troubleshooting section to bridge_failover README
55
+ - **Recommended Settings**: 90s startup delay + 10-30s random delay for simultaneous startups
56
+ - **Alternative**: Stagger node startup by 10-20 seconds or use pre-designated bridge mode
57
+
58
+ ### Changed
59
+
60
+ - **Examples Consolidated** - Reduced from 32 to 14 essential examples
61
+ - Removed 18 redundant/developmental examples
62
+ - Kept: alteriom, basic, bridge, bridge_failover, logClient/Server, mqttBridge, namedMesh, otaReceiver/Sender, priority, sharedGateway, startHere, webServer
63
+ - Cleaner, more maintainable example set focusing on core functionality
64
+
65
+ - **Documentation Consolidated** - Cleaned up repository documentation
66
+ - Removed obsolete release notes, issue resolution docs, and development artifacts
67
+ - Retained: README.md, CHANGELOG.md, CONTRIBUTING.md, RELEASE_GUIDE.md, BRIDGE_TO_INTERNET.md
68
+ - Cleaner root directory with only essential documentation
69
+
70
+ ## [1.8.15] - 2025-11-23
71
+
72
+ ### Added
73
+
74
+ - **Simulator Integration** - Integrated painlessMesh-simulator for automated example validation
75
+ - Added painlessMesh-simulator as git submodule at `test/simulator/`
76
+ - Created YAML-based test scenarios for example validation
77
+ - Configured CI/CD to automatically run simulator tests on every push/PR
78
+ - Validates mesh formation, message broadcasting, and time synchronization with 5+ virtual nodes
79
+ - Provides framework for testing with 100+ nodes without hardware
80
+ - Resolves GitHub issue #163
81
+ - Merged via PR #164
82
+
83
+ ### Documentation
84
+
85
+ - **Release Readiness Assessment** - Created comprehensive release readiness plan
86
+ - `RELEASE_READINESS_PLAN.md` - Complete audit of test infrastructure, performance issues, and security
87
+ - Confirmed library is production-ready with all 119+ test assertions passing
88
+ - Documented Issue #161 resolution (architectural clarification, not a bug)
89
+ - `TESTING_WITH_SIMULATOR.md` - Quick start guide for simulator
90
+ - `docs/SIMULATOR_TESTING.md` - Complete simulator integration guide with CI details
91
+
92
+ ### Fixed
93
+
94
+ - **Build System** - Fixed references to removed test files in CMakeLists.txt
95
+ - **CI/CD** - Added missing libboost-program-options-dev dependency for simulator build
96
+ - **Documentation** - Updated all simulator paths and dependency lists
9
97
 
10
98
  ## [1.8.14] - 2025-11-21
11
99
 
@@ -0,0 +1,79 @@
1
+ # Contributing
2
+
3
+ We try to follow the [git flow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow) development model. Which means that we have a `develop` branch and `master` branch. All development is done under feature branches, which are (when finished) merged into the development branch. When a new version is released we merge the `develop` branch into the `master` branch.
4
+
5
+ ## Git flow
6
+
7
+ If you would like to use [git flow tools](http://danielkummer.github.io/git-flow-cheatsheet/) you are more than welcome to. We use it and it's pretty nifty. If you see a `feature\` prefix on a comment then that is git flow automating branch creation. It does need more typing than just plain git so I suggest creating shell aliases for the commands.
8
+
9
+ ## Submit a pull request:
10
+
11
+ * If your push triggered a 'you just pushed...' message from GitLab then click on the button provided by that pop up to create a pull request.
12
+ * If not, then create a pull request and point it to your branch.
13
+ * Make sure that you're attempting to merge into `develop` and not `master`.
14
+ * Get your code reviewed by another contributor. If there are no contributors who possess the same set of skills then get them to review it anyway but explain what the code does beforehand and why. Use it as an opportunity for discussion around the feature set, to transfer knowledge, and to possibly [rubber duck](https://en.wikipedia.org/wiki/Rubber_duck_debugging) your code.
15
+ * Once the code is reviewed then have your reviewer merge your code.
16
+
17
+ NOTE: Tests *must* pass in order for the code to be merged.
18
+
19
+ NOTE: Always do a `git pull` on `develop` before you start working to capture the latest changes.
20
+
21
+ ## Testing Requirements
22
+
23
+ ### Running Tests
24
+
25
+ Before submitting a pull request, ensure all tests pass:
26
+
27
+ ```bash
28
+ # Build and run unit/integration tests
29
+ cmake -G Ninja .
30
+ ninja
31
+ run-parts --regex catch_ bin/
32
+
33
+ # Run simulator tests (for examples)
34
+ cd test/simulator
35
+ mkdir build && cd build
36
+ cmake -G Ninja .. && ninja
37
+ bin/painlessmesh-simulator --config ../../../examples/basic/test/simulator/scenarios/basic_mesh_test.yaml
38
+ ```
39
+
40
+ ### Adding Tests for New Features
41
+
42
+ When adding new features or examples:
43
+
44
+ 1. **Unit Tests**: Add tests in `test/catch/` for new components
45
+ 2. **Integration Tests**: Add to `test/boost/tcp_integration.cpp` for core functionality
46
+ 3. **Simulator Tests**: Create test scenarios in `examples/your_example/test/simulator/` for new examples
47
+ 4. **Documentation**: Update relevant test documentation
48
+
49
+ ### Example Validation with Simulator
50
+
51
+ All example sketches should have simulator tests that validate behavior with multiple virtual nodes:
52
+
53
+ 1. Create firmware adapter in `examples/your_example/test/simulator/firmware/`
54
+ 2. Create YAML test scenarios in `examples/your_example/test/simulator/scenarios/`
55
+ 3. Document test setup in `examples/your_example/test/simulator/README.md`
56
+
57
+ See [Simulator Testing Guide](docs/SIMULATOR_TESTING.md) for complete instructions.
58
+
59
+ This ensures examples:
60
+ - Work as documented with multiple nodes
61
+ - Handle edge cases properly
62
+ - Don't regress with library changes
63
+ - Serve as validated references for users
64
+
65
+ ## Versioning
66
+
67
+ This project will try its best to adhere to [semver](http://semver.org/) i.e, a codified guide to versioning software. When a new feature is developed or a bug is fixed the version will need to be bumped to signify the change.
68
+
69
+ The semver string is built like this:
70
+
71
+ Major.Minor.Patch
72
+
73
+ A major version bump means that a massive change took place and that application will probably have to be redeployed because a *backwards incompatible* version was released. Example: A library => model relationship change which requires previous configuration options to become invalid.
74
+
75
+ A minor version is a *backwards compatible* addition or change to the core software. Most development activity will be this type of version bump. Example: A new feature or model.
76
+
77
+ A patch version is a *backwards compatible* bug fix or application configuration change.
78
+
79
+ Documentation doesn't require a version bump.