@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,422 @@
|
|
|
1
|
+
# Mesh Topology Implementation Progress
|
|
2
|
+
|
|
3
|
+
**Start Date:** October 12, 2025
|
|
4
|
+
**Implementation Status:** 🟢 Phase 1 & 2 Complete
|
|
5
|
+
**Branch:** copilot/start-phase-2-implementation
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Progress Overview
|
|
10
|
+
|
|
11
|
+
| Phase | Status | Tasks Complete | Total Tasks | Progress |
|
|
12
|
+
|-------|--------|----------------|-------------|----------|
|
|
13
|
+
| **Phase 1: Core Library** | ✅ **COMPLETE** | 8/8 | 8 | 100% |
|
|
14
|
+
| **Phase 2: Topology Reporter** | ✅ **COMPLETE** | 2/2 | 2 | 100% |
|
|
15
|
+
| **Phase 3: Integration** | ⏳ **PENDING** | 0/4 | 4 | 0% |
|
|
16
|
+
| **Phase 4: Testing** | ⏳ **PENDING** | 0/2 | 2 | 0% |
|
|
17
|
+
| **Phase 5: Documentation** | ⏳ **PENDING** | 0/2 | 2 | 0% |
|
|
18
|
+
| **TOTAL** | 🟡 **IN PROGRESS** | 10/18 | 18 | **56%** |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Completed Tasks ✅
|
|
23
|
+
|
|
24
|
+
### Phase 1: Core Library Enhancements (100% Complete)
|
|
25
|
+
|
|
26
|
+
**File:** `src/painlessmesh/mesh.hpp`
|
|
27
|
+
|
|
28
|
+
#### 1. ✅ Added ConnectionInfo Struct
|
|
29
|
+
```cpp
|
|
30
|
+
struct ConnectionInfo {
|
|
31
|
+
uint32_t nodeId; // Connected node ID
|
|
32
|
+
uint32_t lastSeen; // Timestamp of last message (ms)
|
|
33
|
+
int rssi; // Signal strength (dBm)
|
|
34
|
+
int avgLatency; // Average round-trip time (ms)
|
|
35
|
+
int hopCount; // Hops from current node
|
|
36
|
+
int quality; // Connection quality (0-100)
|
|
37
|
+
uint32_t messagesRx; // Messages received
|
|
38
|
+
uint32_t messagesTx; // Messages sent
|
|
39
|
+
uint32_t messagesDropped; // Failed transmissions
|
|
40
|
+
};
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
#### 2. ✅ Added API Method: getConnectionDetails()
|
|
44
|
+
- Returns `std::vector<ConnectionInfo>` of all direct connections
|
|
45
|
+
- Includes quality metrics from Connection class
|
|
46
|
+
- Used by topology reporter
|
|
47
|
+
|
|
48
|
+
#### 3. ✅ Added API Method: getHopCount()
|
|
49
|
+
- Calculates hop count to specific node
|
|
50
|
+
- Returns -1 if unreachable
|
|
51
|
+
- Returns 1 for direct connections, 2 for indirect (simplified)
|
|
52
|
+
|
|
53
|
+
#### 4. ✅ Added API Method: getRoutingTable()
|
|
54
|
+
- Returns `std::map<uint32_t, uint32_t>` (destination -> next hop)
|
|
55
|
+
- Currently only populates direct connections
|
|
56
|
+
- TODO: Implement full multi-hop routing table lookup
|
|
57
|
+
|
|
58
|
+
#### 5. ✅ Enhanced Connection Class with Metrics Tracking
|
|
59
|
+
**Added to Connection class:**
|
|
60
|
+
```cpp
|
|
61
|
+
uint32_t messagesRx = 0;
|
|
62
|
+
uint32_t messagesTx = 0;
|
|
63
|
+
uint32_t messagesDropped = 0;
|
|
64
|
+
uint32_t timeLastReceived = 0;
|
|
65
|
+
std::vector<uint32_t> latencySamples;
|
|
66
|
+
static const size_t MAX_LATENCY_SAMPLES = 10;
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
#### 6. ✅ Added Method: getLatency()
|
|
70
|
+
- Calculates average latency from rolling window (10 samples)
|
|
71
|
+
- Returns -1 if no samples available
|
|
72
|
+
- Used in quality calculation
|
|
73
|
+
|
|
74
|
+
#### 7. ✅ Added Method: getQuality()
|
|
75
|
+
- Calculates connection quality (0-100)
|
|
76
|
+
- Factors: latency, packet loss, RSSI
|
|
77
|
+
- Penalties:
|
|
78
|
+
- High latency (>100ms): -1 per 5ms over threshold
|
|
79
|
+
- Packet loss: -1 per 1% loss rate
|
|
80
|
+
- Weak RSSI (<-80 dBm): -1 per dBm below threshold
|
|
81
|
+
|
|
82
|
+
#### 8. ✅ Added Method: getRSSI()
|
|
83
|
+
- Platform-specific RSSI retrieval
|
|
84
|
+
- ESP32/ESP8266: Returns WiFi.RSSI()
|
|
85
|
+
- Other platforms: Returns 0
|
|
86
|
+
- Uses `#ifdef` guards for platform detection
|
|
87
|
+
|
|
88
|
+
### Phase 2: Topology Reporter (100% Complete)
|
|
89
|
+
|
|
90
|
+
**File:** `examples/bridge/mesh_topology_reporter.hpp`
|
|
91
|
+
|
|
92
|
+
#### 9. ✅ Created MeshTopologyReporter Class
|
|
93
|
+
**Features:**
|
|
94
|
+
- Generates schema-compliant topology messages (@alteriom/mqtt-schema v0.5.0)
|
|
95
|
+
- `generateFullTopology()` - Complete mesh snapshot with nodes, connections, metrics
|
|
96
|
+
- `generateIncrementalUpdate()` - Node join/leave events
|
|
97
|
+
- `hasTopologyChanged()` - Change detection to avoid redundant publishes
|
|
98
|
+
- Network metrics: diameter, avg quality, throughput
|
|
99
|
+
- ISO 8601 timestamps (placeholder, needs NTP integration)
|
|
100
|
+
- Alteriom device ID format: ALT-XXXXXXXXXXXX
|
|
101
|
+
|
|
102
|
+
**JSON Structure:**
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"schema_version": 1,
|
|
106
|
+
"device_id": "ALT-6825DD341CA4",
|
|
107
|
+
"device_type": "gateway",
|
|
108
|
+
"timestamp": "2025-10-12T15:00:00Z",
|
|
109
|
+
"firmware_version": "GW 2.3.4",
|
|
110
|
+
"event": "mesh_topology",
|
|
111
|
+
"mesh_id": "MESH-001",
|
|
112
|
+
"gateway_node_id": "ALT-6825DD341CA4",
|
|
113
|
+
"nodes": [...],
|
|
114
|
+
"connections": [...],
|
|
115
|
+
"metrics": {...},
|
|
116
|
+
"update_type": "full"
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**File:** `examples/bridge/mesh_event_publisher.hpp`
|
|
121
|
+
|
|
122
|
+
#### 10. ✅ Created MeshEventPublisher Class
|
|
123
|
+
**Features:**
|
|
124
|
+
- Publishes real-time mesh events (@alteriom/mqtt-schema v0.5.0)
|
|
125
|
+
- `publishNodeJoin()` - New node entered mesh
|
|
126
|
+
- `publishNodeLeave()` - Node left mesh
|
|
127
|
+
- `publishConnectionLost()` - Direct connection failed
|
|
128
|
+
- `publishConnectionRestored()` - Connection recovered
|
|
129
|
+
- `publishNetworkSplit()` - Mesh partitioned
|
|
130
|
+
- `publishNetworkMerged()` - Partitions rejoined
|
|
131
|
+
|
|
132
|
+
**Event Structure:**
|
|
133
|
+
```json
|
|
134
|
+
{
|
|
135
|
+
"event": "mesh_event",
|
|
136
|
+
"event_type": "node_join",
|
|
137
|
+
"mesh_id": "MESH-001",
|
|
138
|
+
"affected_nodes": ["ALT-441D64F804A0"],
|
|
139
|
+
"details": {
|
|
140
|
+
"total_nodes": 4,
|
|
141
|
+
"timestamp": "2025-10-12T15:00:00Z"
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Remaining Tasks ⏳
|
|
149
|
+
|
|
150
|
+
### Phase 3: Integration (0% Complete)
|
|
151
|
+
|
|
152
|
+
#### 11. ⏳ Update mqttCommandBridge.ino with topology reporter
|
|
153
|
+
**Location:** `examples/mqttCommandBridge/mqttCommandBridge.ino`
|
|
154
|
+
|
|
155
|
+
**Changes Required:**
|
|
156
|
+
1. Add include: `#include "examples/bridge/mesh_topology_reporter.hpp"`
|
|
157
|
+
2. Create global instance: `MeshTopologyReporter* topologyReporter;`
|
|
158
|
+
3. Initialize in setup(): `topologyReporter = new MeshTopologyReporter(mesh, "MESH-001");`
|
|
159
|
+
4. Update `taskTopology` to use `topologyReporter->generateFullTopology()`
|
|
160
|
+
5. Change topic to: `alteriom/mesh/MESH-001/topology`
|
|
161
|
+
|
|
162
|
+
**Estimated Effort:** 30 minutes
|
|
163
|
+
|
|
164
|
+
#### 12. ⏳ Update mqttCommandBridge.ino with event publisher
|
|
165
|
+
**Changes Required:**
|
|
166
|
+
1. Add include: `#include "examples/bridge/mesh_event_publisher.hpp"`
|
|
167
|
+
2. Create global instance: `MeshEventPublisher* eventPublisher;`
|
|
168
|
+
3. Initialize in setup(): `eventPublisher = new MeshEventPublisher(mesh, mqttClient, "MESH-001");`
|
|
169
|
+
4. Update `mesh.onNewConnection()` callback to call `eventPublisher->publishNodeJoin()`
|
|
170
|
+
5. Update `mesh.onDroppedConnection()` callback to call `eventPublisher->publishNodeLeave()`
|
|
171
|
+
|
|
172
|
+
**Estimated Effort:** 30 minutes
|
|
173
|
+
|
|
174
|
+
#### 13. ⏳ Add incremental topology task to mqttCommandBridge.ino
|
|
175
|
+
**Changes Required:**
|
|
176
|
+
1. Create `taskTopologyIncremental` (5 second interval)
|
|
177
|
+
2. Check `topologyReporter->hasTopologyChanged()`
|
|
178
|
+
3. If changed, generate and publish incremental update
|
|
179
|
+
4. Add task to scheduler in setup()
|
|
180
|
+
|
|
181
|
+
**Estimated Effort:** 20 minutes
|
|
182
|
+
|
|
183
|
+
#### 14. ⏳ Add GET_TOPOLOGY command handler (command 300)
|
|
184
|
+
**Location:** `examples/bridge/mqtt_command_bridge.hpp`
|
|
185
|
+
|
|
186
|
+
**Changes Required:**
|
|
187
|
+
1. Add case 300 in command switch
|
|
188
|
+
2. Call `topologyReporter->generateFullTopology()`
|
|
189
|
+
3. Publish response to MQTT
|
|
190
|
+
4. Send command response with success=true
|
|
191
|
+
|
|
192
|
+
**Estimated Effort:** 15 minutes
|
|
193
|
+
|
|
194
|
+
### Phase 4: Testing (0% Complete)
|
|
195
|
+
|
|
196
|
+
#### 15. ⏳ Create physical hardware test sketch
|
|
197
|
+
**Location:** `examples/mqttTopologyTest/mqttTopologyTest.ino` (NEW)
|
|
198
|
+
|
|
199
|
+
**Requirements:**
|
|
200
|
+
- 3-node mesh setup (1 gateway + 2 sensors)
|
|
201
|
+
- Verify full topology published every 60s
|
|
202
|
+
- Verify incremental updates on node join/leave
|
|
203
|
+
- Verify events published correctly
|
|
204
|
+
- Log all messages to Serial
|
|
205
|
+
|
|
206
|
+
**Estimated Effort:** 2 hours
|
|
207
|
+
|
|
208
|
+
#### 16. ⏳ Create schema validation tests
|
|
209
|
+
**Location:** `test/catch/catch_topology_schema.cpp` (NEW)
|
|
210
|
+
|
|
211
|
+
**Test Cases:**
|
|
212
|
+
- Topology message has envelope fields
|
|
213
|
+
- Topology message has nodes array
|
|
214
|
+
- Topology message has connections array
|
|
215
|
+
- Topology message has metrics object
|
|
216
|
+
- Event message has correct structure
|
|
217
|
+
- Device IDs match Alteriom format
|
|
218
|
+
|
|
219
|
+
**Estimated Effort:** 3 hours
|
|
220
|
+
|
|
221
|
+
### Phase 5: Documentation (0% Complete)
|
|
222
|
+
|
|
223
|
+
#### 17. ⏳ Update MQTT_BRIDGE_COMMANDS.md documentation
|
|
224
|
+
**Location:** `docs/MQTT_BRIDGE_COMMANDS.md`
|
|
225
|
+
|
|
226
|
+
**Sections to Add:**
|
|
227
|
+
- Mesh Topology Reporting
|
|
228
|
+
- Mesh Events
|
|
229
|
+
- Topology command (300)
|
|
230
|
+
- Message examples
|
|
231
|
+
|
|
232
|
+
**Estimated Effort:** 1 hour
|
|
233
|
+
|
|
234
|
+
#### 18. ⏳ Create MESH_TOPOLOGY_GUIDE.md
|
|
235
|
+
**Location:** `docs/MESH_TOPOLOGY_GUIDE.md` (NEW)
|
|
236
|
+
|
|
237
|
+
**Content:**
|
|
238
|
+
- How topology reporting works
|
|
239
|
+
- How to visualize with D3.js
|
|
240
|
+
- Troubleshooting topology issues
|
|
241
|
+
- Performance considerations
|
|
242
|
+
|
|
243
|
+
**Estimated Effort:** 2 hours
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## Implementation Notes
|
|
248
|
+
|
|
249
|
+
### TODO Items Identified
|
|
250
|
+
|
|
251
|
+
1. **NTP Time Integration**
|
|
252
|
+
- Currently using millis()-based timestamps
|
|
253
|
+
- Should use painlessMesh time sync for accurate ISO 8601 timestamps
|
|
254
|
+
- Location: `getISO8601Timestamp()` in both reporter and publisher
|
|
255
|
+
|
|
256
|
+
2. **Multi-Hop Routing**
|
|
257
|
+
- `getHopCount()` currently simplified (1 for direct, 2 for indirect)
|
|
258
|
+
- Need proper BFS traversal of mesh tree
|
|
259
|
+
- `getRoutingTable()` only shows direct connections
|
|
260
|
+
|
|
261
|
+
3. **Node Status from Messages**
|
|
262
|
+
- Currently using placeholder values for non-gateway nodes
|
|
263
|
+
- Should parse StatusPackage messages to get actual uptime, memory, firmware
|
|
264
|
+
- Store in cache indexed by node ID
|
|
265
|
+
|
|
266
|
+
4. **Throughput Tracking**
|
|
267
|
+
- `calculateThroughput()` returns placeholder value
|
|
268
|
+
- Need to track messages per second over time window
|
|
269
|
+
- Add to Connection class metrics
|
|
270
|
+
|
|
271
|
+
5. **Network Partition Detection**
|
|
272
|
+
- `publishNetworkSplit()` has TODO for partition detection
|
|
273
|
+
- Need algorithm to detect when mesh splits into segments
|
|
274
|
+
|
|
275
|
+
6. **Connection State Machine**
|
|
276
|
+
- Track connection state changes for `publishConnectionRestored()`
|
|
277
|
+
- Need to distinguish between first connect and reconnect
|
|
278
|
+
|
|
279
|
+
### Testing Strategy
|
|
280
|
+
|
|
281
|
+
**Unit Tests (catch2):**
|
|
282
|
+
- ✅ Command response tracking (already exists)
|
|
283
|
+
- ✅ Status package serialization (already exists)
|
|
284
|
+
- ⏳ Topology JSON schema validation (TODO)
|
|
285
|
+
- ⏳ Event JSON schema validation (TODO)
|
|
286
|
+
|
|
287
|
+
**Integration Tests (hardware):**
|
|
288
|
+
- ⏳ 3-node mesh topology (TODO)
|
|
289
|
+
- ⏳ Node join/leave events (TODO)
|
|
290
|
+
- ⏳ Connection quality metrics (TODO)
|
|
291
|
+
- ⏳ Full/incremental updates (TODO)
|
|
292
|
+
|
|
293
|
+
**Manual Tests:**
|
|
294
|
+
- ⏳ MQTT message inspection
|
|
295
|
+
- ⏳ Web dashboard visualization (D3.js)
|
|
296
|
+
- ⏳ Schema validation with ajv
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## Next Steps (Priority Order)
|
|
301
|
+
|
|
302
|
+
### Immediate (Today)
|
|
303
|
+
|
|
304
|
+
1. **Update mqttCommandBridge.ino** - Integrate topology reporter and event publisher
|
|
305
|
+
2. **Test compilation** - Ensure no errors with new API methods
|
|
306
|
+
3. **Manual MQTT inspection** - Subscribe to topics and verify JSON structure
|
|
307
|
+
|
|
308
|
+
### Short-term (This Week)
|
|
309
|
+
|
|
310
|
+
4. **Add GET_TOPOLOGY command** - Command 300 handler
|
|
311
|
+
5. **Create hardware test sketch** - 3-node mesh validation
|
|
312
|
+
6. **Fix NTP timestamps** - Use painlessMesh time sync
|
|
313
|
+
|
|
314
|
+
### Medium-term (Next Week)
|
|
315
|
+
|
|
316
|
+
7. **Schema validation tests** - Automated JSON schema checks
|
|
317
|
+
8. **Documentation updates** - MQTT_BRIDGE_COMMANDS.md and MESH_TOPOLOGY_GUIDE.md
|
|
318
|
+
9. **Multi-hop routing** - Proper hop count calculation
|
|
319
|
+
10. **Node status caching** - Track actual node metrics from status messages
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
## Files Modified
|
|
324
|
+
|
|
325
|
+
### Core Library
|
|
326
|
+
- ✅ `src/painlessmesh/mesh.hpp` - Added ConnectionInfo, API methods, Connection metrics
|
|
327
|
+
|
|
328
|
+
### New Files Created
|
|
329
|
+
- ✅ `examples/bridge/mesh_topology_reporter.hpp` - Topology reporter class
|
|
330
|
+
- ✅ `examples/bridge/mesh_event_publisher.hpp` - Event publisher class
|
|
331
|
+
- ✅ `docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md` - Implementation plan
|
|
332
|
+
- ✅ `docs/MQTT_SCHEMA_REVIEW.md` - Schema review and recommendations (already existed)
|
|
333
|
+
- ✅ **THIS FILE** - Progress tracking
|
|
334
|
+
|
|
335
|
+
### Files to Modify
|
|
336
|
+
- ⏳ `examples/mqttCommandBridge/mqttCommandBridge.ino` - Integrate reporters
|
|
337
|
+
- ⏳ `examples/bridge/mqtt_command_bridge.hpp` - Add command 300
|
|
338
|
+
- ⏳ `docs/MQTT_BRIDGE_COMMANDS.md` - Add topology docs
|
|
339
|
+
- ⏳ `test/catch/catch_topology_schema.cpp` - Add schema tests (new file)
|
|
340
|
+
- ⏳ `examples/mqttTopologyTest/mqttTopologyTest.ino` - Hardware test (new file)
|
|
341
|
+
- ⏳ `docs/MESH_TOPOLOGY_GUIDE.md` - Visualization guide (new file)
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
## Build & Test Status
|
|
346
|
+
|
|
347
|
+
### Compilation Status
|
|
348
|
+
⏳ **Not Yet Tested** - Need to compile after integration
|
|
349
|
+
|
|
350
|
+
Expected issues:
|
|
351
|
+
- None (API changes are additive, backward compatible)
|
|
352
|
+
|
|
353
|
+
### Test Status
|
|
354
|
+
⏳ **Not Yet Run** - Integration pending
|
|
355
|
+
|
|
356
|
+
### CI/CD Status
|
|
357
|
+
✅ **Last CI Build:** Passed (commit 81ba4bc - CI fixes)
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
## Time Tracking
|
|
362
|
+
|
|
363
|
+
| Phase | Estimated | Actual | Status |
|
|
364
|
+
|-------|-----------|--------|--------|
|
|
365
|
+
| Phase 1: Core Library | 16h | ~2h | ✅ Done |
|
|
366
|
+
| Phase 2: Topology Reporter | 12h | ~1h | ✅ Done |
|
|
367
|
+
| Phase 3: Integration | 2h | 0h | ⏳ Pending |
|
|
368
|
+
| Phase 4: Testing | 5h | 0h | ⏳ Pending |
|
|
369
|
+
| Phase 5: Documentation | 3h | 0h | ⏳ Pending |
|
|
370
|
+
| **Total** | **38h** | **3h** | **8% Complete** |
|
|
371
|
+
|
|
372
|
+
**Efficiency Note:** Implementation is progressing faster than estimated due to:
|
|
373
|
+
- Clear implementation plan (IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md)
|
|
374
|
+
- Well-defined schemas (MQTT_SCHEMA_REVIEW.md)
|
|
375
|
+
- Existing infrastructure (MqttCommandBridge, StatusPackage)
|
|
376
|
+
|
|
377
|
+
---
|
|
378
|
+
|
|
379
|
+
## Risk Assessment
|
|
380
|
+
|
|
381
|
+
### Low Risk ✅
|
|
382
|
+
- Core API additions (backward compatible)
|
|
383
|
+
- New classes (no changes to existing code)
|
|
384
|
+
- Schema-compliant JSON generation
|
|
385
|
+
|
|
386
|
+
### Medium Risk ⚠️
|
|
387
|
+
- Platform-specific RSSI (needs ESP32/ESP8266 testing)
|
|
388
|
+
- Memory usage (8KB JSON buffers on ESP8266)
|
|
389
|
+
- NTP timestamp integration
|
|
390
|
+
|
|
391
|
+
### High Risk 🔴
|
|
392
|
+
- None identified at this stage
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
## Questions & Decisions Needed
|
|
397
|
+
|
|
398
|
+
1. **Mesh ID Convention**
|
|
399
|
+
- Currently hardcoded as "MESH-001"
|
|
400
|
+
- Should this be configurable?
|
|
401
|
+
- Should it be derived from gateway node ID?
|
|
402
|
+
|
|
403
|
+
2. **Firmware Version**
|
|
404
|
+
- Currently hardcoded as "GW 2.3.4"
|
|
405
|
+
- Should this come from library version?
|
|
406
|
+
- Should it be user-defined in setup()?
|
|
407
|
+
|
|
408
|
+
3. **Node Role Detection**
|
|
409
|
+
- Currently assumes all non-gateway nodes are "sensor"
|
|
410
|
+
- How to distinguish sensor vs repeater vs bridge?
|
|
411
|
+
- Should nodes self-report their role?
|
|
412
|
+
|
|
413
|
+
4. **Topology Publish Frequency**
|
|
414
|
+
- Full: Every 60 seconds
|
|
415
|
+
- Incremental: Every 5 seconds (if changed)
|
|
416
|
+
- Are these intervals appropriate?
|
|
417
|
+
- Should they be configurable?
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
|
|
421
|
+
**Updated:** October 12, 2025 15:30 UTC
|
|
422
|
+
**Next Update:** After Phase 3 integration complete
|