@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,796 +0,0 @@
1
- #ifndef ALTERIOM_SENSOR_PACKAGE_HPP
2
- #define ALTERIOM_SENSOR_PACKAGE_HPP
3
-
4
- #include "painlessmesh/plugin.hpp"
5
-
6
- namespace alteriom {
7
-
8
- /**
9
- * @brief Sensor data package for broadcasting environmental measurements
10
- *
11
- * This package is designed for Alteriom's IoT sensor network requirements,
12
- * allowing nodes to share environmental data across the mesh.
13
- */
14
- class SensorPackage : public painlessmesh::plugin::BroadcastPackage {
15
- public:
16
- // Temperature in Celsius
17
- double temperature = 0.0;
18
- // Relative humidity percentage
19
- double humidity = 0.0;
20
- // Atmospheric pressure in hPa
21
- double pressure = 0.0;
22
- // Unique sensor identifier
23
- uint32_t sensorId = 0;
24
- // Unix timestamp of measurement
25
- uint32_t timestamp = 0;
26
- // Battery level percentage
27
- uint8_t batteryLevel = 0;
28
-
29
- // Type ID 200 for Alteriom sensors
30
- SensorPackage() : BroadcastPackage(200) {}
31
-
32
- SensorPackage(JsonObject jsonObj) : BroadcastPackage(jsonObj) {
33
- temperature = jsonObj["temp"];
34
- humidity = jsonObj["hum"];
35
- pressure = jsonObj["press"];
36
- sensorId = jsonObj["sid"];
37
- timestamp = jsonObj["ts"];
38
- batteryLevel = jsonObj["bat"];
39
- }
40
-
41
- JsonObject addTo(JsonObject&& jsonObj) const {
42
- jsonObj = BroadcastPackage::addTo(std::move(jsonObj));
43
- jsonObj["temp"] = temperature;
44
- jsonObj["hum"] = humidity;
45
- jsonObj["press"] = pressure;
46
- jsonObj["sid"] = sensorId;
47
- jsonObj["ts"] = timestamp;
48
- jsonObj["bat"] = batteryLevel;
49
- return jsonObj;
50
- }
51
-
52
- #if ARDUINOJSON_VERSION_MAJOR < 7
53
- size_t jsonObjectSize() const { return JSON_OBJECT_SIZE(noJsonFields + 6); }
54
- #endif
55
- };
56
-
57
- /**
58
- * @brief Command package for controlling Alteriom devices
59
- *
60
- * Single-destination package for sending specific commands to individual nodes.
61
- */
62
- class CommandPackage : public painlessmesh::plugin::SinglePackage {
63
- public:
64
- uint8_t command = 0; // Command type
65
- uint32_t targetDevice = 0; // Target device ID
66
- TSTRING parameters = ""; // Command parameters as JSON string
67
- uint32_t commandId = 0; // Unique command identifier for tracking
68
-
69
- CommandPackage()
70
- : SinglePackage(400) {} // Type ID 400 (COMMAND per mqtt-schema v0.7.2+)
71
-
72
- CommandPackage(JsonObject jsonObj) : SinglePackage(jsonObj) {
73
- command = jsonObj["cmd"];
74
- targetDevice = jsonObj["target"];
75
- parameters = jsonObj["params"].as<TSTRING>();
76
- commandId = jsonObj["cid"];
77
- }
78
-
79
- JsonObject addTo(JsonObject&& jsonObj) const {
80
- jsonObj = SinglePackage::addTo(std::move(jsonObj));
81
- jsonObj["cmd"] = command;
82
- jsonObj["target"] = targetDevice;
83
- jsonObj["params"] = parameters;
84
- jsonObj["cid"] = commandId;
85
- return jsonObj;
86
- }
87
-
88
- #if ARDUINOJSON_VERSION_MAJOR < 7
89
- size_t jsonObjectSize() const {
90
- return JSON_OBJECT_SIZE(noJsonFields + 4) + parameters.length();
91
- }
92
- #endif
93
- };
94
-
95
- /**
96
- * @brief Status report package for device health monitoring
97
- */
98
- class StatusPackage : public painlessmesh::plugin::BroadcastPackage {
99
- public:
100
- uint8_t deviceStatus = 0; // Device status flags
101
- uint32_t uptime = 0; // Device uptime in seconds
102
- uint16_t freeMemory = 0; // Free memory in KB
103
- uint8_t wifiStrength = 0; // WiFi signal strength
104
- TSTRING firmwareVersion = ""; // Current firmware version
105
-
106
- // Command response fields (for MQTT bridge)
107
- uint32_t responseToCommand = 0; // CommandId this is responding to
108
- TSTRING responseMessage = ""; // Success/error message
109
-
110
- StatusPackage() : BroadcastPackage(202) {} // Type ID 202 for Alteriom status
111
-
112
- StatusPackage(JsonObject jsonObj) : BroadcastPackage(jsonObj) {
113
- deviceStatus = jsonObj["status"];
114
- uptime = jsonObj["uptime"];
115
- freeMemory = jsonObj["mem"];
116
- wifiStrength = jsonObj["wifi"];
117
- firmwareVersion = jsonObj["fw"].as<TSTRING>();
118
- responseToCommand = jsonObj["respTo"] | 0;
119
- responseMessage = jsonObj["respMsg"].as<TSTRING>();
120
- }
121
-
122
- JsonObject addTo(JsonObject&& jsonObj) const {
123
- jsonObj = BroadcastPackage::addTo(std::move(jsonObj));
124
- jsonObj["status"] = deviceStatus;
125
- jsonObj["uptime"] = uptime;
126
- jsonObj["mem"] = freeMemory;
127
- jsonObj["wifi"] = wifiStrength;
128
- jsonObj["fw"] = firmwareVersion;
129
- if (responseToCommand > 0) {
130
- jsonObj["respTo"] = responseToCommand;
131
- jsonObj["respMsg"] = responseMessage;
132
- }
133
- return jsonObj;
134
- }
135
-
136
- #if ARDUINOJSON_VERSION_MAJOR < 7
137
- size_t jsonObjectSize() const {
138
- return JSON_OBJECT_SIZE(noJsonFields + 7) + firmwareVersion.length() +
139
- responseMessage.length();
140
- }
141
- #endif
142
- };
143
-
144
- /**
145
- * @brief Enhanced status package with comprehensive health metrics (Phase 1)
146
- *
147
- * This is an extended version of StatusPackage that includes additional
148
- * mesh statistics, performance metrics, and alerting capabilities.
149
- * Type ID 203 is used to distinguish from the basic StatusPackage (202).
150
- */
151
- class EnhancedStatusPackage : public painlessmesh::plugin::BroadcastPackage {
152
- public:
153
- // Device Health (from original StatusPackage)
154
- uint8_t deviceStatus = 0; // Device status flags
155
- uint32_t uptime = 0; // Device uptime in seconds
156
- uint16_t freeMemory = 0; // Free memory in KB
157
- uint8_t wifiStrength = 0; // WiFi signal strength
158
- TSTRING firmwareVersion = ""; // Current firmware version
159
- TSTRING firmwareMD5 = ""; // Firmware hash for OTA verification
160
-
161
- // Mesh Statistics
162
- uint16_t nodeCount = 0; // Number of known nodes in mesh
163
- uint8_t connectionCount = 0; // Number of direct connections
164
- uint32_t messagesReceived = 0; // Total messages received
165
- uint32_t messagesSent = 0; // Total messages sent
166
- uint32_t messagesDropped = 0; // Total messages dropped/failed
167
-
168
- // Performance Metrics
169
- uint16_t avgLatency = 0; // Average message latency in ms
170
- uint8_t packetLossRate = 0; // Packet loss rate percentage (0-100)
171
- uint16_t throughput = 0; // Network throughput in bytes/sec
172
-
173
- // Warnings/Alerts
174
- uint8_t alertFlags = 0; // Bit flags for various alert conditions
175
- TSTRING lastError = ""; // Last error message for diagnostics
176
-
177
- EnhancedStatusPackage()
178
- : BroadcastPackage(604) {
179
- } // Type ID 604 for enhanced status (MESH_STATUS per mqtt-schema v0.7.2+)
180
-
181
- EnhancedStatusPackage(JsonObject jsonObj) : BroadcastPackage(jsonObj) {
182
- deviceStatus = jsonObj["status"];
183
- uptime = jsonObj["uptime"];
184
- freeMemory = jsonObj["mem"];
185
- wifiStrength = jsonObj["wifi"];
186
- firmwareVersion = jsonObj["fw"].as<TSTRING>();
187
- firmwareMD5 = jsonObj["fwMD5"].as<TSTRING>();
188
-
189
- nodeCount = jsonObj["nodes"];
190
- connectionCount = jsonObj["conns"];
191
- messagesReceived = jsonObj["msgRx"];
192
- messagesSent = jsonObj["msgTx"];
193
- messagesDropped = jsonObj["msgDrop"];
194
-
195
- avgLatency = jsonObj["latency"];
196
- packetLossRate = jsonObj["loss"];
197
- throughput = jsonObj["throughput"];
198
-
199
- alertFlags = jsonObj["alerts"];
200
- lastError = jsonObj["lastErr"].as<TSTRING>();
201
- }
202
-
203
- JsonObject addTo(JsonObject&& jsonObj) const {
204
- jsonObj = BroadcastPackage::addTo(std::move(jsonObj));
205
-
206
- // Device Health
207
- jsonObj["status"] = deviceStatus;
208
- jsonObj["uptime"] = uptime;
209
- jsonObj["mem"] = freeMemory;
210
- jsonObj["wifi"] = wifiStrength;
211
- jsonObj["fw"] = firmwareVersion;
212
- jsonObj["fwMD5"] = firmwareMD5;
213
-
214
- // Mesh Statistics
215
- jsonObj["nodes"] = nodeCount;
216
- jsonObj["conns"] = connectionCount;
217
- jsonObj["msgRx"] = messagesReceived;
218
- jsonObj["msgTx"] = messagesSent;
219
- jsonObj["msgDrop"] = messagesDropped;
220
-
221
- // Performance Metrics
222
- jsonObj["latency"] = avgLatency;
223
- jsonObj["loss"] = packetLossRate;
224
- jsonObj["throughput"] = throughput;
225
-
226
- // Alerts
227
- jsonObj["alerts"] = alertFlags;
228
- jsonObj["lastErr"] = lastError;
229
-
230
- return jsonObj;
231
- }
232
-
233
- #if ARDUINOJSON_VERSION_MAJOR < 7
234
- size_t jsonObjectSize() const {
235
- return JSON_OBJECT_SIZE(noJsonFields + 18) + firmwareVersion.length() +
236
- firmwareMD5.length() + lastError.length();
237
- }
238
- #endif
239
- };
240
-
241
- /**
242
- * @brief Detailed performance metrics package for monitoring (Phase 2)
243
- *
244
- * Provides comprehensive performance data including CPU usage, memory trends,
245
- * network throughput, and other metrics useful for dashboards and monitoring.
246
- * Type ID 204 for Alteriom metrics.
247
- */
248
- class MetricsPackage : public painlessmesh::plugin::BroadcastPackage {
249
- public:
250
- // CPU and Processing
251
- uint8_t cpuUsage = 0; // CPU usage percentage (0-100)
252
- uint32_t loopIterations = 0; // Loop iterations per second
253
- uint16_t taskQueueSize = 0; // Number of pending tasks
254
-
255
- // Memory Metrics
256
- uint32_t freeHeap = 0; // Free heap memory in bytes
257
- uint32_t minFreeHeap = 0; // Minimum free heap since boot
258
- uint32_t heapFragmentation = 0; // Heap fragmentation percentage
259
- uint32_t maxAllocHeap = 0; // Largest allocatable block
260
-
261
- // Network Performance
262
- uint32_t bytesReceived = 0; // Total bytes received
263
- uint32_t bytesSent = 0; // Total bytes sent
264
- uint16_t packetsReceived = 0; // Total packets received
265
- uint16_t packetsSent = 0; // Total packets sent
266
- uint16_t packetsDropped = 0; // Packets dropped
267
- uint16_t currentThroughput = 0; // Current throughput in bytes/sec
268
-
269
- // Timing and Latency
270
- uint32_t avgResponseTime = 0; // Average response time in microseconds
271
- uint32_t maxResponseTime = 0; // Maximum response time in microseconds
272
- uint16_t avgMeshLatency = 0; // Average mesh latency in milliseconds
273
-
274
- // Connection Quality
275
- uint8_t connectionQuality = 0; // Overall connection quality (0-100)
276
- int8_t wifiRSSI = 0; // WiFi RSSI in dBm
277
-
278
- // Collection metadata
279
- uint32_t collectionTimestamp = 0; // When metrics were collected
280
- uint32_t collectionInterval = 0; // Interval between collections in ms
281
-
282
- // MQTT Schema v0.7.2+ message_type for faster classification
283
- uint16_t messageType = 204; // SENSOR_METRICS (aligns with schema v0.7.2+)
284
-
285
- MetricsPackage() : BroadcastPackage(204) {}
286
-
287
- MetricsPackage(JsonObject jsonObj) : BroadcastPackage(jsonObj) {
288
- cpuUsage = jsonObj["cpu"];
289
- loopIterations = jsonObj["loops"];
290
- taskQueueSize = jsonObj["tasks"];
291
-
292
- freeHeap = jsonObj["heap"];
293
- minFreeHeap = jsonObj["minHeap"];
294
- heapFragmentation = jsonObj["fragHeap"];
295
- maxAllocHeap = jsonObj["maxHeap"];
296
-
297
- bytesReceived = jsonObj["bytesRx"];
298
- bytesSent = jsonObj["bytesTx"];
299
- packetsReceived = jsonObj["pktsRx"];
300
- packetsSent = jsonObj["pktsTx"];
301
- packetsDropped = jsonObj["pktsDrop"];
302
- currentThroughput = jsonObj["throughput"];
303
-
304
- avgResponseTime = jsonObj["avgResp"];
305
- maxResponseTime = jsonObj["maxResp"];
306
- avgMeshLatency = jsonObj["avgLat"];
307
-
308
- connectionQuality = jsonObj["connQual"];
309
- wifiRSSI = jsonObj["rssi"];
310
-
311
- collectionTimestamp = jsonObj["ts"];
312
- collectionInterval = jsonObj["interval"];
313
- messageType = jsonObj["message_type"] | 204;
314
- }
315
-
316
- JsonObject addTo(JsonObject&& jsonObj) const {
317
- jsonObj = BroadcastPackage::addTo(std::move(jsonObj));
318
-
319
- // CPU and Processing
320
- jsonObj["cpu"] = cpuUsage;
321
- jsonObj["loops"] = loopIterations;
322
- jsonObj["tasks"] = taskQueueSize;
323
-
324
- // Memory Metrics
325
- jsonObj["heap"] = freeHeap;
326
- jsonObj["minHeap"] = minFreeHeap;
327
- jsonObj["fragHeap"] = heapFragmentation;
328
- jsonObj["maxHeap"] = maxAllocHeap;
329
-
330
- // Network Performance
331
- jsonObj["bytesRx"] = bytesReceived;
332
- jsonObj["bytesTx"] = bytesSent;
333
- jsonObj["pktsRx"] = packetsReceived;
334
- jsonObj["pktsTx"] = packetsSent;
335
- jsonObj["pktsDrop"] = packetsDropped;
336
- jsonObj["throughput"] = currentThroughput;
337
-
338
- // Timing and Latency
339
- jsonObj["avgResp"] = avgResponseTime;
340
- jsonObj["maxResp"] = maxResponseTime;
341
- jsonObj["avgLat"] = avgMeshLatency;
342
-
343
- // Connection Quality
344
- jsonObj["connQual"] = connectionQuality;
345
- jsonObj["rssi"] = wifiRSSI;
346
-
347
- // Metadata
348
- jsonObj["ts"] = collectionTimestamp;
349
- jsonObj["interval"] = collectionInterval;
350
- jsonObj["message_type"] = messageType; // MQTT Schema v0.7.1+
351
-
352
- return jsonObj;
353
- }
354
-
355
- #if ARDUINOJSON_VERSION_MAJOR < 7
356
- size_t jsonObjectSize() const { return JSON_OBJECT_SIZE(noJsonFields + 22); }
357
- #endif
358
- };
359
-
360
- /**
361
- * @brief Health check package for proactive problem detection (Phase 2)
362
- *
363
- * Provides early warning indicators and health status to detect issues
364
- * before they cause failures. Used for predictive maintenance and alerting.
365
- * Type ID 605 for Alteriom health checks (MESH_METRICS per mqtt-schema
366
- * v0.7.2+).
367
- */
368
- class HealthCheckPackage : public painlessmesh::plugin::BroadcastPackage {
369
- public:
370
- // Overall Health Status (0=critical, 1=warning, 2=healthy)
371
- uint8_t healthStatus = 2;
372
-
373
- // Problem Indicators (bit flags)
374
- uint16_t problemFlags = 0; // Bit flags for specific problems
375
- /*
376
- * Problem flag bits:
377
- * 0x0001 - Low memory warning
378
- * 0x0002 - High CPU usage
379
- * 0x0004 - Connection instability
380
- * 0x0008 - High packet loss
381
- * 0x0010 - Network congestion
382
- * 0x0020 - Low battery (if applicable)
383
- * 0x0040 - Thermal warning
384
- * 0x0080 - Mesh partition detected
385
- * 0x0100 - OTA in progress
386
- * 0x0200 - Configuration error
387
- */
388
-
389
- // Memory Health
390
- uint8_t memoryHealth = 100; // Memory health score (0-100)
391
- uint32_t memoryTrend = 0; // Bytes/hour memory loss (for leak detection)
392
-
393
- // Network Health
394
- uint8_t networkHealth = 100; // Network health score (0-100)
395
- uint8_t packetLossPercent = 0; // Packet loss percentage
396
- uint8_t reconnectionCount = 0; // Reconnections in last hour
397
-
398
- // Performance Health
399
- uint8_t performanceHealth = 100; // Performance health score (0-100)
400
- uint32_t missedDeadlines = 0; // Missed task deadlines
401
- uint16_t maxLoopTime = 0; // Maximum loop execution time in ms
402
-
403
- // Environmental (if sensors available)
404
- int8_t temperature = 0; // Device temperature in Celsius
405
- uint8_t temperatureHealth = 100; // Temperature health score
406
-
407
- // Uptime and Stability
408
- uint32_t uptime = 0; // Uptime in seconds
409
- uint16_t crashCount = 0; // Crash/restart count
410
- uint32_t lastRebootReason = 0; // Last reboot reason code
411
-
412
- // Predictive indicators
413
- uint16_t estimatedTimeToFailure =
414
- 0; // Estimated hours until failure (0=unknown)
415
- TSTRING recommendations = ""; // Recommended actions
416
-
417
- // Check metadata
418
- uint32_t checkTimestamp = 0; // When check was performed
419
- uint32_t nextCheckDue = 0; // When next check is due
420
-
421
- // MQTT Schema v0.7.2+ message_type for faster classification
422
- uint16_t messageType = 605; // MESH_METRICS type code (mesh performance
423
- // health per mqtt-schema v0.7.2+)
424
-
425
- HealthCheckPackage() : BroadcastPackage(605) {}
426
-
427
- HealthCheckPackage(JsonObject jsonObj) : BroadcastPackage(jsonObj) {
428
- healthStatus = jsonObj["health"];
429
- problemFlags = jsonObj["problems"];
430
-
431
- memoryHealth = jsonObj["memHealth"];
432
- memoryTrend = jsonObj["memTrend"];
433
-
434
- networkHealth = jsonObj["netHealth"];
435
- packetLossPercent = jsonObj["loss"];
436
- reconnectionCount = jsonObj["reconn"];
437
-
438
- performanceHealth = jsonObj["perfHealth"];
439
- missedDeadlines = jsonObj["missed"];
440
- maxLoopTime = jsonObj["maxLoop"];
441
-
442
- temperature = jsonObj["temp"];
443
- temperatureHealth = jsonObj["tempHealth"];
444
-
445
- uptime = jsonObj["uptime"];
446
- crashCount = jsonObj["crashes"];
447
- lastRebootReason = jsonObj["reboot"];
448
-
449
- estimatedTimeToFailure = jsonObj["ettf"];
450
- recommendations = jsonObj["recommend"].as<TSTRING>();
451
-
452
- checkTimestamp = jsonObj["ts"];
453
- nextCheckDue = jsonObj["nextCheck"];
454
- messageType = jsonObj["message_type"] | 605;
455
- }
456
-
457
- JsonObject addTo(JsonObject&& jsonObj) const {
458
- jsonObj = BroadcastPackage::addTo(std::move(jsonObj));
459
-
460
- jsonObj["health"] = healthStatus;
461
- jsonObj["problems"] = problemFlags;
462
-
463
- jsonObj["memHealth"] = memoryHealth;
464
- jsonObj["memTrend"] = memoryTrend;
465
-
466
- jsonObj["netHealth"] = networkHealth;
467
- jsonObj["loss"] = packetLossPercent;
468
- jsonObj["reconn"] = reconnectionCount;
469
-
470
- jsonObj["perfHealth"] = performanceHealth;
471
- jsonObj["missed"] = missedDeadlines;
472
- jsonObj["maxLoop"] = maxLoopTime;
473
-
474
- jsonObj["temp"] = temperature;
475
- jsonObj["tempHealth"] = temperatureHealth;
476
-
477
- jsonObj["uptime"] = uptime;
478
- jsonObj["crashes"] = crashCount;
479
- jsonObj["reboot"] = lastRebootReason;
480
-
481
- jsonObj["ettf"] = estimatedTimeToFailure;
482
- jsonObj["recommend"] = recommendations;
483
-
484
- jsonObj["ts"] = checkTimestamp;
485
- jsonObj["nextCheck"] = nextCheckDue;
486
- jsonObj["message_type"] = messageType; // MQTT Schema v0.7.1+
487
-
488
- return jsonObj;
489
- }
490
-
491
- #if ARDUINOJSON_VERSION_MAJOR < 7
492
- size_t jsonObjectSize() const {
493
- return JSON_OBJECT_SIZE(noJsonFields + 20) + recommendations.length();
494
- }
495
- #endif
496
- };
497
-
498
- /**
499
- * @brief Mesh node information for a single node
500
- */
501
- struct MeshNodeInfo {
502
- uint32_t nodeId = 0; // Node identifier
503
- uint8_t status = 0; // 0=offline, 1=online, 2=unreachable
504
- uint32_t lastSeen = 0; // Unix timestamp of last communication
505
- int8_t signalStrength = 0; // RSSI in dBm
506
- };
507
-
508
- /**
509
- * @brief Mesh node list package (Type 600 - MESH_NODE_LIST)
510
- *
511
- * Provides list of all nodes in the mesh network with their status.
512
- * Type ID 600 for MESH_NODE_LIST per mqtt-schema v0.7.2+.
513
- */
514
- class MeshNodeListPackage : public painlessmesh::plugin::BroadcastPackage {
515
- public:
516
- // Array of node information (max 50 nodes)
517
- MeshNodeInfo nodes[50];
518
- uint8_t nodeCount = 0; // Actual number of nodes
519
- TSTRING meshId = ""; // Mesh network identifier
520
-
521
- // MQTT Schema v0.7.2+ message_type
522
- uint16_t messageType = 600; // MESH_NODE_LIST
523
-
524
- MeshNodeListPackage() : BroadcastPackage(600) {}
525
-
526
- MeshNodeListPackage(JsonObject jsonObj) : BroadcastPackage(jsonObj) {
527
- JsonArray nodesArray = jsonObj["nodes"];
528
- nodeCount = nodesArray.size();
529
- if (nodeCount > 50) nodeCount = 50;
530
-
531
- for (uint8_t i = 0; i < nodeCount; i++) {
532
- JsonObject node = nodesArray[i];
533
- nodes[i].nodeId = node["nodeId"];
534
- nodes[i].status = node["status"];
535
- nodes[i].lastSeen = node["lastSeen"];
536
- nodes[i].signalStrength = node["rssi"];
537
- }
538
-
539
- meshId = jsonObj["meshId"].as<TSTRING>();
540
- messageType = jsonObj["message_type"] | 600;
541
- }
542
-
543
- JsonObject addTo(JsonObject&& jsonObj) const {
544
- jsonObj = BroadcastPackage::addTo(std::move(jsonObj));
545
-
546
- JsonArray nodesArray = jsonObj["nodes"].to<JsonArray>();
547
- for (uint8_t i = 0; i < nodeCount; i++) {
548
- JsonObject node = nodesArray.add<JsonObject>();
549
- node["nodeId"] = nodes[i].nodeId;
550
- node["status"] = nodes[i].status;
551
- node["lastSeen"] = nodes[i].lastSeen;
552
- node["rssi"] = nodes[i].signalStrength;
553
- }
554
-
555
- jsonObj["nodeCount"] = nodeCount;
556
- jsonObj["meshId"] = meshId;
557
- jsonObj["message_type"] = messageType;
558
-
559
- return jsonObj;
560
- }
561
-
562
- #if ARDUINOJSON_VERSION_MAJOR < 7
563
- size_t jsonObjectSize() const {
564
- return JSON_OBJECT_SIZE(noJsonFields + 3) + JSON_ARRAY_SIZE(nodeCount) +
565
- nodeCount * JSON_OBJECT_SIZE(4) + meshId.length();
566
- }
567
- #endif
568
- };
569
-
570
- /**
571
- * @brief Mesh connection information
572
- */
573
- struct MeshConnection {
574
- uint32_t fromNode = 0; // Source node ID
575
- uint32_t toNode = 0; // Destination node ID
576
- float linkQuality = 0.0; // Link quality 0.0-1.0
577
- uint16_t latencyMs = 0; // Latency in milliseconds
578
- uint8_t hopCount = 1; // Number of hops
579
- };
580
-
581
- /**
582
- * @brief Mesh topology package (Type 601 - MESH_TOPOLOGY)
583
- *
584
- * Provides mesh network topology with all connections.
585
- * Type ID 601 for MESH_TOPOLOGY per mqtt-schema v0.7.2+.
586
- */
587
- class MeshTopologyPackage : public painlessmesh::plugin::BroadcastPackage {
588
- public:
589
- // Array of connections (max 100 connections)
590
- MeshConnection connections[100];
591
- uint8_t connectionCount = 0; // Actual number of connections
592
- uint32_t rootNode = 0; // Root/gateway node ID
593
-
594
- // MQTT Schema v0.7.2+ message_type
595
- uint16_t messageType = 601; // MESH_TOPOLOGY
596
-
597
- MeshTopologyPackage() : BroadcastPackage(601) {}
598
-
599
- MeshTopologyPackage(JsonObject jsonObj) : BroadcastPackage(jsonObj) {
600
- JsonArray connsArray = jsonObj["connections"];
601
- connectionCount = connsArray.size();
602
- if (connectionCount > 100) connectionCount = 100;
603
-
604
- for (uint8_t i = 0; i < connectionCount; i++) {
605
- JsonObject conn = connsArray[i];
606
- connections[i].fromNode = conn["from"];
607
- connections[i].toNode = conn["to"];
608
- connections[i].linkQuality = conn["quality"];
609
- connections[i].latencyMs = conn["latency"];
610
- connections[i].hopCount = conn["hops"];
611
- }
612
-
613
- rootNode = jsonObj["rootNode"];
614
- messageType = jsonObj["message_type"] | 601;
615
- }
616
-
617
- JsonObject addTo(JsonObject&& jsonObj) const {
618
- jsonObj = BroadcastPackage::addTo(std::move(jsonObj));
619
-
620
- JsonArray connsArray = jsonObj["connections"].to<JsonArray>();
621
- for (uint8_t i = 0; i < connectionCount; i++) {
622
- JsonObject conn = connsArray.add<JsonObject>();
623
- conn["from"] = connections[i].fromNode;
624
- conn["to"] = connections[i].toNode;
625
- conn["quality"] = connections[i].linkQuality;
626
- conn["latency"] = connections[i].latencyMs;
627
- conn["hops"] = connections[i].hopCount;
628
- }
629
-
630
- jsonObj["totalConnections"] = connectionCount;
631
- jsonObj["rootNode"] = rootNode;
632
- jsonObj["message_type"] = messageType;
633
-
634
- return jsonObj;
635
- }
636
-
637
- #if ARDUINOJSON_VERSION_MAJOR < 7
638
- size_t jsonObjectSize() const {
639
- return JSON_OBJECT_SIZE(noJsonFields + 3) +
640
- JSON_ARRAY_SIZE(connectionCount) +
641
- connectionCount * JSON_OBJECT_SIZE(5);
642
- }
643
- #endif
644
- };
645
-
646
- /**
647
- * @brief Mesh alert information
648
- */
649
- struct MeshAlert {
650
- uint8_t alertType =
651
- 0; // 0=low_memory, 1=node_offline, 2=connection_lost, etc.
652
- uint8_t severity = 0; // 0=info, 1=warning, 2=critical
653
- TSTRING message = ""; // Human-readable message
654
- uint32_t nodeId = 0; // Related node ID
655
- float metricValue = 0.0; // Related metric value
656
- float threshold = 0.0; // Threshold that triggered alert
657
- uint32_t alertId = 0; // Unique alert ID
658
- };
659
-
660
- /**
661
- * @brief Mesh alert package (Type 602 - MESH_ALERT)
662
- *
663
- * Provides mesh network alerts for critical events.
664
- * Type ID 602 for MESH_ALERT per mqtt-schema v0.7.2+.
665
- */
666
- class MeshAlertPackage : public painlessmesh::plugin::BroadcastPackage {
667
- public:
668
- // Array of alerts (max 20 alerts)
669
- MeshAlert alerts[20];
670
- uint8_t alertCount = 0; // Actual number of alerts
671
-
672
- // MQTT Schema v0.7.2+ message_type
673
- uint16_t messageType = 602; // MESH_ALERT
674
-
675
- MeshAlertPackage() : BroadcastPackage(602) {}
676
-
677
- MeshAlertPackage(JsonObject jsonObj) : BroadcastPackage(jsonObj) {
678
- JsonArray alertsArray = jsonObj["alerts"];
679
- alertCount = alertsArray.size();
680
- if (alertCount > 20) alertCount = 20;
681
-
682
- for (uint8_t i = 0; i < alertCount; i++) {
683
- JsonObject alert = alertsArray[i];
684
- alerts[i].alertType = alert["type"];
685
- alerts[i].severity = alert["severity"];
686
- alerts[i].message = alert["msg"].as<TSTRING>();
687
- alerts[i].nodeId = alert["nodeId"];
688
- alerts[i].metricValue = alert["value"];
689
- alerts[i].threshold = alert["threshold"];
690
- alerts[i].alertId = alert["alertId"];
691
- }
692
-
693
- messageType = jsonObj["message_type"] | 602;
694
- }
695
-
696
- JsonObject addTo(JsonObject&& jsonObj) const {
697
- jsonObj = BroadcastPackage::addTo(std::move(jsonObj));
698
-
699
- JsonArray alertsArray = jsonObj["alerts"].to<JsonArray>();
700
- for (uint8_t i = 0; i < alertCount; i++) {
701
- JsonObject alert = alertsArray.add<JsonObject>();
702
- alert["type"] = alerts[i].alertType;
703
- alert["severity"] = alerts[i].severity;
704
- alert["msg"] = alerts[i].message;
705
- alert["nodeId"] = alerts[i].nodeId;
706
- alert["value"] = alerts[i].metricValue;
707
- alert["threshold"] = alerts[i].threshold;
708
- alert["alertId"] = alerts[i].alertId;
709
- }
710
-
711
- jsonObj["alertCount"] = alertCount;
712
- jsonObj["message_type"] = messageType;
713
-
714
- return jsonObj;
715
- }
716
-
717
- #if ARDUINOJSON_VERSION_MAJOR < 7
718
- size_t jsonObjectSize() const {
719
- size_t size = JSON_OBJECT_SIZE(noJsonFields + 2) +
720
- JSON_ARRAY_SIZE(alertCount) +
721
- alertCount * JSON_OBJECT_SIZE(7);
722
- for (uint8_t i = 0; i < alertCount; i++) {
723
- size += alerts[i].message.length();
724
- }
725
- return size;
726
- }
727
- #endif
728
- };
729
-
730
- /**
731
- * @brief Mesh bridge package (Type 603 - MESH_BRIDGE)
732
- *
733
- * Encapsulates native mesh protocol messages for bridging.
734
- * Type ID 603 for MESH_BRIDGE per mqtt-schema v0.7.2+.
735
- */
736
- class MeshBridgePackage : public painlessmesh::plugin::BroadcastPackage {
737
- public:
738
- uint8_t meshProtocol = 0; // 0=painlessMesh, 1=esp-now, 2=ble-mesh, etc.
739
- uint32_t fromNodeId = 0; // Source node ID
740
- uint32_t toNodeId = 0; // Destination node ID (0=broadcast)
741
- uint16_t meshType = 0; // Mesh protocol-specific message type
742
- TSTRING rawPayload = ""; // Raw payload (hex/base64 encoded)
743
- int8_t rssi = 0; // Signal strength
744
- uint8_t hopCount = 0; // Number of hops
745
- uint32_t meshTimestamp = 0; // Mesh protocol timestamp
746
- uint32_t gatewayNodeId = 0; // Gateway's node ID
747
- TSTRING meshNetworkId = ""; // Mesh network identifier
748
-
749
- // MQTT Schema v0.7.2+ message_type
750
- uint16_t messageType = 603; // MESH_BRIDGE
751
-
752
- MeshBridgePackage() : BroadcastPackage(603) {}
753
-
754
- MeshBridgePackage(JsonObject jsonObj) : BroadcastPackage(jsonObj) {
755
- meshProtocol = jsonObj["protocol"];
756
- fromNodeId = jsonObj["fromNode"];
757
- toNodeId = jsonObj["toNode"];
758
- meshType = jsonObj["meshType"];
759
- rawPayload = jsonObj["payload"].as<TSTRING>();
760
- rssi = jsonObj["rssi"];
761
- hopCount = jsonObj["hops"];
762
- meshTimestamp = jsonObj["meshTs"];
763
- gatewayNodeId = jsonObj["gateway"];
764
- meshNetworkId = jsonObj["meshId"].as<TSTRING>();
765
- messageType = jsonObj["message_type"] | 603;
766
- }
767
-
768
- JsonObject addTo(JsonObject&& jsonObj) const {
769
- jsonObj = BroadcastPackage::addTo(std::move(jsonObj));
770
-
771
- jsonObj["protocol"] = meshProtocol;
772
- jsonObj["fromNode"] = fromNodeId;
773
- jsonObj["toNode"] = toNodeId;
774
- jsonObj["meshType"] = meshType;
775
- jsonObj["payload"] = rawPayload;
776
- jsonObj["rssi"] = rssi;
777
- jsonObj["hops"] = hopCount;
778
- jsonObj["meshTs"] = meshTimestamp;
779
- jsonObj["gateway"] = gatewayNodeId;
780
- jsonObj["meshId"] = meshNetworkId;
781
- jsonObj["message_type"] = messageType;
782
-
783
- return jsonObj;
784
- }
785
-
786
- #if ARDUINOJSON_VERSION_MAJOR < 7
787
- size_t jsonObjectSize() const {
788
- return JSON_OBJECT_SIZE(noJsonFields + 11) + rawPayload.length() +
789
- meshNetworkId.length();
790
- }
791
- #endif
792
- };
793
-
794
- } // namespace alteriom
795
-
796
- #endif // ALTERIOM_SENSOR_PACKAGE_HPP