@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,543 @@
|
|
|
1
|
+
# Phase 2 Features Guide
|
|
2
|
+
|
|
3
|
+
## Quick Summary
|
|
4
|
+
|
|
5
|
+
Phase 2 adds production-ready features for scalable OTA distribution and professional monitoring:
|
|
6
|
+
|
|
7
|
+
- ✅ **Broadcast OTA** - True mesh-wide firmware distribution scaling to 50+ nodes
|
|
8
|
+
- ✅ **MQTT Status Bridge** - Professional monitoring integration with Grafana, InfluxDB, Prometheus
|
|
9
|
+
|
|
10
|
+
## Features Overview
|
|
11
|
+
|
|
12
|
+
### 1. Broadcast OTA (Option 1A)
|
|
13
|
+
|
|
14
|
+
**What it does:** Distributes firmware to all nodes simultaneously via broadcast, dramatically reducing network traffic.
|
|
15
|
+
|
|
16
|
+
**Key Benefits:**
|
|
17
|
+
- **~98% network traffic reduction** vs unicast (1 broadcast vs N unicasts)
|
|
18
|
+
- **Faster distribution** - All nodes receive chunks in parallel
|
|
19
|
+
- **Scales to 50-100+ nodes** efficiently
|
|
20
|
+
- **Backward compatible** - Works with Phase 1 compression
|
|
21
|
+
- **Memory efficient** - Only +2-5KB per node
|
|
22
|
+
|
|
23
|
+
**Architecture:**
|
|
24
|
+
```
|
|
25
|
+
Root Node All Nodes
|
|
26
|
+
├─> Broadcast: Announce ─┐
|
|
27
|
+
├─> Broadcast: Chunk 0 ─┼─> Listen & Cache
|
|
28
|
+
├─> Broadcast: Chunk 1 ─┼─> Assemble Firmware
|
|
29
|
+
└─> Broadcast: Chunk N ─┘ Reboot When Complete
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 2. MQTT Status Bridge (Option 2E)
|
|
33
|
+
|
|
34
|
+
**What it does:** Publishes comprehensive mesh status to MQTT topics for professional monitoring tools.
|
|
35
|
+
|
|
36
|
+
**Key Benefits:**
|
|
37
|
+
- **Cloud integration** via MQTT
|
|
38
|
+
- **Professional monitoring** - Grafana, InfluxDB, Prometheus, Home Assistant
|
|
39
|
+
- **Real-time visibility** into mesh health
|
|
40
|
+
- **Automated alerting** for critical conditions
|
|
41
|
+
- **Configurable publishing** intervals and topics
|
|
42
|
+
|
|
43
|
+
**MQTT Topics:**
|
|
44
|
+
- `mesh/status/nodes` - List of all nodes in mesh
|
|
45
|
+
- `mesh/status/topology` - Complete mesh structure JSON
|
|
46
|
+
- `mesh/status/metrics` - Performance statistics
|
|
47
|
+
- `mesh/status/alerts` - Active alert conditions
|
|
48
|
+
- `mesh/status/node/{id}` - Per-node detailed status (optional)
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Getting Started
|
|
53
|
+
|
|
54
|
+
### Prerequisites
|
|
55
|
+
|
|
56
|
+
- Phase 1 features installed (Compressed OTA + Enhanced Status)
|
|
57
|
+
- ESP32 or ESP8266 hardware
|
|
58
|
+
- For MQTT Bridge: MQTT broker (Mosquitto, HiveMQ, etc.)
|
|
59
|
+
- For MQTT Bridge: External WiFi connection
|
|
60
|
+
|
|
61
|
+
### Quick Start: Broadcast OTA
|
|
62
|
+
|
|
63
|
+
```cpp
|
|
64
|
+
#include "painlessMesh.h"
|
|
65
|
+
|
|
66
|
+
painlessMesh mesh;
|
|
67
|
+
|
|
68
|
+
void setup() {
|
|
69
|
+
mesh.init(MESH_PREFIX, MESH_PASSWORD, &scheduler, MESH_PORT);
|
|
70
|
+
|
|
71
|
+
#ifdef PAINLESSMESH_ENABLE_OTA
|
|
72
|
+
// Phase 2: Enable broadcast mode
|
|
73
|
+
mesh.offerOTA(
|
|
74
|
+
"sensor", // Role
|
|
75
|
+
"ESP32", // Hardware
|
|
76
|
+
firmwareMD5, // MD5 hash
|
|
77
|
+
numParts, // Number of chunks
|
|
78
|
+
false, // Not forced
|
|
79
|
+
true, // *** BROADCAST MODE ***
|
|
80
|
+
true // Compressed (Phase 1)
|
|
81
|
+
);
|
|
82
|
+
#endif
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Quick Start: MQTT Status Bridge
|
|
87
|
+
|
|
88
|
+
```cpp
|
|
89
|
+
#include <PubSubClient.h>
|
|
90
|
+
#include "examples/bridge/mqtt_status_bridge.hpp"
|
|
91
|
+
|
|
92
|
+
painlessMesh mesh;
|
|
93
|
+
PubSubClient mqttClient(mqttBroker, 1883, mqttCallback, wifiClient);
|
|
94
|
+
MqttStatusBridge* statusBridge;
|
|
95
|
+
|
|
96
|
+
void setup() {
|
|
97
|
+
// Initialize mesh as bridge node
|
|
98
|
+
mesh.init(MESH_PREFIX, MESH_PASSWORD, MESH_PORT, WIFI_AP_STA, 6);
|
|
99
|
+
mesh.setRoot(true);
|
|
100
|
+
mesh.setContainsRoot(true);
|
|
101
|
+
|
|
102
|
+
// Connect to external WiFi for MQTT
|
|
103
|
+
mesh.stationManual(STATION_SSID, STATION_PASSWORD);
|
|
104
|
+
|
|
105
|
+
// Initialize status bridge
|
|
106
|
+
statusBridge = new MqttStatusBridge(mesh, mqttClient);
|
|
107
|
+
statusBridge->setPublishInterval(30000); // 30 seconds
|
|
108
|
+
statusBridge->begin();
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## API Reference
|
|
115
|
+
|
|
116
|
+
### Broadcast OTA
|
|
117
|
+
|
|
118
|
+
#### mesh.offerOTA()
|
|
119
|
+
|
|
120
|
+
```cpp
|
|
121
|
+
std::shared_ptr<Task> offerOTA(
|
|
122
|
+
TSTRING role,
|
|
123
|
+
TSTRING hardware,
|
|
124
|
+
TSTRING md5,
|
|
125
|
+
size_t noPart,
|
|
126
|
+
bool forced = false,
|
|
127
|
+
bool broadcasted = false, // Phase 2: Broadcast mode
|
|
128
|
+
bool compressed = false // Phase 1: Compression
|
|
129
|
+
)
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Parameters:**
|
|
133
|
+
- `role` - Node role this firmware is for (e.g., "sensor", "gateway")
|
|
134
|
+
- `hardware` - Hardware type: "ESP32" or "ESP8266"
|
|
135
|
+
- `md5` - MD5 hash of firmware (for version checking)
|
|
136
|
+
- `noPart` - Number of firmware chunks
|
|
137
|
+
- `forced` - Force update even if MD5 matches (default: false)
|
|
138
|
+
- **`broadcasted`** - **[Phase 2]** Enable broadcast mode (default: false)
|
|
139
|
+
- `compressed` - [Phase 1] Enable compression (default: false)
|
|
140
|
+
|
|
141
|
+
**Returns:** Shared pointer to Task that manages OTA announcements
|
|
142
|
+
|
|
143
|
+
**Example:**
|
|
144
|
+
```cpp
|
|
145
|
+
auto otaTask = mesh.offerOTA(
|
|
146
|
+
"sensor", "ESP32", md5, 100,
|
|
147
|
+
false, // not forced
|
|
148
|
+
true, // BROADCAST MODE
|
|
149
|
+
true // compressed
|
|
150
|
+
);
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### MQTT Status Bridge
|
|
154
|
+
|
|
155
|
+
#### Constructor
|
|
156
|
+
|
|
157
|
+
```cpp
|
|
158
|
+
MqttStatusBridge(painlessMesh& mesh, PubSubClient& mqttClient)
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
#### Configuration Methods
|
|
162
|
+
|
|
163
|
+
```cpp
|
|
164
|
+
void setPublishInterval(uint32_t interval)
|
|
165
|
+
```
|
|
166
|
+
Set publishing interval in milliseconds (default: 30000)
|
|
167
|
+
|
|
168
|
+
```cpp
|
|
169
|
+
void setTopicPrefix(const String& prefix)
|
|
170
|
+
```
|
|
171
|
+
Set MQTT topic prefix (default: "mesh/status/")
|
|
172
|
+
|
|
173
|
+
```cpp
|
|
174
|
+
void enableTopology(bool enable)
|
|
175
|
+
```
|
|
176
|
+
Enable/disable topology publishing (default: true)
|
|
177
|
+
|
|
178
|
+
```cpp
|
|
179
|
+
void enableMetrics(bool enable)
|
|
180
|
+
```
|
|
181
|
+
Enable/disable metrics publishing (default: true)
|
|
182
|
+
|
|
183
|
+
```cpp
|
|
184
|
+
void enableAlerts(bool enable)
|
|
185
|
+
```
|
|
186
|
+
Enable/disable alerts publishing (default: true)
|
|
187
|
+
|
|
188
|
+
```cpp
|
|
189
|
+
void enablePerNode(bool enable)
|
|
190
|
+
```
|
|
191
|
+
Enable/disable per-node status publishing (default: false)
|
|
192
|
+
⚠️ **Warning:** Can be expensive for large meshes (50+ nodes)
|
|
193
|
+
|
|
194
|
+
#### Control Methods
|
|
195
|
+
|
|
196
|
+
```cpp
|
|
197
|
+
void begin()
|
|
198
|
+
```
|
|
199
|
+
Start publishing status to MQTT
|
|
200
|
+
|
|
201
|
+
```cpp
|
|
202
|
+
void stop()
|
|
203
|
+
```
|
|
204
|
+
Stop publishing
|
|
205
|
+
|
|
206
|
+
```cpp
|
|
207
|
+
void publishNow()
|
|
208
|
+
```
|
|
209
|
+
Trigger immediate status publish (useful for testing)
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Usage Examples
|
|
214
|
+
|
|
215
|
+
### Example 1: Basic Broadcast OTA
|
|
216
|
+
|
|
217
|
+
```cpp
|
|
218
|
+
#include "painlessMesh.h"
|
|
219
|
+
|
|
220
|
+
#define MESH_PREFIX "myMesh"
|
|
221
|
+
#define MESH_PASSWORD "password"
|
|
222
|
+
#define MESH_PORT 5555
|
|
223
|
+
#define OTA_PART_SIZE 1024
|
|
224
|
+
|
|
225
|
+
painlessMesh mesh;
|
|
226
|
+
|
|
227
|
+
void setup() {
|
|
228
|
+
mesh.init(MESH_PREFIX, MESH_PASSWORD, MESH_PORT);
|
|
229
|
+
|
|
230
|
+
#ifdef PAINLESSMESH_ENABLE_OTA
|
|
231
|
+
// Setup OTA sender
|
|
232
|
+
mesh.initOTASend(firmwareCallback, OTA_PART_SIZE);
|
|
233
|
+
|
|
234
|
+
// Announce firmware with broadcast + compression
|
|
235
|
+
mesh.offerOTA(
|
|
236
|
+
"sensor", // role
|
|
237
|
+
"ESP32", // hardware
|
|
238
|
+
"abc123...", // MD5
|
|
239
|
+
150, // number of chunks
|
|
240
|
+
false, // not forced
|
|
241
|
+
true, // BROADCAST
|
|
242
|
+
true // compressed
|
|
243
|
+
);
|
|
244
|
+
#endif
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
size_t firmwareCallback(ota::DataRequest pkg, char* buffer) {
|
|
248
|
+
// Read firmware chunk from storage
|
|
249
|
+
// Return bytes read into buffer
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### Example 2: MQTT Status Bridge with Custom Configuration
|
|
254
|
+
|
|
255
|
+
```cpp
|
|
256
|
+
#include <PubSubClient.h>
|
|
257
|
+
#include "examples/bridge/mqtt_status_bridge.hpp"
|
|
258
|
+
|
|
259
|
+
MqttStatusBridge* bridge;
|
|
260
|
+
|
|
261
|
+
void setup() {
|
|
262
|
+
// ... initialize mesh and MQTT ...
|
|
263
|
+
|
|
264
|
+
bridge = new MqttStatusBridge(mesh, mqttClient);
|
|
265
|
+
|
|
266
|
+
// Custom configuration
|
|
267
|
+
bridge->setPublishInterval(60000); // Publish every minute
|
|
268
|
+
bridge->setTopicPrefix("alteriom/"); // Custom topic prefix
|
|
269
|
+
bridge->enableTopology(true); // Publish topology
|
|
270
|
+
bridge->enableMetrics(true); // Publish metrics
|
|
271
|
+
bridge->enableAlerts(true); // Publish alerts
|
|
272
|
+
bridge->enablePerNode(false); // Disable per-node (too many nodes)
|
|
273
|
+
|
|
274
|
+
bridge->begin();
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
void loop() {
|
|
278
|
+
mesh.update();
|
|
279
|
+
mqttClient.loop();
|
|
280
|
+
|
|
281
|
+
// Trigger manual publish on demand
|
|
282
|
+
if (buttonPressed()) {
|
|
283
|
+
bridge->publishNow();
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
### Example 3: Combined Phase 1 + Phase 2 Features
|
|
289
|
+
|
|
290
|
+
```cpp
|
|
291
|
+
#include "painlessMesh.h"
|
|
292
|
+
#include "examples/alteriom/alteriom_sensor_package.hpp"
|
|
293
|
+
#include "examples/bridge/mqtt_status_bridge.hpp"
|
|
294
|
+
|
|
295
|
+
void setup() {
|
|
296
|
+
mesh.init(...);
|
|
297
|
+
|
|
298
|
+
// Phase 1: Enhanced Status
|
|
299
|
+
alteriom::EnhancedStatusPackage status;
|
|
300
|
+
status.uptime = millis() / 1000;
|
|
301
|
+
status.nodeCount = mesh.getNodeList().size();
|
|
302
|
+
mesh.sendBroadcast(status.toJsonString());
|
|
303
|
+
|
|
304
|
+
// Phase 2: Broadcast OTA
|
|
305
|
+
mesh.offerOTA("sensor", "ESP32", md5, parts, false, true, true);
|
|
306
|
+
|
|
307
|
+
// Phase 2: MQTT Bridge
|
|
308
|
+
statusBridge->begin();
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
## Performance & Scaling
|
|
315
|
+
|
|
316
|
+
### Broadcast OTA Performance
|
|
317
|
+
|
|
318
|
+
| Mesh Size | Unicast Traffic | Broadcast Traffic | Reduction |
|
|
319
|
+
|-----------|----------------|-------------------|-----------|
|
|
320
|
+
| 10 nodes | 10x chunks | 1x chunks | 90% |
|
|
321
|
+
| 50 nodes | 50x chunks | 1x chunks | 98% |
|
|
322
|
+
| 100 nodes | 100x chunks | 1x chunks | 99% |
|
|
323
|
+
|
|
324
|
+
**Example:** 150 chunk firmware update
|
|
325
|
+
- **Unicast mode:** 50 nodes × 150 chunks = 7,500 transmissions
|
|
326
|
+
- **Broadcast mode:** 1 × 150 chunks = 150 transmissions
|
|
327
|
+
- **Reduction:** 7,350 fewer transmissions (98%)
|
|
328
|
+
|
|
329
|
+
### Memory Usage
|
|
330
|
+
|
|
331
|
+
| Feature | Memory Impact | Notes |
|
|
332
|
+
|---------|--------------|-------|
|
|
333
|
+
| Broadcast OTA | +2-5KB per node | Chunk bitmap + buffer |
|
|
334
|
+
| MQTT Bridge | +5-8KB root node | Status collection |
|
|
335
|
+
|
|
336
|
+
### MQTT Traffic
|
|
337
|
+
|
|
338
|
+
| Feature | Messages/Interval | Size | Total/Interval |
|
|
339
|
+
|---------|------------------|------|----------------|
|
|
340
|
+
| Node List | 1 | ~200 bytes | 200 bytes |
|
|
341
|
+
| Topology | 1 | ~1-5KB | 1-5KB |
|
|
342
|
+
| Metrics | 1 | ~300 bytes | 300 bytes |
|
|
343
|
+
| Alerts | 1 | ~400 bytes | 400 bytes |
|
|
344
|
+
| Per-node (50 nodes) | 50 | ~150 bytes | ~7.5KB |
|
|
345
|
+
|
|
346
|
+
**Recommended:** Disable per-node publishing for meshes >20 nodes
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## Integration with Monitoring Tools
|
|
351
|
+
|
|
352
|
+
### Grafana Dashboard
|
|
353
|
+
|
|
354
|
+
```json
|
|
355
|
+
{
|
|
356
|
+
"datasource": "MQTT",
|
|
357
|
+
"targets": [
|
|
358
|
+
{
|
|
359
|
+
"topic": "mesh/status/metrics",
|
|
360
|
+
"field": "nodeCount"
|
|
361
|
+
}
|
|
362
|
+
]
|
|
363
|
+
}
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
### InfluxDB Telegraf
|
|
367
|
+
|
|
368
|
+
```toml
|
|
369
|
+
[[inputs.mqtt_consumer]]
|
|
370
|
+
servers = ["tcp://localhost:1883"]
|
|
371
|
+
topics = [
|
|
372
|
+
"mesh/status/metrics",
|
|
373
|
+
"mesh/status/alerts"
|
|
374
|
+
]
|
|
375
|
+
data_format = "json"
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
### Prometheus MQTT Exporter
|
|
379
|
+
|
|
380
|
+
```yaml
|
|
381
|
+
mqtt:
|
|
382
|
+
server: tcp://localhost:1883
|
|
383
|
+
topics:
|
|
384
|
+
- mesh/status/metrics
|
|
385
|
+
- mesh/status/alerts
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
### Home Assistant
|
|
389
|
+
|
|
390
|
+
```yaml
|
|
391
|
+
sensor:
|
|
392
|
+
- platform: mqtt
|
|
393
|
+
name: "Mesh Node Count"
|
|
394
|
+
state_topic: "mesh/status/metrics"
|
|
395
|
+
value_template: "{{ value_json.nodeCount }}"
|
|
396
|
+
|
|
397
|
+
- platform: mqtt
|
|
398
|
+
name: "Mesh Free Heap"
|
|
399
|
+
state_topic: "mesh/status/metrics"
|
|
400
|
+
value_template: "{{ value_json.freeHeap }}"
|
|
401
|
+
unit_of_measurement: "bytes"
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
## Troubleshooting
|
|
407
|
+
|
|
408
|
+
### Broadcast OTA Issues
|
|
409
|
+
|
|
410
|
+
**Problem:** Nodes not receiving broadcast chunks
|
|
411
|
+
|
|
412
|
+
**Solutions:**
|
|
413
|
+
1. Ensure `broadcasted=true` in offerOTA()
|
|
414
|
+
2. Check mesh connectivity (all nodes must be connected)
|
|
415
|
+
3. Verify nodes are running receiver code with `initOTAReceive()`
|
|
416
|
+
4. Check for mesh congestion (add delays between chunks)
|
|
417
|
+
|
|
418
|
+
**Problem:** Out-of-sequence chunks
|
|
419
|
+
|
|
420
|
+
**Solution:** This is normal! Broadcast mode handles out-of-order delivery automatically.
|
|
421
|
+
|
|
422
|
+
### MQTT Bridge Issues
|
|
423
|
+
|
|
424
|
+
**Problem:** No status published to MQTT
|
|
425
|
+
|
|
426
|
+
**Solutions:**
|
|
427
|
+
1. Check MQTT broker connectivity
|
|
428
|
+
2. Verify mqttClient.connected() returns true
|
|
429
|
+
3. Check publish interval (default 30s)
|
|
430
|
+
4. Enable Serial debug output
|
|
431
|
+
|
|
432
|
+
**Problem:** High MQTT traffic
|
|
433
|
+
|
|
434
|
+
**Solutions:**
|
|
435
|
+
1. Increase publish interval (30s → 60s → 120s)
|
|
436
|
+
2. Disable per-node publishing
|
|
437
|
+
3. Disable topology publishing if mesh structure is static
|
|
438
|
+
|
|
439
|
+
---
|
|
440
|
+
|
|
441
|
+
## Migration Guide
|
|
442
|
+
|
|
443
|
+
### From Phase 1 to Phase 2
|
|
444
|
+
|
|
445
|
+
**Step 1:** Update offerOTA() calls
|
|
446
|
+
```cpp
|
|
447
|
+
// Phase 1
|
|
448
|
+
mesh.offerOTA(role, hardware, md5, parts, false, false, true);
|
|
449
|
+
|
|
450
|
+
// Phase 2 - just add broadcast flag
|
|
451
|
+
mesh.offerOTA(role, hardware, md5, parts, false, true, true);
|
|
452
|
+
// ^^^^
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
**Step 2:** Add MQTT bridge (optional)
|
|
456
|
+
```cpp
|
|
457
|
+
#include "examples/bridge/mqtt_status_bridge.hpp"
|
|
458
|
+
|
|
459
|
+
MqttStatusBridge* bridge = new MqttStatusBridge(mesh, mqttClient);
|
|
460
|
+
bridge->begin();
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
### Backward Compatibility
|
|
464
|
+
|
|
465
|
+
✅ **Fully backward compatible**
|
|
466
|
+
- Broadcast defaults to `false` (unicast mode)
|
|
467
|
+
- Non-broadcast nodes work alongside broadcast nodes
|
|
468
|
+
- MQTT bridge is optional add-on
|
|
469
|
+
- All Phase 1 features continue to work
|
|
470
|
+
|
|
471
|
+
---
|
|
472
|
+
|
|
473
|
+
## Best Practices
|
|
474
|
+
|
|
475
|
+
### When to Use Broadcast OTA
|
|
476
|
+
|
|
477
|
+
✅ **Use broadcast mode when:**
|
|
478
|
+
- Mesh has 10+ nodes
|
|
479
|
+
- All nodes need same firmware
|
|
480
|
+
- Network bandwidth is limited
|
|
481
|
+
- Fast distribution is critical
|
|
482
|
+
|
|
483
|
+
❌ **Don't use broadcast mode when:**
|
|
484
|
+
- Mesh has <5 nodes (unicast is sufficient)
|
|
485
|
+
- Different nodes need different firmware
|
|
486
|
+
- Targeting specific nodes only
|
|
487
|
+
|
|
488
|
+
### When to Use MQTT Status Bridge
|
|
489
|
+
|
|
490
|
+
✅ **Use MQTT bridge when:**
|
|
491
|
+
- Production deployment
|
|
492
|
+
- Remote monitoring required
|
|
493
|
+
- Integration with existing tools (Grafana, etc.)
|
|
494
|
+
- Automated alerting needed
|
|
495
|
+
- Cloud connectivity available
|
|
496
|
+
|
|
497
|
+
❌ **Don't use MQTT bridge when:**
|
|
498
|
+
- Development/testing environment
|
|
499
|
+
- No external WiFi available
|
|
500
|
+
- No MQTT broker available
|
|
501
|
+
- Mesh is purely offline
|
|
502
|
+
|
|
503
|
+
### Configuration Recommendations
|
|
504
|
+
|
|
505
|
+
**Small meshes (1-10 nodes):**
|
|
506
|
+
- Publish interval: 30 seconds
|
|
507
|
+
- Enable all features
|
|
508
|
+
- Enable per-node status
|
|
509
|
+
|
|
510
|
+
**Medium meshes (10-50 nodes):**
|
|
511
|
+
- Publish interval: 60 seconds
|
|
512
|
+
- Enable topology, metrics, alerts
|
|
513
|
+
- Disable per-node status
|
|
514
|
+
|
|
515
|
+
**Large meshes (50+ nodes):**
|
|
516
|
+
- Publish interval: 120 seconds
|
|
517
|
+
- Enable metrics and alerts only
|
|
518
|
+
- Disable topology and per-node
|
|
519
|
+
|
|
520
|
+
---
|
|
521
|
+
|
|
522
|
+
## Next Steps
|
|
523
|
+
|
|
524
|
+
### Phase 3 Features (Future)
|
|
525
|
+
- Progressive rollout OTA (Option 1B)
|
|
526
|
+
- Real-time telemetry streams (Option 2C)
|
|
527
|
+
- Proactive alerting system
|
|
528
|
+
- Large-scale mesh support (100+ nodes)
|
|
529
|
+
|
|
530
|
+
### Further Reading
|
|
531
|
+
- [PHASE2_IMPLEMENTATION.md](improvements/PHASE2_IMPLEMENTATION.md) - Technical details
|
|
532
|
+
- [examples/alteriom/phase2_features.ino](../examples/alteriom/phase2_features.ino) - Complete example
|
|
533
|
+
- [examples/bridge/mqtt_status_bridge_example.ino](../examples/bridge/mqtt_status_bridge_example.ino) - MQTT example
|
|
534
|
+
- [FEATURE_PROPOSALS.md](improvements/FEATURE_PROPOSALS.md) - All features overview
|
|
535
|
+
|
|
536
|
+
---
|
|
537
|
+
|
|
538
|
+
**Questions?** Open an issue on GitHub with logs and configuration details.
|
|
539
|
+
|
|
540
|
+
**Status:** ✅ Phase 2 Complete - Production Ready
|
|
541
|
+
**Recommended For:** Medium to large mesh deployments (10-100+ nodes)
|
|
542
|
+
**Risk:** Low (backward compatible, well-tested)
|
|
543
|
+
**Value:** High (scalability + professional monitoring)
|
package/docs/README.md
CHANGED
|
@@ -1,71 +1,78 @@
|
|
|
1
|
-
# painlessMesh Documentation
|
|
2
|
-
|
|
3
|
-
Welcome to the comprehensive documentation for painlessMesh - a user-friendly ESP8266/ESP32 mesh networking library that automatically handles routing and network management.
|
|
4
|
-
|
|
5
|
-
## Documentation Structure
|
|
6
|
-
|
|
7
|
-
### Getting Started
|
|
8
|
-
- [Quick Start Guide](getting-started/quickstart.md) - Get up and running in minutes
|
|
9
|
-
- [Installation](getting-started/installation.md) - Detailed installation instructions
|
|
10
|
-
- [First Mesh Network](getting-started/first-mesh.md) - Your first working mesh
|
|
11
|
-
|
|
12
|
-
### Architecture & Design
|
|
13
|
-
- [Mesh Architecture](architecture/mesh-architecture.md) - How painlessMesh works internally
|
|
14
|
-
- [Plugin System](architecture/plugin-system.md) - Understanding the plugin architecture
|
|
15
|
-
- [Message Routing](architecture/routing.md) - Message routing algorithms and strategies
|
|
16
|
-
- [Time Synchronization](architecture/time-sync.md) - Mesh-wide time synchronization
|
|
17
|
-
|
|
18
|
-
### API Reference
|
|
19
|
-
- [Core API](api/core-api.md) - Main painlessMesh class methods
|
|
20
|
-
- [Plugin API](api/plugin-api.md) - Creating custom packages and plugins
|
|
21
|
-
- [Configuration](api/configuration.md) - Configuration options and constants
|
|
22
|
-
- [Callbacks](api/callbacks.md) - Event handling and callbacks
|
|
23
|
-
|
|
24
|
-
### Tutorials & Examples
|
|
25
|
-
- [Basic Examples](tutorials/basic-examples.md) - Simple mesh networking examples
|
|
26
|
-
- [Custom Packages](tutorials/custom-packages.md) - Creating your own message types
|
|
27
|
-
- [Sensor Networks](tutorials/sensor-networks.md) - Building IoT sensor networks
|
|
28
|
-
- [Bridge Applications](tutorials/bridge-apps.md) - Connecting mesh to external networks
|
|
29
|
-
|
|
30
|
-
### Alteriom Extensions
|
|
31
|
-
- [Alteriom Overview](alteriom/overview.md) - Alteriom-specific functionality
|
|
32
|
-
- [Sensor Packages](alteriom/sensor-packages.md) - Environmental sensor data handling
|
|
33
|
-
- [Command System](alteriom/command-system.md) - Device command and control
|
|
34
|
-
- [Status Monitoring](alteriom/status-monitoring.md) - Device health and diagnostics
|
|
35
|
-
|
|
36
|
-
### Advanced Topics
|
|
37
|
-
- [Performance Optimization](advanced/performance.md) - Optimizing mesh performance
|
|
38
|
-
- [Memory Management](advanced/memory.md) - Managing ESP8266/ESP32 memory constraints
|
|
39
|
-
- [Security Considerations](advanced/security.md) - Securing your mesh network
|
|
40
|
-
- [OTA Updates](advanced/ota.md) - Over-the-air firmware updates in mesh
|
|
41
|
-
|
|
42
|
-
### Troubleshooting
|
|
43
|
-
- [Common Issues](troubleshooting/common-issues.md) - Solutions to frequent problems
|
|
44
|
-
- [Debugging Guide](troubleshooting/debugging.md) - Tools and techniques for debugging
|
|
45
|
-
- [FAQ](troubleshooting/faq.md) - Frequently asked questions
|
|
46
|
-
- [Network Issues](troubleshooting/network-issues.md) - Connectivity and mesh topology problems
|
|
47
|
-
|
|
48
|
-
### Development
|
|
49
|
-
- [Contributing](development/contributing.md) - How to contribute to painlessMesh
|
|
50
|
-
- [Building & Testing](development/building.md) - Development environment setup
|
|
51
|
-
- [Documentation](development/documentation.md) - Contributing to documentation
|
|
52
|
-
- [Release Process](development/releases.md) - Understanding releases and versioning
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
- **[
|
|
57
|
-
-
|
|
58
|
-
-
|
|
59
|
-
-
|
|
60
|
-
|
|
61
|
-
##
|
|
62
|
-
|
|
63
|
-
-
|
|
64
|
-
-
|
|
65
|
-
-
|
|
66
|
-
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
1
|
+
# painlessMesh Documentation
|
|
2
|
+
|
|
3
|
+
Welcome to the comprehensive documentation for painlessMesh - a user-friendly ESP8266/ESP32 mesh networking library that automatically handles routing and network management.
|
|
4
|
+
|
|
5
|
+
## Documentation Structure
|
|
6
|
+
|
|
7
|
+
### Getting Started
|
|
8
|
+
- [Quick Start Guide](getting-started/quickstart.md) - Get up and running in minutes
|
|
9
|
+
- [Installation](getting-started/installation.md) - Detailed installation instructions
|
|
10
|
+
- [First Mesh Network](getting-started/first-mesh.md) - Your first working mesh
|
|
11
|
+
|
|
12
|
+
### Architecture & Design
|
|
13
|
+
- [Mesh Architecture](architecture/mesh-architecture.md) - How painlessMesh works internally
|
|
14
|
+
- [Plugin System](architecture/plugin-system.md) - Understanding the plugin architecture
|
|
15
|
+
- [Message Routing](architecture/routing.md) - Message routing algorithms and strategies
|
|
16
|
+
- [Time Synchronization](architecture/time-sync.md) - Mesh-wide time synchronization
|
|
17
|
+
|
|
18
|
+
### API Reference
|
|
19
|
+
- [Core API](api/core-api.md) - Main painlessMesh class methods
|
|
20
|
+
- [Plugin API](api/plugin-api.md) - Creating custom packages and plugins
|
|
21
|
+
- [Configuration](api/configuration.md) - Configuration options and constants
|
|
22
|
+
- [Callbacks](api/callbacks.md) - Event handling and callbacks
|
|
23
|
+
|
|
24
|
+
### Tutorials & Examples
|
|
25
|
+
- [Basic Examples](tutorials/basic-examples.md) - Simple mesh networking examples
|
|
26
|
+
- [Custom Packages](tutorials/custom-packages.md) - Creating your own message types
|
|
27
|
+
- [Sensor Networks](tutorials/sensor-networks.md) - Building IoT sensor networks
|
|
28
|
+
- [Bridge Applications](tutorials/bridge-apps.md) - Connecting mesh to external networks
|
|
29
|
+
|
|
30
|
+
### Alteriom Extensions
|
|
31
|
+
- [Alteriom Overview](alteriom/overview.md) - Alteriom-specific functionality
|
|
32
|
+
- [Sensor Packages](alteriom/sensor-packages.md) - Environmental sensor data handling
|
|
33
|
+
- [Command System](alteriom/command-system.md) - Device command and control
|
|
34
|
+
- [Status Monitoring](alteriom/status-monitoring.md) - Device health and diagnostics
|
|
35
|
+
|
|
36
|
+
### Advanced Topics
|
|
37
|
+
- [Performance Optimization](advanced/performance.md) - Optimizing mesh performance
|
|
38
|
+
- [Memory Management](advanced/memory.md) - Managing ESP8266/ESP32 memory constraints
|
|
39
|
+
- [Security Considerations](advanced/security.md) - Securing your mesh network
|
|
40
|
+
- [OTA Updates](advanced/ota.md) - Over-the-air firmware updates in mesh
|
|
41
|
+
|
|
42
|
+
### Troubleshooting
|
|
43
|
+
- [Common Issues](troubleshooting/common-issues.md) - Solutions to frequent problems
|
|
44
|
+
- [Debugging Guide](troubleshooting/debugging.md) - Tools and techniques for debugging
|
|
45
|
+
- [FAQ](troubleshooting/faq.md) - Frequently asked questions
|
|
46
|
+
- [Network Issues](troubleshooting/network-issues.md) - Connectivity and mesh topology problems
|
|
47
|
+
|
|
48
|
+
### Development
|
|
49
|
+
- [Contributing](development/contributing.md) - How to contribute to painlessMesh
|
|
50
|
+
- [Building & Testing](development/building.md) - Development environment setup
|
|
51
|
+
- [Documentation](development/documentation.md) - Contributing to documentation
|
|
52
|
+
- [Release Process](development/releases.md) - Understanding releases and versioning
|
|
53
|
+
|
|
54
|
+
### Improvements & Proposals
|
|
55
|
+
- [Library Improvements](improvements/README.md) - Overview of performance and security enhancements
|
|
56
|
+
- **[Feature Proposals: OTA & Status](improvements/FEATURE_PROPOSALS.md)** 🆕 - Comprehensive proposals for OTA distribution and mesh status monitoring
|
|
57
|
+
- [Full Analysis](improvements/ota-and-status-enhancements.md) - Detailed exploration of 10+ enhancement options
|
|
58
|
+
- [Quick Reference](improvements/ota-status-quick-reference.md) - TL;DR with decision guides
|
|
59
|
+
- [Architecture Diagrams](improvements/ota-status-architecture-diagrams.md) - Visual diagrams of each option
|
|
60
|
+
|
|
61
|
+
## Quick Links
|
|
62
|
+
|
|
63
|
+
- **[GitHub Repository](https://github.com/Alteriom/painlessMesh)**
|
|
64
|
+
- **[API Documentation](http://painlessmesh.gitlab.io/painlessMesh/index.html)**
|
|
65
|
+
- **[Community Forum](https://groups.google.com/forum/#!forum/painlessmesh-user)**
|
|
66
|
+
- **[Issue Tracker](https://github.com/Alteriom/painlessMesh/issues)**
|
|
67
|
+
|
|
68
|
+
## Need Help?
|
|
69
|
+
|
|
70
|
+
- Start with the [Quick Start Guide](getting-started/quickstart.md)
|
|
71
|
+
- Check the [FAQ](troubleshooting/faq.md) for common questions
|
|
72
|
+
- Browse [Examples](tutorials/basic-examples.md) for practical use cases
|
|
73
|
+
- Join our [Community Forum](https://groups.google.com/forum/#!forum/painlessmesh-user)
|
|
74
|
+
- Report bugs on the [Issue Tracker](https://github.com/Alteriom/painlessMesh/issues)
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
71
78
|
This documentation is maintained by the painlessMesh community. Contributions are welcome! See our [Documentation Contributing Guide](development/documentation.md) to get started.
|