@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.
- package/BRIDGE_TO_INTERNET.md +229 -0
- package/CHANGELOG.md +61 -1
- package/CONTRIBUTING.md +79 -0
- package/README.md +69 -144
- package/docs/README.md +1 -0
- package/docs/api/shared-gateway.md +1207 -0
- package/examples/bridge_failover/README.md +81 -0
- package/examples/bridge_failover/bridge_failover.ino +35 -4
- 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 -6
- package/src/arduino/wifi.hpp +342 -4
- 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/RELEASE_NOTES_1.8.15.md +0 -160
- package/RELEASE_READINESS_PLAN.md +0 -323
- package/TESTING_WITH_SIMULATOR.md +0 -259
- 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/BRIDGE_INITIALIZATION_FALLBACK.md +0 -357
- 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/SIMULATOR_TESTING.md +0 -408
- 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/common-architecture-mistakes.md +0 -438
- package/docs/troubleshooting/internet-access-faq.md +0 -299
- 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 -108
- package/examples/multi_bridge/regular_node.ino +0 -141
- package/examples/multi_bridge/secondary_bridge.ino +0 -123
- 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,429 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Alteriom Metrics and Health Monitoring Node
|
|
3
|
-
*
|
|
4
|
-
* This example demonstrates the new MetricsPackage (Type 204) and
|
|
5
|
-
* HealthCheckPackage (Type 605) introduced in painlessMesh v1.7.7.
|
|
6
|
-
*
|
|
7
|
-
* Features:
|
|
8
|
-
* - Comprehensive performance metrics collection
|
|
9
|
-
* - Proactive health monitoring with problem detection
|
|
10
|
-
* - Configurable collection intervals
|
|
11
|
-
* - Alert threshold detection
|
|
12
|
-
* - Memory leak detection
|
|
13
|
-
* - Network quality monitoring
|
|
14
|
-
*
|
|
15
|
-
* Hardware: ESP32 or ESP8266
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
#include "painlessMesh.h"
|
|
19
|
-
#include "alteriom_sensor_package.hpp"
|
|
20
|
-
|
|
21
|
-
using namespace alteriom;
|
|
22
|
-
|
|
23
|
-
// Mesh Configuration
|
|
24
|
-
#define MESH_PREFIX "AlteriomMesh"
|
|
25
|
-
#define MESH_PASSWORD "your_password"
|
|
26
|
-
#define MESH_PORT 5555
|
|
27
|
-
|
|
28
|
-
// Collection Intervals (milliseconds)
|
|
29
|
-
#define METRICS_INTERVAL 30000 // 30 seconds
|
|
30
|
-
#define HEALTH_INTERVAL 60000 // 60 seconds
|
|
31
|
-
|
|
32
|
-
Scheduler userScheduler;
|
|
33
|
-
painlessMesh mesh;
|
|
34
|
-
|
|
35
|
-
// Tasks
|
|
36
|
-
Task taskSendMetrics(METRICS_INTERVAL, TASK_FOREVER, &sendMetrics);
|
|
37
|
-
Task taskSendHealth(HEALTH_INTERVAL, TASK_FOREVER, &sendHealthCheck);
|
|
38
|
-
|
|
39
|
-
// Metrics tracking
|
|
40
|
-
uint32_t loopCount = 0;
|
|
41
|
-
uint32_t lastLoopCount = 0;
|
|
42
|
-
uint32_t lastMetricsTime = 0;
|
|
43
|
-
uint32_t maxLoopDuration = 0;
|
|
44
|
-
uint32_t loopStartTime = 0;
|
|
45
|
-
|
|
46
|
-
// Network statistics
|
|
47
|
-
uint32_t totalBytesRx = 0;
|
|
48
|
-
uint32_t totalBytesTx = 0;
|
|
49
|
-
uint32_t totalPacketsRx = 0;
|
|
50
|
-
uint32_t totalPacketsTx = 0;
|
|
51
|
-
uint32_t packetsDropped = 0;
|
|
52
|
-
|
|
53
|
-
// Health tracking
|
|
54
|
-
uint32_t minHeapEverSeen = 0xFFFFFFFF;
|
|
55
|
-
uint32_t previousHeap = 0;
|
|
56
|
-
uint32_t memoryCheckCount = 0;
|
|
57
|
-
int32_t memoryTrendAccumulator = 0;
|
|
58
|
-
uint16_t reconnectionCount = 0;
|
|
59
|
-
|
|
60
|
-
void setup() {
|
|
61
|
-
Serial.begin(115200);
|
|
62
|
-
Serial.println("\n\n=== Alteriom Metrics & Health Monitoring Node ===");
|
|
63
|
-
Serial.println("painlessMesh v1.7.7 - Type 204, 604 & 605 Packages");
|
|
64
|
-
|
|
65
|
-
// Initialize mesh
|
|
66
|
-
mesh.setDebugMsgTypes(ERROR | STARTUP | CONNECTION);
|
|
67
|
-
mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT);
|
|
68
|
-
|
|
69
|
-
// Set up callbacks
|
|
70
|
-
mesh.onReceive(&receivedCallback);
|
|
71
|
-
mesh.onNewConnection(&newConnectionCallback);
|
|
72
|
-
mesh.onChangedConnections(&changedConnectionCallback);
|
|
73
|
-
mesh.onDroppedConnection(&droppedConnectionCallback);
|
|
74
|
-
|
|
75
|
-
// Add tasks to scheduler
|
|
76
|
-
userScheduler.addTask(taskSendMetrics);
|
|
77
|
-
userScheduler.addTask(taskSendHealth);
|
|
78
|
-
|
|
79
|
-
taskSendMetrics.enable();
|
|
80
|
-
taskSendHealth.enable();
|
|
81
|
-
|
|
82
|
-
// Initialize tracking
|
|
83
|
-
lastMetricsTime = millis();
|
|
84
|
-
minHeapEverSeen = ESP.getFreeHeap();
|
|
85
|
-
previousHeap = minHeapEverSeen;
|
|
86
|
-
|
|
87
|
-
Serial.printf("Node ID: %u\n", mesh.getNodeId());
|
|
88
|
-
Serial.printf("Free Heap: %u bytes\n", ESP.getFreeHeap());
|
|
89
|
-
Serial.println("Setup complete!");
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
void loop() {
|
|
93
|
-
loopStartTime = micros();
|
|
94
|
-
loopCount++;
|
|
95
|
-
|
|
96
|
-
mesh.update();
|
|
97
|
-
|
|
98
|
-
// Track maximum loop duration
|
|
99
|
-
uint32_t loopDuration = micros() - loopStartTime;
|
|
100
|
-
if (loopDuration > maxLoopDuration) {
|
|
101
|
-
maxLoopDuration = loopDuration;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
void sendMetrics() {
|
|
106
|
-
Serial.println("\n--- Sending Metrics Package ---");
|
|
107
|
-
|
|
108
|
-
MetricsPackage metrics;
|
|
109
|
-
metrics.from = mesh.getNodeId();
|
|
110
|
-
|
|
111
|
-
// Calculate time since last metrics
|
|
112
|
-
uint32_t now = millis();
|
|
113
|
-
uint32_t timeDelta = now - lastMetricsTime;
|
|
114
|
-
if (timeDelta == 0) timeDelta = 1; // Prevent division by zero
|
|
115
|
-
|
|
116
|
-
// CPU and Processing
|
|
117
|
-
metrics.loopIterations = ((loopCount - lastLoopCount) * 1000) / timeDelta;
|
|
118
|
-
metrics.cpuUsage = calculateCPUUsage();
|
|
119
|
-
// Note: TaskScheduler doesn't provide a size() method, so we'll use 0 or estimate
|
|
120
|
-
metrics.taskQueueSize = 0; // TaskScheduler API doesn't expose queue size
|
|
121
|
-
|
|
122
|
-
// Memory Metrics
|
|
123
|
-
metrics.freeHeap = ESP.getFreeHeap();
|
|
124
|
-
metrics.minFreeHeap = minHeapEverSeen;
|
|
125
|
-
#ifdef ESP32
|
|
126
|
-
metrics.heapFragmentation = 0; // ESP32 doesn't provide fragmentation
|
|
127
|
-
metrics.maxAllocHeap = ESP.getMaxAllocHeap();
|
|
128
|
-
#else
|
|
129
|
-
metrics.heapFragmentation = ESP.getHeapFragmentation();
|
|
130
|
-
metrics.maxAllocHeap = ESP.getMaxFreeBlockSize();
|
|
131
|
-
#endif
|
|
132
|
-
|
|
133
|
-
// Update minimum heap tracking
|
|
134
|
-
if (metrics.freeHeap < minHeapEverSeen) {
|
|
135
|
-
minHeapEverSeen = metrics.freeHeap;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// Network Performance
|
|
139
|
-
metrics.bytesReceived = totalBytesRx;
|
|
140
|
-
metrics.bytesSent = totalBytesTx;
|
|
141
|
-
metrics.packetsReceived = totalPacketsRx;
|
|
142
|
-
metrics.packetsSent = totalPacketsTx;
|
|
143
|
-
metrics.packetsDropped = packetsDropped;
|
|
144
|
-
metrics.currentThroughput = ((totalBytesRx + totalBytesTx) * 1000) / timeDelta;
|
|
145
|
-
|
|
146
|
-
// Timing and Latency
|
|
147
|
-
metrics.avgResponseTime = mesh.getNodeTime() % 1000000; // Mock value
|
|
148
|
-
metrics.maxResponseTime = maxLoopDuration;
|
|
149
|
-
metrics.avgMeshLatency = 25; // Would need to calculate from actual delays
|
|
150
|
-
|
|
151
|
-
// Connection Quality
|
|
152
|
-
metrics.connectionQuality = calculateConnectionQuality();
|
|
153
|
-
metrics.wifiRSSI = WiFi.RSSI();
|
|
154
|
-
|
|
155
|
-
// Metadata
|
|
156
|
-
metrics.collectionTimestamp = mesh.getNodeTime();
|
|
157
|
-
metrics.collectionInterval = METRICS_INTERVAL;
|
|
158
|
-
|
|
159
|
-
// Serialize and send the metrics
|
|
160
|
-
JsonDocument doc;
|
|
161
|
-
JsonObject obj = doc.to<JsonObject>();
|
|
162
|
-
metrics.addTo(std::move(obj));
|
|
163
|
-
|
|
164
|
-
String msg;
|
|
165
|
-
serializeJson(doc, msg);
|
|
166
|
-
bool sent = mesh.sendBroadcast(msg);
|
|
167
|
-
|
|
168
|
-
if (sent) {
|
|
169
|
-
Serial.println("Metrics sent successfully");
|
|
170
|
-
Serial.printf(" CPU: %d%%, Loops/sec: %u\n", metrics.cpuUsage, metrics.loopIterations);
|
|
171
|
-
Serial.printf(" Free Heap: %u bytes, Min: %u bytes\n", metrics.freeHeap, metrics.minFreeHeap);
|
|
172
|
-
Serial.printf(" Throughput: %u bytes/sec\n", metrics.currentThroughput);
|
|
173
|
-
Serial.printf(" WiFi RSSI: %d dBm\n", metrics.wifiRSSI);
|
|
174
|
-
} else {
|
|
175
|
-
Serial.println("ERROR: Failed to send metrics");
|
|
176
|
-
packetsDropped++;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// Update tracking
|
|
180
|
-
lastLoopCount = loopCount;
|
|
181
|
-
lastMetricsTime = now;
|
|
182
|
-
maxLoopDuration = 0;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
void sendHealthCheck() {
|
|
186
|
-
Serial.println("\n--- Sending Health Check Package ---");
|
|
187
|
-
|
|
188
|
-
HealthCheckPackage health;
|
|
189
|
-
health.from = mesh.getNodeId();
|
|
190
|
-
|
|
191
|
-
// Collect health metrics
|
|
192
|
-
uint32_t freeHeap = ESP.getFreeHeap();
|
|
193
|
-
uint8_t memHealth = calculateMemoryHealth(freeHeap);
|
|
194
|
-
uint8_t netHealth = calculateNetworkHealth();
|
|
195
|
-
uint8_t perfHealth = calculatePerformanceHealth();
|
|
196
|
-
|
|
197
|
-
// Overall health status (0=critical, 1=warning, 2=healthy)
|
|
198
|
-
if (memHealth < 30 || netHealth < 30 || perfHealth < 30) {
|
|
199
|
-
health.healthStatus = 0; // Critical
|
|
200
|
-
} else if (memHealth < 60 || netHealth < 60 || perfHealth < 60) {
|
|
201
|
-
health.healthStatus = 1; // Warning
|
|
202
|
-
} else {
|
|
203
|
-
health.healthStatus = 2; // Healthy
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// Problem flags
|
|
207
|
-
health.problemFlags = 0;
|
|
208
|
-
if (memHealth < 60) health.problemFlags |= 0x0001; // Low memory
|
|
209
|
-
if (perfHealth < 60) health.problemFlags |= 0x0002; // High CPU
|
|
210
|
-
if (netHealth < 60) health.problemFlags |= 0x0004; // Connection instability
|
|
211
|
-
if (packetsDropped > 0) health.problemFlags |= 0x0008; // High packet loss
|
|
212
|
-
|
|
213
|
-
// Memory Health
|
|
214
|
-
health.memoryHealth = memHealth;
|
|
215
|
-
|
|
216
|
-
// Calculate memory trend (bytes per hour)
|
|
217
|
-
if (memoryCheckCount > 0) {
|
|
218
|
-
int32_t memoryDelta = (int32_t)previousHeap - (int32_t)freeHeap;
|
|
219
|
-
memoryTrendAccumulator += memoryDelta;
|
|
220
|
-
health.memoryTrend = (memoryTrendAccumulator * 3600000) / (HEALTH_INTERVAL * memoryCheckCount);
|
|
221
|
-
}
|
|
222
|
-
previousHeap = freeHeap;
|
|
223
|
-
memoryCheckCount++;
|
|
224
|
-
|
|
225
|
-
// Network Health
|
|
226
|
-
health.networkHealth = netHealth;
|
|
227
|
-
health.packetLossPercent = calculatePacketLoss();
|
|
228
|
-
health.reconnectionCount = reconnectionCount;
|
|
229
|
-
|
|
230
|
-
// Performance Health
|
|
231
|
-
health.performanceHealth = perfHealth;
|
|
232
|
-
health.missedDeadlines = 0; // Would need task scheduler integration
|
|
233
|
-
health.maxLoopTime = maxLoopDuration / 1000; // Convert to ms
|
|
234
|
-
|
|
235
|
-
// Environmental (if available)
|
|
236
|
-
#ifdef TEMP_SENSOR_PIN
|
|
237
|
-
health.temperature = readTemperature();
|
|
238
|
-
health.temperatureHealth = calculateTemperatureHealth(health.temperature);
|
|
239
|
-
#else
|
|
240
|
-
health.temperature = 0;
|
|
241
|
-
health.temperatureHealth = 100;
|
|
242
|
-
#endif
|
|
243
|
-
|
|
244
|
-
// Uptime and Stability
|
|
245
|
-
health.uptime = millis() / 1000;
|
|
246
|
-
health.crashCount = 0; // Would need EEPROM tracking
|
|
247
|
-
health.lastRebootReason = 1; // Normal startup
|
|
248
|
-
|
|
249
|
-
// Predictive indicators
|
|
250
|
-
if (health.memoryTrend > 0 && freeHeap > health.memoryTrend) {
|
|
251
|
-
health.estimatedTimeToFailure = (freeHeap / health.memoryTrend);
|
|
252
|
-
} else {
|
|
253
|
-
health.estimatedTimeToFailure = 0; // Unknown
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// Recommendations
|
|
257
|
-
if (health.healthStatus == 0) {
|
|
258
|
-
health.recommendations = "CRITICAL: Immediate attention required";
|
|
259
|
-
} else if (health.healthStatus == 1) {
|
|
260
|
-
if (memHealth < 60) {
|
|
261
|
-
health.recommendations = "Increase memory allocation or reduce message frequency";
|
|
262
|
-
} else if (netHealth < 60) {
|
|
263
|
-
health.recommendations = "Check network connections and reduce interference";
|
|
264
|
-
} else {
|
|
265
|
-
health.recommendations = "Monitor performance closely";
|
|
266
|
-
}
|
|
267
|
-
} else {
|
|
268
|
-
health.recommendations = "System operating normally";
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// Metadata
|
|
272
|
-
health.checkTimestamp = mesh.getNodeTime();
|
|
273
|
-
health.nextCheckDue = health.checkTimestamp + (HEALTH_INTERVAL * 1000);
|
|
274
|
-
|
|
275
|
-
// Serialize and send the health check
|
|
276
|
-
JsonDocument doc;
|
|
277
|
-
JsonObject obj = doc.to<JsonObject>();
|
|
278
|
-
health.addTo(std::move(obj));
|
|
279
|
-
|
|
280
|
-
String msg;
|
|
281
|
-
serializeJson(doc, msg);
|
|
282
|
-
bool sent = mesh.sendBroadcast(msg);
|
|
283
|
-
|
|
284
|
-
if (sent) {
|
|
285
|
-
Serial.println("Health check sent successfully");
|
|
286
|
-
Serial.printf(" Overall Health: %s (Status: %d)\n",
|
|
287
|
-
health.healthStatus == 2 ? "HEALTHY" :
|
|
288
|
-
health.healthStatus == 1 ? "WARNING" : "CRITICAL",
|
|
289
|
-
health.healthStatus);
|
|
290
|
-
Serial.printf(" Memory Health: %d%%, Network Health: %d%%, Performance: %d%%\n",
|
|
291
|
-
health.memoryHealth, health.networkHealth, health.performanceHealth);
|
|
292
|
-
if (health.problemFlags > 0) {
|
|
293
|
-
Serial.printf(" Problem Flags: 0x%04X\n", health.problemFlags);
|
|
294
|
-
}
|
|
295
|
-
Serial.printf(" Memory Trend: %d bytes/hour\n", health.memoryTrend);
|
|
296
|
-
if (health.estimatedTimeToFailure > 0) {
|
|
297
|
-
Serial.printf(" Est. Time to Failure: %d hours\n", health.estimatedTimeToFailure);
|
|
298
|
-
}
|
|
299
|
-
Serial.printf(" Recommendations: %s\n", health.recommendations.c_str());
|
|
300
|
-
} else {
|
|
301
|
-
Serial.println("ERROR: Failed to send health check");
|
|
302
|
-
packetsDropped++;
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
// Utility functions for health calculations
|
|
307
|
-
uint8_t calculateCPUUsage() {
|
|
308
|
-
// Simplified CPU usage estimation based on loop execution
|
|
309
|
-
// In reality, this would need more sophisticated timing
|
|
310
|
-
uint32_t loopsPerSec = (loopCount - lastLoopCount) * 1000 / (millis() - lastMetricsTime);
|
|
311
|
-
if (loopsPerSec > 10000) return 20; // Low usage
|
|
312
|
-
if (loopsPerSec > 5000) return 40;
|
|
313
|
-
if (loopsPerSec > 2000) return 60;
|
|
314
|
-
if (loopsPerSec > 1000) return 80;
|
|
315
|
-
return 95; // High usage
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
uint8_t calculateConnectionQuality() {
|
|
319
|
-
int8_t rssi = WiFi.RSSI();
|
|
320
|
-
uint8_t lossPercent = calculatePacketLoss();
|
|
321
|
-
|
|
322
|
-
// Quality based on RSSI (0-50 points)
|
|
323
|
-
uint8_t rssiScore = 0;
|
|
324
|
-
if (rssi > -50) rssiScore = 50;
|
|
325
|
-
else if (rssi > -70) rssiScore = 40;
|
|
326
|
-
else if (rssi > -80) rssiScore = 30;
|
|
327
|
-
else if (rssi > -90) rssiScore = 20;
|
|
328
|
-
else rssiScore = 10;
|
|
329
|
-
|
|
330
|
-
// Quality based on packet loss (0-50 points)
|
|
331
|
-
uint8_t lossScore = 50 - (lossPercent / 2);
|
|
332
|
-
if (lossScore < 0) lossScore = 0;
|
|
333
|
-
|
|
334
|
-
return rssiScore + lossScore;
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
uint8_t calculateMemoryHealth(uint32_t freeHeap) {
|
|
338
|
-
#ifdef ESP32
|
|
339
|
-
uint32_t totalHeap = ESP.getHeapSize();
|
|
340
|
-
#else
|
|
341
|
-
uint32_t totalHeap = 81920; // ESP8266 ~80KB
|
|
342
|
-
#endif
|
|
343
|
-
|
|
344
|
-
uint8_t heapPercent = (freeHeap * 100) / totalHeap;
|
|
345
|
-
|
|
346
|
-
if (heapPercent > 60) return 100;
|
|
347
|
-
if (heapPercent > 40) return 80;
|
|
348
|
-
if (heapPercent > 20) return 50;
|
|
349
|
-
if (heapPercent > 10) return 30;
|
|
350
|
-
return 10;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
uint8_t calculateNetworkHealth() {
|
|
354
|
-
uint8_t connectionCount = mesh.getNodeList().size();
|
|
355
|
-
uint8_t lossPercent = calculatePacketLoss();
|
|
356
|
-
|
|
357
|
-
// Good if we have connections and low packet loss
|
|
358
|
-
if (connectionCount > 0 && lossPercent < 5) return 100;
|
|
359
|
-
if (connectionCount > 0 && lossPercent < 10) return 80;
|
|
360
|
-
if (connectionCount > 0 && lossPercent < 20) return 60;
|
|
361
|
-
if (connectionCount > 0) return 40;
|
|
362
|
-
return 20; // No connections
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
uint8_t calculatePerformanceHealth() {
|
|
366
|
-
// Based on loop performance
|
|
367
|
-
if (maxLoopDuration < 10000) return 100; // < 10ms excellent
|
|
368
|
-
if (maxLoopDuration < 50000) return 80; // < 50ms good
|
|
369
|
-
if (maxLoopDuration < 100000) return 60; // < 100ms fair
|
|
370
|
-
if (maxLoopDuration < 200000) return 40; // < 200ms poor
|
|
371
|
-
return 20; // Very poor
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
uint8_t calculatePacketLoss() {
|
|
375
|
-
uint32_t totalPackets = totalPacketsTx + totalPacketsRx;
|
|
376
|
-
if (totalPackets == 0) return 0;
|
|
377
|
-
return (packetsDropped * 100) / totalPackets;
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
// Mesh callbacks
|
|
381
|
-
void receivedCallback(uint32_t from, String& msg) {
|
|
382
|
-
totalBytesRx += msg.length();
|
|
383
|
-
totalPacketsRx++;
|
|
384
|
-
|
|
385
|
-
// Parse message type
|
|
386
|
-
JsonDocument doc;
|
|
387
|
-
deserializeJson(doc, msg);
|
|
388
|
-
JsonObject obj = doc.as<JsonObject>();
|
|
389
|
-
uint16_t msgType = obj["type"];
|
|
390
|
-
|
|
391
|
-
Serial.printf("\nReceived Type %d from %u\n", msgType, from);
|
|
392
|
-
|
|
393
|
-
switch(msgType) {
|
|
394
|
-
case 200: // SensorPackage
|
|
395
|
-
Serial.println(" -> Sensor data");
|
|
396
|
-
break;
|
|
397
|
-
case 400: // CommandPackage (COMMAND per schema v0.7.2+)
|
|
398
|
-
Serial.println(" -> Command");
|
|
399
|
-
break;
|
|
400
|
-
case 202: // StatusPackage
|
|
401
|
-
Serial.println(" -> Status");
|
|
402
|
-
break;
|
|
403
|
-
case 604: // EnhancedStatusPackage (MESH_STATUS per schema v0.7.2+)
|
|
404
|
-
Serial.println(" -> Enhanced Status");
|
|
405
|
-
break;
|
|
406
|
-
case 204: // MetricsPackage (SENSOR_METRICS per schema v0.7.2+)
|
|
407
|
-
Serial.println(" -> Metrics");
|
|
408
|
-
break;
|
|
409
|
-
case 605: // HealthCheckPackage (MESH_METRICS per schema v0.7.2+)
|
|
410
|
-
Serial.println(" -> Health Check");
|
|
411
|
-
break;
|
|
412
|
-
default:
|
|
413
|
-
Serial.println(" -> Unknown type");
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
void newConnectionCallback(uint32_t nodeId) {
|
|
418
|
-
Serial.printf("\nNew Connection: %u\n", nodeId);
|
|
419
|
-
Serial.printf("Total nodes: %d\n", mesh.getNodeList().size() + 1);
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
void changedConnectionCallback() {
|
|
423
|
-
Serial.println("\nMesh topology changed");
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
void droppedConnectionCallback(uint32_t nodeId) {
|
|
427
|
-
Serial.printf("\nConnection dropped: %u\n", nodeId);
|
|
428
|
-
reconnectionCount++;
|
|
429
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
[platformio]
|
|
2
|
-
src_dir = .
|
|
3
|
-
|
|
4
|
-
[env]
|
|
5
|
-
lib_deps =
|
|
6
|
-
bblanchon/ArduinoJson
|
|
7
|
-
arkhipenko/TaskScheduler
|
|
8
|
-
|
|
9
|
-
lib_ldf_mode = deep+
|
|
10
|
-
[env:esp8266]
|
|
11
|
-
platform = espressif8266
|
|
12
|
-
board = nodemcuv2
|
|
13
|
-
framework = arduino
|
|
14
|
-
lib_extra_dirs = ../../ ; Load the local copy of painlessmesh. For your own example add painlessmesh to the lib_deps
|
|
15
|
-
lib_deps =
|
|
16
|
-
${env.lib_deps} ; Inherit common dependencies
|
|
17
|
-
esp32async/ESPAsyncTCP@^2.0.0 ; Only for ESP8266
|
|
18
|
-
|
|
19
|
-
[env:esp32]
|
|
20
|
-
platform = espressif32
|
|
21
|
-
board = esp32dev
|
|
22
|
-
framework = arduino
|
|
23
|
-
lib_extra_dirs = ../../ ; Load the local copy of painlessmesh. For your own example add painlessmesh to the lib_deps
|
|
24
|
-
lib_deps =
|
|
25
|
-
${env.lib_deps} ; Inherit common dependencies
|
|
26
|
-
esp32async/AsyncTCP
|
|
@@ -1,224 +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
|
-
StatusPackage() : BroadcastPackage(202) {} // Type ID 202 for Alteriom status
|
|
100
|
-
|
|
101
|
-
StatusPackage(JsonObject jsonObj) : BroadcastPackage(jsonObj) {
|
|
102
|
-
deviceStatus = jsonObj["status"];
|
|
103
|
-
uptime = jsonObj["uptime"];
|
|
104
|
-
freeMemory = jsonObj["mem"];
|
|
105
|
-
wifiStrength = jsonObj["wifi"];
|
|
106
|
-
firmwareVersion = jsonObj["fw"].as<TSTRING>();
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
JsonObject addTo(JsonObject&& jsonObj) const {
|
|
110
|
-
jsonObj = BroadcastPackage::addTo(std::move(jsonObj));
|
|
111
|
-
jsonObj["status"] = deviceStatus;
|
|
112
|
-
jsonObj["uptime"] = uptime;
|
|
113
|
-
jsonObj["mem"] = freeMemory;
|
|
114
|
-
jsonObj["wifi"] = wifiStrength;
|
|
115
|
-
jsonObj["fw"] = firmwareVersion;
|
|
116
|
-
return jsonObj;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
#if ARDUINOJSON_VERSION_MAJOR < 7
|
|
120
|
-
size_t jsonObjectSize() const {
|
|
121
|
-
return JSON_OBJECT_SIZE(noJsonFields + 5) + firmwareVersion.length();
|
|
122
|
-
}
|
|
123
|
-
#endif
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* @brief Enhanced status package with comprehensive health metrics (Phase 1)
|
|
128
|
-
*
|
|
129
|
-
* This is an extended version of StatusPackage that includes additional
|
|
130
|
-
* mesh statistics, performance metrics, and alerting capabilities.
|
|
131
|
-
* Type ID 203 is used to distinguish from the basic StatusPackage (202).
|
|
132
|
-
*/
|
|
133
|
-
class EnhancedStatusPackage : public painlessmesh::plugin::BroadcastPackage {
|
|
134
|
-
public:
|
|
135
|
-
// Device Health (from original StatusPackage)
|
|
136
|
-
uint8_t deviceStatus = 0; // Device status flags
|
|
137
|
-
uint32_t uptime = 0; // Device uptime in seconds
|
|
138
|
-
uint16_t freeMemory = 0; // Free memory in KB
|
|
139
|
-
uint8_t wifiStrength = 0; // WiFi signal strength
|
|
140
|
-
TSTRING firmwareVersion = ""; // Current firmware version
|
|
141
|
-
TSTRING firmwareMD5 = ""; // Firmware hash for OTA verification
|
|
142
|
-
|
|
143
|
-
// Mesh Statistics
|
|
144
|
-
uint16_t nodeCount = 0; // Number of known nodes in mesh
|
|
145
|
-
uint8_t connectionCount = 0; // Number of direct connections
|
|
146
|
-
uint32_t messagesReceived = 0; // Total messages received
|
|
147
|
-
uint32_t messagesSent = 0; // Total messages sent
|
|
148
|
-
uint32_t messagesDropped = 0; // Total messages dropped/failed
|
|
149
|
-
|
|
150
|
-
// Performance Metrics
|
|
151
|
-
uint16_t avgLatency = 0; // Average message latency in ms
|
|
152
|
-
uint8_t packetLossRate = 0; // Packet loss rate percentage (0-100)
|
|
153
|
-
uint16_t throughput = 0; // Network throughput in bytes/sec
|
|
154
|
-
|
|
155
|
-
// Warnings/Alerts
|
|
156
|
-
uint8_t alertFlags = 0; // Bit flags for various alert conditions
|
|
157
|
-
TSTRING lastError = ""; // Last error message for diagnostics
|
|
158
|
-
|
|
159
|
-
EnhancedStatusPackage()
|
|
160
|
-
: BroadcastPackage(203) {} // Type ID 203 for enhanced status
|
|
161
|
-
|
|
162
|
-
EnhancedStatusPackage(JsonObject jsonObj) : BroadcastPackage(jsonObj) {
|
|
163
|
-
deviceStatus = jsonObj["status"];
|
|
164
|
-
uptime = jsonObj["uptime"];
|
|
165
|
-
freeMemory = jsonObj["mem"];
|
|
166
|
-
wifiStrength = jsonObj["wifi"];
|
|
167
|
-
firmwareVersion = jsonObj["fw"].as<TSTRING>();
|
|
168
|
-
firmwareMD5 = jsonObj["fwMD5"].as<TSTRING>();
|
|
169
|
-
|
|
170
|
-
nodeCount = jsonObj["nodes"];
|
|
171
|
-
connectionCount = jsonObj["conns"];
|
|
172
|
-
messagesReceived = jsonObj["msgRx"];
|
|
173
|
-
messagesSent = jsonObj["msgTx"];
|
|
174
|
-
messagesDropped = jsonObj["msgDrop"];
|
|
175
|
-
|
|
176
|
-
avgLatency = jsonObj["latency"];
|
|
177
|
-
packetLossRate = jsonObj["loss"];
|
|
178
|
-
throughput = jsonObj["throughput"];
|
|
179
|
-
|
|
180
|
-
alertFlags = jsonObj["alerts"];
|
|
181
|
-
lastError = jsonObj["lastErr"].as<TSTRING>();
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
JsonObject addTo(JsonObject&& jsonObj) const {
|
|
185
|
-
jsonObj = BroadcastPackage::addTo(std::move(jsonObj));
|
|
186
|
-
|
|
187
|
-
// Device Health
|
|
188
|
-
jsonObj["status"] = deviceStatus;
|
|
189
|
-
jsonObj["uptime"] = uptime;
|
|
190
|
-
jsonObj["mem"] = freeMemory;
|
|
191
|
-
jsonObj["wifi"] = wifiStrength;
|
|
192
|
-
jsonObj["fw"] = firmwareVersion;
|
|
193
|
-
jsonObj["fwMD5"] = firmwareMD5;
|
|
194
|
-
|
|
195
|
-
// Mesh Statistics
|
|
196
|
-
jsonObj["nodes"] = nodeCount;
|
|
197
|
-
jsonObj["conns"] = connectionCount;
|
|
198
|
-
jsonObj["msgRx"] = messagesReceived;
|
|
199
|
-
jsonObj["msgTx"] = messagesSent;
|
|
200
|
-
jsonObj["msgDrop"] = messagesDropped;
|
|
201
|
-
|
|
202
|
-
// Performance Metrics
|
|
203
|
-
jsonObj["latency"] = avgLatency;
|
|
204
|
-
jsonObj["loss"] = packetLossRate;
|
|
205
|
-
jsonObj["throughput"] = throughput;
|
|
206
|
-
|
|
207
|
-
// Alerts
|
|
208
|
-
jsonObj["alerts"] = alertFlags;
|
|
209
|
-
jsonObj["lastErr"] = lastError;
|
|
210
|
-
|
|
211
|
-
return jsonObj;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
#if ARDUINOJSON_VERSION_MAJOR < 7
|
|
215
|
-
size_t jsonObjectSize() const {
|
|
216
|
-
return JSON_OBJECT_SIZE(noJsonFields + 18) + firmwareVersion.length() +
|
|
217
|
-
firmwareMD5.length() + lastError.length();
|
|
218
|
-
}
|
|
219
|
-
#endif
|
|
220
|
-
};
|
|
221
|
-
|
|
222
|
-
} // namespace alteriom
|
|
223
|
-
|
|
224
|
-
#endif // ALTERIOM_SENSOR_PACKAGE_HPP
|