@alteriom/painlessmesh 1.6.1 → 1.7.3
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 +435 -144
- package/LICENSE +674 -674
- package/README.md +491 -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 +130 -71
- 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/archive/DOCUSAURUS_DEPLOYMENT.md +166 -0
- package/docs/archive/FEATURE_PROPOSALS.md +337 -0
- package/docs/archive/LIBRARY_JSON_FIX.md +98 -0
- package/docs/archive/LIBRARY_STRUCTURE_FIX.md +215 -0
- package/docs/archive/PHASE1_IMPLEMENTATION.md +325 -0
- package/docs/archive/PHASE2_IMPLEMENTATION.md +567 -0
- package/docs/archive/RELEASE_SUMMARY.md +173 -0
- package/docs/archive/SCONS_BUILD_FIX.md +313 -0
- package/docs/archive/TRIGGER_RELEASE.md +280 -0
- package/docs/archive/VECTOR_INCLUDE_FIX.md +129 -0
- package/docs/archive/ota-and-status-enhancements.md +911 -0
- package/docs/archive/ota-status-architecture-diagrams.md +658 -0
- package/docs/archive/ota-status-quick-reference.md +284 -0
- package/docs/development/ARDUINO_COMPLIANCE_SUMMARY.md +71 -0
- package/docs/development/CODE_REFACTORING_RECOMMENDATIONS.md +1011 -0
- package/docs/development/DOCKER_TESTING.md +196 -0
- package/docs/development/PLATFORMIO_USAGE.md +180 -0
- package/docs/development/TESTING_SUMMARY.md +126 -0
- package/docs/development/contributing.md +301 -0
- package/docs/development/documentation.md +583 -0
- 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/FUTURE_PROPOSALS.md +1016 -0
- package/docs/improvements/IMPLEMENTATION_HISTORY.md +1091 -0
- package/docs/improvements/OTA_STATUS_ENHANCEMENTS.md +709 -0
- package/docs/improvements/README.md +212 -69
- package/docs/platformio-publishing.md +255 -0
- package/docs/platformio-setup-summary.md +121 -0
- package/docs/releases/FEATURE_HISTORY.md +543 -0
- package/docs/releases/PATCH_v1.7.3.md +262 -0
- package/docs/releases/PHASE1_SUMMARY.md +246 -0
- package/docs/releases/PHASE2_SUMMARY.md +499 -0
- package/docs/releases/RELEASE_NOTES_1.7.0.md +539 -0
- package/docs/troubleshooting/common-issues.md +520 -520
- package/docs/troubleshooting/debugging.md +455 -0
- 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 +338 -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)
|