@alteriom/painlessmesh 1.8.15 → 1.9.1
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/BRIDGE_TO_INTERNET.md +229 -0
- package/CHANGELOG.md +101 -1
- package/CONTRIBUTING.md +79 -0
- package/README.md +69 -144
- package/docs/README.md +1 -0
- package/docs/api/shared-gateway.md +1207 -0
- package/examples/bridge_failover/README.md +113 -0
- package/examples/bridge_failover/bridge_failover.ino +38 -4
- package/examples/sharedGateway/README.md +235 -0
- package/examples/{meshCommandNode → sharedGateway}/platformio.ini +3 -2
- package/examples/sharedGateway/sharedGateway.ino +303 -0
- package/library.json +3 -22
- package/library.properties +1 -1
- package/package.json +3 -6
- package/src/arduino/wifi.hpp +504 -4
- package/src/painlessmesh/gateway.hpp +2120 -0
- package/src/painlessmesh/mesh.hpp +1034 -6
- package/src/painlessmesh/message_tracker.hpp +311 -0
- package/src/painlessmesh/protocol.hpp +6 -0
- package/DOCUMENTATION_INDEX.md +0 -146
- package/RELEASE_NOTES_1.8.15.md +0 -160
- package/RELEASE_READINESS_PLAN.md +0 -323
- package/TESTING_WITH_SIMULATOR.md +0 -259
- package/docs/API_DESIGN_GUIDELINES.md +0 -414
- package/docs/ARDUINO_LIBRARY_MANAGER_SUBMISSION.md +0 -331
- package/docs/BOOLEAN_NAMING_CONVENTION.md +0 -235
- package/docs/BRIDGE_FAILOVER.md +0 -512
- package/docs/BRIDGE_HEALTH_MONITORING.md +0 -293
- package/docs/BRIDGE_INITIALIZATION_FALLBACK.md +0 -357
- package/docs/CHANNEL_SYNCHRONIZATION.md +0 -209
- package/docs/CREATE_MISSING_RELEASES.md +0 -321
- package/docs/DOCUMENTATION_MIGRATION_PLAN.md +0 -176
- package/docs/FAQ_VERSION_NUMBERS.md +0 -152
- package/docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md +0 -1062
- package/docs/MESH_TOPOLOGY_GUIDE.md +0 -992
- package/docs/MESH_TOPOLOGY_PROGRESS.md +0 -422
- package/docs/MQTT_BRIDGE_COMMANDS.md +0 -894
- package/docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md +0 -324
- package/docs/MQTT_COMMAND_SCHEMA_PROPOSAL.md +0 -576
- package/docs/MQTT_SCHEMA_COMPLIANCE.md +0 -340
- package/docs/MQTT_SCHEMA_PROPOSALS.md +0 -446
- package/docs/MQTT_SCHEMA_REVIEW.md +0 -690
- package/docs/OTA_COMMANDS_REFERENCE.md +0 -554
- package/docs/PHASE1_GUIDE.md +0 -349
- package/docs/PHASE2_GUIDE.md +0 -543
- package/docs/QUICK_REFERENCE_VERSIONING.md +0 -127
- package/docs/RELEASE_AGENT_SUMMARY.md +0 -386
- package/docs/SCHEMA_VALIDATION_CHECKLIST.md +0 -222
- package/docs/SIMULATOR_TESTING.md +0 -408
- package/docs/VERSION_MANAGEMENT.md +0 -213
- package/docs/archive/DOCUSAURUS_DEPLOYMENT.md +0 -166
- package/docs/archive/FEATURE_PROPOSALS.md +0 -337
- package/docs/archive/LIBRARY_JSON_FIX.md +0 -98
- package/docs/archive/LIBRARY_STRUCTURE_FIX.md +0 -215
- package/docs/archive/PHASE1_IMPLEMENTATION.md +0 -325
- package/docs/archive/PHASE2_IMPLEMENTATION.md +0 -567
- package/docs/archive/RELEASE_SUMMARY.md +0 -173
- package/docs/archive/SCONS_BUILD_FIX.md +0 -313
- package/docs/archive/TRIGGER_RELEASE.md +0 -280
- package/docs/archive/VECTOR_INCLUDE_FIX.md +0 -129
- package/docs/archive/ota-and-status-enhancements.md +0 -911
- package/docs/archive/ota-status-architecture-diagrams.md +0 -658
- package/docs/archive/ota-status-quick-reference.md +0 -284
- package/docs/design/.gitkeep +0 -1
- package/docs/design/STATION_CREDENTIALS_DESIGN.md +0 -182
- package/docs/development/ARDUINO_COMPLIANCE_SUMMARY.md +0 -71
- package/docs/development/CODE_REFACTORING_RECOMMENDATIONS.md +0 -1011
- package/docs/development/DOCKER_TESTING.md +0 -196
- package/docs/development/PLATFORMIO_USAGE.md +0 -180
- package/docs/development/TESTING_SUMMARY.md +0 -126
- package/docs/development/contributing.md +0 -301
- package/docs/development/documentation.md +0 -583
- package/docs/features/DIAGNOSTICS_API.md +0 -534
- package/docs/implementation/BRIDGE_ARCHITECTURE_IMPLEMENTATION.md +0 -340
- package/docs/implementation/BRIDGE_HEALTH_MONITORING_IMPLEMENTATION.md +0 -213
- package/docs/implementation/BRIDGE_STATUS_FEATURE.md +0 -635
- package/docs/implementation/DIAGNOSTICS_API_IMPLEMENTATION.md +0 -232
- package/docs/implementation/IMPLEMENTATION_COMPLETE.md +0 -228
- package/docs/implementation/IMPLEMENTATION_NTP_TIME_SYNC.md +0 -325
- package/docs/implementation/IMPLEMENTATION_SUMMARY.md +0 -316
- package/docs/implementation/MESSAGE_QUEUE_IMPLEMENTATION.md +0 -405
- package/docs/implementation/MULTI_BRIDGE_IMPLEMENTATION.md +0 -520
- package/docs/implementation/NTP_TIME_SYNC_FEATURE.md +0 -392
- package/docs/improvements/FUTURE_PROPOSALS.md +0 -1016
- package/docs/improvements/IMPLEMENTATION_HISTORY.md +0 -1091
- package/docs/improvements/OTA_STATUS_ENHANCEMENTS.md +0 -709
- package/docs/improvements/README.md +0 -212
- package/docs/internal/CUSTOM_AGENT_ANALYSIS.md +0 -391
- package/docs/internal/ISSUE_65_VERIFICATION.md +0 -947
- package/docs/internal/ISSUE_66_CLOSURE.md +0 -249
- package/docs/internal/ISSUE_66_STATUS.md +0 -316
- package/docs/internal/PR_SUMMARY.md +0 -315
- package/docs/internal/REVIEW_SUMMARY.md +0 -332
- package/docs/multi-bridge-setup.md +0 -1025
- package/docs/platformio-publishing.md +0 -255
- package/docs/platformio-setup-summary.md +0 -121
- package/docs/releases/ANNOUNCEMENT_v1.8.6.md +0 -63
- package/docs/releases/ANNOUNCEMENT_v1.8.7.md +0 -113
- package/docs/releases/BRIDGE_STATUS_SELF_REGISTRATION_FIX.md +0 -221
- package/docs/releases/FEATURE_HISTORY.md +0 -543
- package/docs/releases/GITHUB_RELEASE_v1.8.6.md +0 -71
- package/docs/releases/GITHUB_RELEASE_v1.8.7.md +0 -90
- package/docs/releases/PATCH_v1.7.2.md +0 -262
- package/docs/releases/PATCH_v1.7.3.md +0 -262
- package/docs/releases/PATCH_v1.7.4.md +0 -219
- package/docs/releases/PHASE1_SUMMARY.md +0 -246
- package/docs/releases/PHASE2_SUMMARY.md +0 -499
- package/docs/releases/PUBLISH_v1.8.0_INSTRUCTIONS.md +0 -163
- package/docs/releases/QUICK_START_RELEASES.md +0 -113
- package/docs/releases/RELEASE_CHECKLIST_1.8.10.md +0 -331
- package/docs/releases/RELEASE_CHECKLIST_1.8.9.md +0 -207
- package/docs/releases/RELEASE_CHECKLIST_v1.7.4.md +0 -253
- package/docs/releases/RELEASE_CHECKLIST_v1.7.5.md +0 -315
- package/docs/releases/RELEASE_CHECKLIST_v1.7.6.md +0 -389
- package/docs/releases/RELEASE_CHECKLIST_v1.8.0.md +0 -331
- package/docs/releases/RELEASE_CHECKLIST_v1.8.2.md +0 -309
- package/docs/releases/RELEASE_NOTES_1.7.0.md +0 -539
- package/docs/releases/RELEASE_NOTES_1.8.10.md +0 -239
- package/docs/releases/RELEASE_NOTES_1.8.9.md +0 -213
- package/docs/releases/RELEASE_NOTES_v1.8.0.md +0 -685
- package/docs/releases/RELEASE_NOTES_v1.8.1.md +0 -221
- package/docs/releases/RELEASE_NOTES_v1.8.2.md +0 -421
- package/docs/releases/RELEASE_NOTES_v1.8.3.md +0 -292
- package/docs/releases/RELEASE_NOTES_v1.8.4.md +0 -277
- package/docs/releases/RELEASE_NOTES_v1.8.6.md +0 -205
- package/docs/releases/RELEASE_NOTES_v1.8.7.md +0 -184
- package/docs/releases/RELEASE_PLAN_v1.7.6.md +0 -816
- package/docs/releases/RELEASE_SUMMARY_1.8.10.md +0 -193
- package/docs/releases/RELEASE_SUMMARY_v1.7.4.md +0 -276
- package/docs/releases/RELEASE_SUMMARY_v1.7.5.md +0 -322
- package/docs/releases/RELEASE_SUMMARY_v1.7.6.md +0 -436
- package/docs/releases/RELEASE_SUMMARY_v1.7.7.md +0 -391
- package/docs/releases/RELEASE_SUMMARY_v1.7.8.md +0 -523
- package/docs/releases/RELEASE_SUMMARY_v1.7.9.md +0 -542
- package/docs/troubleshooting/ARDUINO_IDE_VERSION_FIX_SUMMARY.md +0 -229
- package/docs/troubleshooting/ARDUINO_LIBRARY_NAME_FIX.md +0 -197
- package/docs/troubleshooting/CRASH_QUICK_REF.md +0 -93
- package/docs/troubleshooting/ESP32_C6_COMPATIBILITY.md +0 -157
- package/docs/troubleshooting/FREERTOS_ASSERTION_FAILURE.md +0 -288
- package/docs/troubleshooting/FREERTOS_FIX_IMPLEMENTATION.md +0 -267
- package/docs/troubleshooting/NPM_PUBLISHING_ISSUE_SUMMARY.md +0 -110
- package/docs/troubleshooting/PAINLESSMESH_V1.7.4_COMPILATION_ISSUES.md +0 -547
- package/docs/troubleshooting/QUICK_FIX_FREERTOS.md +0 -164
- package/docs/troubleshooting/SENSOR_NODE_CONNECTION_CRASH.md +0 -264
- package/docs/troubleshooting/common-architecture-mistakes.md +0 -438
- package/docs/troubleshooting/internet-access-faq.md +0 -299
- package/docs/troubleshooting/station-reconnection-issues.md +0 -172
- package/docs/v1.7.7_MQTT_IMPROVEMENTS.md +0 -794
- package/docs/wiki/API-Reference.md +0 -246
- package/docs/wiki/Complete-Documentation.md +0 -123
- package/examples/alteriomImproved/alteriom_sensor_package.hpp +0 -224
- package/examples/alteriomImproved/improved_sensor_node.ino +0 -248
- package/examples/alteriomImproved/platformio.ini +0 -32
- package/examples/alteriomMetricsHealth/alteriom_sensor_package.hpp +0 -796
- package/examples/alteriomMetricsHealth/metrics_health_node.ino +0 -429
- package/examples/alteriomMetricsHealth/platformio.ini +0 -26
- package/examples/alteriomPhase1/alteriom_sensor_package.hpp +0 -224
- package/examples/alteriomPhase1/phase1_features.ino +0 -242
- package/examples/alteriomPhase1/platformio.ini +0 -26
- package/examples/alteriomPhase2/alteriom_sensor_package.hpp +0 -224
- package/examples/alteriomPhase2/phase2_features.ino +0 -186
- package/examples/alteriomPhase2/platformio.ini +0 -26
- package/examples/alteriomSensorNode/alteriom_sensor_node.ino +0 -186
- package/examples/alteriomSensorNode/alteriom_sensor_package.hpp +0 -1227
- package/examples/alteriomSensorNode/platformio.ini +0 -26
- package/examples/bridge/alteriom_sensor_package.hpp +0 -1170
- package/examples/bridge/bridge_health_monitoring_example.ino +0 -188
- package/examples/bridge/enhanced_mqtt_bridge.hpp +0 -610
- package/examples/bridge/enhanced_mqtt_bridge_example.ino +0 -226
- package/examples/bridge/mesh_event_publisher.hpp +0 -253
- package/examples/bridge/mesh_topology_reporter.hpp +0 -303
- package/examples/bridge/mqtt_command_bridge.hpp +0 -459
- package/examples/bridge/mqtt_status_bridge.hpp +0 -519
- package/examples/bridgeAwareSensorNode/alteriom_sensor_package.hpp +0 -1227
- package/examples/bridgeAwareSensorNode/bridgeAwareSensorNode.ino +0 -342
- package/examples/bridgeAwareSensorNode/platformio.ini +0 -26
- package/examples/diagnosticsExample/diagnosticsExample.ino +0 -171
- package/examples/diagnosticsExample/platformio.ini +0 -26
- package/examples/echoNode/echoNode.ino +0 -33
- package/examples/echoNode/platformio.ini +0 -26
- package/examples/meshCommandNode/alteriom_sensor_package.hpp +0 -235
- package/examples/meshCommandNode/meshCommandNode.ino +0 -265
- package/examples/mqttCommandBridge/alteriom_sensor_package.hpp +0 -235
- package/examples/mqttCommandBridge/mesh_event_publisher.hpp +0 -253
- package/examples/mqttCommandBridge/mesh_topology_reporter.hpp +0 -303
- package/examples/mqttCommandBridge/mqttCommandBridge.ino +0 -254
- package/examples/mqttCommandBridge/mqtt_command_bridge.hpp +0 -462
- package/examples/mqttCommandBridge/platformio.ini +0 -27
- package/examples/mqttStatusBridge/mqttStatusBridge.ino +0 -218
- package/examples/mqttStatusBridge/mqtt_status_bridge.hpp +0 -522
- package/examples/mqttStatusBridge/platformio.ini +0 -27
- package/examples/mqttTopologyTest/README.md +0 -467
- package/examples/mqttTopologyTest/mqttTopologyTest.ino +0 -754
- package/examples/mqttTopologyTest/platformio.ini +0 -27
- package/examples/multi_bridge/README.md +0 -346
- package/examples/multi_bridge/primary_bridge.ino +0 -108
- package/examples/multi_bridge/regular_node.ino +0 -141
- package/examples/multi_bridge/secondary_bridge.ino +0 -123
- package/examples/ntpTimeSyncBridge/alteriom_sensor_package.hpp +0 -1383
- package/examples/ntpTimeSyncBridge/ntpTimeSyncBridge.ino +0 -86
- package/examples/ntpTimeSyncNode/alteriom_sensor_package.hpp +0 -1383
- package/examples/ntpTimeSyncNode/ntpTimeSyncNode.ino +0 -109
- package/examples/queued_alarms/README.md +0 -390
- package/examples/queued_alarms/queued_alarms.ino +0 -265
- package/examples/routing_demo/README.md +0 -172
- package/examples/routing_demo/routing_demo.ino +0 -102
- package/examples/rtcIntegration/README.md +0 -294
- package/examples/rtcIntegration/rtcIntegration.ino +0 -210
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
# OTA and Status Enhancements - Quick Reference
|
|
2
|
-
|
|
3
|
-
**TL;DR:** Five options each for OTA distribution improvements and mesh status monitoring, with phased implementation recommendations.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## 🚀 OTA Distribution Options
|
|
8
|
-
|
|
9
|
-
### ⚡ Option 1A: Mesh-Wide Broadcast OTA ★★★★★ (RECOMMENDED - Phase 2)
|
|
10
|
-
**What:** Broadcast firmware chunks to all nodes simultaneously
|
|
11
|
-
**Speed:** Very Fast | **Memory:** +2-5KB | **Complexity:** Medium
|
|
12
|
-
**Best For:** Medium to large meshes (10-100 nodes)
|
|
13
|
-
|
|
14
|
-
### 🛡️ Option 1B: Progressive Rollout OTA ★★★★☆ (RECOMMENDED - Phase 3)
|
|
15
|
-
**What:** Deploy firmware in waves (canary → early adopters → all)
|
|
16
|
-
**Speed:** Slow | **Memory:** +3-7KB | **Complexity:** High
|
|
17
|
-
**Best For:** Production deployments requiring safety
|
|
18
|
-
|
|
19
|
-
### 🌐 Option 1C: Peer-to-Peer Distribution ★★★☆☆
|
|
20
|
-
**What:** Updated nodes become distribution sources
|
|
21
|
-
**Speed:** Very Fast | **Memory:** +200-500KB | **Complexity:** Very High
|
|
22
|
-
**Best For:** Very large meshes (50+ nodes) with sufficient flash
|
|
23
|
-
|
|
24
|
-
### 🔗 Option 1D: MQTT-Integrated OTA ★★★★☆
|
|
25
|
-
**What:** Standardized MQTT interface for OTA operations
|
|
26
|
-
**Speed:** Medium | **Memory:** +5-10KB | **Complexity:** Medium
|
|
27
|
-
**Best For:** Existing MQTT infrastructure
|
|
28
|
-
|
|
29
|
-
### 📦 Option 1E: Compressed OTA Transfer ★★★★★ (RECOMMENDED - Phase 1)
|
|
30
|
-
**What:** Gzip compression for firmware transfers
|
|
31
|
-
**Speed:** Fast | **Memory:** +4-8KB | **Complexity:** Low
|
|
32
|
-
**Best For:** All deployments (40-60% bandwidth reduction)
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
## 📊 Mesh Status Options
|
|
37
|
-
|
|
38
|
-
### 📡 Option 2A: Enhanced StatusPackage ★★★★★ (RECOMMENDED - Phase 1)
|
|
39
|
-
**What:** Extend Alteriom StatusPackage with comprehensive metrics
|
|
40
|
-
**Overhead:** Low | **Memory:** +500 bytes | **Complexity:** Low
|
|
41
|
-
**Best For:** Alteriom users, simple integration
|
|
42
|
-
|
|
43
|
-
### 🔍 Option 2B: Mesh Status Service ★★★★☆ (RECOMMENDED - Phase 2)
|
|
44
|
-
**What:** Query-based status collection with aggregation
|
|
45
|
-
**Overhead:** Medium | **Memory:** +2-4KB node, +10-20KB root | **Complexity:** Medium
|
|
46
|
-
**Best For:** Centralized monitoring, on-demand queries
|
|
47
|
-
|
|
48
|
-
### 📈 Option 2C: Telemetry Stream ★★★★☆ (RECOMMENDED - Phase 3)
|
|
49
|
-
**What:** Continuous low-bandwidth telemetry with delta encoding
|
|
50
|
-
**Overhead:** Low | **Memory:** +1-2KB node, +50-100KB root | **Complexity:** High
|
|
51
|
-
**Best For:** Real-time monitoring, large-scale deployments
|
|
52
|
-
|
|
53
|
-
### 🖥️ Option 2D: Health Dashboard ★★★☆☆
|
|
54
|
-
**What:** Complete web-based monitoring solution
|
|
55
|
-
**Overhead:** Medium | **Memory:** +50-100KB code, +200KB assets | **Complexity:** Very High
|
|
56
|
-
**Best For:** User-facing applications, visual monitoring
|
|
57
|
-
|
|
58
|
-
### 🔗 Option 2E: MQTT Status Bridge ★★★★★ (RECOMMENDED - Phase 2)
|
|
59
|
-
**What:** Publish mesh status to MQTT topics
|
|
60
|
-
**Overhead:** Low | **Memory:** +5-8KB | **Complexity:** Low
|
|
61
|
-
**Best For:** Cloud integration, existing monitoring tools
|
|
62
|
-
|
|
63
|
-
---
|
|
64
|
-
|
|
65
|
-
## 🎯 Recommended Implementation Path
|
|
66
|
-
|
|
67
|
-
### ✅ Phase 1: Quick Wins (3-4 weeks)
|
|
68
|
-
```
|
|
69
|
-
Option 1E (Compressed OTA) + Option 2A (Enhanced StatusPackage)
|
|
70
|
-
```
|
|
71
|
-
- Immediate 40-60% OTA speed improvement
|
|
72
|
-
- Standardized status reporting
|
|
73
|
-
- Low risk, high value
|
|
74
|
-
- Builds on existing code
|
|
75
|
-
|
|
76
|
-
### ✅ Phase 2: Production Ready (6-8 weeks)
|
|
77
|
-
```
|
|
78
|
-
Option 1A (Broadcast OTA) + Option 2E (MQTT Bridge)
|
|
79
|
-
```
|
|
80
|
-
- Scalable OTA for larger meshes
|
|
81
|
-
- Cloud monitoring integration
|
|
82
|
-
- Enterprise features
|
|
83
|
-
- Professional deployment
|
|
84
|
-
|
|
85
|
-
### ✅ Phase 3: Advanced (3-4 months)
|
|
86
|
-
```
|
|
87
|
-
Option 1B (Progressive OTA) + Option 2C (Telemetry)
|
|
88
|
-
```
|
|
89
|
-
- Zero-downtime updates
|
|
90
|
-
- Real-time monitoring
|
|
91
|
-
- Proactive alerting
|
|
92
|
-
- Large-scale support
|
|
93
|
-
|
|
94
|
-
---
|
|
95
|
-
|
|
96
|
-
## 📋 Quick Comparison
|
|
97
|
-
|
|
98
|
-
### OTA Options at a Glance
|
|
99
|
-
|
|
100
|
-
| Option | Speed | Memory | Complexity | When to Use |
|
|
101
|
-
|--------|-------|--------|------------|-------------|
|
|
102
|
-
| **1E: Compression** | ⭐⭐⭐⭐ | +4-8KB | ⭐⭐ | **Start here** - Universal benefit |
|
|
103
|
-
| **1A: Broadcast** | ⭐⭐⭐⭐⭐ | +2-5KB | ⭐⭐⭐ | Medium-large mesh (10-100 nodes) |
|
|
104
|
-
| **1B: Progressive** | ⭐⭐ | +3-7KB | ⭐⭐⭐⭐ | Production safety critical |
|
|
105
|
-
| 1C: P2P | ⭐⭐⭐⭐⭐ | +200KB | ⭐⭐⭐⭐⭐ | Very large mesh (50+ nodes) |
|
|
106
|
-
| 1D: MQTT | ⭐⭐⭐ | +5-10KB | ⭐⭐⭐ | Already using MQTT |
|
|
107
|
-
|
|
108
|
-
### Status Options at a Glance
|
|
109
|
-
|
|
110
|
-
| Option | Real-time | Overhead | Complexity | When to Use |
|
|
111
|
-
|--------|-----------|----------|------------|-------------|
|
|
112
|
-
| **2A: Enhanced Pkg** | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ | **Start here** - Simple integration |
|
|
113
|
-
| **2E: MQTT Bridge** | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ | Cloud monitoring needed |
|
|
114
|
-
| **2B: Status Service** | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | Centralized control |
|
|
115
|
-
| 2C: Telemetry | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ | Real-time critical |
|
|
116
|
-
| 2D: Dashboard | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | User-facing app |
|
|
117
|
-
|
|
118
|
-
---
|
|
119
|
-
|
|
120
|
-
## 💡 Decision Guide
|
|
121
|
-
|
|
122
|
-
### Choose OTA Option Based On:
|
|
123
|
-
|
|
124
|
-
**If mesh size < 10 nodes:**
|
|
125
|
-
- Start with **1E (Compression)** only
|
|
126
|
-
- Add **1A (Broadcast)** if frequent updates
|
|
127
|
-
|
|
128
|
-
**If mesh size 10-50 nodes:**
|
|
129
|
-
- Use **1E + 1A** (Compression + Broadcast)
|
|
130
|
-
- Add **1B (Progressive)** for production
|
|
131
|
-
|
|
132
|
-
**If mesh size > 50 nodes:**
|
|
133
|
-
- Use **1E + 1C** (Compression + P2P)
|
|
134
|
-
- Or **1E + 1A + 1B** if flash limited
|
|
135
|
-
|
|
136
|
-
**If MQTT already used:**
|
|
137
|
-
- Consider **1D (MQTT Bridge)** for integration
|
|
138
|
-
- Combine with **1E** for speed
|
|
139
|
-
|
|
140
|
-
### Choose Status Option Based On:
|
|
141
|
-
|
|
142
|
-
**For simple monitoring:**
|
|
143
|
-
- **2A (Enhanced StatusPackage)** - easiest start
|
|
144
|
-
|
|
145
|
-
**For cloud integration:**
|
|
146
|
-
- **2E (MQTT Bridge)** - Grafana, InfluxDB, etc.
|
|
147
|
-
|
|
148
|
-
**For real-time monitoring:**
|
|
149
|
-
- **2C (Telemetry Stream)** - continuous updates
|
|
150
|
-
|
|
151
|
-
**For user dashboards:**
|
|
152
|
-
- **2D (Health Dashboard)** - visual interface
|
|
153
|
-
|
|
154
|
-
**For API access:**
|
|
155
|
-
- **2B (Status Service)** - RESTful queries
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
|
-
## 🔧 Implementation Examples
|
|
160
|
-
|
|
161
|
-
### Phase 1 Code (Compression + Enhanced Status)
|
|
162
|
-
|
|
163
|
-
**Enable Compressed OTA:**
|
|
164
|
-
```cpp
|
|
165
|
-
// In sender node
|
|
166
|
-
#define PAINLESSMESH_ENABLE_OTA
|
|
167
|
-
#define OTA_COMPRESSION_ENABLED
|
|
168
|
-
|
|
169
|
-
mesh.initOTASend(firmwareCallback, OTA_PART_SIZE);
|
|
170
|
-
mesh.offerOTA("sensor", "ESP32", md5, parts, false, false, true); // last param = compressed
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
**Enhanced Status Reporting:**
|
|
174
|
-
```cpp
|
|
175
|
-
#include "examples/alteriom/alteriom_sensor_package.hpp"
|
|
176
|
-
|
|
177
|
-
alteriom::EnhancedStatusPackage status;
|
|
178
|
-
status.uptime = millis() / 1000;
|
|
179
|
-
status.freeMemory = ESP.getFreeHeap() / 1024;
|
|
180
|
-
status.nodeCount = mesh.getNodeList().size();
|
|
181
|
-
status.firmwareVersion = "v1.2.3";
|
|
182
|
-
|
|
183
|
-
mesh.sendBroadcast(status.toJsonString());
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
### Phase 2 Code (Broadcast OTA + MQTT Status)
|
|
187
|
-
|
|
188
|
-
**Broadcast OTA:**
|
|
189
|
-
```cpp
|
|
190
|
-
// Sender enables broadcast mode
|
|
191
|
-
mesh.offerOTA("sensor", "ESP32", md5, parts,
|
|
192
|
-
false, // not forced
|
|
193
|
-
true); // broadcast mode
|
|
194
|
-
|
|
195
|
-
// Receivers auto-detect broadcast
|
|
196
|
-
mesh.initOTAReceive("sensor", progressCallback);
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
**MQTT Status Bridge:**
|
|
200
|
-
```cpp
|
|
201
|
-
#include "examples/bridge/mqtt_status_bridge.hpp"
|
|
202
|
-
|
|
203
|
-
MqttStatusBridge bridge(mesh, mqttClient);
|
|
204
|
-
bridge.setPublishInterval(30000); // 30s
|
|
205
|
-
bridge.enableTopology(true);
|
|
206
|
-
bridge.enableMetrics(true);
|
|
207
|
-
bridge.begin();
|
|
208
|
-
|
|
209
|
-
// Status published to:
|
|
210
|
-
// - mesh/status/nodes
|
|
211
|
-
// - mesh/status/topology
|
|
212
|
-
// - mesh/status/metrics
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
---
|
|
216
|
-
|
|
217
|
-
## 📈 Performance Expectations
|
|
218
|
-
|
|
219
|
-
### OTA Distribution Time (100KB firmware, 10 nodes)
|
|
220
|
-
|
|
221
|
-
| Method | Time | Bandwidth | Memory |
|
|
222
|
-
|--------|------|-----------|--------|
|
|
223
|
-
| Current | ~60s | 1MB | +1KB |
|
|
224
|
-
| + Compression (1E) | ~35s | 600KB | +5KB |
|
|
225
|
-
| + Broadcast (1A) | ~25s | 600KB | +7KB |
|
|
226
|
-
| + P2P (1C) | ~15s | 400KB | +205KB |
|
|
227
|
-
|
|
228
|
-
### Status Update Overhead
|
|
229
|
-
|
|
230
|
-
| Method | Frequency | Per Update | Total/hour |
|
|
231
|
-
|--------|-----------|------------|------------|
|
|
232
|
-
| Manual | On-demand | ~200B | Varies |
|
|
233
|
-
| Enhanced Pkg (2A) | 5 min | ~500B | ~6KB |
|
|
234
|
-
| MQTT Bridge (2E) | 30s | ~800B | ~96KB |
|
|
235
|
-
| Telemetry (2C) | 60s | ~64B | ~3.8KB |
|
|
236
|
-
|
|
237
|
-
---
|
|
238
|
-
|
|
239
|
-
## ⚠️ Common Pitfalls
|
|
240
|
-
|
|
241
|
-
### OTA Implementation
|
|
242
|
-
- ❌ Don't forget to include OTA support in updated firmware (will brick nodes)
|
|
243
|
-
- ❌ Don't skip MD5 validation (corrupted firmware)
|
|
244
|
-
- ❌ Don't update all nodes at once without testing (mesh failure)
|
|
245
|
-
- ✅ DO test OTA on single node first
|
|
246
|
-
- ✅ DO implement rollback mechanism
|
|
247
|
-
- ✅ DO use progressive rollout for production
|
|
248
|
-
|
|
249
|
-
### Status Monitoring
|
|
250
|
-
- ❌ Don't poll status too frequently (network congestion)
|
|
251
|
-
- ❌ Don't ignore memory warnings (node crashes)
|
|
252
|
-
- ❌ Don't assume all nodes respond (timeouts happen)
|
|
253
|
-
- ✅ DO use appropriate update intervals (30-60s typically)
|
|
254
|
-
- ✅ DO implement timeout handling
|
|
255
|
-
- ✅ DO cache status at collection point
|
|
256
|
-
|
|
257
|
-
---
|
|
258
|
-
|
|
259
|
-
## 🔗 Related Resources
|
|
260
|
-
|
|
261
|
-
- **Full Proposal:** `docs/improvements/ota-and-status-enhancements.md`
|
|
262
|
-
- **Current OTA Example:** `examples/otaSender/otaSender.ino`
|
|
263
|
-
- **Metrics System:** `src/painlessmesh/metrics.hpp`
|
|
264
|
-
- **Alteriom Packages:** `examples/alteriom/alteriom_sensor_package.hpp`
|
|
265
|
-
- **MQTT Bridge:** `examples/mqttBridge/mqttBridge.ino`
|
|
266
|
-
|
|
267
|
-
---
|
|
268
|
-
|
|
269
|
-
## 🤝 Contributing
|
|
270
|
-
|
|
271
|
-
To implement any of these features:
|
|
272
|
-
|
|
273
|
-
1. Review full proposal document
|
|
274
|
-
2. Create design doc for specific option
|
|
275
|
-
3. Submit RFC to team
|
|
276
|
-
4. Implement with tests
|
|
277
|
-
5. Create examples
|
|
278
|
-
6. Update documentation
|
|
279
|
-
|
|
280
|
-
---
|
|
281
|
-
|
|
282
|
-
**Quick Start:** Begin with **Phase 1** (Option 1E + 2A) for immediate benefits with minimal risk.
|
|
283
|
-
|
|
284
|
-
**Questions?** See full proposal or open a GitHub issue.
|
package/docs/design/.gitkeep
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Created
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
# Station Credentials Design Rationale
|
|
2
|
-
|
|
3
|
-
## Question
|
|
4
|
-
|
|
5
|
-
Why does `mesh.init()` require a separate `mesh.stationManual()` call to connect to a router, instead of accepting station credentials directly?
|
|
6
|
-
|
|
7
|
-
## Answer: Multiple Valid Approaches
|
|
8
|
-
|
|
9
|
-
The library now supports **three approaches** for connecting a bridge node to a router, each with different use cases:
|
|
10
|
-
|
|
11
|
-
### 1. Separate stationManual() Call (Original Design)
|
|
12
|
-
|
|
13
|
-
```cpp
|
|
14
|
-
mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT, WIFI_AP_STA, 6);
|
|
15
|
-
mesh.stationManual(STATION_SSID, STATION_PASSWORD);
|
|
16
|
-
mesh.setRoot(true);
|
|
17
|
-
mesh.setContainsRoot(true);
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
**When to use:**
|
|
21
|
-
- Maximum flexibility - can change router connection without reinitializing mesh
|
|
22
|
-
- Dynamic router selection at runtime
|
|
23
|
-
- Need to call `setHostname()` or other WiFi configuration between init and connection
|
|
24
|
-
- Following existing examples or legacy code
|
|
25
|
-
|
|
26
|
-
**Advantages:**
|
|
27
|
-
- Separation of concerns: mesh setup vs router connection
|
|
28
|
-
- Can reconnect to different routers without mesh reinitialization
|
|
29
|
-
- More control over connection timing and error handling
|
|
30
|
-
|
|
31
|
-
### 2. Optional Parameters in init() (New Convenience Feature)
|
|
32
|
-
|
|
33
|
-
```cpp
|
|
34
|
-
mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT,
|
|
35
|
-
WIFI_AP_STA, 6, 0, MAX_CONN,
|
|
36
|
-
STATION_SSID, STATION_PASSWORD); // Optional parameters
|
|
37
|
-
mesh.setRoot(true);
|
|
38
|
-
mesh.setContainsRoot(true);
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
**When to use:**
|
|
42
|
-
- Simple bridge setup with known credentials
|
|
43
|
-
- Static configuration (credentials won't change)
|
|
44
|
-
- Want slightly more concise code
|
|
45
|
-
- Don't need hostname or other WiFi customization
|
|
46
|
-
|
|
47
|
-
**Advantages:**
|
|
48
|
-
- One line instead of two for basic bridge setup
|
|
49
|
-
- All connection parameters in one place
|
|
50
|
-
- Still maintains full flexibility of other options
|
|
51
|
-
|
|
52
|
-
### 3. initAsBridge() Method (Recommended for New Projects)
|
|
53
|
-
|
|
54
|
-
```cpp
|
|
55
|
-
mesh.initAsBridge(MESH_PREFIX, MESH_PASSWORD,
|
|
56
|
-
STATION_SSID, STATION_PASSWORD,
|
|
57
|
-
&userScheduler, MESH_PORT);
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
**When to use:**
|
|
61
|
-
- New bridge implementations (recommended)
|
|
62
|
-
- Want automatic channel detection
|
|
63
|
-
- Need simplest possible setup
|
|
64
|
-
- Following modern best practices
|
|
65
|
-
|
|
66
|
-
**Advantages:**
|
|
67
|
-
- **Automatic channel detection** - no manual channel configuration needed
|
|
68
|
-
- Automatically sets node as root
|
|
69
|
-
- Maintains router connection through channel switches
|
|
70
|
-
- Broadcasts bridge status (Type 610) automatically
|
|
71
|
-
- Comprehensive initialization in one call
|
|
72
|
-
|
|
73
|
-
## Design Rationale for Original Separation
|
|
74
|
-
|
|
75
|
-
The original design separated `init()` and `stationManual()` for good architectural reasons:
|
|
76
|
-
|
|
77
|
-
### 1. Separation of Concerns
|
|
78
|
-
|
|
79
|
-
**Mesh Setup (`init()`):**
|
|
80
|
-
- Creates mesh network (AP mode)
|
|
81
|
-
- Sets up mesh routing and protocol
|
|
82
|
-
- Configures mesh-specific parameters
|
|
83
|
-
- Lifetime: typically never changes
|
|
84
|
-
|
|
85
|
-
**Router Connection (`stationManual()`):**
|
|
86
|
-
- Connects to external WiFi (STA mode)
|
|
87
|
-
- Different lifecycle - may connect/disconnect/change
|
|
88
|
-
- Network-specific credentials and settings
|
|
89
|
-
- Can be reconfigured at runtime
|
|
90
|
-
|
|
91
|
-
This separation allows clean code organization and different lifecycles for each concern.
|
|
92
|
-
|
|
93
|
-
### 2. Not All Nodes Need Router Connection
|
|
94
|
-
|
|
95
|
-
In a typical mesh network:
|
|
96
|
-
- **1 bridge node**: Needs router connection (AP+STA mode)
|
|
97
|
-
- **N regular nodes**: Mesh only (AP mode, or AP+STA for mesh connections)
|
|
98
|
-
|
|
99
|
-
Regular nodes use:
|
|
100
|
-
```cpp
|
|
101
|
-
mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT, WIFI_AP_STA);
|
|
102
|
-
// No stationManual() call - not a bridge
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
If `init()` always required station credentials, it would be confusing for regular nodes.
|
|
106
|
-
|
|
107
|
-
### 3. Dynamic Router Switching
|
|
108
|
-
|
|
109
|
-
Some advanced use cases require changing router connections at runtime:
|
|
110
|
-
|
|
111
|
-
```cpp
|
|
112
|
-
// Initial setup
|
|
113
|
-
mesh.init(...);
|
|
114
|
-
mesh.stationManual("Router1", "pass1");
|
|
115
|
-
|
|
116
|
-
// Later, switch to different router
|
|
117
|
-
mesh.stationManual("Router2", "pass2");
|
|
118
|
-
|
|
119
|
-
// Or respond to failover
|
|
120
|
-
void onRouterDisconnect() {
|
|
121
|
-
mesh.stationManual(backupSSID, backupPassword);
|
|
122
|
-
}
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
With station credentials baked into `init()`, this flexibility would be lost.
|
|
126
|
-
|
|
127
|
-
### 4. Additional WiFi Configuration
|
|
128
|
-
|
|
129
|
-
Many users need to configure WiFi settings between initialization and connection:
|
|
130
|
-
|
|
131
|
-
```cpp
|
|
132
|
-
mesh.init(...);
|
|
133
|
-
mesh.setHostname("MESH_BRIDGE"); // Must be before stationManual()
|
|
134
|
-
mesh.stationManual(...);
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
The separation provides a natural place for these configurations.
|
|
138
|
-
|
|
139
|
-
### 5. Error Handling and Retry Logic
|
|
140
|
-
|
|
141
|
-
Separating the calls allows better error handling:
|
|
142
|
-
|
|
143
|
-
```cpp
|
|
144
|
-
mesh.init(...); // This typically doesn't fail
|
|
145
|
-
|
|
146
|
-
// Retry router connection with backoff
|
|
147
|
-
for (int retry = 0; retry < 3; retry++) {
|
|
148
|
-
if (tryStationConnect()) break;
|
|
149
|
-
delay(1000 * (retry + 1));
|
|
150
|
-
}
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
## Comparison Table
|
|
154
|
-
|
|
155
|
-
| Approach | Setup Complexity | Flexibility | Channel Detection | Best For |
|
|
156
|
-
|----------|-----------------|-------------|-------------------|----------|
|
|
157
|
-
| **stationManual()** | Medium | Highest | Manual | Dynamic configs, legacy code |
|
|
158
|
-
| **init() params** | Low-Medium | High | Manual | Simple static bridges |
|
|
159
|
-
| **initAsBridge()** | Lowest | Medium | Automatic | New projects, recommended |
|
|
160
|
-
|
|
161
|
-
## Recommendation
|
|
162
|
-
|
|
163
|
-
**For new projects:** Use `initAsBridge()` - it's the modern, recommended approach with automatic channel detection.
|
|
164
|
-
|
|
165
|
-
**For existing projects:** The original `init()` + `stationManual()` pattern remains fully supported and appropriate.
|
|
166
|
-
|
|
167
|
-
**For simple bridges:** The new optional parameters in `init()` provide a middle ground with good flexibility.
|
|
168
|
-
|
|
169
|
-
All three approaches are valid and will continue to be supported. Choose based on your specific needs.
|
|
170
|
-
|
|
171
|
-
## Implementation Note
|
|
172
|
-
|
|
173
|
-
When station credentials are passed to `init()`, the implementation internally calls `stationManual()` after mesh initialization. This maintains consistency and code reuse while providing convenience.
|
|
174
|
-
|
|
175
|
-
```cpp
|
|
176
|
-
// Inside init() implementation
|
|
177
|
-
if (!stationSSID.empty() && (connectMode & WIFI_STA)) {
|
|
178
|
-
this->stationManual(stationSSID, stationPassword);
|
|
179
|
-
}
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
This design ensures all three approaches use the same underlying connection logic.
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
# Arduino Library Manager Compliance - Summary of Changes
|
|
2
|
-
|
|
3
|
-
## Issues Fixed
|
|
4
|
-
|
|
5
|
-
### 1. Library Name Conflict (Fixed ✅)
|
|
6
|
-
- **Problem**: Library name "Alteriom painlessMesh" contained spaces and was not unique
|
|
7
|
-
- **Solution**: Changed to "AlteriomPainlessMesh" (no spaces, unique identifier)
|
|
8
|
-
- **Files Modified**: `library.properties`
|
|
9
|
-
|
|
10
|
-
### 2. Missing Primary Header File (Fixed ✅)
|
|
11
|
-
- **Problem**: No header file matching the library name
|
|
12
|
-
- **Solution**: Created `src/AlteriomPainlessMesh.h` as the primary include
|
|
13
|
-
- **Files Created**: `src/AlteriomPainlessMesh.h`
|
|
14
|
-
- **Files Modified**: `library.properties` (updated includes field)
|
|
15
|
-
|
|
16
|
-
### 3. Example Sketch Naming Mismatch (Fixed ✅)
|
|
17
|
-
- **Problem**: Example folder `alteriom` didn't have a matching `alteriom.ino` file
|
|
18
|
-
- **Solution**: Created `examples/alteriom/alteriom.ino` with proper header inclusion
|
|
19
|
-
- **Files Created**: `examples/alteriom/alteriom.ino`
|
|
20
|
-
|
|
21
|
-
### 4. Test Sketches in Wrong Location (Fixed ✅)
|
|
22
|
-
- **Problem**: Arduino sketches found in `test/` directory (not allowed by Library Manager)
|
|
23
|
-
- **Solution**: Moved problematic sketches to `extras/test-sketches/`
|
|
24
|
-
- **Directories Moved**:
|
|
25
|
-
- `test/issue_521/` → `extras/test-sketches/issue_521/`
|
|
26
|
-
- `test/performance/` → `extras/test-sketches/performance/`
|
|
27
|
-
- `test/startHere/` → `extras/test-sketches/startHere/`
|
|
28
|
-
- `test/start_stop/` → `extras/test-sketches/start_stop/`
|
|
29
|
-
- `test/wifi/` → `extras/test-sketches/wifi/`
|
|
30
|
-
|
|
31
|
-
## Current Compliance Status
|
|
32
|
-
|
|
33
|
-
✅ **Library Properties**: All required fields present and valid
|
|
34
|
-
✅ **Naming Convention**: Library name "AlteriomPainlessMesh" is unique and compliant
|
|
35
|
-
✅ **Header File**: Primary header `src/AlteriomPainlessMesh.h` exists and matches library name
|
|
36
|
-
✅ **Examples Structure**: All example folders have matching .ino files
|
|
37
|
-
✅ **Directory Structure**: No Arduino sketches in prohibited locations
|
|
38
|
-
|
|
39
|
-
## Files Created/Modified
|
|
40
|
-
|
|
41
|
-
### New Files
|
|
42
|
-
- `src/AlteriomPainlessMesh.h` - Primary library header with comprehensive documentation
|
|
43
|
-
- `examples/alteriom/alteriom.ino` - Primary example matching folder name
|
|
44
|
-
- `extras/test-sketches/` - Directory for test sketches (moved from test/)
|
|
45
|
-
|
|
46
|
-
### Modified Files
|
|
47
|
-
- `library.properties` - Updated name, includes, and description for compliance
|
|
48
|
-
|
|
49
|
-
## Validation Results
|
|
50
|
-
|
|
51
|
-
The custom validation script confirms all major Arduino Library Manager requirements are met:
|
|
52
|
-
|
|
53
|
-
```
|
|
54
|
-
🎉 All checks passed! Library should be compliant.
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
## Next Steps
|
|
58
|
-
|
|
59
|
-
1. **Optional**: Run official Arduino Lint tool when available for final verification
|
|
60
|
-
2. **Submit**: Library is ready for Arduino Library Manager submission
|
|
61
|
-
3. **Monitor**: Check for any additional feedback from Arduino Library Manager review process
|
|
62
|
-
|
|
63
|
-
## Documentation Integration
|
|
64
|
-
|
|
65
|
-
The library now includes:
|
|
66
|
-
- Complete Docsify documentation website in `docsify-site/`
|
|
67
|
-
- Automated Doxygen API documentation generation
|
|
68
|
-
- GitHub Actions workflow for documentation deployment
|
|
69
|
-
- Embedded API documentation viewing within the website
|
|
70
|
-
|
|
71
|
-
All changes maintain compatibility with existing painlessMesh functionality while adding Alteriom-specific enhancements and ensuring Arduino Library Manager compliance.
|