@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,349 @@
|
|
|
1
|
+
# Phase 1 OTA Features Guide
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Phase 1 implements two key enhancements to painlessMesh:
|
|
6
|
+
|
|
7
|
+
1. **Option 1E: Compressed OTA Transfer** - 40-60% bandwidth reduction
|
|
8
|
+
2. **Option 2A: Enhanced StatusPackage** - Comprehensive health monitoring
|
|
9
|
+
|
|
10
|
+
These features provide immediate value with minimal complexity and risk.
|
|
11
|
+
|
|
12
|
+
## Benefits
|
|
13
|
+
|
|
14
|
+
### Compressed OTA (Option 1E)
|
|
15
|
+
- ✅ **40-60% bandwidth reduction** - Less network congestion
|
|
16
|
+
- ✅ **Faster updates** - Reduced transfer time
|
|
17
|
+
- ✅ **Lower energy consumption** - Less radio time
|
|
18
|
+
- ✅ **Universal benefit** - Works with all distribution methods
|
|
19
|
+
- ✅ **Backward compatible** - Works with uncompressed nodes
|
|
20
|
+
|
|
21
|
+
### Enhanced Status (Option 2A)
|
|
22
|
+
- ✅ **Comprehensive monitoring** - Device health + mesh stats + performance
|
|
23
|
+
- ✅ **Proactive alerting** - Detect issues before they become critical
|
|
24
|
+
- ✅ **Standardized format** - Consistent across all Alteriom nodes
|
|
25
|
+
- ✅ **Easy integration** - Ready for dashboards and monitoring tools
|
|
26
|
+
- ✅ **Minimal overhead** - ~500 bytes per status report
|
|
27
|
+
|
|
28
|
+
## Implementation
|
|
29
|
+
|
|
30
|
+
### 1. Compressed OTA Transfer
|
|
31
|
+
|
|
32
|
+
#### Sender Side (OTA Distribution Node)
|
|
33
|
+
|
|
34
|
+
```cpp
|
|
35
|
+
#include "painlessMesh.h"
|
|
36
|
+
|
|
37
|
+
#define PAINLESSMESH_ENABLE_OTA
|
|
38
|
+
|
|
39
|
+
painlessMesh mesh;
|
|
40
|
+
|
|
41
|
+
void setup() {
|
|
42
|
+
// Initialize mesh...
|
|
43
|
+
|
|
44
|
+
// Setup OTA sender with callback to provide firmware data
|
|
45
|
+
mesh.initOTASend(firmwareCallback, OTA_PART_SIZE);
|
|
46
|
+
|
|
47
|
+
// Announce firmware with compression enabled
|
|
48
|
+
String md5 = "abc123def456"; // MD5 hash of firmware
|
|
49
|
+
size_t parts = 100; // Number of firmware chunks
|
|
50
|
+
|
|
51
|
+
mesh.offerOTA(
|
|
52
|
+
"sensor", // Role
|
|
53
|
+
"ESP32", // Hardware
|
|
54
|
+
md5, // MD5 hash
|
|
55
|
+
parts, // Number of parts
|
|
56
|
+
false, // Not forced
|
|
57
|
+
false, // Not broadcast (Phase 2)
|
|
58
|
+
true // COMPRESSED! ← Phase 1 feature
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
size_t firmwareCallback(painlessmesh::plugin::ota::DataRequest req, char* buffer) {
|
|
63
|
+
// Load firmware chunk into buffer
|
|
64
|
+
// Return size of data loaded
|
|
65
|
+
return loadFirmwareChunk(req.partNo, buffer);
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
#### Receiver Side (Nodes Being Updated)
|
|
70
|
+
|
|
71
|
+
```cpp
|
|
72
|
+
#include "painlessMesh.h"
|
|
73
|
+
|
|
74
|
+
#define PAINLESSMESH_ENABLE_OTA
|
|
75
|
+
|
|
76
|
+
painlessMesh mesh;
|
|
77
|
+
|
|
78
|
+
void setup() {
|
|
79
|
+
// Initialize mesh...
|
|
80
|
+
|
|
81
|
+
// Setup OTA receiver - automatically handles compression
|
|
82
|
+
mesh.initOTAReceive("sensor", progressCallback);
|
|
83
|
+
|
|
84
|
+
// That's it! Compression is handled automatically
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
void progressCallback(int current, int total) {
|
|
88
|
+
Serial.printf("OTA Progress: %d/%d (%.1f%%)\n",
|
|
89
|
+
current, total, 100.0 * current / total);
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Key Points:**
|
|
94
|
+
- Compression is transparent to receiver nodes
|
|
95
|
+
- Nodes automatically decompress during flash write
|
|
96
|
+
- MD5 verification uses original (uncompressed) firmware hash
|
|
97
|
+
- Backward compatible - compressed nodes can receive uncompressed OTA
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
### 2. Enhanced Status Package
|
|
102
|
+
|
|
103
|
+
#### Creating and Sending Enhanced Status
|
|
104
|
+
|
|
105
|
+
```cpp
|
|
106
|
+
#include "alteriom_sensor_package.hpp"
|
|
107
|
+
#include "painlessMesh.h"
|
|
108
|
+
|
|
109
|
+
painlessMesh mesh;
|
|
110
|
+
|
|
111
|
+
void sendEnhancedStatus() {
|
|
112
|
+
alteriom::EnhancedStatusPackage status;
|
|
113
|
+
|
|
114
|
+
// Device Health
|
|
115
|
+
status.deviceStatus = 0x01; // Online
|
|
116
|
+
status.uptime = millis() / 1000; // Seconds
|
|
117
|
+
status.freeMemory = ESP.getFreeHeap() / 1024; // KB
|
|
118
|
+
status.wifiStrength = map(WiFi.RSSI(), -100, -50, 0, 100);
|
|
119
|
+
status.firmwareVersion = "1.0.0";
|
|
120
|
+
status.firmwareMD5 = "abc123def456";
|
|
121
|
+
|
|
122
|
+
// Mesh Statistics
|
|
123
|
+
status.nodeCount = mesh.getNodeList().size();
|
|
124
|
+
status.connectionCount = mesh.connectionCount();
|
|
125
|
+
status.messagesReceived = getTotalMessagesReceived();
|
|
126
|
+
status.messagesSent = getTotalMessagesSent();
|
|
127
|
+
status.messagesDropped = getTotalMessagesDropped();
|
|
128
|
+
|
|
129
|
+
// Performance Metrics
|
|
130
|
+
status.avgLatency = calculateAverageLatency(); // ms
|
|
131
|
+
status.packetLossRate = calculatePacketLoss(); // 0-100%
|
|
132
|
+
status.throughput = calculateThroughput(); // bytes/sec
|
|
133
|
+
|
|
134
|
+
// Alerts
|
|
135
|
+
status.alertFlags = 0;
|
|
136
|
+
if (status.freeMemory < 32) status.alertFlags |= 0x01; // Low memory
|
|
137
|
+
if (status.wifiStrength < 30) status.alertFlags |= 0x02; // Weak signal
|
|
138
|
+
status.lastError = (status.alertFlags == 0) ? "" : "See alerts";
|
|
139
|
+
|
|
140
|
+
// Send as broadcast
|
|
141
|
+
String msg;
|
|
142
|
+
protocol::Variant(&status).printTo(msg);
|
|
143
|
+
mesh.sendBroadcast(msg);
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
#### Receiving and Processing Enhanced Status
|
|
148
|
+
|
|
149
|
+
```cpp
|
|
150
|
+
void receivedCallback(uint32_t from, String& msg) {
|
|
151
|
+
DynamicJsonDocument doc(2048);
|
|
152
|
+
deserializeJson(doc, msg);
|
|
153
|
+
|
|
154
|
+
int msgType = doc["type"];
|
|
155
|
+
|
|
156
|
+
if (msgType == 203) { // Enhanced Status
|
|
157
|
+
protocol::Variant variant(msg);
|
|
158
|
+
auto status = variant.to<alteriom::EnhancedStatusPackage>();
|
|
159
|
+
|
|
160
|
+
Serial.printf("Status from %u: v%s\n", from, status.firmwareVersion.c_str());
|
|
161
|
+
Serial.printf(" Uptime: %ds, Memory: %dKB, Nodes: %d\n",
|
|
162
|
+
status.uptime, status.freeMemory, status.nodeCount);
|
|
163
|
+
Serial.printf(" Messages: %d RX, %d TX, %d dropped\n",
|
|
164
|
+
status.messagesReceived, status.messagesSent,
|
|
165
|
+
status.messagesDropped);
|
|
166
|
+
Serial.printf(" Performance: %dms latency, %d%% loss, %d B/s\n",
|
|
167
|
+
status.avgLatency, status.packetLossRate, status.throughput);
|
|
168
|
+
|
|
169
|
+
if (status.alertFlags) {
|
|
170
|
+
Serial.printf(" ALERTS: 0x%02X - %s\n",
|
|
171
|
+
status.alertFlags, status.lastError.c_str());
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Alert Flags
|
|
178
|
+
|
|
179
|
+
The `alertFlags` field uses bit flags for different alert conditions:
|
|
180
|
+
|
|
181
|
+
| Bit | Value | Meaning |
|
|
182
|
+
|-----|-------|---------|
|
|
183
|
+
| 0 | 0x01 | Low memory warning |
|
|
184
|
+
| 1 | 0x02 | Weak WiFi signal |
|
|
185
|
+
| 2 | 0x04 | Isolated node (no connections) |
|
|
186
|
+
| 3 | 0x08 | High packet loss rate |
|
|
187
|
+
| 4 | 0x10 | High message latency |
|
|
188
|
+
| 5 | 0x20 | Frequent disconnections |
|
|
189
|
+
| 6 | 0x40 | Custom application alert |
|
|
190
|
+
| 7 | 0x80 | Critical error condition |
|
|
191
|
+
|
|
192
|
+
## Package Type IDs
|
|
193
|
+
|
|
194
|
+
| Type | Package Name | Description |
|
|
195
|
+
|------|--------------|-------------|
|
|
196
|
+
| 200 | SensorPackage | Environmental sensor data |
|
|
197
|
+
| 201 | CommandPackage | Device control commands |
|
|
198
|
+
| 202 | StatusPackage | Basic status (original) |
|
|
199
|
+
| **203** | **EnhancedStatusPackage** | **Comprehensive status (Phase 1)** |
|
|
200
|
+
|
|
201
|
+
## Integration with Metrics System
|
|
202
|
+
|
|
203
|
+
For production use, integrate with painlessMesh metrics:
|
|
204
|
+
|
|
205
|
+
```cpp
|
|
206
|
+
#include "painlessmesh/metrics.hpp"
|
|
207
|
+
|
|
208
|
+
void sendEnhancedStatus() {
|
|
209
|
+
alteriom::EnhancedStatusPackage status;
|
|
210
|
+
|
|
211
|
+
// ... set device health fields ...
|
|
212
|
+
|
|
213
|
+
// Integrate with mesh metrics (if enabled)
|
|
214
|
+
#ifdef PAINLESSMESH_ENABLE_METRICS
|
|
215
|
+
auto& metrics = mesh.getMetrics();
|
|
216
|
+
status.messagesReceived = metrics.message_stats().messages_received;
|
|
217
|
+
status.messagesSent = metrics.message_stats().messages_sent;
|
|
218
|
+
status.avgLatency = metrics.message_stats().average_latency_ms();
|
|
219
|
+
// ... other metrics ...
|
|
220
|
+
#endif
|
|
221
|
+
|
|
222
|
+
// ... send status ...
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## Example Projects
|
|
227
|
+
|
|
228
|
+
See the `examples/alteriom/` directory for complete examples:
|
|
229
|
+
|
|
230
|
+
- **phase1_features.ino** - Comprehensive Phase 1 demonstration
|
|
231
|
+
- **improved_sensor_node.ino** - Enhanced sensor with validation
|
|
232
|
+
|
|
233
|
+
## Performance Impact
|
|
234
|
+
|
|
235
|
+
### Compressed OTA
|
|
236
|
+
- **Memory:** +4-8KB RAM (decompression buffer)
|
|
237
|
+
- **CPU:** Minimal decompression overhead
|
|
238
|
+
- **Bandwidth:** 40-60% reduction (typical)
|
|
239
|
+
- **Update Time:** 35-70s for 10 nodes (vs 60-120s uncompressed)
|
|
240
|
+
|
|
241
|
+
### Enhanced Status
|
|
242
|
+
- **Memory:** +500 bytes per status report
|
|
243
|
+
- **Network:** ~1.5KB per status message
|
|
244
|
+
- **CPU:** Negligible serialization overhead
|
|
245
|
+
- **Frequency:** Configurable (recommend 30-60s interval)
|
|
246
|
+
|
|
247
|
+
## Backward Compatibility
|
|
248
|
+
|
|
249
|
+
Both features are fully backward compatible:
|
|
250
|
+
|
|
251
|
+
### Compressed OTA
|
|
252
|
+
- Nodes without compression support can still receive uncompressed OTA
|
|
253
|
+
- Mixed mesh with compressed and uncompressed nodes works correctly
|
|
254
|
+
- Compression flag is optional in announce messages
|
|
255
|
+
|
|
256
|
+
### Enhanced Status
|
|
257
|
+
- Uses new type ID (203) to distinguish from basic status (202)
|
|
258
|
+
- Nodes can send both basic and enhanced status
|
|
259
|
+
- Receivers can handle both types simultaneously
|
|
260
|
+
- Default values for all fields (safe to omit fields)
|
|
261
|
+
|
|
262
|
+
## Migration Guide
|
|
263
|
+
|
|
264
|
+
### From Uncompressed OTA
|
|
265
|
+
|
|
266
|
+
```cpp
|
|
267
|
+
// Before (Phase 0)
|
|
268
|
+
mesh.offerOTA("sensor", "ESP32", md5, parts);
|
|
269
|
+
|
|
270
|
+
// After (Phase 1) - just add compression flag
|
|
271
|
+
mesh.offerOTA("sensor", "ESP32", md5, parts, false, false, true);
|
|
272
|
+
// ^^^^^ ^^^^^ ^^^^
|
|
273
|
+
// forced bcast compress
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### From Basic StatusPackage
|
|
277
|
+
|
|
278
|
+
```cpp
|
|
279
|
+
// Before (basic status)
|
|
280
|
+
alteriom::StatusPackage status;
|
|
281
|
+
status.uptime = millis() / 1000;
|
|
282
|
+
status.freeMemory = ESP.getFreeHeap() / 1024;
|
|
283
|
+
// ... send ...
|
|
284
|
+
|
|
285
|
+
// After (enhanced status) - just add fields
|
|
286
|
+
alteriom::EnhancedStatusPackage status;
|
|
287
|
+
status.uptime = millis() / 1000;
|
|
288
|
+
status.freeMemory = ESP.getFreeHeap() / 1024;
|
|
289
|
+
status.nodeCount = mesh.getNodeList().size(); // New fields
|
|
290
|
+
status.messagesReceived = getTotalRx(); // New fields
|
|
291
|
+
// ... send ...
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
## Testing
|
|
295
|
+
|
|
296
|
+
Run the test suite to verify Phase 1 features:
|
|
297
|
+
|
|
298
|
+
```bash
|
|
299
|
+
cd /path/to/painlessMesh
|
|
300
|
+
cmake -G Ninja .
|
|
301
|
+
ninja
|
|
302
|
+
./bin/catch_alteriom_packages
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
All tests should pass (80+ assertions).
|
|
306
|
+
|
|
307
|
+
## Next Steps (Phase 2)
|
|
308
|
+
|
|
309
|
+
Phase 1 provides the foundation for Phase 2 features:
|
|
310
|
+
|
|
311
|
+
- **Broadcast OTA (Option 1A)** - Single transmission to all nodes
|
|
312
|
+
- **MQTT Status Bridge (Option 2E)** - Cloud integration
|
|
313
|
+
- **Grafana/InfluxDB dashboards** - Professional monitoring
|
|
314
|
+
|
|
315
|
+
## Troubleshooting
|
|
316
|
+
|
|
317
|
+
### Compressed OTA Not Working
|
|
318
|
+
|
|
319
|
+
1. Check that `PAINLESSMESH_ENABLE_OTA` is defined
|
|
320
|
+
2. Verify compression flag is set to `true`
|
|
321
|
+
3. Ensure sender has compression library available
|
|
322
|
+
4. Check receiver has sufficient RAM for decompression buffer
|
|
323
|
+
|
|
324
|
+
### Enhanced Status Not Received
|
|
325
|
+
|
|
326
|
+
1. Verify type ID is 203 (not 202)
|
|
327
|
+
2. Check receiver handles type 203 in callback
|
|
328
|
+
3. Ensure sufficient buffer size (2048+ bytes for JSON parsing)
|
|
329
|
+
4. Verify all string fields have valid values
|
|
330
|
+
|
|
331
|
+
### Performance Issues
|
|
332
|
+
|
|
333
|
+
1. Reduce status broadcast frequency (use 60s+ intervals)
|
|
334
|
+
2. Check memory availability (need ~8KB free for OTA)
|
|
335
|
+
3. Monitor packet loss rate in enhanced status
|
|
336
|
+
4. Consider mesh topology (star vs mesh affects performance)
|
|
337
|
+
|
|
338
|
+
## Support
|
|
339
|
+
|
|
340
|
+
For questions or issues:
|
|
341
|
+
1. Check full proposal: `docs/improvements/FEATURE_PROPOSALS.md`
|
|
342
|
+
2. Review examples: `examples/alteriom/phase1_features.ino`
|
|
343
|
+
3. Open GitHub issue with logs and configuration
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
**Phase 1 Status:** ✅ Implemented and Tested
|
|
348
|
+
**Expected Performance:** 40-60% OTA bandwidth reduction + comprehensive status monitoring
|
|
349
|
+
**Risk Level:** Low (backward compatible, minimal changes)
|