@alteriom/painlessmesh 1.6.1 → 1.7.2
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/CHANGELOG.md +380 -143
- package/LICENSE +674 -674
- package/README.md +477 -434
- package/RELEASE_GUIDE.md +504 -418
- package/docs/DOCUMENTATION_MIGRATION_PLAN.md +175 -175
- package/docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md +1062 -0
- package/docs/MESH_TOPOLOGY_GUIDE.md +992 -0
- package/docs/MESH_TOPOLOGY_PROGRESS.md +422 -0
- package/docs/MQTT_BRIDGE_COMMANDS.md +894 -0
- package/docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md +324 -0
- package/docs/MQTT_COMMAND_SCHEMA_PROPOSAL.md +576 -0
- package/docs/MQTT_SCHEMA_COMPLIANCE.md +285 -0
- package/docs/MQTT_SCHEMA_PROPOSALS.md +446 -0
- package/docs/MQTT_SCHEMA_REVIEW.md +690 -0
- package/docs/OTA_COMMANDS_REFERENCE.md +554 -0
- package/docs/PHASE1_GUIDE.md +349 -0
- package/docs/PHASE2_GUIDE.md +543 -0
- package/docs/README.md +77 -70
- package/docs/SCHEMA_VALIDATION_CHECKLIST.md +222 -0
- package/docs/alteriom/overview.md +507 -507
- package/docs/api/core-api.md +606 -606
- package/docs/architecture/mesh-architecture.md +378 -378
- package/docs/architecture/plugin-system.md +516 -516
- package/docs/getting-started/first-mesh.md +409 -409
- package/docs/getting-started/installation.md +274 -274
- package/docs/getting-started/quickstart.md +157 -157
- package/docs/improvements/FEATURE_PROPOSALS.md +337 -0
- package/docs/improvements/PHASE1_IMPLEMENTATION.md +325 -0
- package/docs/improvements/PHASE2_IMPLEMENTATION.md +567 -0
- package/docs/improvements/README.md +86 -68
- package/docs/improvements/ota-and-status-enhancements.md +911 -0
- package/docs/improvements/ota-status-architecture-diagrams.md +658 -0
- package/docs/improvements/ota-status-quick-reference.md +284 -0
- package/docs/platformio-publishing.md +255 -0
- package/docs/platformio-setup-summary.md +121 -0
- package/docs/troubleshooting/common-issues.md +520 -520
- package/docs/troubleshooting/faq.md +472 -472
- package/docs/tutorials/basic-examples.md +717 -717
- package/docs/wiki/API-Reference.md +245 -245
- package/docs/wiki/Complete-Documentation.md +122 -122
- package/examples/alteriom/README.md +139 -81
- package/examples/alteriom/alteriom.ino +186 -185
- package/examples/alteriom/alteriom_sensor_package.hpp +240 -127
- package/examples/alteriom/platformio.ini +24 -24
- package/examples/alteriomImproved/alteriom_sensor_package.hpp +224 -0
- package/examples/{alteriom → alteriomImproved}/improved_sensor_node.ino +245 -245
- package/examples/alteriomImproved/platformio.ini +25 -0
- package/examples/alteriomPhase1/alteriom_sensor_package.hpp +224 -0
- package/examples/alteriomPhase1/phase1_features.ino +242 -0
- package/examples/alteriomPhase1/platformio.ini +25 -0
- package/examples/alteriomPhase2/alteriom_sensor_package.hpp +224 -0
- package/examples/alteriomPhase2/phase2_features.ino +186 -0
- package/examples/alteriomPhase2/platformio.ini +25 -0
- package/examples/{alteriom → alteriomSensorNode}/alteriom_sensor_node.ino +183 -183
- package/examples/alteriomSensorNode/alteriom_sensor_package.hpp +224 -0
- package/examples/alteriomSensorNode/platformio.ini +25 -0
- package/examples/basic/basic.ino +66 -66
- package/examples/basic/platformio.ini +25 -25
- package/examples/bridge/bridge.ino +51 -51
- package/examples/bridge/mesh_event_publisher.hpp +253 -0
- package/examples/bridge/mesh_topology_reporter.hpp +303 -0
- package/examples/bridge/mqtt_command_bridge.hpp +459 -0
- package/examples/bridge/mqtt_status_bridge.hpp +519 -0
- package/examples/bridge/platformio.ini +25 -25
- package/examples/echoNode/echoNode.ino +33 -33
- package/examples/echoNode/platformio.ini +25 -25
- package/examples/logClient/logClient.ino +109 -109
- package/examples/logClient/platformio.ini +25 -25
- package/examples/logServer/logServer.ino +81 -81
- package/examples/logServer/platformio.ini +25 -25
- package/examples/meshCommandNode/alteriom_sensor_package.hpp +235 -0
- package/examples/meshCommandNode/meshCommandNode.ino +263 -0
- package/examples/meshCommandNode/platformio.ini +25 -0
- package/examples/mqttBridge/mqttBridge.ino +118 -118
- package/examples/mqttBridge/platformio.ini +26 -26
- package/examples/mqttCommandBridge/alteriom_sensor_package.hpp +235 -0
- package/examples/mqttCommandBridge/mesh_event_publisher.hpp +253 -0
- package/examples/mqttCommandBridge/mesh_topology_reporter.hpp +303 -0
- package/examples/mqttCommandBridge/mqttCommandBridge.ino +252 -0
- package/examples/mqttCommandBridge/mqtt_command_bridge.hpp +459 -0
- package/examples/mqttCommandBridge/platformio.ini +26 -0
- package/examples/mqttStatusBridge/mqttStatusBridge.ino +216 -0
- package/examples/mqttStatusBridge/mqtt_status_bridge.hpp +522 -0
- package/examples/mqttStatusBridge/platformio.ini +26 -0
- package/examples/mqttTopologyTest/README.md +467 -0
- package/examples/mqttTopologyTest/mqttTopologyTest.ino +748 -0
- package/examples/mqttTopologyTest/platformio.ini +26 -0
- package/examples/namedMesh/namedMesh.ino +97 -97
- package/examples/namedMesh/platformio.ini +25 -25
- package/examples/otaReceiver/otaReceiver.ino +79 -79
- package/examples/otaReceiver/platformio.ini +25 -25
- package/examples/otaSender/otaSender.ino +160 -151
- package/examples/otaSender/platformio.ini +25 -25
- package/examples/startHere/platformio.ini +25 -25
- package/examples/startHere/startHere.ino +159 -159
- package/examples/webServer/platformio.ini +27 -27
- package/examples/webServer/webServer.ino +89 -89
- package/keywords.txt +48 -48
- package/library.json +55 -34
- package/library.properties +10 -10
- package/package.json +86 -78
- package/src/AlteriomPainlessMesh.h +97 -97
- package/src/arduino/wifi.hpp +365 -365
- package/src/boost/asynctcp.hpp +279 -279
- package/src/painlessMesh.h +70 -70
- package/src/painlessMeshSTA.cpp +236 -236
- package/src/painlessMeshSTA.h +58 -58
- package/src/painlessTaskOptions.h +4 -4
- package/src/painlessmesh/base64.hpp +111 -111
- package/src/painlessmesh/buffer.hpp +229 -229
- package/src/painlessmesh/callback.hpp +91 -91
- package/src/painlessmesh/configuration.hpp +77 -77
- package/src/painlessmesh/connection.hpp +192 -192
- package/src/painlessmesh/layout.hpp +188 -188
- package/src/painlessmesh/logger.hpp +158 -158
- package/src/painlessmesh/memory.hpp +119 -119
- package/src/painlessmesh/mesh.hpp +761 -560
- package/src/painlessmesh/metrics.hpp +322 -322
- package/src/painlessmesh/ntp.hpp +263 -263
- package/src/painlessmesh/ota.hpp +582 -553
- package/src/painlessmesh/plugin.hpp +188 -188
- package/src/painlessmesh/protocol.hpp +813 -813
- package/src/painlessmesh/router.hpp +322 -322
- package/src/painlessmesh/tcp.hpp +71 -71
- package/src/painlessmesh/validation.hpp +238 -238
- package/src/plugin/performance.hpp +214 -214
- package/src/plugin/remote.hpp +64 -64
- package/src/scheduler.cpp +10 -10
- package/src/wifi.cpp +2 -2
|
@@ -0,0 +1,690 @@
|
|
|
1
|
+
# MQTT Command Schema Review & Mesh Reporting Analysis
|
|
2
|
+
|
|
3
|
+
**Date:** October 12, 2025
|
|
4
|
+
**Reviewer:** Alteriom Development Team
|
|
5
|
+
**Document:** MQTT_COMMAND_SCHEMA_PROPOSAL.md Analysis
|
|
6
|
+
**Status:** ✅ APPROVED with RECOMMENDED ADDITIONS
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Executive Summary
|
|
11
|
+
|
|
12
|
+
### Overall Assessment
|
|
13
|
+
|
|
14
|
+
The MQTT command schema proposal is **comprehensive and production-ready** for device control operations. However, analysis reveals a **critical gap in mesh network topology reporting** that should be addressed in the same release (v0.5.0).
|
|
15
|
+
|
|
16
|
+
### Key Findings
|
|
17
|
+
|
|
18
|
+
| Area | Status | Details |
|
|
19
|
+
|------|--------|---------|
|
|
20
|
+
| Command Schema | ✅ **Excellent** | Complete, well-documented, ready to implement |
|
|
21
|
+
| Response Tracking | ✅ **Excellent** | Correlation IDs, latency metrics, error codes |
|
|
22
|
+
| Migration Path | ✅ **Excellent** | Clear upgrade from v0.4.0 control_response |
|
|
23
|
+
| Standard Commands | ✅ **Excellent** | 30+ documented commands across 6 categories |
|
|
24
|
+
| **Mesh Topology** | ⚠️ **MISSING** | No schema for network structure reporting |
|
|
25
|
+
| **Mesh Events** | ⚠️ **MISSING** | No schema for real-time mesh notifications |
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Part 1: Command Schema Review
|
|
30
|
+
|
|
31
|
+
### ✅ Strengths
|
|
32
|
+
|
|
33
|
+
#### 1. Complete Command Lifecycle
|
|
34
|
+
```json
|
|
35
|
+
// Command → Response with correlation
|
|
36
|
+
{
|
|
37
|
+
"command": "read_sensors",
|
|
38
|
+
"correlation_id": "cmd-1728745800-001",
|
|
39
|
+
"parameters": {"immediate": true}
|
|
40
|
+
}
|
|
41
|
+
// ↓
|
|
42
|
+
{
|
|
43
|
+
"success": true,
|
|
44
|
+
"correlation_id": "cmd-1728745800-001",
|
|
45
|
+
"latency_ms": 1250
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
#### 2. Comprehensive Error Handling
|
|
50
|
+
- 12 standard error codes (TIMEOUT, INVALID_PARAMS, SENSOR_NOT_AVAILABLE, etc.)
|
|
51
|
+
- Human-readable messages
|
|
52
|
+
- Machine-readable error_code field
|
|
53
|
+
- Gateway-generated errors for timeouts
|
|
54
|
+
|
|
55
|
+
#### 3. Well-Organized Command Categories
|
|
56
|
+
- **Device Control (1-99):** RESET, SLEEP, LED_CONTROL, RELAY_SWITCH, PWM_SET
|
|
57
|
+
- **Configuration (100-199):** GET_CONFIG, SET_CONFIG, SAVE_CONFIG, SET_SAMPLE_RATE
|
|
58
|
+
- **Status (200-255):** GET_STATUS, GET_METRICS, GET_DIAGNOSTICS, START_MONITORING
|
|
59
|
+
|
|
60
|
+
#### 4. Production-Ready Features
|
|
61
|
+
- Priority queuing (low, normal, high, urgent)
|
|
62
|
+
- Configurable timeouts (1000-300000ms)
|
|
63
|
+
- Command parameter validation
|
|
64
|
+
- Custom command support with `custom_` prefix
|
|
65
|
+
|
|
66
|
+
#### 5. Excellent Documentation
|
|
67
|
+
- 4 complete examples (success, error, timeout)
|
|
68
|
+
- JavaScript and Python client code
|
|
69
|
+
- Migration path from v0.4.0
|
|
70
|
+
- Implementation checklist
|
|
71
|
+
|
|
72
|
+
### 📋 Minor Suggestions
|
|
73
|
+
|
|
74
|
+
1. **Add Batch Command Support**
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"event": "command_batch",
|
|
78
|
+
"commands": [
|
|
79
|
+
{"command": "led_control", "parameters": {...}},
|
|
80
|
+
{"command": "set_interval", "parameters": {...}}
|
|
81
|
+
],
|
|
82
|
+
"correlation_id": "batch-001"
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
2. **Add Scheduled Command Support**
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"command": "read_sensors",
|
|
90
|
+
"schedule": {
|
|
91
|
+
"execute_at": "2025-10-12T16:00:00Z",
|
|
92
|
+
"repeat": "hourly"
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Part 2: Mesh Reporting Gap Analysis
|
|
100
|
+
|
|
101
|
+
### ⚠️ Critical Missing Feature: Topology Reporting
|
|
102
|
+
|
|
103
|
+
#### The Problem
|
|
104
|
+
|
|
105
|
+
**Current State:**
|
|
106
|
+
- MQTT topic exists: `mesh/topology` (in implementation docs)
|
|
107
|
+
- Gateway publishes topology updates
|
|
108
|
+
- **NO STANDARDIZED SCHEMA** ❌
|
|
109
|
+
|
|
110
|
+
**Impact:**
|
|
111
|
+
```
|
|
112
|
+
❌ Web dashboards can't reliably parse topology
|
|
113
|
+
❌ DevOps lacks standardized monitoring format
|
|
114
|
+
❌ Third-party tools can't visualize mesh
|
|
115
|
+
❌ Historical topology analysis impossible
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
#### Use Cases Not Addressed
|
|
119
|
+
|
|
120
|
+
**1. Network Visualization**
|
|
121
|
+
```
|
|
122
|
+
Dashboard needs to display:
|
|
123
|
+
├── Which nodes are online?
|
|
124
|
+
├── How are they connected?
|
|
125
|
+
├── What's the signal quality?
|
|
126
|
+
├── Where are the bottlenecks?
|
|
127
|
+
└── Which paths are redundant?
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**2. Performance Monitoring**
|
|
131
|
+
```
|
|
132
|
+
Monitoring system needs:
|
|
133
|
+
├── Average hop count to each node
|
|
134
|
+
├── Connection quality metrics
|
|
135
|
+
├── Network diameter changes
|
|
136
|
+
├── Node churn rate (joins/leaves per hour)
|
|
137
|
+
└── Message routing efficiency
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**3. Debugging & Troubleshooting**
|
|
141
|
+
```
|
|
142
|
+
When "Node X is unreachable":
|
|
143
|
+
├── What path should messages take?
|
|
144
|
+
├── Which intermediate nodes?
|
|
145
|
+
├── Are there alternative routes?
|
|
146
|
+
├── Is the network partitioned?
|
|
147
|
+
└── What's the RSSI at each hop?
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Part 3: Proposed Mesh Topology Schema
|
|
153
|
+
|
|
154
|
+
### New Schema: mesh_topology.schema.json
|
|
155
|
+
|
|
156
|
+
#### High-Level Structure
|
|
157
|
+
```json
|
|
158
|
+
{
|
|
159
|
+
"event": "mesh_topology",
|
|
160
|
+
"mesh_id": "MESH-001",
|
|
161
|
+
"gateway_node_id": "ALT-6825DD341CA4",
|
|
162
|
+
"nodes": [...], // Array of node objects
|
|
163
|
+
"connections": [...], // Array of connection/edge objects
|
|
164
|
+
"metrics": {...}, // Network-wide aggregates
|
|
165
|
+
"update_type": "full" // "full" or "incremental"
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
#### Node Object Schema
|
|
170
|
+
```json
|
|
171
|
+
{
|
|
172
|
+
"node_id": "ALT-441D64F804A0",
|
|
173
|
+
"role": "sensor", // gateway|sensor|repeater|bridge
|
|
174
|
+
"status": "online", // online|offline|unknown
|
|
175
|
+
"last_seen": "2025-10-12T14:59:58Z",
|
|
176
|
+
"firmware_version": "SN 2.3.4",
|
|
177
|
+
"uptime_seconds": 72000,
|
|
178
|
+
"free_memory_kb": 42,
|
|
179
|
+
"connection_count": 2
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
#### Connection Object Schema
|
|
184
|
+
```json
|
|
185
|
+
{
|
|
186
|
+
"from_node": "ALT-6825DD341CA4",
|
|
187
|
+
"to_node": "ALT-441D64F804A0",
|
|
188
|
+
"quality": 95, // 0-100 percentage
|
|
189
|
+
"latency_ms": 12, // Round-trip time
|
|
190
|
+
"rssi": -42, // WiFi signal strength (dBm)
|
|
191
|
+
"hop_count": 1 // Hops from gateway
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
#### Network Metrics Object
|
|
196
|
+
```json
|
|
197
|
+
{
|
|
198
|
+
"total_nodes": 4,
|
|
199
|
+
"online_nodes": 4,
|
|
200
|
+
"network_diameter": 2, // Max hop count
|
|
201
|
+
"avg_connection_quality": 85,
|
|
202
|
+
"messages_per_second": 12.4
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Complete Example: 4-Node Mesh
|
|
207
|
+
|
|
208
|
+
**MQTT Topic:** `alteriom/mesh/MESH-001/topology`
|
|
209
|
+
|
|
210
|
+
```json
|
|
211
|
+
{
|
|
212
|
+
"schema_version": 1,
|
|
213
|
+
"device_id": "ALT-6825DD341CA4",
|
|
214
|
+
"device_type": "gateway",
|
|
215
|
+
"timestamp": "2025-10-12T15:00:00Z",
|
|
216
|
+
"firmware_version": "GW 2.3.4",
|
|
217
|
+
"event": "mesh_topology",
|
|
218
|
+
"mesh_id": "MESH-001",
|
|
219
|
+
"gateway_node_id": "ALT-6825DD341CA4",
|
|
220
|
+
"nodes": [
|
|
221
|
+
{
|
|
222
|
+
"node_id": "ALT-6825DD341CA4",
|
|
223
|
+
"role": "gateway",
|
|
224
|
+
"status": "online",
|
|
225
|
+
"last_seen": "2025-10-12T15:00:00Z",
|
|
226
|
+
"firmware_version": "GW 2.3.4",
|
|
227
|
+
"uptime_seconds": 86400,
|
|
228
|
+
"free_memory_kb": 128,
|
|
229
|
+
"connection_count": 3
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"node_id": "ALT-441D64F804A0",
|
|
233
|
+
"role": "sensor",
|
|
234
|
+
"status": "online",
|
|
235
|
+
"last_seen": "2025-10-12T14:59:58Z",
|
|
236
|
+
"firmware_version": "SN 2.3.4",
|
|
237
|
+
"uptime_seconds": 72000,
|
|
238
|
+
"free_memory_kb": 42,
|
|
239
|
+
"connection_count": 2
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
"node_id": "ALT-9A3B2C1D0E5F",
|
|
243
|
+
"role": "sensor",
|
|
244
|
+
"status": "online",
|
|
245
|
+
"last_seen": "2025-10-12T14:59:55Z",
|
|
246
|
+
"firmware_version": "SN 2.3.4",
|
|
247
|
+
"uptime_seconds": 64800,
|
|
248
|
+
"free_memory_kb": 38,
|
|
249
|
+
"connection_count": 1
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"node_id": "ALT-7F8E9D0A1B2C",
|
|
253
|
+
"role": "repeater",
|
|
254
|
+
"status": "online",
|
|
255
|
+
"last_seen": "2025-10-12T14:59:59Z",
|
|
256
|
+
"firmware_version": "RP 2.3.4",
|
|
257
|
+
"uptime_seconds": 43200,
|
|
258
|
+
"free_memory_kb": 96,
|
|
259
|
+
"connection_count": 3
|
|
260
|
+
}
|
|
261
|
+
],
|
|
262
|
+
"connections": [
|
|
263
|
+
{
|
|
264
|
+
"from_node": "ALT-6825DD341CA4",
|
|
265
|
+
"to_node": "ALT-441D64F804A0",
|
|
266
|
+
"quality": 95,
|
|
267
|
+
"latency_ms": 12,
|
|
268
|
+
"rssi": -42,
|
|
269
|
+
"hop_count": 1
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
"from_node": "ALT-6825DD341CA4",
|
|
273
|
+
"to_node": "ALT-7F8E9D0A1B2C",
|
|
274
|
+
"quality": 88,
|
|
275
|
+
"latency_ms": 18,
|
|
276
|
+
"rssi": -55,
|
|
277
|
+
"hop_count": 1
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
"from_node": "ALT-441D64F804A0",
|
|
281
|
+
"to_node": "ALT-7F8E9D0A1B2C",
|
|
282
|
+
"quality": 82,
|
|
283
|
+
"latency_ms": 24,
|
|
284
|
+
"rssi": -62,
|
|
285
|
+
"hop_count": 2
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
"from_node": "ALT-7F8E9D0A1B2C",
|
|
289
|
+
"to_node": "ALT-9A3B2C1D0E5F",
|
|
290
|
+
"quality": 75,
|
|
291
|
+
"latency_ms": 32,
|
|
292
|
+
"rssi": -68,
|
|
293
|
+
"hop_count": 2
|
|
294
|
+
}
|
|
295
|
+
],
|
|
296
|
+
"metrics": {
|
|
297
|
+
"total_nodes": 4,
|
|
298
|
+
"online_nodes": 4,
|
|
299
|
+
"network_diameter": 2,
|
|
300
|
+
"avg_connection_quality": 85,
|
|
301
|
+
"messages_per_second": 12.4
|
|
302
|
+
},
|
|
303
|
+
"update_type": "full"
|
|
304
|
+
}
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### Incremental Updates
|
|
308
|
+
|
|
309
|
+
**When a node joins:**
|
|
310
|
+
```json
|
|
311
|
+
{
|
|
312
|
+
"event": "mesh_topology",
|
|
313
|
+
"mesh_id": "MESH-001",
|
|
314
|
+
"nodes": [
|
|
315
|
+
{
|
|
316
|
+
"node_id": "ALT-NEW12345678",
|
|
317
|
+
"role": "sensor",
|
|
318
|
+
"status": "online"
|
|
319
|
+
}
|
|
320
|
+
],
|
|
321
|
+
"connections": [
|
|
322
|
+
{
|
|
323
|
+
"from_node": "ALT-7F8E9D0A1B2C",
|
|
324
|
+
"to_node": "ALT-NEW12345678",
|
|
325
|
+
"quality": 78
|
|
326
|
+
}
|
|
327
|
+
],
|
|
328
|
+
"update_type": "incremental"
|
|
329
|
+
}
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
## Part 4: Additional Mesh Schemas
|
|
335
|
+
|
|
336
|
+
### Schema 2: mesh_event.schema.json
|
|
337
|
+
|
|
338
|
+
**Purpose:** Real-time notifications of mesh state changes
|
|
339
|
+
|
|
340
|
+
```json
|
|
341
|
+
{
|
|
342
|
+
"event": "mesh_event",
|
|
343
|
+
"event_type": "node_leave",
|
|
344
|
+
"affected_nodes": ["ALT-441D64F804A0"],
|
|
345
|
+
"timestamp": "2025-10-12T15:10:00Z",
|
|
346
|
+
"details": {
|
|
347
|
+
"reason": "timeout",
|
|
348
|
+
"last_seen": "2025-10-12T15:08:45Z",
|
|
349
|
+
"connections_lost": 2
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
**Event Types:**
|
|
355
|
+
- `node_join` - New node entered mesh
|
|
356
|
+
- `node_leave` - Node left mesh (clean disconnect)
|
|
357
|
+
- `node_timeout` - Node lost due to timeout
|
|
358
|
+
- `connection_lost` - Direct connection failed
|
|
359
|
+
- `connection_restored` - Connection recovered
|
|
360
|
+
- `network_split` - Mesh partitioned
|
|
361
|
+
- `network_merged` - Partitions rejoined
|
|
362
|
+
- `route_changed` - Routing table updated
|
|
363
|
+
|
|
364
|
+
### Schema 3: mesh_diagnostics.schema.json
|
|
365
|
+
|
|
366
|
+
**Purpose:** Detailed mesh health information
|
|
367
|
+
|
|
368
|
+
```json
|
|
369
|
+
{
|
|
370
|
+
"event": "mesh_diagnostics",
|
|
371
|
+
"diagnostic_type": "full_report",
|
|
372
|
+
"routing_table": [
|
|
373
|
+
{
|
|
374
|
+
"destination": "ALT-441D64F804A0",
|
|
375
|
+
"next_hop": "ALT-441D64F804A0",
|
|
376
|
+
"hop_count": 1,
|
|
377
|
+
"path_quality": 95
|
|
378
|
+
}
|
|
379
|
+
],
|
|
380
|
+
"message_statistics": {
|
|
381
|
+
"total_sent": 15432,
|
|
382
|
+
"total_received": 14987,
|
|
383
|
+
"total_dropped": 45,
|
|
384
|
+
"retransmissions": 123
|
|
385
|
+
},
|
|
386
|
+
"connection_history": [
|
|
387
|
+
{
|
|
388
|
+
"node_id": "ALT-441D64F804A0",
|
|
389
|
+
"connects": 1,
|
|
390
|
+
"disconnects": 0,
|
|
391
|
+
"avg_uptime_seconds": 72000
|
|
392
|
+
}
|
|
393
|
+
]
|
|
394
|
+
}
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
---
|
|
398
|
+
|
|
399
|
+
## Part 5: Mesh Command Extensions
|
|
400
|
+
|
|
401
|
+
### Add Mesh-Specific Commands (300-399)
|
|
402
|
+
|
|
403
|
+
Extend the standard command list with mesh operations:
|
|
404
|
+
|
|
405
|
+
```json
|
|
406
|
+
// Topology management
|
|
407
|
+
"get_topology" // Request current mesh topology
|
|
408
|
+
"scan_neighbors" // Scan for nearby mesh nodes
|
|
409
|
+
"force_reconnect" // Force reconnection to mesh
|
|
410
|
+
"optimize_routes" // Trigger routing optimization
|
|
411
|
+
|
|
412
|
+
// Diagnostics
|
|
413
|
+
"mesh_diagnostics" // Run mesh health check
|
|
414
|
+
"connection_test" // Test connection to specific node
|
|
415
|
+
"trace_route" // Trace message path to node
|
|
416
|
+
|
|
417
|
+
// Network management
|
|
418
|
+
"set_tx_power" // Adjust WiFi transmit power
|
|
419
|
+
"change_channel" // Switch WiFi channel
|
|
420
|
+
"isolate_node" // Temporarily isolate node for testing
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
**Example: Get Topology Command**
|
|
424
|
+
```json
|
|
425
|
+
{
|
|
426
|
+
"event": "command",
|
|
427
|
+
"command": "get_topology",
|
|
428
|
+
"correlation_id": "cmd-topology-001",
|
|
429
|
+
"parameters": {
|
|
430
|
+
"format": "full", // "full" or "summary"
|
|
431
|
+
"include_metrics": true,
|
|
432
|
+
"include_history": false
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
**Response:**
|
|
438
|
+
```json
|
|
439
|
+
{
|
|
440
|
+
"event": "command_response",
|
|
441
|
+
"command": "get_topology",
|
|
442
|
+
"correlation_id": "cmd-topology-001",
|
|
443
|
+
"success": true,
|
|
444
|
+
"result": {
|
|
445
|
+
// Full topology object as per mesh_topology.schema.json
|
|
446
|
+
},
|
|
447
|
+
"latency_ms": 850
|
|
448
|
+
}
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
---
|
|
452
|
+
|
|
453
|
+
## Part 6: Implementation Roadmap
|
|
454
|
+
|
|
455
|
+
### v0.5.0 Scope (RECOMMENDED)
|
|
456
|
+
|
|
457
|
+
#### High Priority - Include Now ✅
|
|
458
|
+
|
|
459
|
+
1. **command.schema.json** (from proposal) ✅
|
|
460
|
+
2. **command_response.schema.json** (from proposal) ✅
|
|
461
|
+
3. **mesh_topology.schema.json** (NEW) ⚠️
|
|
462
|
+
4. **mesh_event.schema.json** (NEW) ⚠️
|
|
463
|
+
|
|
464
|
+
**Rationale:** Topology reporting is essential for mesh monitoring. Without it, users can't visualize or debug their networks effectively.
|
|
465
|
+
|
|
466
|
+
#### Medium Priority - Consider for v0.5.0 📋
|
|
467
|
+
|
|
468
|
+
5. **mesh_diagnostics.schema.json** (NEW)
|
|
469
|
+
6. **Mesh command extensions** (300-399 command IDs)
|
|
470
|
+
|
|
471
|
+
**Rationale:** Nice-to-have for advanced debugging, but not blocking.
|
|
472
|
+
|
|
473
|
+
#### Low Priority - Defer to v0.6.0 ⏳
|
|
474
|
+
|
|
475
|
+
7. **node_discovery.schema.json** (auto-configuration)
|
|
476
|
+
8. **route_metrics.schema.json** (per-message tracking)
|
|
477
|
+
9. **Batch command schema** (send multiple commands)
|
|
478
|
+
10. **Scheduled command schema** (future execution)
|
|
479
|
+
|
|
480
|
+
---
|
|
481
|
+
|
|
482
|
+
## Part 7: Schema Comparison Matrix
|
|
483
|
+
|
|
484
|
+
| Feature | Command Proposal | Mesh Addition | Current painlessMesh | Gap |
|
|
485
|
+
|---------|-----------------|---------------|---------------------|-----|
|
|
486
|
+
| Device control | ✅ Covered | N/A | ✅ Implemented | ✅ None |
|
|
487
|
+
| Command tracking | ✅ correlation_id | N/A | ✅ commandId field | ✅ None |
|
|
488
|
+
| Error handling | ✅ 12 error codes | N/A | ✅ StatusPackage | ✅ None |
|
|
489
|
+
| Network topology | ❌ Not covered | ✅ Proposed | ⚠️ Ad-hoc format | ⚠️ **Critical** |
|
|
490
|
+
| Node list | ❌ Not covered | ✅ Proposed | ✅ getNodeList() | ⚠️ Schema needed |
|
|
491
|
+
| Connection graph | ❌ Not covered | ✅ Proposed | ⚠️ Not exposed | ⚠️ **Critical** |
|
|
492
|
+
| Signal quality | ❌ Not covered | ✅ Proposed (RSSI) | ⚠️ Not exposed | ⚠️ Important |
|
|
493
|
+
| Network events | ❌ Not covered | ✅ Proposed | ⚠️ Callbacks only | ⚠️ Important |
|
|
494
|
+
| Routing table | ❌ Not covered | ✅ Proposed | ⚠️ Internal only | 📋 Future |
|
|
495
|
+
| Hop counts | ❌ Not covered | ✅ Proposed | ⚠️ Not tracked | 📋 Future |
|
|
496
|
+
|
|
497
|
+
---
|
|
498
|
+
|
|
499
|
+
## Part 8: Benefits Analysis
|
|
500
|
+
|
|
501
|
+
### With Command Schema Only (Proposal)
|
|
502
|
+
|
|
503
|
+
✅ Control devices remotely
|
|
504
|
+
✅ Track command execution
|
|
505
|
+
✅ Handle errors gracefully
|
|
506
|
+
❌ Can't visualize network
|
|
507
|
+
❌ Can't debug connectivity issues
|
|
508
|
+
❌ Can't monitor mesh health
|
|
509
|
+
|
|
510
|
+
### With Command + Topology Schemas (Recommended)
|
|
511
|
+
|
|
512
|
+
✅ Control devices remotely
|
|
513
|
+
✅ Track command execution
|
|
514
|
+
✅ Handle errors gracefully
|
|
515
|
+
✅ **Visualize network graph** (D3.js/Cytoscape.js)
|
|
516
|
+
✅ **Debug connectivity issues** (trace paths)
|
|
517
|
+
✅ **Monitor mesh health** (quality metrics)
|
|
518
|
+
✅ **Detect network problems** (partitions, bottlenecks)
|
|
519
|
+
✅ **Historical analysis** (topology over time)
|
|
520
|
+
✅ **Automated alerts** (node offline, poor quality)
|
|
521
|
+
|
|
522
|
+
---
|
|
523
|
+
|
|
524
|
+
## Part 9: Example Web Dashboard Integration
|
|
525
|
+
|
|
526
|
+
### Topology Visualization with D3.js
|
|
527
|
+
|
|
528
|
+
```javascript
|
|
529
|
+
import mqtt from 'mqtt';
|
|
530
|
+
import * as d3 from 'd3';
|
|
531
|
+
|
|
532
|
+
const client = mqtt.connect('mqtt://broker.local:1883');
|
|
533
|
+
client.subscribe('alteriom/mesh/+/topology');
|
|
534
|
+
|
|
535
|
+
client.on('message', (topic, message) => {
|
|
536
|
+
const topology = JSON.parse(message.toString());
|
|
537
|
+
|
|
538
|
+
if (topology.event === 'mesh_topology') {
|
|
539
|
+
renderMeshGraph(topology);
|
|
540
|
+
}
|
|
541
|
+
});
|
|
542
|
+
|
|
543
|
+
function renderMeshGraph(topology) {
|
|
544
|
+
const nodes = topology.nodes.map(n => ({
|
|
545
|
+
id: n.node_id,
|
|
546
|
+
role: n.role,
|
|
547
|
+
status: n.status,
|
|
548
|
+
memory: n.free_memory_kb
|
|
549
|
+
}));
|
|
550
|
+
|
|
551
|
+
const links = topology.connections.map(c => ({
|
|
552
|
+
source: c.from_node,
|
|
553
|
+
target: c.to_node,
|
|
554
|
+
quality: c.quality,
|
|
555
|
+
latency: c.latency_ms
|
|
556
|
+
}));
|
|
557
|
+
|
|
558
|
+
// D3.js force-directed graph
|
|
559
|
+
const simulation = d3.forceSimulation(nodes)
|
|
560
|
+
.force('link', d3.forceLink(links).id(d => d.id))
|
|
561
|
+
.force('charge', d3.forceManyBody())
|
|
562
|
+
.force('center', d3.forceCenter(width / 2, height / 2));
|
|
563
|
+
|
|
564
|
+
// Render nodes with color based on status
|
|
565
|
+
svg.selectAll('circle')
|
|
566
|
+
.data(nodes)
|
|
567
|
+
.enter().append('circle')
|
|
568
|
+
.attr('r', 20)
|
|
569
|
+
.attr('fill', d => d.status === 'online' ? 'green' : 'red');
|
|
570
|
+
|
|
571
|
+
// Render links with thickness based on quality
|
|
572
|
+
svg.selectAll('line')
|
|
573
|
+
.data(links)
|
|
574
|
+
.enter().append('line')
|
|
575
|
+
.attr('stroke-width', d => d.quality / 10)
|
|
576
|
+
.attr('stroke', d => d.quality > 80 ? 'green' : d.quality > 50 ? 'orange' : 'red');
|
|
577
|
+
}
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
### Real-Time Event Monitoring
|
|
581
|
+
|
|
582
|
+
```javascript
|
|
583
|
+
client.subscribe('alteriom/mesh/+/events');
|
|
584
|
+
|
|
585
|
+
client.on('message', (topic, message) => {
|
|
586
|
+
const event = JSON.parse(message.toString());
|
|
587
|
+
|
|
588
|
+
if (event.event === 'mesh_event') {
|
|
589
|
+
switch (event.event_type) {
|
|
590
|
+
case 'node_leave':
|
|
591
|
+
showNotification('⚠️ Node Offline',
|
|
592
|
+
`Node ${event.affected_nodes[0]} disconnected`);
|
|
593
|
+
updateTopology(); // Refresh graph
|
|
594
|
+
break;
|
|
595
|
+
|
|
596
|
+
case 'node_join':
|
|
597
|
+
showNotification('✅ New Node',
|
|
598
|
+
`Node ${event.affected_nodes[0]} joined mesh`);
|
|
599
|
+
updateTopology();
|
|
600
|
+
break;
|
|
601
|
+
|
|
602
|
+
case 'network_split':
|
|
603
|
+
showAlert('🚨 Network Partition Detected!',
|
|
604
|
+
'Mesh has split into multiple segments');
|
|
605
|
+
break;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
});
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
---
|
|
612
|
+
|
|
613
|
+
## Part 10: Recommendations
|
|
614
|
+
|
|
615
|
+
### For @alteriom/mqtt-schema Maintainers
|
|
616
|
+
|
|
617
|
+
#### Immediate Actions (v0.5.0)
|
|
618
|
+
|
|
619
|
+
1. ✅ **Approve command schemas** from proposal (ready as-is)
|
|
620
|
+
2. ⚠️ **Add mesh_topology.schema.json** (critical for monitoring)
|
|
621
|
+
3. ⚠️ **Add mesh_event.schema.json** (important for alerts)
|
|
622
|
+
4. 📝 **Update TypeScript types** to include mesh schemas
|
|
623
|
+
5. 🧪 **Add validation tests** for topology messages
|
|
624
|
+
|
|
625
|
+
#### Future Considerations (v0.6.0)
|
|
626
|
+
|
|
627
|
+
6. 📋 **Add mesh_diagnostics.schema.json** (advanced debugging)
|
|
628
|
+
7. 📋 **Add node_discovery.schema.json** (auto-configuration)
|
|
629
|
+
8. ⏳ **Add batch_command.schema.json** (efficiency)
|
|
630
|
+
9. ⏳ **Add scheduled_command.schema.json** (automation)
|
|
631
|
+
|
|
632
|
+
### For alteriom-firmware Team
|
|
633
|
+
|
|
634
|
+
#### Immediate Actions
|
|
635
|
+
|
|
636
|
+
1. ✅ **Implement command bridge** (already done!)
|
|
637
|
+
2. ⚠️ **Add topology reporter** in gateway
|
|
638
|
+
- Export `mesh.getNodeList()` as topology message
|
|
639
|
+
- Publish full topology every 60 seconds
|
|
640
|
+
- Publish incremental updates on node join/leave
|
|
641
|
+
3. ⚠️ **Add mesh event publisher**
|
|
642
|
+
- Hook into painlessMesh callbacks
|
|
643
|
+
- Publish `mesh_event` on topology changes
|
|
644
|
+
4. 🧪 **Test with web dashboard** (D3.js visualization)
|
|
645
|
+
|
|
646
|
+
#### Future Work
|
|
647
|
+
|
|
648
|
+
5. 📋 **Add `get_topology` command handler**
|
|
649
|
+
6. 📋 **Implement mesh diagnostics command**
|
|
650
|
+
7. 📋 **Add connection quality tracking** (RSSI, latency)
|
|
651
|
+
|
|
652
|
+
---
|
|
653
|
+
|
|
654
|
+
## Conclusion
|
|
655
|
+
|
|
656
|
+
### Summary
|
|
657
|
+
|
|
658
|
+
The MQTT command schema proposal is **excellent and ready for implementation**. However, to provide a **complete mesh management solution**, we strongly recommend adding **mesh topology and event schemas** in the same release (v0.5.0).
|
|
659
|
+
|
|
660
|
+
### Final Verdict
|
|
661
|
+
|
|
662
|
+
| Component | Status | Action |
|
|
663
|
+
|-----------|--------|--------|
|
|
664
|
+
| Command Schema | ✅ **APPROVED** | Implement as proposed |
|
|
665
|
+
| Response Schema | ✅ **APPROVED** | Implement as proposed |
|
|
666
|
+
| Topology Schema | ⚠️ **MISSING** | **Add to v0.5.0** |
|
|
667
|
+
| Event Schema | ⚠️ **MISSING** | **Add to v0.5.0** |
|
|
668
|
+
|
|
669
|
+
### Proposed v0.5.0 Release Scope
|
|
670
|
+
|
|
671
|
+
**Include:**
|
|
672
|
+
1. command.schema.json ✅
|
|
673
|
+
2. command_response.schema.json ✅
|
|
674
|
+
3. mesh_topology.schema.json ⚠️ **NEW**
|
|
675
|
+
4. mesh_event.schema.json ⚠️ **NEW**
|
|
676
|
+
|
|
677
|
+
**Benefits:**
|
|
678
|
+
- Complete bidirectional control (commands + responses)
|
|
679
|
+
- Complete mesh visibility (topology + events)
|
|
680
|
+
- Production-ready monitoring solution
|
|
681
|
+
- Enables web dashboard visualization
|
|
682
|
+
- Supports automated alerting
|
|
683
|
+
|
|
684
|
+
---
|
|
685
|
+
|
|
686
|
+
**Reviewed By:** Alteriom Development Team
|
|
687
|
+
**Date:** October 12, 2025
|
|
688
|
+
**Status:** ✅ APPROVED WITH ADDITIONS RECOMMENDED
|
|
689
|
+
**Next Step:** Submit mesh schemas to @alteriom/mqtt-schema maintainers
|
|
690
|
+
|