@alteriom/painlessmesh 1.8.15 → 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 +61 -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 +81 -0
  8. package/examples/bridge_failover/bridge_failover.ino +35 -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 +342 -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,209 +0,0 @@
1
- # Channel Synchronization in painlessMesh
2
-
3
- ## Problem Statement
4
-
5
- When a mesh network operates on one channel and a node promotes to bridge via election, it may connect to a router operating on a different channel. This creates a channel mismatch where:
6
-
7
- 1. Bridge node switches to router's channel (e.g., channel 6)
8
- 2. Other mesh nodes remain on original channel (e.g., channel 1)
9
- 3. Bridge takeover announcements sent on new channel are not heard by nodes on old channel
10
- 4. Nodes cannot find the mesh network and become isolated
11
-
12
- ## Solution Overview
13
-
14
- The solution has two complementary parts:
15
-
16
- ### Part 1: Automatic Channel Re-detection
17
-
18
- Nodes automatically detect when they can't find the mesh on their current channel and trigger a full channel scan to locate it.
19
-
20
- **Implementation:** `src/painlessMeshSTA.cpp` and `src/painlessMeshSTA.h`
21
-
22
- **Key Components:**
23
- - `consecutiveEmptyScans` counter tracks scans with no mesh nodes found
24
- - `EMPTY_SCAN_THRESHOLD` constant (6 scans) determines when to trigger re-scan
25
- - Full channel scan using `scanForMeshChannel()` when threshold reached
26
- - Automatic channel update and AP restart when mesh found on different channel
27
-
28
- **Flow:**
29
- ```
30
- 1. Node scans on current channel (e.g., channel 1)
31
- 2. Finds no mesh nodes → increment consecutiveEmptyScans
32
- 3. Repeat for EMPTY_SCAN_THRESHOLD scans (~30 seconds with fast scanning)
33
- 4. Trigger scanForMeshChannel() to scan ALL channels (1-13)
34
- 5. If mesh found on different channel:
35
- a. Update mesh->_meshChannel to detected channel
36
- b. Restart AP on new channel
37
- c. Reset consecutiveEmptyScans counter
38
- 6. Continue normal scanning on new channel
39
- ```
40
-
41
- **Safeguards:**
42
- - Only triggers when WiFi.status() != WL_CONNECTED (not when stably connected)
43
- - Only triggers when channel > 0 (channel 0 already means auto-detect)
44
- - Resets counter when mesh nodes are found (prevents false triggers)
45
-
46
- ### Part 2: Dual-Channel Takeover Announcements
47
-
48
- Bridge promotion sends takeover announcements on both the old and new channels to ensure all nodes are notified.
49
-
50
- **Implementation:** `src/arduino/wifi.hpp` in `promoteToBridge()` method
51
-
52
- **Flow:**
53
- ```
54
- 1. Node wins bridge election
55
- 2. Send takeover announcement on CURRENT channel (e.g., channel 1)
56
- → Nodes still on channel 1 receive this announcement
57
- 3. Wait 1 second for announcement to propagate
58
- 4. Stop mesh and reinitialize as bridge via initAsBridge()
59
- → Connects to router, detects router's channel (e.g., channel 6)
60
- → Initializes mesh on channel 6
61
- 5. Schedule follow-up takeover announcement on NEW channel (channel 6)
62
- → Sent 3 seconds after initialization
63
- → Nodes that switched to channel 6 receive this announcement
64
- ```
65
-
66
- **Benefits:**
67
- - Early announcement notifies nodes on old channel before bridge switches
68
- - Delayed announcement notifies nodes that switched early or quickly found new channel
69
- - Ensures complete mesh awareness regardless of node timing
70
-
71
- ## Expected Behavior
72
-
73
- ### Scenario: Bridge Promotion with Channel Change
74
-
75
- **Setup:**
76
- - Node1: Regular mesh node on channel 1
77
- - Node2: Regular mesh node on channel 1 (weak router signal)
78
- - Router: Operating on channel 6
79
-
80
- **Sequence:**
81
- 1. Node2 starts mesh on channel 1 (default, no router connection)
82
- 2. Node1 joins mesh on channel 1
83
- 3. Node1 wins bridge election (better router signal)
84
- 4. Node1 sends "Becoming bridge" announcement on channel 1
85
- 5. Node2 receives announcement
86
- 6. Node1 connects to router on channel 6, initializes mesh on channel 6
87
- 7. Node1 sends follow-up "I'm the bridge" announcement on channel 6
88
- 8. Node2 can't find mesh on channel 1 for 6 consecutive scans
89
- 9. Node2 triggers full channel scan, finds mesh on channel 6
90
- 10. Node2 updates to channel 6, restarts AP on channel 6
91
- 11. Node2 reconnects to Node1 on channel 6
92
- 12. Mesh network is now unified on channel 6
93
-
94
- **Timeline:**
95
- - T+0s: Node1 wins election, sends announcement on channel 1
96
- - T+1s: Node1 stops mesh on channel 1
97
- - T+2s: Node1 initializes mesh on channel 6
98
- - T+5s: Node1 sends follow-up announcement on channel 6
99
- - T+30s: Node2 can't find mesh on channel 1 (fast scanning)
100
- - T+30s: Node2 triggers channel re-scan
101
- - T+31s: Node2 finds mesh on channel 6
102
- - T+32s: Node2 restarts AP on channel 6
103
- - T+35s: Node2 reconnects to mesh on channel 6
104
-
105
- ## Configuration
106
-
107
- ### Adjusting Re-scan Threshold
108
-
109
- The `EMPTY_SCAN_THRESHOLD` is defined in `src/painlessMeshSTA.h`:
110
-
111
- ```cpp
112
- static const uint16_t EMPTY_SCAN_THRESHOLD = 6; // ~30 seconds at default SCAN_INTERVAL
113
- ```
114
-
115
- **Trade-offs:**
116
- - **Lower value** (e.g., 3): Faster channel detection, but more susceptible to false triggers
117
- - **Higher value** (e.g., 10): More stable, but slower response to channel changes
118
-
119
- ### Scan Timing
120
-
121
- Default scan intervals defined in `src/painlessmesh/configuration.hpp`:
122
-
123
- ```cpp
124
- #define SCAN_INTERVAL 30 * TASK_SECOND // AP scan period in ms
125
- ```
126
-
127
- When no mesh nodes found, scanning switches to fast mode:
128
- ```cpp
129
- task.setInterval(0.5 * SCAN_INTERVAL); // 15 seconds
130
- ```
131
-
132
- With EMPTY_SCAN_THRESHOLD=6 and fast scanning:
133
- - Time to trigger re-scan: 6 × 15s = 90 seconds (~1.5 minutes)
134
-
135
- ## Debugging
136
-
137
- ### Log Messages
138
-
139
- **Channel Re-detection:**
140
- ```
141
- CONNECTION: connectToAP(): No mesh nodes found for 6 scans, triggering channel re-detection
142
- CONNECTION: scanForMeshChannel(): Scanning all channels for mesh 'YourMesh'...
143
- CONNECTION: scanForMeshChannel(): Found mesh on channel 6 (RSSI: -45)
144
- CONNECTION: connectToAP(): Mesh found on different channel 6 (was 1), updating...
145
- CONNECTION: connectToAP(): Restarting AP from channel 1 to channel 6
146
- CONNECTION: connectToAP(): AP restarted on channel 6
147
- ```
148
-
149
- **Bridge Promotion:**
150
- ```
151
- STARTUP: === Becoming Bridge Node ===
152
- STARTUP: Sending takeover announcement on current channel before switching...
153
- STARTUP: ✓ Takeover announcement sent on channel 1
154
- STARTUP: Step 1: Connecting to router YourRouter...
155
- STARTUP: ✓ Router connected on channel 6
156
- STARTUP: Step 2: Initializing mesh on channel 6...
157
- STARTUP: ✓ Bridge promotion complete on channel 6
158
- STARTUP: Sending follow-up takeover announcement on new channel 6
159
- STARTUP: ✓ Follow-up takeover announcement sent
160
- ```
161
-
162
- ### Common Issues
163
-
164
- **Issue:** Nodes don't switch channels
165
- - **Check:** Ensure `channel=0` in init() for auto-detection
166
- - **Check:** Verify nodes are not connected via stationManual() to router
167
- - **Check:** Increase log level to see scanning activity
168
-
169
- **Issue:** Channel switching takes too long
170
- - **Solution:** Reduce EMPTY_SCAN_THRESHOLD in painlessMeshSTA.h
171
- - **Trade-off:** May increase false triggers during temporary network instability
172
-
173
- **Issue:** Bridge promotion doesn't work
174
- - **Check:** Verify router credentials are configured
175
- - **Check:** Ensure router has good signal strength (> -80 dBm)
176
- - **Check:** Confirm router is on a valid channel (1-13 for 2.4GHz)
177
-
178
- ## Testing
179
-
180
- ### Manual Testing Procedure
181
-
182
- 1. Setup two ESP32/ESP8266 nodes with painlessMesh
183
- 2. Configure router on channel 6
184
- 3. Start both nodes without router credentials (will use channel 1)
185
- 4. Configure one node with router credentials and trigger election
186
- 5. Monitor serial output for channel switching messages
187
- 6. Verify both nodes eventually operate on channel 6
188
- 7. Verify mesh connectivity is maintained
189
-
190
- ### Expected Results
191
-
192
- - Bridge node switches to router channel within 5 seconds
193
- - Non-bridge nodes detect channel change within 90 seconds
194
- - All nodes reconnect on new channel
195
- - No loss of mesh connectivity (except during transition)
196
-
197
- ## Related Files
198
-
199
- - `src/painlessMeshSTA.h` - StationScan class definition with channel re-detection
200
- - `src/painlessMeshSTA.cpp` - Channel re-detection implementation
201
- - `src/arduino/wifi.hpp` - Bridge promotion with dual announcements
202
- - `test/catch/catch_channel_resync.cpp` - Unit tests for channel synchronization
203
- - `BRIDGE_TO_INTERNET.md` - Bridge setup documentation
204
-
205
- ## References
206
-
207
- - Issue #137: Bridge takeover announcements not heard across channels
208
- - WiFi channels: 1-13 for 2.4GHz (channels 12-13 restricted in some regions)
209
- - ESP32/ESP8266 can only operate on one channel at a time in AP+STA mode
@@ -1,321 +0,0 @@
1
- # Creating Missing GitHub Releases for v1.7.8 and v1.7.9
2
-
3
- ## Problem
4
-
5
- Versions 1.7.8 and 1.7.9 have:
6
- - ✅ CHANGELOG.md entries (complete release notes)
7
- - ✅ Release summary documentation (docs/releases/RELEASE_SUMMARY_v1.7.x.md)
8
- - ✅ Version numbers in library files (library.properties, library.json, package.json)
9
- - ❌ **Missing GitHub Releases** (no tags, no release pages)
10
-
11
- This means:
12
- - Users cannot download these specific versions from GitHub
13
- - Release automation may not have run properly
14
- - NPM/GitHub Packages may not have been published
15
-
16
- ## Solution: Create GitHub Releases Retroactively
17
-
18
- ### Option 1: Automated Script (Recommended)
19
-
20
- We've created a script to automate the process:
21
-
22
- ```bash
23
- ./scripts/create-missing-releases.sh
24
- ```
25
-
26
- **What it does:**
27
- 1. Extracts release notes from CHANGELOG.md
28
- 2. Creates git tags (v1.7.8, v1.7.9)
29
- 3. Pushes tags to GitHub
30
- 4. Creates GitHub releases with proper release notes
31
- 5. Provides links to verify releases
32
-
33
- **Requirements:**
34
- - GitHub CLI (`gh`) installed: https://cli.github.com/
35
- - Authenticated with GitHub: `gh auth login`
36
- - Write access to the repository
37
-
38
- **Running the script:**
39
-
40
- ```bash
41
- # Navigate to repository root
42
- cd /path/to/painlessMesh
43
-
44
- # Run the script
45
- ./scripts/create-missing-releases.sh
46
-
47
- # Follow the prompts
48
- # - Confirm you want to proceed
49
- # - If releases exist, choose whether to recreate them
50
- ```
51
-
52
- ### Option 2: Manual Process
53
-
54
- If you prefer to create releases manually or the script doesn't work:
55
-
56
- #### Step 1: Extract Release Notes
57
-
58
- ```bash
59
- # Extract v1.7.8 notes
60
- awk '/^## \[1\.7\.8\]/ {flag=1; next} /^## \[/ {flag=0} flag' CHANGELOG.md > release_notes_1.7.8.txt
61
-
62
- # Extract v1.7.9 notes
63
- awk '/^## \[1\.7\.9\]/ {flag=1; next} /^## \[/ {flag=0} flag' CHANGELOG.md > release_notes_1.7.9.txt
64
- ```
65
-
66
- #### Step 2: Create Tags and Releases via GitHub CLI
67
-
68
- **For v1.7.8:**
69
- ```bash
70
- # Create and push tag
71
- git tag -a v1.7.8 -m "painlessMesh v1.7.8"
72
- git push origin v1.7.8
73
-
74
- # Create GitHub release
75
- gh release create v1.7.8 \
76
- --repo Alteriom/painlessMesh \
77
- --title "painlessMesh v1.7.8" \
78
- --notes-file release_notes_1.7.8.txt
79
- ```
80
-
81
- **For v1.7.9:**
82
- ```bash
83
- # Create and push tag
84
- git tag -a v1.7.9 -m "painlessMesh v1.7.9"
85
- git push origin v1.7.9
86
-
87
- # Create GitHub release
88
- gh release create v1.7.9 \
89
- --repo Alteriom/painlessMesh \
90
- --title "painlessMesh v1.7.9" \
91
- --notes-file release_notes_1.7.9.txt
92
- ```
93
-
94
- #### Step 3: Create Releases via GitHub Web UI
95
-
96
- If you don't have GitHub CLI:
97
-
98
- 1. **Go to**: https://github.com/Alteriom/painlessMesh/releases/new
99
- 2. **For v1.7.8**:
100
- - Tag: `v1.7.8`
101
- - Release title: `painlessMesh v1.7.8`
102
- - Description: Copy content from `CHANGELOG.md` section `[1.7.8]`
103
- - Click "Publish release"
104
- 3. **For v1.7.9**:
105
- - Tag: `v1.7.9`
106
- - Release title: `painlessMesh v1.7.9`
107
- - Description: Copy content from `CHANGELOG.md` section `[1.7.9]`
108
- - Click "Publish release"
109
-
110
- ## Verification
111
-
112
- After creating the releases, verify:
113
-
114
- ### 1. Check GitHub Releases Page
115
- ```bash
116
- # View releases via CLI
117
- gh release list --repo Alteriom/painlessMesh
118
-
119
- # Or visit in browser
120
- # https://github.com/Alteriom/painlessMesh/releases
121
- ```
122
-
123
- **Expected output:**
124
- ```
125
- v1.7.9 painlessMesh v1.7.9 Latest 2025-11-08
126
- v1.7.8 painlessMesh v1.7.8 2025-11-05
127
- ```
128
-
129
- ### 2. Check Tags
130
- ```bash
131
- git fetch --tags
132
- git tag -l | grep -E "v1.7.[89]"
133
- ```
134
-
135
- **Expected output:**
136
- ```
137
- v1.7.8
138
- v1.7.9
139
- ```
140
-
141
- ### 3. Verify Release Notes
142
- Visit each release page and confirm:
143
- - ✅ Release notes match CHANGELOG.md content
144
- - ✅ Date is correct (v1.7.8: Nov 5, 2025; v1.7.9: Nov 8, 2025)
145
- - ✅ Release is marked as "Latest" for v1.7.9
146
-
147
- ## Publishing Packages
148
-
149
- After creating the GitHub releases, you may want to publish packages to NPM and GitHub Packages.
150
-
151
- ### Check if Already Published
152
-
153
- ```bash
154
- # Check NPM
155
- npm view @alteriom/painlessmesh versions
156
-
157
- # Check if 1.7.8 and 1.7.9 are listed
158
- ```
159
-
160
- ### Publish if Missing
161
-
162
- If versions are not published:
163
-
164
- ```bash
165
- # Option 1: Trigger manual publish workflow
166
- gh workflow run manual-publish.yml --repo Alteriom/painlessMesh
167
-
168
- # Option 2: Manual NPM publish (requires NPM token)
169
- npm publish --access public
170
- ```
171
-
172
- ## Why This Happened
173
-
174
- The releases were likely missed because:
175
-
176
- 1. **Commits didn't trigger release workflow** - The release workflow triggers on:
177
- - Commits to `main` branch
178
- - Changes to version files OR commit message starting with `release:`
179
- - If neither condition was met, no release was created
180
-
181
- 2. **Version was bumped without triggering release** - The version files were updated but:
182
- - Commit message didn't start with `release:`
183
- - Or changes were pushed to a different branch first
184
-
185
- 3. **Workflow may have failed** - Check GitHub Actions history for failed workflows
186
-
187
- ## Preventing Future Issues
188
-
189
- ### Ensure Releases Trigger Properly
190
-
191
- The release workflow (`.github/workflows/release.yml`) triggers when:
192
-
193
- 1. **Automatic trigger** (recommended):
194
- - Modify `library.properties`, `library.json`, or `package.json`
195
- - Commit changes to `main` branch
196
- - Workflow automatically detects version bump and creates release
197
-
198
- 2. **Manual trigger**:
199
- - Commit message starts with `release:`
200
- - Example: `git commit -m "release: v1.8.0 - New features"`
201
-
202
- ### Best Practices for Future Releases
203
-
204
- 1. **Use the bump-version script:**
205
- ```bash
206
- ./scripts/bump-version.sh patch # or minor, major
207
- ```
208
-
209
- 2. **Update CHANGELOG.md** with release notes
210
-
211
- 3. **Use release agent to validate:**
212
- ```bash
213
- ./scripts/release-agent.sh
214
- ```
215
-
216
- 4. **Commit with proper message:**
217
- ```bash
218
- git add library.properties library.json package.json CHANGELOG.md
219
- git commit -m "release: v1.8.0 - Brief description"
220
- git push origin main
221
- ```
222
-
223
- 5. **Verify workflow runs:**
224
- - Go to: https://github.com/Alteriom/painlessMesh/actions
225
- - Watch the "Automated Release" workflow
226
- - Confirm it completes successfully
227
-
228
- 6. **Check release was created:**
229
- ```bash
230
- gh release list --repo Alteriom/painlessMesh
231
- ```
232
-
233
- ### Monitoring Release Success
234
-
235
- After pushing a release commit, verify:
236
-
237
- - ✅ GitHub Actions workflow runs successfully
238
- - ✅ Git tag is created and pushed
239
- - ✅ GitHub release is created with notes
240
- - ✅ NPM package is published
241
- - ✅ GitHub Packages is updated
242
- - ✅ Wiki is synchronized (if enabled)
243
-
244
- View the workflow run:
245
- ```bash
246
- gh run list --workflow=release.yml --repo Alteriom/painlessMesh
247
- ```
248
-
249
- ## Troubleshooting
250
-
251
- ### "Tag already exists" Error
252
-
253
- If tags exist but releases don't:
254
- ```bash
255
- # Delete existing tags (careful!)
256
- git tag -d v1.7.8
257
- git push origin :refs/tags/v1.7.8
258
-
259
- # Then recreate using the script
260
- ./scripts/create-missing-releases.sh
261
- ```
262
-
263
- ### "Permission denied" Error
264
-
265
- You need write access to the repository:
266
- - Verify you're authenticated: `gh auth status`
267
- - Check your permissions on the repository
268
- - Contact repository owner for access
269
-
270
- ### Script Fails
271
-
272
- If the automated script fails:
273
- 1. Check error messages
274
- 2. Verify GitHub CLI is installed: `gh --version`
275
- 3. Verify you're authenticated: `gh auth login`
276
- 4. Try manual process (Option 2 above)
277
-
278
- ### Release Notes Are Empty
279
-
280
- If release notes extraction fails:
281
- 1. Verify CHANGELOG.md format matches expected pattern
282
- 2. Check that version sections exist: `## [1.7.8]` and `## [1.7.9]`
283
- 3. Manually copy content from CHANGELOG.md
284
-
285
- ## Additional Resources
286
-
287
- - **Release Guide**: See `RELEASE_GUIDE.md` for complete release process
288
- - **GitHub Releases**: https://github.com/Alteriom/painlessMesh/releases
289
- - **GitHub CLI Docs**: https://cli.github.com/manual/
290
- - **Release Workflow**: `.github/workflows/release.yml`
291
-
292
- ## Summary
293
-
294
- **To create missing releases:**
295
-
296
- ```bash
297
- # Quick method (automated)
298
- ./scripts/create-missing-releases.sh
299
-
300
- # Verify
301
- gh release list --repo Alteriom/painlessMesh
302
-
303
- # Publish packages if needed
304
- gh workflow run manual-publish.yml --repo Alteriom/painlessMesh
305
- ```
306
-
307
- **To prevent future issues:**
308
-
309
- ```bash
310
- # Always use this workflow for releases:
311
- ./scripts/bump-version.sh patch
312
- # Update CHANGELOG.md
313
- ./scripts/release-agent.sh # Validate
314
- git add . && git commit -m "release: vX.Y.Z - Description"
315
- git push origin main
316
- # Watch GitHub Actions to confirm success
317
- ```
318
-
319
- ---
320
-
321
- **Questions?** Open an issue with the `ci/cd` label.
@@ -1,176 +0,0 @@
1
- # painlessMesh Documentation - Docusaurus Migration
2
-
3
- ## Overview
4
-
5
- This document outlines the migration from the current custom documentation approach to **Docusaurus 3** for better user experience and maintainability.
6
-
7
- ## Current Issues
8
-
9
- ### Broken Links Found
10
- - `docs/tutorials/custom-packages.md` - Missing
11
- - `docs/tutorials/sensor-networks.md` - Missing
12
- - `docs/advanced/performance.md` - Missing
13
- - `docs/architecture/routing.md` - Missing
14
-
15
- ### Problems with Current Approach
16
- 1. **Raw Markdown** - No processing, links break in GitHub Pages
17
- 2. **Manual HTML generation** - Basic and unmaintainable
18
- 3. **Doxygen isolation** - Separate from user documentation
19
- 4. **No link validation** - Broken links undetected
20
- 5. **No search functionality** - Poor discoverability
21
- 6. **Poor mobile experience** - Not responsive
22
-
23
- ## Proposed Solution: Docusaurus 3
24
-
25
- ### Why Docusaurus?
26
- - ✅ **Modern React-based** - Fast, responsive, beautiful
27
- - ✅ **Built-in search** - Algolia integration
28
- - ✅ **API docs integration** - Seamless with Doxygen
29
- - ✅ **Link validation** - Automatic broken link detection
30
- - ✅ **Versioning support** - Multiple library versions
31
- - ✅ **GitHub Pages deployment** - Automated CI/CD
32
- - ✅ **SEO optimized** - Better search engine ranking
33
-
34
- ### Implementation Plan
35
-
36
- #### Phase 1: Setup Docusaurus
37
- ```bash
38
- # Initialize Docusaurus
39
- npx create-docusaurus@latest website classic
40
-
41
- # Configure for painlessMesh
42
- cd website
43
- npm install --save @docusaurus/plugin-client-redirects
44
- npm install --save @docusaurus/theme-mermaid
45
- ```
46
-
47
- #### Phase 2: Content Migration
48
- 1. **Migrate existing docs** to `docs/` folder
49
- 2. **Create missing pages** identified in review
50
- 3. **Fix all broken links**
51
- 4. **Integrate Doxygen** output
52
- 5. **Add interactive examples**
53
-
54
- #### Phase 3: Enhanced Features
55
- 1. **Search integration** with Algolia
56
- 2. **API documentation** with auto-generated content
57
- 3. **Interactive code examples**
58
- 4. **Version management** for releases
59
- 5. **Analytics integration**
60
-
61
- ## File Structure (Proposed)
62
-
63
- ```
64
- website/
65
- ├── docs/ # Main documentation
66
- │ ├── getting-started/
67
- │ │ ├── installation.md
68
- │ │ ├── quickstart.md
69
- │ │ └── first-mesh.md
70
- │ ├── api/
71
- │ │ ├── core-api.md
72
- │ │ └── alteriom-packages.md
73
- │ ├── tutorials/
74
- │ │ ├── basic-examples.md
75
- │ │ ├── custom-packages.md # NEW - Currently missing
76
- │ │ └── sensor-networks.md # NEW - Currently missing
77
- │ ├── architecture/
78
- │ │ ├── mesh-architecture.md
79
- │ │ ├── plugin-system.md
80
- │ │ └── routing.md # NEW - Currently missing
81
- │ ├── advanced/
82
- │ │ └── performance.md # NEW - Currently missing
83
- │ └── troubleshooting/
84
- │ ├── faq.md
85
- │ └── common-issues.md
86
- ├── src/
87
- │ ├── components/ # React components
88
- │ └── pages/ # Custom pages
89
- ├── static/ # Static assets
90
- ├── docusaurus.config.js # Main configuration
91
- └── sidebars.js # Navigation structure
92
- ```
93
-
94
- ## Benefits
95
-
96
- ### For Users
97
- - 🚀 **Faster navigation** - Single-page app performance
98
- - 🔍 **Powerful search** - Find anything instantly
99
- - 📱 **Mobile-friendly** - Responsive design
100
- - 🎯 **Better organization** - Clear navigation
101
- - 💡 **Interactive examples** - Live code demos
102
-
103
- ### For Maintainers
104
- - 🔗 **Link validation** - Automatic broken link detection
105
- - 📝 **Easy content management** - Simple Markdown workflow
106
- - 🚀 **Automated deployment** - GitHub Actions integration
107
- - 📊 **Analytics** - Usage insights
108
- - 🔄 **Version control** - Git-based workflow
109
-
110
- ## Migration Timeline
111
-
112
- ### Week 1: Setup & Configuration
113
- - [ ] Initialize Docusaurus project
114
- - [ ] Configure for painlessMesh branding
115
- - [ ] Set up build pipeline
116
-
117
- ### Week 2: Content Migration
118
- - [ ] Migrate existing documentation
119
- - [ ] Create missing pages
120
- - [ ] Fix all broken links
121
- - [ ] Integrate Doxygen output
122
-
123
- ### Week 3: Enhancement & Testing
124
- - [ ] Add search functionality
125
- - [ ] Create interactive examples
126
- - [ ] Mobile testing
127
- - [ ] Performance optimization
128
-
129
- ### Week 4: Deployment & Cleanup
130
- - [ ] Deploy to GitHub Pages
131
- - [ ] Update all repository links
132
- - [ ] Archive old documentation
133
- - [ ] Team training
134
-
135
- ## Implementation Commands
136
-
137
- ```bash
138
- # 1. Create Docusaurus site
139
- npx create-docusaurus@latest docs-website classic
140
- cd docs-website
141
-
142
- # 2. Install additional plugins
143
- npm install --save @docusaurus/plugin-client-redirects
144
- npm install --save @docusaurus/theme-mermaid
145
- npm install --save @docusaurus/plugin-google-analytics
146
-
147
- # 3. Configure build for GitHub Pages
148
- npm run build
149
-
150
- # 4. Deploy
151
- npm run deploy
152
- ```
153
-
154
- ## Cost-Benefit Analysis
155
-
156
- ### Current Approach Costs
157
- - ❌ **Developer time** - Manual HTML maintenance
158
- - ❌ **User frustration** - Broken links, poor UX
159
- - ❌ **SEO penalty** - Poor search ranking
160
- - ❌ **Mobile users** - Bad mobile experience
161
-
162
- ### Docusaurus Benefits
163
- - ✅ **Time savings** - Automated builds
164
- - ✅ **Better UX** - Professional documentation
165
- - ✅ **SEO boost** - Optimized for search engines
166
- - ✅ **Future-proof** - Modern, maintained framework
167
-
168
- ## Recommendation
169
-
170
- **Immediate Action**: Implement Docusaurus 3 migration
171
-
172
- **Priority**: High - Current documentation has critical usability issues
173
-
174
- **Timeline**: 2-4 weeks for full migration
175
-
176
- **ROI**: High - Significantly better user experience with minimal ongoing maintenance