@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.
- package/BRIDGE_TO_INTERNET.md +229 -0
- package/CHANGELOG.md +89 -1
- package/CONTRIBUTING.md +79 -0
- package/README.md +70 -143
- package/docs/README.md +1 -0
- package/docs/api/shared-gateway.md +1207 -0
- package/docs/troubleshooting/common-issues.md +28 -0
- package/docs/troubleshooting/faq.md +113 -12
- package/examples/basic/test/simulator/CMakeLists.txt +40 -0
- package/examples/basic/test/simulator/README.md +149 -0
- package/examples/basic/test/simulator/firmware/basic_firmware.hpp +117 -0
- package/examples/basic/test/simulator/scenarios/basic_mesh_test.yaml +81 -0
- package/examples/bridge/bridge.ino +17 -4
- package/examples/bridge_failover/README.md +81 -0
- package/examples/bridge_failover/bridge_failover.ino +51 -6
- package/examples/sharedGateway/README.md +235 -0
- package/examples/{meshCommandNode → sharedGateway}/platformio.ini +3 -2
- package/examples/sharedGateway/sharedGateway.ino +303 -0
- package/library.json +3 -22
- package/library.properties +1 -1
- package/package.json +3 -3
- package/src/arduino/wifi.hpp +380 -13
- package/src/painlessmesh/gateway.hpp +2120 -0
- package/src/painlessmesh/mesh.hpp +1034 -6
- package/src/painlessmesh/message_tracker.hpp +311 -0
- package/src/painlessmesh/protocol.hpp +6 -0
- package/DOCUMENTATION_INDEX.md +0 -146
- package/docs/API_DESIGN_GUIDELINES.md +0 -414
- package/docs/ARDUINO_LIBRARY_MANAGER_SUBMISSION.md +0 -331
- package/docs/BOOLEAN_NAMING_CONVENTION.md +0 -235
- package/docs/BRIDGE_FAILOVER.md +0 -512
- package/docs/BRIDGE_HEALTH_MONITORING.md +0 -293
- package/docs/CHANNEL_SYNCHRONIZATION.md +0 -209
- package/docs/CREATE_MISSING_RELEASES.md +0 -321
- package/docs/DOCUMENTATION_MIGRATION_PLAN.md +0 -176
- package/docs/FAQ_VERSION_NUMBERS.md +0 -152
- package/docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md +0 -1062
- package/docs/MESH_TOPOLOGY_GUIDE.md +0 -992
- package/docs/MESH_TOPOLOGY_PROGRESS.md +0 -422
- package/docs/MQTT_BRIDGE_COMMANDS.md +0 -894
- package/docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md +0 -324
- package/docs/MQTT_COMMAND_SCHEMA_PROPOSAL.md +0 -576
- package/docs/MQTT_SCHEMA_COMPLIANCE.md +0 -340
- package/docs/MQTT_SCHEMA_PROPOSALS.md +0 -446
- package/docs/MQTT_SCHEMA_REVIEW.md +0 -690
- package/docs/OTA_COMMANDS_REFERENCE.md +0 -554
- package/docs/PHASE1_GUIDE.md +0 -349
- package/docs/PHASE2_GUIDE.md +0 -543
- package/docs/QUICK_REFERENCE_VERSIONING.md +0 -127
- package/docs/RELEASE_AGENT_SUMMARY.md +0 -386
- package/docs/SCHEMA_VALIDATION_CHECKLIST.md +0 -222
- package/docs/VERSION_MANAGEMENT.md +0 -213
- package/docs/archive/DOCUSAURUS_DEPLOYMENT.md +0 -166
- package/docs/archive/FEATURE_PROPOSALS.md +0 -337
- package/docs/archive/LIBRARY_JSON_FIX.md +0 -98
- package/docs/archive/LIBRARY_STRUCTURE_FIX.md +0 -215
- package/docs/archive/PHASE1_IMPLEMENTATION.md +0 -325
- package/docs/archive/PHASE2_IMPLEMENTATION.md +0 -567
- package/docs/archive/RELEASE_SUMMARY.md +0 -173
- package/docs/archive/SCONS_BUILD_FIX.md +0 -313
- package/docs/archive/TRIGGER_RELEASE.md +0 -280
- package/docs/archive/VECTOR_INCLUDE_FIX.md +0 -129
- package/docs/archive/ota-and-status-enhancements.md +0 -911
- package/docs/archive/ota-status-architecture-diagrams.md +0 -658
- package/docs/archive/ota-status-quick-reference.md +0 -284
- package/docs/design/.gitkeep +0 -1
- package/docs/design/STATION_CREDENTIALS_DESIGN.md +0 -182
- package/docs/development/ARDUINO_COMPLIANCE_SUMMARY.md +0 -71
- package/docs/development/CODE_REFACTORING_RECOMMENDATIONS.md +0 -1011
- package/docs/development/DOCKER_TESTING.md +0 -196
- package/docs/development/PLATFORMIO_USAGE.md +0 -180
- package/docs/development/TESTING_SUMMARY.md +0 -126
- package/docs/development/contributing.md +0 -301
- package/docs/development/documentation.md +0 -583
- package/docs/features/DIAGNOSTICS_API.md +0 -534
- package/docs/implementation/BRIDGE_ARCHITECTURE_IMPLEMENTATION.md +0 -340
- package/docs/implementation/BRIDGE_HEALTH_MONITORING_IMPLEMENTATION.md +0 -213
- package/docs/implementation/BRIDGE_STATUS_FEATURE.md +0 -635
- package/docs/implementation/DIAGNOSTICS_API_IMPLEMENTATION.md +0 -232
- package/docs/implementation/IMPLEMENTATION_COMPLETE.md +0 -228
- package/docs/implementation/IMPLEMENTATION_NTP_TIME_SYNC.md +0 -325
- package/docs/implementation/IMPLEMENTATION_SUMMARY.md +0 -316
- package/docs/implementation/MESSAGE_QUEUE_IMPLEMENTATION.md +0 -405
- package/docs/implementation/MULTI_BRIDGE_IMPLEMENTATION.md +0 -520
- package/docs/implementation/NTP_TIME_SYNC_FEATURE.md +0 -392
- package/docs/improvements/FUTURE_PROPOSALS.md +0 -1016
- package/docs/improvements/IMPLEMENTATION_HISTORY.md +0 -1091
- package/docs/improvements/OTA_STATUS_ENHANCEMENTS.md +0 -709
- package/docs/improvements/README.md +0 -212
- package/docs/internal/CUSTOM_AGENT_ANALYSIS.md +0 -391
- package/docs/internal/ISSUE_65_VERIFICATION.md +0 -947
- package/docs/internal/ISSUE_66_CLOSURE.md +0 -249
- package/docs/internal/ISSUE_66_STATUS.md +0 -316
- package/docs/internal/PR_SUMMARY.md +0 -315
- package/docs/internal/REVIEW_SUMMARY.md +0 -332
- package/docs/multi-bridge-setup.md +0 -1025
- package/docs/platformio-publishing.md +0 -255
- package/docs/platformio-setup-summary.md +0 -121
- package/docs/releases/ANNOUNCEMENT_v1.8.6.md +0 -63
- package/docs/releases/ANNOUNCEMENT_v1.8.7.md +0 -113
- package/docs/releases/BRIDGE_STATUS_SELF_REGISTRATION_FIX.md +0 -221
- package/docs/releases/FEATURE_HISTORY.md +0 -543
- package/docs/releases/GITHUB_RELEASE_v1.8.6.md +0 -71
- package/docs/releases/GITHUB_RELEASE_v1.8.7.md +0 -90
- package/docs/releases/PATCH_v1.7.2.md +0 -262
- package/docs/releases/PATCH_v1.7.3.md +0 -262
- package/docs/releases/PATCH_v1.7.4.md +0 -219
- package/docs/releases/PHASE1_SUMMARY.md +0 -246
- package/docs/releases/PHASE2_SUMMARY.md +0 -499
- package/docs/releases/PUBLISH_v1.8.0_INSTRUCTIONS.md +0 -163
- package/docs/releases/QUICK_START_RELEASES.md +0 -113
- package/docs/releases/RELEASE_CHECKLIST_1.8.10.md +0 -331
- package/docs/releases/RELEASE_CHECKLIST_1.8.9.md +0 -207
- package/docs/releases/RELEASE_CHECKLIST_v1.7.4.md +0 -253
- package/docs/releases/RELEASE_CHECKLIST_v1.7.5.md +0 -315
- package/docs/releases/RELEASE_CHECKLIST_v1.7.6.md +0 -389
- package/docs/releases/RELEASE_CHECKLIST_v1.8.0.md +0 -331
- package/docs/releases/RELEASE_CHECKLIST_v1.8.2.md +0 -309
- package/docs/releases/RELEASE_NOTES_1.7.0.md +0 -539
- package/docs/releases/RELEASE_NOTES_1.8.10.md +0 -239
- package/docs/releases/RELEASE_NOTES_1.8.9.md +0 -213
- package/docs/releases/RELEASE_NOTES_v1.8.0.md +0 -685
- package/docs/releases/RELEASE_NOTES_v1.8.1.md +0 -221
- package/docs/releases/RELEASE_NOTES_v1.8.2.md +0 -421
- package/docs/releases/RELEASE_NOTES_v1.8.3.md +0 -292
- package/docs/releases/RELEASE_NOTES_v1.8.4.md +0 -277
- package/docs/releases/RELEASE_NOTES_v1.8.6.md +0 -205
- package/docs/releases/RELEASE_NOTES_v1.8.7.md +0 -184
- package/docs/releases/RELEASE_PLAN_v1.7.6.md +0 -816
- package/docs/releases/RELEASE_SUMMARY_1.8.10.md +0 -193
- package/docs/releases/RELEASE_SUMMARY_v1.7.4.md +0 -276
- package/docs/releases/RELEASE_SUMMARY_v1.7.5.md +0 -322
- package/docs/releases/RELEASE_SUMMARY_v1.7.6.md +0 -436
- package/docs/releases/RELEASE_SUMMARY_v1.7.7.md +0 -391
- package/docs/releases/RELEASE_SUMMARY_v1.7.8.md +0 -523
- package/docs/releases/RELEASE_SUMMARY_v1.7.9.md +0 -542
- package/docs/troubleshooting/ARDUINO_IDE_VERSION_FIX_SUMMARY.md +0 -229
- package/docs/troubleshooting/ARDUINO_LIBRARY_NAME_FIX.md +0 -197
- package/docs/troubleshooting/CRASH_QUICK_REF.md +0 -93
- package/docs/troubleshooting/ESP32_C6_COMPATIBILITY.md +0 -157
- package/docs/troubleshooting/FREERTOS_ASSERTION_FAILURE.md +0 -288
- package/docs/troubleshooting/FREERTOS_FIX_IMPLEMENTATION.md +0 -267
- package/docs/troubleshooting/NPM_PUBLISHING_ISSUE_SUMMARY.md +0 -110
- package/docs/troubleshooting/PAINLESSMESH_V1.7.4_COMPILATION_ISSUES.md +0 -547
- package/docs/troubleshooting/QUICK_FIX_FREERTOS.md +0 -164
- package/docs/troubleshooting/SENSOR_NODE_CONNECTION_CRASH.md +0 -264
- package/docs/troubleshooting/station-reconnection-issues.md +0 -172
- package/docs/v1.7.7_MQTT_IMPROVEMENTS.md +0 -794
- package/docs/wiki/API-Reference.md +0 -246
- package/docs/wiki/Complete-Documentation.md +0 -123
- package/examples/alteriomImproved/alteriom_sensor_package.hpp +0 -224
- package/examples/alteriomImproved/improved_sensor_node.ino +0 -248
- package/examples/alteriomImproved/platformio.ini +0 -32
- package/examples/alteriomMetricsHealth/alteriom_sensor_package.hpp +0 -796
- package/examples/alteriomMetricsHealth/metrics_health_node.ino +0 -429
- package/examples/alteriomMetricsHealth/platformio.ini +0 -26
- package/examples/alteriomPhase1/alteriom_sensor_package.hpp +0 -224
- package/examples/alteriomPhase1/phase1_features.ino +0 -242
- package/examples/alteriomPhase1/platformio.ini +0 -26
- package/examples/alteriomPhase2/alteriom_sensor_package.hpp +0 -224
- package/examples/alteriomPhase2/phase2_features.ino +0 -186
- package/examples/alteriomPhase2/platformio.ini +0 -26
- package/examples/alteriomSensorNode/alteriom_sensor_node.ino +0 -186
- package/examples/alteriomSensorNode/alteriom_sensor_package.hpp +0 -1227
- package/examples/alteriomSensorNode/platformio.ini +0 -26
- package/examples/bridge/alteriom_sensor_package.hpp +0 -1170
- package/examples/bridge/bridge_health_monitoring_example.ino +0 -188
- package/examples/bridge/enhanced_mqtt_bridge.hpp +0 -610
- package/examples/bridge/enhanced_mqtt_bridge_example.ino +0 -226
- package/examples/bridge/mesh_event_publisher.hpp +0 -253
- package/examples/bridge/mesh_topology_reporter.hpp +0 -303
- package/examples/bridge/mqtt_command_bridge.hpp +0 -459
- package/examples/bridge/mqtt_status_bridge.hpp +0 -519
- package/examples/bridgeAwareSensorNode/alteriom_sensor_package.hpp +0 -1227
- package/examples/bridgeAwareSensorNode/bridgeAwareSensorNode.ino +0 -342
- package/examples/bridgeAwareSensorNode/platformio.ini +0 -26
- package/examples/diagnosticsExample/diagnosticsExample.ino +0 -171
- package/examples/diagnosticsExample/platformio.ini +0 -26
- package/examples/echoNode/echoNode.ino +0 -33
- package/examples/echoNode/platformio.ini +0 -26
- package/examples/meshCommandNode/alteriom_sensor_package.hpp +0 -235
- package/examples/meshCommandNode/meshCommandNode.ino +0 -265
- package/examples/mqttCommandBridge/alteriom_sensor_package.hpp +0 -235
- package/examples/mqttCommandBridge/mesh_event_publisher.hpp +0 -253
- package/examples/mqttCommandBridge/mesh_topology_reporter.hpp +0 -303
- package/examples/mqttCommandBridge/mqttCommandBridge.ino +0 -254
- package/examples/mqttCommandBridge/mqtt_command_bridge.hpp +0 -462
- package/examples/mqttCommandBridge/platformio.ini +0 -27
- package/examples/mqttStatusBridge/mqttStatusBridge.ino +0 -218
- package/examples/mqttStatusBridge/mqtt_status_bridge.hpp +0 -522
- package/examples/mqttStatusBridge/platformio.ini +0 -27
- package/examples/mqttTopologyTest/README.md +0 -467
- package/examples/mqttTopologyTest/mqttTopologyTest.ino +0 -754
- package/examples/mqttTopologyTest/platformio.ini +0 -27
- package/examples/multi_bridge/README.md +0 -346
- package/examples/multi_bridge/primary_bridge.ino +0 -96
- package/examples/multi_bridge/regular_node.ino +0 -141
- package/examples/multi_bridge/secondary_bridge.ino +0 -111
- package/examples/ntpTimeSyncBridge/alteriom_sensor_package.hpp +0 -1383
- package/examples/ntpTimeSyncBridge/ntpTimeSyncBridge.ino +0 -86
- package/examples/ntpTimeSyncNode/alteriom_sensor_package.hpp +0 -1383
- package/examples/ntpTimeSyncNode/ntpTimeSyncNode.ino +0 -109
- package/examples/queued_alarms/README.md +0 -390
- package/examples/queued_alarms/queued_alarms.ino +0 -265
- package/examples/routing_demo/README.md +0 -172
- package/examples/routing_demo/routing_demo.ino +0 -102
- package/examples/rtcIntegration/README.md +0 -294
- package/examples/rtcIntegration/rtcIntegration.ino +0 -210
|
@@ -1,235 +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
|
-
double temperature = 0.0; // Temperature in Celsius
|
|
17
|
-
double humidity = 0.0; // Relative humidity percentage
|
|
18
|
-
double pressure = 0.0; // Atmospheric pressure in hPa
|
|
19
|
-
uint32_t sensorId = 0; // Unique sensor identifier
|
|
20
|
-
uint32_t timestamp = 0; // Unix timestamp of measurement
|
|
21
|
-
uint8_t batteryLevel = 0; // Battery level percentage
|
|
22
|
-
|
|
23
|
-
SensorPackage()
|
|
24
|
-
: BroadcastPackage(200) {} // Type ID 200 for Alteriom sensors
|
|
25
|
-
|
|
26
|
-
SensorPackage(JsonObject jsonObj) : BroadcastPackage(jsonObj) {
|
|
27
|
-
temperature = jsonObj["temp"];
|
|
28
|
-
humidity = jsonObj["hum"];
|
|
29
|
-
pressure = jsonObj["press"];
|
|
30
|
-
sensorId = jsonObj["sid"];
|
|
31
|
-
timestamp = jsonObj["ts"];
|
|
32
|
-
batteryLevel = jsonObj["bat"];
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
JsonObject addTo(JsonObject&& jsonObj) const {
|
|
36
|
-
jsonObj = BroadcastPackage::addTo(std::move(jsonObj));
|
|
37
|
-
jsonObj["temp"] = temperature;
|
|
38
|
-
jsonObj["hum"] = humidity;
|
|
39
|
-
jsonObj["press"] = pressure;
|
|
40
|
-
jsonObj["sid"] = sensorId;
|
|
41
|
-
jsonObj["ts"] = timestamp;
|
|
42
|
-
jsonObj["bat"] = batteryLevel;
|
|
43
|
-
return jsonObj;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
#if ARDUINOJSON_VERSION_MAJOR < 7
|
|
47
|
-
size_t jsonObjectSize() const { return JSON_OBJECT_SIZE(noJsonFields + 6); }
|
|
48
|
-
#endif
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* @brief Command package for controlling Alteriom devices
|
|
53
|
-
*
|
|
54
|
-
* Single-destination package for sending specific commands to individual nodes.
|
|
55
|
-
*/
|
|
56
|
-
class CommandPackage : public painlessmesh::plugin::SinglePackage {
|
|
57
|
-
public:
|
|
58
|
-
uint8_t command = 0; // Command type
|
|
59
|
-
uint32_t targetDevice = 0; // Target device ID
|
|
60
|
-
TSTRING parameters = ""; // Command parameters as JSON string
|
|
61
|
-
uint32_t commandId = 0; // Unique command identifier for tracking
|
|
62
|
-
|
|
63
|
-
CommandPackage() : SinglePackage(400) {} // Type ID 201 for Alteriom commands
|
|
64
|
-
|
|
65
|
-
CommandPackage(JsonObject jsonObj) : SinglePackage(jsonObj) {
|
|
66
|
-
command = jsonObj["cmd"];
|
|
67
|
-
targetDevice = jsonObj["target"];
|
|
68
|
-
parameters = jsonObj["params"].as<TSTRING>();
|
|
69
|
-
commandId = jsonObj["cid"];
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
JsonObject addTo(JsonObject&& jsonObj) const {
|
|
73
|
-
jsonObj = SinglePackage::addTo(std::move(jsonObj));
|
|
74
|
-
jsonObj["cmd"] = command;
|
|
75
|
-
jsonObj["target"] = targetDevice;
|
|
76
|
-
jsonObj["params"] = parameters;
|
|
77
|
-
jsonObj["cid"] = commandId;
|
|
78
|
-
return jsonObj;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
#if ARDUINOJSON_VERSION_MAJOR < 7
|
|
82
|
-
size_t jsonObjectSize() const {
|
|
83
|
-
return JSON_OBJECT_SIZE(noJsonFields + 4) + parameters.length();
|
|
84
|
-
}
|
|
85
|
-
#endif
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* @brief Status report package for device health monitoring
|
|
90
|
-
*/
|
|
91
|
-
class StatusPackage : public painlessmesh::plugin::BroadcastPackage {
|
|
92
|
-
public:
|
|
93
|
-
uint8_t deviceStatus = 0; // Device status flags
|
|
94
|
-
uint32_t uptime = 0; // Device uptime in seconds
|
|
95
|
-
uint16_t freeMemory = 0; // Free memory in KB
|
|
96
|
-
uint8_t wifiStrength = 0; // WiFi signal strength
|
|
97
|
-
TSTRING firmwareVersion = ""; // Current firmware version
|
|
98
|
-
|
|
99
|
-
// Command response fields (for MQTT bridge)
|
|
100
|
-
uint32_t responseToCommand = 0; // CommandId this is responding to
|
|
101
|
-
TSTRING responseMessage = ""; // Success/error message
|
|
102
|
-
|
|
103
|
-
StatusPackage() : BroadcastPackage(202) {} // Type ID 202 for Alteriom status
|
|
104
|
-
|
|
105
|
-
StatusPackage(JsonObject jsonObj) : BroadcastPackage(jsonObj) {
|
|
106
|
-
deviceStatus = jsonObj["status"];
|
|
107
|
-
uptime = jsonObj["uptime"];
|
|
108
|
-
freeMemory = jsonObj["mem"];
|
|
109
|
-
wifiStrength = jsonObj["wifi"];
|
|
110
|
-
firmwareVersion = jsonObj["fw"].as<TSTRING>();
|
|
111
|
-
responseToCommand = jsonObj["respTo"] | 0;
|
|
112
|
-
responseMessage = jsonObj["respMsg"].as<TSTRING>();
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
JsonObject addTo(JsonObject&& jsonObj) const {
|
|
116
|
-
jsonObj = BroadcastPackage::addTo(std::move(jsonObj));
|
|
117
|
-
jsonObj["status"] = deviceStatus;
|
|
118
|
-
jsonObj["uptime"] = uptime;
|
|
119
|
-
jsonObj["mem"] = freeMemory;
|
|
120
|
-
jsonObj["wifi"] = wifiStrength;
|
|
121
|
-
jsonObj["fw"] = firmwareVersion;
|
|
122
|
-
if (responseToCommand > 0) {
|
|
123
|
-
jsonObj["respTo"] = responseToCommand;
|
|
124
|
-
jsonObj["respMsg"] = responseMessage;
|
|
125
|
-
}
|
|
126
|
-
return jsonObj;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
#if ARDUINOJSON_VERSION_MAJOR < 7
|
|
130
|
-
size_t jsonObjectSize() const {
|
|
131
|
-
return JSON_OBJECT_SIZE(noJsonFields + 7) + firmwareVersion.length() +
|
|
132
|
-
responseMessage.length();
|
|
133
|
-
}
|
|
134
|
-
#endif
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* @brief Enhanced status package with comprehensive health metrics (Phase 1)
|
|
139
|
-
*
|
|
140
|
-
* This is an extended version of StatusPackage that includes additional
|
|
141
|
-
* mesh statistics, performance metrics, and alerting capabilities.
|
|
142
|
-
* Type ID 203 is used to distinguish from the basic StatusPackage (202).
|
|
143
|
-
*/
|
|
144
|
-
class EnhancedStatusPackage : public painlessmesh::plugin::BroadcastPackage {
|
|
145
|
-
public:
|
|
146
|
-
// Device Health (from original StatusPackage)
|
|
147
|
-
uint8_t deviceStatus = 0; // Device status flags
|
|
148
|
-
uint32_t uptime = 0; // Device uptime in seconds
|
|
149
|
-
uint16_t freeMemory = 0; // Free memory in KB
|
|
150
|
-
uint8_t wifiStrength = 0; // WiFi signal strength
|
|
151
|
-
TSTRING firmwareVersion = ""; // Current firmware version
|
|
152
|
-
TSTRING firmwareMD5 = ""; // Firmware hash for OTA verification
|
|
153
|
-
|
|
154
|
-
// Mesh Statistics
|
|
155
|
-
uint16_t nodeCount = 0; // Number of known nodes in mesh
|
|
156
|
-
uint8_t connectionCount = 0; // Number of direct connections
|
|
157
|
-
uint32_t messagesReceived = 0; // Total messages received
|
|
158
|
-
uint32_t messagesSent = 0; // Total messages sent
|
|
159
|
-
uint32_t messagesDropped = 0; // Total messages dropped/failed
|
|
160
|
-
|
|
161
|
-
// Performance Metrics
|
|
162
|
-
uint16_t avgLatency = 0; // Average message latency in ms
|
|
163
|
-
uint8_t packetLossRate = 0; // Packet loss rate percentage (0-100)
|
|
164
|
-
uint16_t throughput = 0; // Network throughput in bytes/sec
|
|
165
|
-
|
|
166
|
-
// Warnings/Alerts
|
|
167
|
-
uint8_t alertFlags = 0; // Bit flags for various alert conditions
|
|
168
|
-
TSTRING lastError = ""; // Last error message for diagnostics
|
|
169
|
-
|
|
170
|
-
EnhancedStatusPackage()
|
|
171
|
-
: BroadcastPackage(203) {} // Type ID 203 for enhanced status
|
|
172
|
-
|
|
173
|
-
EnhancedStatusPackage(JsonObject jsonObj) : BroadcastPackage(jsonObj) {
|
|
174
|
-
deviceStatus = jsonObj["status"];
|
|
175
|
-
uptime = jsonObj["uptime"];
|
|
176
|
-
freeMemory = jsonObj["mem"];
|
|
177
|
-
wifiStrength = jsonObj["wifi"];
|
|
178
|
-
firmwareVersion = jsonObj["fw"].as<TSTRING>();
|
|
179
|
-
firmwareMD5 = jsonObj["fwMD5"].as<TSTRING>();
|
|
180
|
-
|
|
181
|
-
nodeCount = jsonObj["nodes"];
|
|
182
|
-
connectionCount = jsonObj["conns"];
|
|
183
|
-
messagesReceived = jsonObj["msgRx"];
|
|
184
|
-
messagesSent = jsonObj["msgTx"];
|
|
185
|
-
messagesDropped = jsonObj["msgDrop"];
|
|
186
|
-
|
|
187
|
-
avgLatency = jsonObj["latency"];
|
|
188
|
-
packetLossRate = jsonObj["loss"];
|
|
189
|
-
throughput = jsonObj["throughput"];
|
|
190
|
-
|
|
191
|
-
alertFlags = jsonObj["alerts"];
|
|
192
|
-
lastError = jsonObj["lastErr"].as<TSTRING>();
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
JsonObject addTo(JsonObject&& jsonObj) const {
|
|
196
|
-
jsonObj = BroadcastPackage::addTo(std::move(jsonObj));
|
|
197
|
-
|
|
198
|
-
// Device Health
|
|
199
|
-
jsonObj["status"] = deviceStatus;
|
|
200
|
-
jsonObj["uptime"] = uptime;
|
|
201
|
-
jsonObj["mem"] = freeMemory;
|
|
202
|
-
jsonObj["wifi"] = wifiStrength;
|
|
203
|
-
jsonObj["fw"] = firmwareVersion;
|
|
204
|
-
jsonObj["fwMD5"] = firmwareMD5;
|
|
205
|
-
|
|
206
|
-
// Mesh Statistics
|
|
207
|
-
jsonObj["nodes"] = nodeCount;
|
|
208
|
-
jsonObj["conns"] = connectionCount;
|
|
209
|
-
jsonObj["msgRx"] = messagesReceived;
|
|
210
|
-
jsonObj["msgTx"] = messagesSent;
|
|
211
|
-
jsonObj["msgDrop"] = messagesDropped;
|
|
212
|
-
|
|
213
|
-
// Performance Metrics
|
|
214
|
-
jsonObj["latency"] = avgLatency;
|
|
215
|
-
jsonObj["loss"] = packetLossRate;
|
|
216
|
-
jsonObj["throughput"] = throughput;
|
|
217
|
-
|
|
218
|
-
// Alerts
|
|
219
|
-
jsonObj["alerts"] = alertFlags;
|
|
220
|
-
jsonObj["lastErr"] = lastError;
|
|
221
|
-
|
|
222
|
-
return jsonObj;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
#if ARDUINOJSON_VERSION_MAJOR < 7
|
|
226
|
-
size_t jsonObjectSize() const {
|
|
227
|
-
return JSON_OBJECT_SIZE(noJsonFields + 18) + firmwareVersion.length() +
|
|
228
|
-
firmwareMD5.length() + lastError.length();
|
|
229
|
-
}
|
|
230
|
-
#endif
|
|
231
|
-
};
|
|
232
|
-
|
|
233
|
-
} // namespace alteriom
|
|
234
|
-
|
|
235
|
-
#endif // ALTERIOM_SENSOR_PACKAGE_HPP
|
|
@@ -1,253 +0,0 @@
|
|
|
1
|
-
#ifndef MESH_EVENT_PUBLISHER_HPP
|
|
2
|
-
#define MESH_EVENT_PUBLISHER_HPP
|
|
3
|
-
|
|
4
|
-
#include "painlessMesh.h"
|
|
5
|
-
#include <PubSubClient.h>
|
|
6
|
-
#include <ArduinoJson.h>
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* MeshEventPublisher - Publish real-time mesh events
|
|
10
|
-
*
|
|
11
|
-
* Publishes mesh state change events conforming to @alteriom/mqtt-schema v0.5.0
|
|
12
|
-
* mesh_event.schema.json specification.
|
|
13
|
-
*
|
|
14
|
-
* Event Types:
|
|
15
|
-
* - node_join: New node entered mesh
|
|
16
|
-
* - node_leave: Node left mesh (clean disconnect)
|
|
17
|
-
* - connection_lost: Direct connection failed
|
|
18
|
-
* - connection_restored: Connection recovered
|
|
19
|
-
*
|
|
20
|
-
* @author Alteriom Development Team
|
|
21
|
-
* @date October 12, 2025
|
|
22
|
-
*/
|
|
23
|
-
class MeshEventPublisher {
|
|
24
|
-
private:
|
|
25
|
-
painlessMesh& mesh;
|
|
26
|
-
PubSubClient& mqttClient;
|
|
27
|
-
String meshId;
|
|
28
|
-
String eventTopic;
|
|
29
|
-
String firmwareVersion;
|
|
30
|
-
|
|
31
|
-
public:
|
|
32
|
-
MeshEventPublisher(painlessMesh& mesh, PubSubClient& mqttClient,
|
|
33
|
-
const String& meshId, const String& topic = "alteriom/mesh/events",
|
|
34
|
-
const String& fwVersion = "GW 2.3.4")
|
|
35
|
-
: mesh(mesh), mqttClient(mqttClient), meshId(meshId),
|
|
36
|
-
eventTopic(topic), firmwareVersion(fwVersion) {}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Publish node join event
|
|
40
|
-
* Called when a new node connects to the mesh
|
|
41
|
-
*/
|
|
42
|
-
void publishNodeJoin(uint32_t nodeId) {
|
|
43
|
-
JsonDocument doc; // ArduinoJson v7: automatic sizing
|
|
44
|
-
|
|
45
|
-
// Envelope
|
|
46
|
-
doc["schema_version"] = 1;
|
|
47
|
-
doc["device_id"] = generateDeviceId(mesh.getNodeId());
|
|
48
|
-
doc["device_type"] = "gateway";
|
|
49
|
-
doc["timestamp"] = getISO8601Timestamp();
|
|
50
|
-
doc["firmware_version"] = firmwareVersion;
|
|
51
|
-
|
|
52
|
-
// Event
|
|
53
|
-
doc["event"] = "mesh_event";
|
|
54
|
-
doc["event_type"] = "node_join";
|
|
55
|
-
doc["mesh_id"] = meshId;
|
|
56
|
-
|
|
57
|
-
JsonArray affected = doc["affected_nodes"].to<JsonArray>();
|
|
58
|
-
affected.add(generateDeviceId(nodeId));
|
|
59
|
-
|
|
60
|
-
JsonObject details = doc["details"].to<JsonObject>();
|
|
61
|
-
details["total_nodes"] = mesh.getNodeList().size() + 1;
|
|
62
|
-
details["timestamp"] = getISO8601Timestamp();
|
|
63
|
-
|
|
64
|
-
publishEvent(doc, "Node Join");
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Publish node leave event
|
|
69
|
-
* Called when a node disconnects from the mesh
|
|
70
|
-
*/
|
|
71
|
-
void publishNodeLeave(uint32_t nodeId) {
|
|
72
|
-
JsonDocument doc; // ArduinoJson v7: automatic sizing
|
|
73
|
-
|
|
74
|
-
// Envelope
|
|
75
|
-
doc["schema_version"] = 1;
|
|
76
|
-
doc["device_id"] = generateDeviceId(mesh.getNodeId());
|
|
77
|
-
doc["device_type"] = "gateway";
|
|
78
|
-
doc["timestamp"] = getISO8601Timestamp();
|
|
79
|
-
doc["firmware_version"] = firmwareVersion;
|
|
80
|
-
|
|
81
|
-
// Event
|
|
82
|
-
doc["event"] = "mesh_event";
|
|
83
|
-
doc["event_type"] = "node_leave";
|
|
84
|
-
doc["mesh_id"] = meshId;
|
|
85
|
-
|
|
86
|
-
JsonArray affected = doc["affected_nodes"].to<JsonArray>();
|
|
87
|
-
affected.add(generateDeviceId(nodeId));
|
|
88
|
-
|
|
89
|
-
JsonObject details = doc["details"].to<JsonObject>();
|
|
90
|
-
details["reason"] = "connection_lost";
|
|
91
|
-
details["last_seen"] = getISO8601Timestamp();
|
|
92
|
-
details["total_nodes"] = mesh.getNodeList().size() + 1;
|
|
93
|
-
|
|
94
|
-
publishEvent(doc, "Node Leave");
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Publish connection lost event
|
|
99
|
-
* Called when a direct connection fails
|
|
100
|
-
*/
|
|
101
|
-
void publishConnectionLost(uint32_t nodeId) {
|
|
102
|
-
JsonDocument doc; // ArduinoJson v7: automatic sizing
|
|
103
|
-
|
|
104
|
-
doc["schema_version"] = 1;
|
|
105
|
-
doc["device_id"] = generateDeviceId(mesh.getNodeId());
|
|
106
|
-
doc["device_type"] = "gateway";
|
|
107
|
-
doc["timestamp"] = getISO8601Timestamp();
|
|
108
|
-
doc["firmware_version"] = firmwareVersion;
|
|
109
|
-
|
|
110
|
-
doc["event"] = "mesh_event";
|
|
111
|
-
doc["event_type"] = "connection_lost";
|
|
112
|
-
doc["mesh_id"] = meshId;
|
|
113
|
-
|
|
114
|
-
JsonArray affected = doc["affected_nodes"].to<JsonArray>();
|
|
115
|
-
affected.add(generateDeviceId(nodeId));
|
|
116
|
-
|
|
117
|
-
JsonObject details = doc["details"].to<JsonObject>();
|
|
118
|
-
details["reason"] = "timeout";
|
|
119
|
-
details["timestamp"] = getISO8601Timestamp();
|
|
120
|
-
|
|
121
|
-
publishEvent(doc, "Connection Lost");
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Publish connection restored event
|
|
126
|
-
* Called when a connection is re-established
|
|
127
|
-
*/
|
|
128
|
-
void publishConnectionRestored(uint32_t nodeId) {
|
|
129
|
-
JsonDocument doc; // ArduinoJson v7: automatic sizing
|
|
130
|
-
|
|
131
|
-
doc["schema_version"] = 1;
|
|
132
|
-
doc["device_id"] = generateDeviceId(mesh.getNodeId());
|
|
133
|
-
doc["device_type"] = "gateway";
|
|
134
|
-
doc["timestamp"] = getISO8601Timestamp();
|
|
135
|
-
doc["firmware_version"] = firmwareVersion;
|
|
136
|
-
|
|
137
|
-
doc["event"] = "mesh_event";
|
|
138
|
-
doc["event_type"] = "connection_restored";
|
|
139
|
-
doc["mesh_id"] = meshId;
|
|
140
|
-
|
|
141
|
-
JsonArray affected = doc["affected_nodes"].to<JsonArray>();
|
|
142
|
-
affected.add(generateDeviceId(nodeId));
|
|
143
|
-
|
|
144
|
-
JsonObject details = doc["details"].to<JsonObject>();
|
|
145
|
-
details["timestamp"] = getISO8601Timestamp();
|
|
146
|
-
|
|
147
|
-
publishEvent(doc, "Connection Restored");
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Publish network split event
|
|
152
|
-
* Called when mesh partitions into separate segments
|
|
153
|
-
*/
|
|
154
|
-
void publishNetworkSplit() {
|
|
155
|
-
JsonDocument doc; // ArduinoJson v7: automatic sizing
|
|
156
|
-
|
|
157
|
-
doc["schema_version"] = 1;
|
|
158
|
-
doc["device_id"] = generateDeviceId(mesh.getNodeId());
|
|
159
|
-
doc["device_type"] = "gateway";
|
|
160
|
-
doc["timestamp"] = getISO8601Timestamp();
|
|
161
|
-
doc["firmware_version"] = firmwareVersion;
|
|
162
|
-
|
|
163
|
-
doc["event"] = "mesh_event";
|
|
164
|
-
doc["event_type"] = "network_split";
|
|
165
|
-
doc["mesh_id"] = meshId;
|
|
166
|
-
|
|
167
|
-
JsonArray affected = doc["affected_nodes"].to<JsonArray>();
|
|
168
|
-
// TODO: Detect which nodes are in different partitions
|
|
169
|
-
|
|
170
|
-
JsonObject details = doc["details"].to<JsonObject>();
|
|
171
|
-
details["timestamp"] = getISO8601Timestamp();
|
|
172
|
-
details["partition_count"] = 2; // TODO: Calculate actual partitions
|
|
173
|
-
|
|
174
|
-
publishEvent(doc, "Network Split");
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Publish network merged event
|
|
179
|
-
* Called when mesh partitions rejoin
|
|
180
|
-
*/
|
|
181
|
-
void publishNetworkMerged() {
|
|
182
|
-
JsonDocument doc; // ArduinoJson v7: automatic sizing
|
|
183
|
-
|
|
184
|
-
doc["schema_version"] = 1;
|
|
185
|
-
doc["device_id"] = generateDeviceId(mesh.getNodeId());
|
|
186
|
-
doc["device_type"] = "gateway";
|
|
187
|
-
doc["timestamp"] = getISO8601Timestamp();
|
|
188
|
-
doc["firmware_version"] = firmwareVersion;
|
|
189
|
-
|
|
190
|
-
doc["event"] = "mesh_event";
|
|
191
|
-
doc["event_type"] = "network_merged";
|
|
192
|
-
doc["mesh_id"] = meshId;
|
|
193
|
-
|
|
194
|
-
JsonArray affected = doc["affected_nodes"].to<JsonArray>();
|
|
195
|
-
// TODO: List nodes that rejoined
|
|
196
|
-
|
|
197
|
-
JsonObject details = doc["details"].to<JsonObject>();
|
|
198
|
-
details["timestamp"] = getISO8601Timestamp();
|
|
199
|
-
|
|
200
|
-
publishEvent(doc, "Network Merged");
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
private:
|
|
204
|
-
/**
|
|
205
|
-
* Internal method to publish event to MQTT
|
|
206
|
-
*/
|
|
207
|
-
void publishEvent(const JsonDocument& doc, const char* eventName) {
|
|
208
|
-
if (!mqttClient.connected()) {
|
|
209
|
-
Serial.printf("[Event] ⚠️ MQTT not connected, cannot publish %s\n", eventName);
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
String payload;
|
|
214
|
-
serializeJson(doc, payload);
|
|
215
|
-
|
|
216
|
-
bool success = mqttClient.publish(eventTopic.c_str(), payload.c_str());
|
|
217
|
-
|
|
218
|
-
if (success) {
|
|
219
|
-
Serial.printf("[Event] ✅ Published: %s (node: %s)\n",
|
|
220
|
-
eventName,
|
|
221
|
-
doc["affected_nodes"][0].as<const char*>());
|
|
222
|
-
} else {
|
|
223
|
-
Serial.printf("[Event] ❌ Failed to publish: %s\n", eventName);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Generate device ID in Alteriom format (ALT-XXXXXXXXXXXX)
|
|
229
|
-
*/
|
|
230
|
-
String generateDeviceId(uint32_t nodeId) {
|
|
231
|
-
char deviceId[20];
|
|
232
|
-
snprintf(deviceId, sizeof(deviceId), "ALT-%012X", nodeId);
|
|
233
|
-
return String(deviceId);
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
/**
|
|
237
|
-
* Get current timestamp in ISO 8601 format
|
|
238
|
-
* TODO: Use proper NTP time if available
|
|
239
|
-
*/
|
|
240
|
-
String getISO8601Timestamp() {
|
|
241
|
-
// For now, use epoch-based timestamp
|
|
242
|
-
// In production, this should use actual NTP-synced time
|
|
243
|
-
unsigned long ms = millis();
|
|
244
|
-
char timestamp[32];
|
|
245
|
-
snprintf(timestamp, sizeof(timestamp), "2025-10-12T%02lu:%02lu:%02luZ",
|
|
246
|
-
(ms / 3600000) % 24,
|
|
247
|
-
(ms / 60000) % 60,
|
|
248
|
-
(ms / 1000) % 60);
|
|
249
|
-
return String(timestamp);
|
|
250
|
-
}
|
|
251
|
-
};
|
|
252
|
-
|
|
253
|
-
#endif // MESH_EVENT_PUBLISHER_HPP
|