@alteriom/painlessmesh 1.8.14 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/BRIDGE_TO_INTERNET.md +229 -0
  2. package/CHANGELOG.md +89 -1
  3. package/CONTRIBUTING.md +79 -0
  4. package/README.md +70 -143
  5. package/docs/README.md +1 -0
  6. package/docs/api/shared-gateway.md +1207 -0
  7. package/docs/troubleshooting/common-issues.md +28 -0
  8. package/docs/troubleshooting/faq.md +113 -12
  9. package/examples/basic/test/simulator/CMakeLists.txt +40 -0
  10. package/examples/basic/test/simulator/README.md +149 -0
  11. package/examples/basic/test/simulator/firmware/basic_firmware.hpp +117 -0
  12. package/examples/basic/test/simulator/scenarios/basic_mesh_test.yaml +81 -0
  13. package/examples/bridge/bridge.ino +17 -4
  14. package/examples/bridge_failover/README.md +81 -0
  15. package/examples/bridge_failover/bridge_failover.ino +51 -6
  16. package/examples/sharedGateway/README.md +235 -0
  17. package/examples/{meshCommandNode → sharedGateway}/platformio.ini +3 -2
  18. package/examples/sharedGateway/sharedGateway.ino +303 -0
  19. package/library.json +3 -22
  20. package/library.properties +1 -1
  21. package/package.json +3 -3
  22. package/src/arduino/wifi.hpp +380 -13
  23. package/src/painlessmesh/gateway.hpp +2120 -0
  24. package/src/painlessmesh/mesh.hpp +1034 -6
  25. package/src/painlessmesh/message_tracker.hpp +311 -0
  26. package/src/painlessmesh/protocol.hpp +6 -0
  27. package/DOCUMENTATION_INDEX.md +0 -146
  28. package/docs/API_DESIGN_GUIDELINES.md +0 -414
  29. package/docs/ARDUINO_LIBRARY_MANAGER_SUBMISSION.md +0 -331
  30. package/docs/BOOLEAN_NAMING_CONVENTION.md +0 -235
  31. package/docs/BRIDGE_FAILOVER.md +0 -512
  32. package/docs/BRIDGE_HEALTH_MONITORING.md +0 -293
  33. package/docs/CHANNEL_SYNCHRONIZATION.md +0 -209
  34. package/docs/CREATE_MISSING_RELEASES.md +0 -321
  35. package/docs/DOCUMENTATION_MIGRATION_PLAN.md +0 -176
  36. package/docs/FAQ_VERSION_NUMBERS.md +0 -152
  37. package/docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md +0 -1062
  38. package/docs/MESH_TOPOLOGY_GUIDE.md +0 -992
  39. package/docs/MESH_TOPOLOGY_PROGRESS.md +0 -422
  40. package/docs/MQTT_BRIDGE_COMMANDS.md +0 -894
  41. package/docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md +0 -324
  42. package/docs/MQTT_COMMAND_SCHEMA_PROPOSAL.md +0 -576
  43. package/docs/MQTT_SCHEMA_COMPLIANCE.md +0 -340
  44. package/docs/MQTT_SCHEMA_PROPOSALS.md +0 -446
  45. package/docs/MQTT_SCHEMA_REVIEW.md +0 -690
  46. package/docs/OTA_COMMANDS_REFERENCE.md +0 -554
  47. package/docs/PHASE1_GUIDE.md +0 -349
  48. package/docs/PHASE2_GUIDE.md +0 -543
  49. package/docs/QUICK_REFERENCE_VERSIONING.md +0 -127
  50. package/docs/RELEASE_AGENT_SUMMARY.md +0 -386
  51. package/docs/SCHEMA_VALIDATION_CHECKLIST.md +0 -222
  52. package/docs/VERSION_MANAGEMENT.md +0 -213
  53. package/docs/archive/DOCUSAURUS_DEPLOYMENT.md +0 -166
  54. package/docs/archive/FEATURE_PROPOSALS.md +0 -337
  55. package/docs/archive/LIBRARY_JSON_FIX.md +0 -98
  56. package/docs/archive/LIBRARY_STRUCTURE_FIX.md +0 -215
  57. package/docs/archive/PHASE1_IMPLEMENTATION.md +0 -325
  58. package/docs/archive/PHASE2_IMPLEMENTATION.md +0 -567
  59. package/docs/archive/RELEASE_SUMMARY.md +0 -173
  60. package/docs/archive/SCONS_BUILD_FIX.md +0 -313
  61. package/docs/archive/TRIGGER_RELEASE.md +0 -280
  62. package/docs/archive/VECTOR_INCLUDE_FIX.md +0 -129
  63. package/docs/archive/ota-and-status-enhancements.md +0 -911
  64. package/docs/archive/ota-status-architecture-diagrams.md +0 -658
  65. package/docs/archive/ota-status-quick-reference.md +0 -284
  66. package/docs/design/.gitkeep +0 -1
  67. package/docs/design/STATION_CREDENTIALS_DESIGN.md +0 -182
  68. package/docs/development/ARDUINO_COMPLIANCE_SUMMARY.md +0 -71
  69. package/docs/development/CODE_REFACTORING_RECOMMENDATIONS.md +0 -1011
  70. package/docs/development/DOCKER_TESTING.md +0 -196
  71. package/docs/development/PLATFORMIO_USAGE.md +0 -180
  72. package/docs/development/TESTING_SUMMARY.md +0 -126
  73. package/docs/development/contributing.md +0 -301
  74. package/docs/development/documentation.md +0 -583
  75. package/docs/features/DIAGNOSTICS_API.md +0 -534
  76. package/docs/implementation/BRIDGE_ARCHITECTURE_IMPLEMENTATION.md +0 -340
  77. package/docs/implementation/BRIDGE_HEALTH_MONITORING_IMPLEMENTATION.md +0 -213
  78. package/docs/implementation/BRIDGE_STATUS_FEATURE.md +0 -635
  79. package/docs/implementation/DIAGNOSTICS_API_IMPLEMENTATION.md +0 -232
  80. package/docs/implementation/IMPLEMENTATION_COMPLETE.md +0 -228
  81. package/docs/implementation/IMPLEMENTATION_NTP_TIME_SYNC.md +0 -325
  82. package/docs/implementation/IMPLEMENTATION_SUMMARY.md +0 -316
  83. package/docs/implementation/MESSAGE_QUEUE_IMPLEMENTATION.md +0 -405
  84. package/docs/implementation/MULTI_BRIDGE_IMPLEMENTATION.md +0 -520
  85. package/docs/implementation/NTP_TIME_SYNC_FEATURE.md +0 -392
  86. package/docs/improvements/FUTURE_PROPOSALS.md +0 -1016
  87. package/docs/improvements/IMPLEMENTATION_HISTORY.md +0 -1091
  88. package/docs/improvements/OTA_STATUS_ENHANCEMENTS.md +0 -709
  89. package/docs/improvements/README.md +0 -212
  90. package/docs/internal/CUSTOM_AGENT_ANALYSIS.md +0 -391
  91. package/docs/internal/ISSUE_65_VERIFICATION.md +0 -947
  92. package/docs/internal/ISSUE_66_CLOSURE.md +0 -249
  93. package/docs/internal/ISSUE_66_STATUS.md +0 -316
  94. package/docs/internal/PR_SUMMARY.md +0 -315
  95. package/docs/internal/REVIEW_SUMMARY.md +0 -332
  96. package/docs/multi-bridge-setup.md +0 -1025
  97. package/docs/platformio-publishing.md +0 -255
  98. package/docs/platformio-setup-summary.md +0 -121
  99. package/docs/releases/ANNOUNCEMENT_v1.8.6.md +0 -63
  100. package/docs/releases/ANNOUNCEMENT_v1.8.7.md +0 -113
  101. package/docs/releases/BRIDGE_STATUS_SELF_REGISTRATION_FIX.md +0 -221
  102. package/docs/releases/FEATURE_HISTORY.md +0 -543
  103. package/docs/releases/GITHUB_RELEASE_v1.8.6.md +0 -71
  104. package/docs/releases/GITHUB_RELEASE_v1.8.7.md +0 -90
  105. package/docs/releases/PATCH_v1.7.2.md +0 -262
  106. package/docs/releases/PATCH_v1.7.3.md +0 -262
  107. package/docs/releases/PATCH_v1.7.4.md +0 -219
  108. package/docs/releases/PHASE1_SUMMARY.md +0 -246
  109. package/docs/releases/PHASE2_SUMMARY.md +0 -499
  110. package/docs/releases/PUBLISH_v1.8.0_INSTRUCTIONS.md +0 -163
  111. package/docs/releases/QUICK_START_RELEASES.md +0 -113
  112. package/docs/releases/RELEASE_CHECKLIST_1.8.10.md +0 -331
  113. package/docs/releases/RELEASE_CHECKLIST_1.8.9.md +0 -207
  114. package/docs/releases/RELEASE_CHECKLIST_v1.7.4.md +0 -253
  115. package/docs/releases/RELEASE_CHECKLIST_v1.7.5.md +0 -315
  116. package/docs/releases/RELEASE_CHECKLIST_v1.7.6.md +0 -389
  117. package/docs/releases/RELEASE_CHECKLIST_v1.8.0.md +0 -331
  118. package/docs/releases/RELEASE_CHECKLIST_v1.8.2.md +0 -309
  119. package/docs/releases/RELEASE_NOTES_1.7.0.md +0 -539
  120. package/docs/releases/RELEASE_NOTES_1.8.10.md +0 -239
  121. package/docs/releases/RELEASE_NOTES_1.8.9.md +0 -213
  122. package/docs/releases/RELEASE_NOTES_v1.8.0.md +0 -685
  123. package/docs/releases/RELEASE_NOTES_v1.8.1.md +0 -221
  124. package/docs/releases/RELEASE_NOTES_v1.8.2.md +0 -421
  125. package/docs/releases/RELEASE_NOTES_v1.8.3.md +0 -292
  126. package/docs/releases/RELEASE_NOTES_v1.8.4.md +0 -277
  127. package/docs/releases/RELEASE_NOTES_v1.8.6.md +0 -205
  128. package/docs/releases/RELEASE_NOTES_v1.8.7.md +0 -184
  129. package/docs/releases/RELEASE_PLAN_v1.7.6.md +0 -816
  130. package/docs/releases/RELEASE_SUMMARY_1.8.10.md +0 -193
  131. package/docs/releases/RELEASE_SUMMARY_v1.7.4.md +0 -276
  132. package/docs/releases/RELEASE_SUMMARY_v1.7.5.md +0 -322
  133. package/docs/releases/RELEASE_SUMMARY_v1.7.6.md +0 -436
  134. package/docs/releases/RELEASE_SUMMARY_v1.7.7.md +0 -391
  135. package/docs/releases/RELEASE_SUMMARY_v1.7.8.md +0 -523
  136. package/docs/releases/RELEASE_SUMMARY_v1.7.9.md +0 -542
  137. package/docs/troubleshooting/ARDUINO_IDE_VERSION_FIX_SUMMARY.md +0 -229
  138. package/docs/troubleshooting/ARDUINO_LIBRARY_NAME_FIX.md +0 -197
  139. package/docs/troubleshooting/CRASH_QUICK_REF.md +0 -93
  140. package/docs/troubleshooting/ESP32_C6_COMPATIBILITY.md +0 -157
  141. package/docs/troubleshooting/FREERTOS_ASSERTION_FAILURE.md +0 -288
  142. package/docs/troubleshooting/FREERTOS_FIX_IMPLEMENTATION.md +0 -267
  143. package/docs/troubleshooting/NPM_PUBLISHING_ISSUE_SUMMARY.md +0 -110
  144. package/docs/troubleshooting/PAINLESSMESH_V1.7.4_COMPILATION_ISSUES.md +0 -547
  145. package/docs/troubleshooting/QUICK_FIX_FREERTOS.md +0 -164
  146. package/docs/troubleshooting/SENSOR_NODE_CONNECTION_CRASH.md +0 -264
  147. package/docs/troubleshooting/station-reconnection-issues.md +0 -172
  148. package/docs/v1.7.7_MQTT_IMPROVEMENTS.md +0 -794
  149. package/docs/wiki/API-Reference.md +0 -246
  150. package/docs/wiki/Complete-Documentation.md +0 -123
  151. package/examples/alteriomImproved/alteriom_sensor_package.hpp +0 -224
  152. package/examples/alteriomImproved/improved_sensor_node.ino +0 -248
  153. package/examples/alteriomImproved/platformio.ini +0 -32
  154. package/examples/alteriomMetricsHealth/alteriom_sensor_package.hpp +0 -796
  155. package/examples/alteriomMetricsHealth/metrics_health_node.ino +0 -429
  156. package/examples/alteriomMetricsHealth/platformio.ini +0 -26
  157. package/examples/alteriomPhase1/alteriom_sensor_package.hpp +0 -224
  158. package/examples/alteriomPhase1/phase1_features.ino +0 -242
  159. package/examples/alteriomPhase1/platformio.ini +0 -26
  160. package/examples/alteriomPhase2/alteriom_sensor_package.hpp +0 -224
  161. package/examples/alteriomPhase2/phase2_features.ino +0 -186
  162. package/examples/alteriomPhase2/platformio.ini +0 -26
  163. package/examples/alteriomSensorNode/alteriom_sensor_node.ino +0 -186
  164. package/examples/alteriomSensorNode/alteriom_sensor_package.hpp +0 -1227
  165. package/examples/alteriomSensorNode/platformio.ini +0 -26
  166. package/examples/bridge/alteriom_sensor_package.hpp +0 -1170
  167. package/examples/bridge/bridge_health_monitoring_example.ino +0 -188
  168. package/examples/bridge/enhanced_mqtt_bridge.hpp +0 -610
  169. package/examples/bridge/enhanced_mqtt_bridge_example.ino +0 -226
  170. package/examples/bridge/mesh_event_publisher.hpp +0 -253
  171. package/examples/bridge/mesh_topology_reporter.hpp +0 -303
  172. package/examples/bridge/mqtt_command_bridge.hpp +0 -459
  173. package/examples/bridge/mqtt_status_bridge.hpp +0 -519
  174. package/examples/bridgeAwareSensorNode/alteriom_sensor_package.hpp +0 -1227
  175. package/examples/bridgeAwareSensorNode/bridgeAwareSensorNode.ino +0 -342
  176. package/examples/bridgeAwareSensorNode/platformio.ini +0 -26
  177. package/examples/diagnosticsExample/diagnosticsExample.ino +0 -171
  178. package/examples/diagnosticsExample/platformio.ini +0 -26
  179. package/examples/echoNode/echoNode.ino +0 -33
  180. package/examples/echoNode/platformio.ini +0 -26
  181. package/examples/meshCommandNode/alteriom_sensor_package.hpp +0 -235
  182. package/examples/meshCommandNode/meshCommandNode.ino +0 -265
  183. package/examples/mqttCommandBridge/alteriom_sensor_package.hpp +0 -235
  184. package/examples/mqttCommandBridge/mesh_event_publisher.hpp +0 -253
  185. package/examples/mqttCommandBridge/mesh_topology_reporter.hpp +0 -303
  186. package/examples/mqttCommandBridge/mqttCommandBridge.ino +0 -254
  187. package/examples/mqttCommandBridge/mqtt_command_bridge.hpp +0 -462
  188. package/examples/mqttCommandBridge/platformio.ini +0 -27
  189. package/examples/mqttStatusBridge/mqttStatusBridge.ino +0 -218
  190. package/examples/mqttStatusBridge/mqtt_status_bridge.hpp +0 -522
  191. package/examples/mqttStatusBridge/platformio.ini +0 -27
  192. package/examples/mqttTopologyTest/README.md +0 -467
  193. package/examples/mqttTopologyTest/mqttTopologyTest.ino +0 -754
  194. package/examples/mqttTopologyTest/platformio.ini +0 -27
  195. package/examples/multi_bridge/README.md +0 -346
  196. package/examples/multi_bridge/primary_bridge.ino +0 -96
  197. package/examples/multi_bridge/regular_node.ino +0 -141
  198. package/examples/multi_bridge/secondary_bridge.ino +0 -111
  199. package/examples/ntpTimeSyncBridge/alteriom_sensor_package.hpp +0 -1383
  200. package/examples/ntpTimeSyncBridge/ntpTimeSyncBridge.ino +0 -86
  201. package/examples/ntpTimeSyncNode/alteriom_sensor_package.hpp +0 -1383
  202. package/examples/ntpTimeSyncNode/ntpTimeSyncNode.ino +0 -109
  203. package/examples/queued_alarms/README.md +0 -390
  204. package/examples/queued_alarms/queued_alarms.ino +0 -265
  205. package/examples/routing_demo/README.md +0 -172
  206. package/examples/routing_demo/routing_demo.ino +0 -102
  207. package/examples/rtcIntegration/README.md +0 -294
  208. package/examples/rtcIntegration/rtcIntegration.ino +0 -210
@@ -1,109 +0,0 @@
1
- /**
2
- * @file ntpTimeSyncNode.ino
3
- * @brief Example: Regular mesh node receiving NTP time from bridge
4
- *
5
- * This example demonstrates a regular mesh node that:
6
- * 1. Connects to the mesh network
7
- * 2. Listens for NTP time broadcasts from bridge nodes
8
- * 3. Updates local time when NTP sync is received
9
- * 4. Optionally syncs RTC module if available
10
- *
11
- * No Internet connection needed - time is received from bridge!
12
- */
13
-
14
- #include "painlessMesh.h"
15
- #include "alteriom_sensor_package.hpp"
16
-
17
- // Mesh configuration
18
- #define MESH_PREFIX "AlteriomMesh"
19
- #define MESH_PASSWORD "your_mesh_password"
20
- #define MESH_PORT 5555
21
-
22
- Scheduler userScheduler;
23
- painlessMesh mesh;
24
-
25
- using namespace alteriom;
26
-
27
- // Track last time sync
28
- uint32_t lastNTPSync = 0;
29
- uint32_t ntpSyncCount = 0;
30
-
31
- // Received callback - handle incoming messages
32
- void receivedCallback(uint32_t from, String& msg) {
33
- // Parse JSON message
34
- DynamicJsonDocument doc(1024);
35
- DeserializationError error = deserializeJson(doc, msg);
36
-
37
- if (error) {
38
- Serial.printf("JSON parse error: %s\n", error.c_str());
39
- return;
40
- }
41
-
42
- JsonObject obj = doc.as<JsonObject>();
43
- uint16_t msgType = obj["type"];
44
-
45
- // Check if this is an NTP time sync message
46
- if (msgType == 614) {
47
- // Deserialize NTP time sync package
48
- auto pkg = NTPTimeSyncPackage(obj);
49
-
50
- Serial.printf("\n=== NTP Time Sync Received ===\n");
51
- Serial.printf("From: %u\n", from);
52
- Serial.printf("NTP Time: %u\n", pkg.ntpTime);
53
- Serial.printf("Accuracy: %ums\n", pkg.accuracy);
54
- Serial.printf("Source: %s\n", pkg.source.c_str());
55
- Serial.printf("Timestamp: %u\n", pkg.timestamp);
56
- Serial.println("=============================\n");
57
-
58
- // Update mesh time (this is application-specific)
59
- // In a real implementation, you would:
60
- // 1. Verify the sender is a bridge node
61
- // 2. Apply the time with mesh.setTimeFromNTP(pkg.ntpTime)
62
- // 3. Update RTC if available
63
-
64
- lastNTPSync = millis();
65
- ntpSyncCount++;
66
-
67
- Serial.printf("Time sync applied! Total syncs: %u\n", ntpSyncCount);
68
- }
69
- }
70
-
71
- // Status task - periodic status updates
72
- Task taskStatus(30000, TASK_FOREVER, [](){
73
- uint32_t timeSinceSync = (millis() - lastNTPSync) / 1000;
74
-
75
- Serial.printf("\n--- Node Status ---\n");
76
- Serial.printf("Node ID: %u\n", mesh.getNodeId());
77
- Serial.printf("Connections: %d\n", mesh.getNodeList().size());
78
- Serial.printf("NTP Syncs: %u\n", ntpSyncCount);
79
-
80
- if (ntpSyncCount > 0) {
81
- Serial.printf("Last sync: %u seconds ago\n", timeSinceSync);
82
- } else {
83
- Serial.println("Waiting for first NTP sync...");
84
- }
85
-
86
- Serial.println("------------------\n");
87
- });
88
-
89
- void setup() {
90
- Serial.begin(115200);
91
-
92
- // Initialize mesh
93
- mesh.setDebugMsgTypes(ERROR | STARTUP | CONNECTION);
94
- mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT);
95
-
96
- // Set callbacks
97
- mesh.onReceive(&receivedCallback);
98
-
99
- // Add status task
100
- userScheduler.addTask(taskStatus);
101
- taskStatus.enable();
102
-
103
- Serial.println("Regular mesh node initialized");
104
- Serial.println("Listening for NTP time broadcasts...");
105
- }
106
-
107
- void loop() {
108
- mesh.update();
109
- }
@@ -1,390 +0,0 @@
1
- # Queued Alarms Example
2
-
3
- ## Overview
4
-
5
- This example demonstrates **priority-based message queueing** for critical IoT systems that cannot afford to lose data during Internet outages. It's designed for the fish farm dissolved oxygen (O2) monitoring use case described in [Issue #66](https://github.com/Alteriom/painlessMesh/issues/66).
6
-
7
- ## Problem Statement
8
-
9
- In production IoT systems like fish farm monitoring, **critical alarms must never be lost**. When the bridge node loses Internet connectivity:
10
-
11
- - ❌ **Without queueing**: Critical O2 alarms are lost → fish die
12
- - ✅ **With queueing**: Alarms are queued and delivered when connection restored → supervisor notified, fish saved
13
-
14
- ## Features
15
-
16
- ### ✅ Priority-Based Queueing
17
-
18
- - **CRITICAL** (Priority 0): Life-safety alarms - never dropped
19
- - **HIGH** (Priority 1): Important warnings - preserved up to 80% capacity
20
- - **NORMAL** (Priority 2): Regular data - preserved up to 60% capacity
21
- - **LOW** (Priority 3): Telemetry - dropped first when queue full
22
-
23
- ### ✅ Automatic Queue Management
24
-
25
- - Queues messages when Internet unavailable
26
- - Flushes queue when Internet restored
27
- - Prunes old messages (configurable age)
28
- - Monitors queue health with callbacks
29
-
30
- ### ✅ Production Ready
31
-
32
- - Survives Internet outages (queuing)
33
- - Handles queue overflow intelligently
34
- - Provides queue statistics
35
- - Retry logic with attempt tracking
36
-
37
- ## Hardware Requirements
38
-
39
- - **ESP32** or **ESP8266**
40
- - At least 2 nodes (1 bridge + 1 sensor node)
41
- - Bridge node needs WiFi router access
42
-
43
- ## Configuration
44
-
45
- ### 1. Mesh Network Settings
46
-
47
- ```cpp
48
- #define MESH_PREFIX "FishFarmMesh"
49
- #define MESH_PASSWORD "somethingSneaky"
50
- #define MESH_PORT 5555
51
- ```
52
-
53
- ### 2. Router Credentials (Bridge Node)
54
-
55
- ```cpp
56
- #define ROUTER_SSID "YourWiFiSSID"
57
- #define ROUTER_PASSWORD "YourWiFiPassword"
58
- ```
59
-
60
- Enable in setup for bridge node:
61
- ```cpp
62
- mesh.stationManual(ROUTER_SSID, ROUTER_PASSWORD);
63
- ```
64
-
65
- ### 3. Sensor Thresholds
66
-
67
- Adjust for your sensors (dissolved oxygen in mg/L):
68
-
69
- ```cpp
70
- #define CRITICAL_O2_THRESHOLD 3.0 // Life-critical
71
- #define WARNING_O2_THRESHOLD 5.0 // Warning level
72
- ```
73
-
74
- ### 4. Queue Configuration
75
-
76
- ```cpp
77
- #define MAX_QUEUE_SIZE 500 // Max messages
78
- #define QUEUE_PRUNE_AGE (24 * 60 * 60 * 1000) // 24 hours
79
- ```
80
-
81
- ## How It Works
82
-
83
- ### Normal Operation (Internet Available)
84
-
85
- ```
86
- Sensor → Mesh → Bridge → Internet → Cloud/MQTT
87
- ```
88
-
89
- Messages sent immediately, no queueing.
90
-
91
- ### Offline Mode (No Internet)
92
-
93
- ```
94
- Sensor → Mesh → Bridge → Queue (Priority-based)
95
- ↓
96
- [CRITICAL never dropped]
97
- [LOW dropped first]
98
- ```
99
-
100
- Messages queued with priority, delivered when Internet restored.
101
-
102
- ### Internet Restored
103
-
104
- ```
105
- Queue → Flush → MQTT/HTTP → Cloud
106
- ↓
107
- Remove on success
108
- Retry on failure (max 3 attempts)
109
- ```
110
-
111
- ## Usage
112
-
113
- ### 1. Flash Bridge Node
114
-
115
- 1. Uncomment these lines in `setup()`:
116
- ```cpp
117
- mesh.stationManual(ROUTER_SSID, ROUTER_PASSWORD);
118
- mesh.setHostname("FishFarmBridge");
119
- ```
120
- 2. Upload to ESP32/ESP8266 with router access
121
- 3. Bridge connects to router and provides Internet to mesh
122
-
123
- ### 2. Flash Sensor Nodes
124
-
125
- 1. Leave router lines commented
126
- 2. Upload to sensor node ESP32/ESP8266
127
- 3. Node joins mesh and monitors sensors
128
-
129
- ### 3. Monitor Serial Output
130
-
131
- **Normal operation:**
132
- ```
133
- ✅ ONLINE MODE - Internet restored
134
- 📊 Telemetry: 7.32 mg/L
135
- 📊 Telemetry: 6.85 mg/L
136
- ```
137
-
138
- **Internet lost:**
139
- ```
140
- ⚠️ OFFLINE MODE ACTIVATED
141
- Queue size: 0 messages
142
- 📊 Telemetry: 6.42 mg/L - queued #1
143
- [Queue: 1 messages]
144
- ```
145
-
146
- **Critical alarm (offline):**
147
- ```
148
- 🚨 CRITICAL O2 ALARM: 2.87 mg/L - QUEUED #5
149
- [Queue: 5 messages (1 CRITICAL)]
150
- ```
151
-
152
- **Internet restored:**
153
- ```
154
- ✅ ONLINE MODE - Internet restored
155
- Flushing 5 queued messages...
156
- Sending queued message #1 (priority=3, attempts=0)
157
- Sending queued message #5 (priority=0, attempts=0)
158
- ✅ Queue flushed (5 messages sent)
159
- ```
160
-
161
- ## Queue States
162
-
163
- The example monitors queue health:
164
-
165
- - **EMPTY**: No messages queued
166
- - **NORMAL**: Queue has space available
167
- - **75% FULL**: Warning - queue reaching capacity
168
- - **FULL**: Queue full - dropping LOW priority messages
169
-
170
- Example output:
171
- ```
172
- ⚠️ Queue 75% full (375 messages)
173
- 🚨 Queue FULL (500 messages) - dropping LOW priority
174
- ```
175
-
176
- ## Testing Without Hardware
177
-
178
- ### Simulate Internet Loss
179
-
180
- In real deployment, Internet loss is automatic. For testing, you can:
181
-
182
- 1. **Disconnect router**: Physically disconnect Ethernet/WAN
183
- 2. **Block MAC address**: Router settings → Block bridge MAC
184
- 3. **Power cycle router**: Turn off router
185
- 4. **Modify code**: Add test button to toggle `offlineMode`
186
-
187
- ### Verify Queue Behavior
188
-
189
- 1. Start with Internet connected
190
- 2. Cause Internet loss (any method above)
191
- 3. Wait for critical alarms to queue
192
- 4. Restore Internet
193
- 5. Verify messages are flushed
194
-
195
- Expected sequence:
196
- ```
197
- ✅ Online → ⚠️ Offline (queueing) → ✅ Online (flush queue)
198
- ```
199
-
200
- ## Integration with Cloud Services
201
-
202
- ### MQTT Example
203
-
204
- Replace simulated sending with MQTT:
205
-
206
- ```cpp
207
- #include <PubSubClient.h>
208
-
209
- WiFiClient wifiClient;
210
- PubSubClient mqttClient(wifiClient);
211
-
212
- // In setup()
213
- mqttClient.setServer("mqtt.example.com", 1883);
214
-
215
- // In bridgeStatusCallback()
216
- for (auto& msg : messages) {
217
- bool sent = mqttClient.publish(
218
- msg.destination.c_str(), // Topic from queueMessage()
219
- msg.payload.c_str()
220
- );
221
-
222
- if (sent) {
223
- mesh.removeQueuedMessage(msg.id);
224
- } else {
225
- mesh.incrementQueuedMessageAttempts(msg.id);
226
- }
227
- }
228
- ```
229
-
230
- ### HTTP Example
231
-
232
- Replace simulated sending with HTTP POST:
233
-
234
- ```cpp
235
- #include <HTTPClient.h>
236
-
237
- HTTPClient http;
238
-
239
- for (auto& msg : messages) {
240
- http.begin(msg.destination); // URL from queueMessage()
241
- http.addHeader("Content-Type", "application/json");
242
-
243
- int httpCode = http.POST(msg.payload);
244
- bool sent = (httpCode == 200 || httpCode == 201);
245
-
246
- if (sent) {
247
- mesh.removeQueuedMessage(msg.id);
248
- } else {
249
- mesh.incrementQueuedMessageAttempts(msg.id);
250
- }
251
-
252
- http.end();
253
- }
254
- ```
255
-
256
- ## Message Format
257
-
258
- Example JSON message structure:
259
-
260
- ### Critical Alarm
261
- ```json
262
- {
263
- "type": "CRITICAL_ALARM",
264
- "sensor": "O2",
265
- "value": 2.87,
266
- "threshold": 3.0,
267
- "tankId": "TANK_A",
268
- "nodeId": 123456789,
269
- "timestamp": 1234567890
270
- }
271
- ```
272
-
273
- ### Warning
274
- ```json
275
- {
276
- "type": "WARNING",
277
- "sensor": "O2",
278
- "value": 4.5,
279
- "threshold": 5.0,
280
- "nodeId": 123456789
281
- }
282
- ```
283
-
284
- ### Telemetry
285
- ```json
286
- {
287
- "sensor": "O2",
288
- "value": 7.32,
289
- "nodeId": 123456789
290
- }
291
- ```
292
-
293
- ## API Reference
294
-
295
- ### Enable Queue
296
-
297
- ```cpp
298
- mesh.enableMessageQueue(true, MAX_QUEUE_SIZE);
299
- ```
300
-
301
- ### Queue Message
302
-
303
- ```cpp
304
- uint32_t msgId = mesh.queueMessage(
305
- payload, // Message content
306
- destination, // Cloud endpoint/topic
307
- PRIORITY_CRITICAL // Priority level
308
- );
309
- ```
310
-
311
- ### Flush Queue
312
-
313
- ```cpp
314
- auto messages = mesh.flushMessageQueue();
315
- for (auto& msg : messages) {
316
- if (sendToCloud(msg)) {
317
- mesh.removeQueuedMessage(msg.id);
318
- }
319
- }
320
- ```
321
-
322
- ### Query Queue
323
-
324
- ```cpp
325
- uint32_t total = mesh.getQueuedMessageCount();
326
- uint32_t critical = mesh.getQueuedMessageCount(PRIORITY_CRITICAL);
327
- ```
328
-
329
- ### Callbacks
330
-
331
- ```cpp
332
- mesh.onBridgeStatusChanged([](uint32_t bridgeId, bool hasInternet) {
333
- // Handle Internet connectivity change
334
- });
335
-
336
- mesh.onQueueStateChanged([](QueueState state, uint32_t count) {
337
- // Handle queue state change (EMPTY, NORMAL, 75%, FULL)
338
- });
339
- ```
340
-
341
- ## Troubleshooting
342
-
343
- ### Queue Always Full
344
-
345
- - Increase `MAX_QUEUE_SIZE`
346
- - Decrease message frequency
347
- - Lower message priorities
348
- - Reduce `QUEUE_PRUNE_AGE`
349
-
350
- ### Messages Not Flushing
351
-
352
- - Check `bridgeStatusCallback()` is called
353
- - Verify Internet connectivity with `mesh.hasInternetConnection()`
354
- - Check MQTT/HTTP sending code
355
- - Monitor serial for errors
356
-
357
- ### High Memory Usage
358
-
359
- - Reduce `MAX_QUEUE_SIZE`
360
- - Enable aggressive pruning
361
- - Use shorter message payloads
362
- - Monitor with `ESP.getFreeHeap()`
363
-
364
- ## Performance
365
-
366
- ### Memory Usage
367
-
368
- | Queue Size | RAM Usage (approx) |
369
- |------------|-------------------|
370
- | 100 | ~20 KB |
371
- | 500 | ~100 KB |
372
- | 1000 | ~200 KB |
373
-
374
- **ESP32**: Can handle 1000+ messages
375
- **ESP8266**: Recommend ≤500 messages
376
-
377
- ### Throughput
378
-
379
- - **Queue**: ~1000 msg/sec
380
- - **Flush**: Limited by MQTT/HTTP send rate (~10-50 msg/sec)
381
-
382
- ## Related Documentation
383
-
384
- - [Issue #66: Message Queueing Feature](https://github.com/Alteriom/painlessMesh/issues/66)
385
- - [Issue #63: Bridge Status Broadcast](https://github.com/Alteriom/painlessMesh/issues/63)
386
- - [painlessMesh Documentation](https://gitlab.com/painlessMesh/painlessMesh)
387
-
388
- ## License
389
-
390
- MIT License - See repository LICENSE file