@alteriom/painlessmesh 1.7.8 → 1.8.0
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 +139 -3
- package/README.md +114 -4
- package/RELEASE_GUIDE.md +57 -8
- package/docs/BRIDGE_FAILOVER.md +512 -0
- package/docs/BRIDGE_HEALTH_MONITORING.md +293 -0
- package/docs/CREATE_MISSING_RELEASES.md +321 -0
- package/docs/README.md +2 -1
- package/docs/RELEASE_AGENT_SUMMARY.md +386 -0
- package/docs/releases/RELEASE_SUMMARY_v1.7.8.md +523 -0
- package/docs/releases/RELEASE_SUMMARY_v1.7.9.md +542 -0
- package/docs/troubleshooting/ESP32_C6_COMPATIBILITY.md +157 -0
- package/docs/troubleshooting/common-issues.md +28 -0
- package/examples/alteriom/alteriom_sensor_package.hpp +233 -1
- package/examples/alteriom/platformio.ini +1 -1
- package/examples/alteriomImproved/platformio.ini +1 -1
- package/examples/alteriomMetricsHealth/metrics_health_node.ino +18 -7
- package/examples/alteriomMetricsHealth/platformio.ini +1 -1
- package/examples/alteriomPhase1/platformio.ini +1 -1
- package/examples/alteriomPhase2/platformio.ini +1 -1
- package/examples/alteriomSensorNode/alteriom_sensor_package.hpp +1014 -11
- package/examples/alteriomSensorNode/platformio.ini +1 -1
- package/examples/basic/basic.ino +6 -2
- package/examples/basic/platformio.ini +1 -1
- package/examples/bridge/alteriom_sensor_package.hpp +1170 -0
- package/examples/bridge/bridge.ino +44 -23
- package/examples/bridge/bridge_health_monitoring_example.ino +188 -0
- package/examples/bridge/enhanced_mqtt_bridge.hpp +1 -1
- package/examples/bridge/mqtt_command_bridge.hpp +2 -2
- package/examples/bridge/platformio.ini +2 -1
- package/examples/bridgeAwareSensorNode/alteriom_sensor_package.hpp +1227 -0
- package/examples/bridgeAwareSensorNode/bridgeAwareSensorNode.ino +343 -0
- package/examples/bridgeAwareSensorNode/platformio.ini +26 -0
- package/examples/bridge_failover/README.md +358 -0
- package/examples/bridge_failover/bridge_failover.ino +180 -0
- package/examples/bridge_failover/platformio.ini +27 -0
- package/examples/diagnosticsExample/diagnosticsExample.ino +171 -0
- package/examples/diagnosticsExample/platformio.ini +26 -0
- package/examples/echoNode/platformio.ini +1 -1
- package/examples/logClient/platformio.ini +1 -1
- package/examples/logServer/platformio.ini +1 -1
- package/examples/mqttStatusBridge/platformio.ini +1 -1
- package/examples/namedMesh/platformio.ini +1 -1
- package/examples/ntpTimeSyncBridge/alteriom_sensor_package.hpp +1383 -0
- package/examples/ntpTimeSyncBridge/ntpTimeSyncBridge.ino +81 -0
- package/examples/ntpTimeSyncNode/alteriom_sensor_package.hpp +1383 -0
- package/examples/ntpTimeSyncNode/ntpTimeSyncNode.ino +109 -0
- package/examples/otaReceiver/platformio.ini +1 -1
- package/examples/rtcIntegration/README.md +235 -0
- package/examples/rtcIntegration/rtcIntegration.ino +196 -0
- package/examples/startHere/platformio.ini +1 -1
- package/examples/webServer/platformio.ini +1 -1
- package/library.json +93 -53
- package/library.properties +1 -1
- package/package.json +2 -2
- package/src/arduino/wifi.hpp +581 -0
- package/src/painlessMeshSTA.cpp +68 -0
- package/src/painlessMeshSTA.h +3 -0
- package/src/painlessmesh/mesh.hpp +1127 -4
- package/src/painlessmesh/rtc.hpp +203 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
# Bridge Health Monitoring & Metrics Collection
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The Bridge Health Monitoring feature provides comprehensive operational visibility into bridge health, connectivity quality, and performance metrics. This is essential for production deployments, troubleshooting, and capacity planning.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
✅ **Connectivity Metrics** - Track uptime, internet connectivity, and disconnection events
|
|
10
|
+
✅ **Signal Quality** - Monitor WiFi signal strength (RSSI) statistics
|
|
11
|
+
✅ **Traffic Metrics** - Measure bytes and messages transmitted/received
|
|
12
|
+
✅ **Performance Metrics** - Calculate latency and packet loss
|
|
13
|
+
✅ **JSON Export** - Easy integration with monitoring tools
|
|
14
|
+
✅ **Prometheus Support** - Export metrics for Prometheus scraping
|
|
15
|
+
✅ **Periodic Callbacks** - Automated metric collection and reporting
|
|
16
|
+
|
|
17
|
+
## API Reference
|
|
18
|
+
|
|
19
|
+
### BridgeHealthMetrics Structure
|
|
20
|
+
|
|
21
|
+
```cpp
|
|
22
|
+
struct BridgeHealthMetrics {
|
|
23
|
+
// Connectivity
|
|
24
|
+
uint32_t uptimeSeconds; // Total uptime in seconds
|
|
25
|
+
uint32_t internetUptimeSeconds; // Time with Internet connection
|
|
26
|
+
uint32_t totalDisconnects; // Number of disconnection events
|
|
27
|
+
uint32_t currentUptime; // Current uptime in milliseconds
|
|
28
|
+
|
|
29
|
+
// Signal Quality
|
|
30
|
+
int8_t currentRSSI; // Current WiFi signal strength (dBm)
|
|
31
|
+
int8_t avgRSSI; // Average signal strength
|
|
32
|
+
int8_t minRSSI; // Minimum observed signal strength
|
|
33
|
+
int8_t maxRSSI; // Maximum observed signal strength
|
|
34
|
+
|
|
35
|
+
// Traffic
|
|
36
|
+
uint64_t bytesRx; // Total bytes received
|
|
37
|
+
uint64_t bytesTx; // Total bytes transmitted
|
|
38
|
+
uint32_t messagesRx; // Total messages received
|
|
39
|
+
uint32_t messagesTx; // Total messages transmitted
|
|
40
|
+
uint32_t messagesQueued; // Messages currently queued
|
|
41
|
+
uint32_t messagesDropped; // Messages that failed to send
|
|
42
|
+
|
|
43
|
+
// Performance
|
|
44
|
+
uint32_t avgLatencyMs; // Average message latency
|
|
45
|
+
uint8_t packetLossPercent; // Packet loss percentage (0-100)
|
|
46
|
+
uint32_t meshNodeCount; // Number of nodes in mesh
|
|
47
|
+
};
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Methods
|
|
51
|
+
|
|
52
|
+
#### getBridgeHealthMetrics()
|
|
53
|
+
|
|
54
|
+
Get current health metrics snapshot.
|
|
55
|
+
|
|
56
|
+
```cpp
|
|
57
|
+
BridgeHealthMetrics metrics = mesh.getBridgeHealthMetrics();
|
|
58
|
+
|
|
59
|
+
Serial.printf("Uptime: %u s\n", metrics.uptimeSeconds);
|
|
60
|
+
Serial.printf("Messages RX: %u\n", metrics.messagesRx);
|
|
61
|
+
Serial.printf("Avg Latency: %u ms\n", metrics.avgLatencyMs);
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
#### resetHealthMetrics()
|
|
65
|
+
|
|
66
|
+
Reset all counters to zero. Useful for periodic monitoring windows.
|
|
67
|
+
|
|
68
|
+
```cpp
|
|
69
|
+
mesh.resetHealthMetrics();
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Note:** This resets counters (messages, bytes, disconnects) but keeps current state metrics (RSSI, node count).
|
|
73
|
+
|
|
74
|
+
#### getHealthMetricsJSON()
|
|
75
|
+
|
|
76
|
+
Export metrics as JSON string for easy integration.
|
|
77
|
+
|
|
78
|
+
```cpp
|
|
79
|
+
String json = mesh.getHealthMetricsJSON();
|
|
80
|
+
mqttClient.publish("bridge/metrics", json.c_str());
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**JSON Format:**
|
|
84
|
+
```json
|
|
85
|
+
{
|
|
86
|
+
"connectivity": {
|
|
87
|
+
"uptimeSeconds": 3600,
|
|
88
|
+
"internetUptimeSeconds": 3540,
|
|
89
|
+
"totalDisconnects": 2,
|
|
90
|
+
"currentUptime": 3600000
|
|
91
|
+
},
|
|
92
|
+
"signalQuality": {
|
|
93
|
+
"currentRSSI": -65,
|
|
94
|
+
"avgRSSI": -68,
|
|
95
|
+
"minRSSI": -75,
|
|
96
|
+
"maxRSSI": -60
|
|
97
|
+
},
|
|
98
|
+
"traffic": {
|
|
99
|
+
"bytesRx": 1048576,
|
|
100
|
+
"bytesTx": 524288,
|
|
101
|
+
"messagesRx": 1234,
|
|
102
|
+
"messagesTx": 567,
|
|
103
|
+
"messagesQueued": 0,
|
|
104
|
+
"messagesDropped": 5
|
|
105
|
+
},
|
|
106
|
+
"performance": {
|
|
107
|
+
"avgLatencyMs": 45,
|
|
108
|
+
"packetLossPercent": 1,
|
|
109
|
+
"meshNodeCount": 8
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
#### onHealthMetricsUpdate()
|
|
115
|
+
|
|
116
|
+
Register a periodic callback for automated monitoring.
|
|
117
|
+
|
|
118
|
+
```cpp
|
|
119
|
+
mesh.onHealthMetricsUpdate([](BridgeHealthMetrics metrics) {
|
|
120
|
+
// Process metrics
|
|
121
|
+
Serial.printf("Nodes: %u, Latency: %u ms\n",
|
|
122
|
+
metrics.meshNodeCount, metrics.avgLatencyMs);
|
|
123
|
+
}, 60000); // Every 60 seconds
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Integration Examples
|
|
127
|
+
|
|
128
|
+
### MQTT Publishing
|
|
129
|
+
|
|
130
|
+
```cpp
|
|
131
|
+
#include <PubSubClient.h>
|
|
132
|
+
|
|
133
|
+
WiFiClient espClient;
|
|
134
|
+
PubSubClient mqttClient(espClient);
|
|
135
|
+
|
|
136
|
+
void metricsCallback(BridgeHealthMetrics metrics) {
|
|
137
|
+
if (mqttClient.connected()) {
|
|
138
|
+
String json = mesh.getHealthMetricsJSON();
|
|
139
|
+
mqttClient.publish("bridge/metrics", json.c_str());
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
void setup() {
|
|
144
|
+
// ... mesh setup ...
|
|
145
|
+
mesh.onHealthMetricsUpdate(metricsCallback, 60000);
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Prometheus Exporter
|
|
150
|
+
|
|
151
|
+
```cpp
|
|
152
|
+
#include <ESPAsyncWebServer.h>
|
|
153
|
+
|
|
154
|
+
AsyncWebServer server(80);
|
|
155
|
+
|
|
156
|
+
String exportPrometheus() {
|
|
157
|
+
auto metrics = mesh.getBridgeHealthMetrics();
|
|
158
|
+
|
|
159
|
+
String output = "";
|
|
160
|
+
output += "# HELP bridge_uptime_seconds Bridge uptime\n";
|
|
161
|
+
output += "# TYPE bridge_uptime_seconds counter\n";
|
|
162
|
+
output += "bridge_uptime_seconds " + String(metrics.uptimeSeconds) + "\n";
|
|
163
|
+
|
|
164
|
+
output += "# HELP bridge_rssi_dbm WiFi signal strength\n";
|
|
165
|
+
output += "# TYPE bridge_rssi_dbm gauge\n";
|
|
166
|
+
output += "bridge_rssi_dbm " + String(metrics.currentRSSI) + "\n";
|
|
167
|
+
|
|
168
|
+
// Add more metrics...
|
|
169
|
+
|
|
170
|
+
return output;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
void setup() {
|
|
174
|
+
// ... mesh setup ...
|
|
175
|
+
|
|
176
|
+
server.on("/metrics", HTTP_GET, [](AsyncWebServerRequest *request){
|
|
177
|
+
request->send(200, "text/plain", exportPrometheus());
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
server.begin();
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Grafana Dashboard
|
|
185
|
+
|
|
186
|
+
Use the Prometheus exporter above with Grafana to create monitoring dashboards:
|
|
187
|
+
|
|
188
|
+
1. Configure Prometheus to scrape your bridge node: `http://bridge-ip/metrics`
|
|
189
|
+
2. Import metrics into Grafana
|
|
190
|
+
3. Create panels for:
|
|
191
|
+
- Uptime and availability
|
|
192
|
+
- Signal strength trends
|
|
193
|
+
- Traffic throughput
|
|
194
|
+
- Latency and packet loss
|
|
195
|
+
- Mesh topology changes
|
|
196
|
+
|
|
197
|
+
### Cloud Logging (AWS CloudWatch, Azure Monitor, etc.)
|
|
198
|
+
|
|
199
|
+
```cpp
|
|
200
|
+
void metricsCallback(BridgeHealthMetrics metrics) {
|
|
201
|
+
String json = mesh.getHealthMetricsJSON();
|
|
202
|
+
|
|
203
|
+
// Send to CloudWatch
|
|
204
|
+
httpClient.post("/cloudwatch", json);
|
|
205
|
+
|
|
206
|
+
// Send to Azure Monitor
|
|
207
|
+
httpClient.post("/azure-monitor", json);
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## Use Cases
|
|
212
|
+
|
|
213
|
+
### Production Monitoring
|
|
214
|
+
|
|
215
|
+
Monitor bridge health in production deployments:
|
|
216
|
+
- Track uptime and availability
|
|
217
|
+
- Detect connectivity issues early
|
|
218
|
+
- Analyze signal quality trends
|
|
219
|
+
- Capacity planning based on traffic patterns
|
|
220
|
+
|
|
221
|
+
### Troubleshooting
|
|
222
|
+
|
|
223
|
+
Debug network issues:
|
|
224
|
+
- Identify sources of packet loss
|
|
225
|
+
- Locate signal strength problems
|
|
226
|
+
- Diagnose latency spikes
|
|
227
|
+
- Track disconnection patterns
|
|
228
|
+
|
|
229
|
+
### Performance Optimization
|
|
230
|
+
|
|
231
|
+
Optimize mesh performance:
|
|
232
|
+
- Analyze traffic patterns
|
|
233
|
+
- Identify bottlenecks
|
|
234
|
+
- Optimize node placement based on RSSI
|
|
235
|
+
- Fine-tune routing strategies
|
|
236
|
+
|
|
237
|
+
## Best Practices
|
|
238
|
+
|
|
239
|
+
### Monitoring Intervals
|
|
240
|
+
|
|
241
|
+
- **Development:** 10-30 seconds for rapid feedback
|
|
242
|
+
- **Production:** 60-300 seconds to reduce overhead
|
|
243
|
+
- **Critical Systems:** 30-60 seconds with alerting
|
|
244
|
+
|
|
245
|
+
### Metric Storage
|
|
246
|
+
|
|
247
|
+
- Use time-series databases (InfluxDB, Prometheus)
|
|
248
|
+
- Retain raw metrics for 7-30 days
|
|
249
|
+
- Aggregate to hourly/daily for long-term storage
|
|
250
|
+
- Set up automated retention policies
|
|
251
|
+
|
|
252
|
+
### Alerting
|
|
253
|
+
|
|
254
|
+
Set up alerts for:
|
|
255
|
+
- Packet loss > 5%
|
|
256
|
+
- Latency > 200ms
|
|
257
|
+
- Signal strength < -80 dBm
|
|
258
|
+
- Frequent disconnections (> 3/hour)
|
|
259
|
+
- Node count drops
|
|
260
|
+
|
|
261
|
+
### Resource Management
|
|
262
|
+
|
|
263
|
+
On ESP8266 (limited RAM):
|
|
264
|
+
- Use longer intervals (120-300 seconds)
|
|
265
|
+
- Minimize callback complexity
|
|
266
|
+
- Consider offloading processing to gateway
|
|
267
|
+
|
|
268
|
+
On ESP32 (more RAM):
|
|
269
|
+
- Can use shorter intervals (30-60 seconds)
|
|
270
|
+
- More sophisticated processing possible
|
|
271
|
+
- Support multiple monitoring integrations
|
|
272
|
+
|
|
273
|
+
## Example: Complete Monitoring Setup
|
|
274
|
+
|
|
275
|
+
See `examples/bridge/bridge_health_monitoring_example.ino` for a complete working example with:
|
|
276
|
+
- Periodic metrics logging
|
|
277
|
+
- MQTT integration
|
|
278
|
+
- Prometheus export endpoint
|
|
279
|
+
- Manual metrics queries
|
|
280
|
+
|
|
281
|
+
## Version History
|
|
282
|
+
|
|
283
|
+
- **v1.8.0** - Initial release
|
|
284
|
+
- Basic metrics collection
|
|
285
|
+
- JSON export
|
|
286
|
+
- Periodic callbacks
|
|
287
|
+
- MQTT and Prometheus examples
|
|
288
|
+
|
|
289
|
+
## See Also
|
|
290
|
+
|
|
291
|
+
- [Bridge Architecture](BRIDGE_ARCHITECTURE_IMPLEMENTATION.md)
|
|
292
|
+
- [Bridge Status Feature](BRIDGE_STATUS_FEATURE.md)
|
|
293
|
+
- [MQTT Bridge Examples](../examples/bridge/)
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
# Creating Missing GitHub Releases for v1.7.8 and v1.7.9
|
|
2
|
+
|
|
3
|
+
## Problem
|
|
4
|
+
|
|
5
|
+
Versions 1.7.8 and 1.7.9 have:
|
|
6
|
+
- ✅ CHANGELOG.md entries (complete release notes)
|
|
7
|
+
- ✅ Release summary documentation (docs/releases/RELEASE_SUMMARY_v1.7.x.md)
|
|
8
|
+
- ✅ Version numbers in library files (library.properties, library.json, package.json)
|
|
9
|
+
- ❌ **Missing GitHub Releases** (no tags, no release pages)
|
|
10
|
+
|
|
11
|
+
This means:
|
|
12
|
+
- Users cannot download these specific versions from GitHub
|
|
13
|
+
- Release automation may not have run properly
|
|
14
|
+
- NPM/GitHub Packages may not have been published
|
|
15
|
+
|
|
16
|
+
## Solution: Create GitHub Releases Retroactively
|
|
17
|
+
|
|
18
|
+
### Option 1: Automated Script (Recommended)
|
|
19
|
+
|
|
20
|
+
We've created a script to automate the process:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
./scripts/create-missing-releases.sh
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**What it does:**
|
|
27
|
+
1. Extracts release notes from CHANGELOG.md
|
|
28
|
+
2. Creates git tags (v1.7.8, v1.7.9)
|
|
29
|
+
3. Pushes tags to GitHub
|
|
30
|
+
4. Creates GitHub releases with proper release notes
|
|
31
|
+
5. Provides links to verify releases
|
|
32
|
+
|
|
33
|
+
**Requirements:**
|
|
34
|
+
- GitHub CLI (`gh`) installed: https://cli.github.com/
|
|
35
|
+
- Authenticated with GitHub: `gh auth login`
|
|
36
|
+
- Write access to the repository
|
|
37
|
+
|
|
38
|
+
**Running the script:**
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# Navigate to repository root
|
|
42
|
+
cd /path/to/painlessMesh
|
|
43
|
+
|
|
44
|
+
# Run the script
|
|
45
|
+
./scripts/create-missing-releases.sh
|
|
46
|
+
|
|
47
|
+
# Follow the prompts
|
|
48
|
+
# - Confirm you want to proceed
|
|
49
|
+
# - If releases exist, choose whether to recreate them
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Option 2: Manual Process
|
|
53
|
+
|
|
54
|
+
If you prefer to create releases manually or the script doesn't work:
|
|
55
|
+
|
|
56
|
+
#### Step 1: Extract Release Notes
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# Extract v1.7.8 notes
|
|
60
|
+
awk '/^## \[1\.7\.8\]/ {flag=1; next} /^## \[/ {flag=0} flag' CHANGELOG.md > release_notes_1.7.8.txt
|
|
61
|
+
|
|
62
|
+
# Extract v1.7.9 notes
|
|
63
|
+
awk '/^## \[1\.7\.9\]/ {flag=1; next} /^## \[/ {flag=0} flag' CHANGELOG.md > release_notes_1.7.9.txt
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
#### Step 2: Create Tags and Releases via GitHub CLI
|
|
67
|
+
|
|
68
|
+
**For v1.7.8:**
|
|
69
|
+
```bash
|
|
70
|
+
# Create and push tag
|
|
71
|
+
git tag -a v1.7.8 -m "painlessMesh v1.7.8"
|
|
72
|
+
git push origin v1.7.8
|
|
73
|
+
|
|
74
|
+
# Create GitHub release
|
|
75
|
+
gh release create v1.7.8 \
|
|
76
|
+
--repo Alteriom/painlessMesh \
|
|
77
|
+
--title "painlessMesh v1.7.8" \
|
|
78
|
+
--notes-file release_notes_1.7.8.txt
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**For v1.7.9:**
|
|
82
|
+
```bash
|
|
83
|
+
# Create and push tag
|
|
84
|
+
git tag -a v1.7.9 -m "painlessMesh v1.7.9"
|
|
85
|
+
git push origin v1.7.9
|
|
86
|
+
|
|
87
|
+
# Create GitHub release
|
|
88
|
+
gh release create v1.7.9 \
|
|
89
|
+
--repo Alteriom/painlessMesh \
|
|
90
|
+
--title "painlessMesh v1.7.9" \
|
|
91
|
+
--notes-file release_notes_1.7.9.txt
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
#### Step 3: Create Releases via GitHub Web UI
|
|
95
|
+
|
|
96
|
+
If you don't have GitHub CLI:
|
|
97
|
+
|
|
98
|
+
1. **Go to**: https://github.com/Alteriom/painlessMesh/releases/new
|
|
99
|
+
2. **For v1.7.8**:
|
|
100
|
+
- Tag: `v1.7.8`
|
|
101
|
+
- Release title: `painlessMesh v1.7.8`
|
|
102
|
+
- Description: Copy content from `CHANGELOG.md` section `[1.7.8]`
|
|
103
|
+
- Click "Publish release"
|
|
104
|
+
3. **For v1.7.9**:
|
|
105
|
+
- Tag: `v1.7.9`
|
|
106
|
+
- Release title: `painlessMesh v1.7.9`
|
|
107
|
+
- Description: Copy content from `CHANGELOG.md` section `[1.7.9]`
|
|
108
|
+
- Click "Publish release"
|
|
109
|
+
|
|
110
|
+
## Verification
|
|
111
|
+
|
|
112
|
+
After creating the releases, verify:
|
|
113
|
+
|
|
114
|
+
### 1. Check GitHub Releases Page
|
|
115
|
+
```bash
|
|
116
|
+
# View releases via CLI
|
|
117
|
+
gh release list --repo Alteriom/painlessMesh
|
|
118
|
+
|
|
119
|
+
# Or visit in browser
|
|
120
|
+
# https://github.com/Alteriom/painlessMesh/releases
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**Expected output:**
|
|
124
|
+
```
|
|
125
|
+
v1.7.9 painlessMesh v1.7.9 Latest 2025-11-08
|
|
126
|
+
v1.7.8 painlessMesh v1.7.8 2025-11-05
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 2. Check Tags
|
|
130
|
+
```bash
|
|
131
|
+
git fetch --tags
|
|
132
|
+
git tag -l | grep -E "v1.7.[89]"
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**Expected output:**
|
|
136
|
+
```
|
|
137
|
+
v1.7.8
|
|
138
|
+
v1.7.9
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 3. Verify Release Notes
|
|
142
|
+
Visit each release page and confirm:
|
|
143
|
+
- ✅ Release notes match CHANGELOG.md content
|
|
144
|
+
- ✅ Date is correct (v1.7.8: Nov 5, 2025; v1.7.9: Nov 8, 2025)
|
|
145
|
+
- ✅ Release is marked as "Latest" for v1.7.9
|
|
146
|
+
|
|
147
|
+
## Publishing Packages
|
|
148
|
+
|
|
149
|
+
After creating the GitHub releases, you may want to publish packages to NPM and GitHub Packages.
|
|
150
|
+
|
|
151
|
+
### Check if Already Published
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
# Check NPM
|
|
155
|
+
npm view @alteriom/painlessmesh versions
|
|
156
|
+
|
|
157
|
+
# Check if 1.7.8 and 1.7.9 are listed
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Publish if Missing
|
|
161
|
+
|
|
162
|
+
If versions are not published:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
# Option 1: Trigger manual publish workflow
|
|
166
|
+
gh workflow run manual-publish.yml --repo Alteriom/painlessMesh
|
|
167
|
+
|
|
168
|
+
# Option 2: Manual NPM publish (requires NPM token)
|
|
169
|
+
npm publish --access public
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Why This Happened
|
|
173
|
+
|
|
174
|
+
The releases were likely missed because:
|
|
175
|
+
|
|
176
|
+
1. **Commits didn't trigger release workflow** - The release workflow triggers on:
|
|
177
|
+
- Commits to `main` branch
|
|
178
|
+
- Changes to version files OR commit message starting with `release:`
|
|
179
|
+
- If neither condition was met, no release was created
|
|
180
|
+
|
|
181
|
+
2. **Version was bumped without triggering release** - The version files were updated but:
|
|
182
|
+
- Commit message didn't start with `release:`
|
|
183
|
+
- Or changes were pushed to a different branch first
|
|
184
|
+
|
|
185
|
+
3. **Workflow may have failed** - Check GitHub Actions history for failed workflows
|
|
186
|
+
|
|
187
|
+
## Preventing Future Issues
|
|
188
|
+
|
|
189
|
+
### Ensure Releases Trigger Properly
|
|
190
|
+
|
|
191
|
+
The release workflow (`.github/workflows/release.yml`) triggers when:
|
|
192
|
+
|
|
193
|
+
1. **Automatic trigger** (recommended):
|
|
194
|
+
- Modify `library.properties`, `library.json`, or `package.json`
|
|
195
|
+
- Commit changes to `main` branch
|
|
196
|
+
- Workflow automatically detects version bump and creates release
|
|
197
|
+
|
|
198
|
+
2. **Manual trigger**:
|
|
199
|
+
- Commit message starts with `release:`
|
|
200
|
+
- Example: `git commit -m "release: v1.8.0 - New features"`
|
|
201
|
+
|
|
202
|
+
### Best Practices for Future Releases
|
|
203
|
+
|
|
204
|
+
1. **Use the bump-version script:**
|
|
205
|
+
```bash
|
|
206
|
+
./scripts/bump-version.sh patch # or minor, major
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
2. **Update CHANGELOG.md** with release notes
|
|
210
|
+
|
|
211
|
+
3. **Use release agent to validate:**
|
|
212
|
+
```bash
|
|
213
|
+
./scripts/release-agent.sh
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
4. **Commit with proper message:**
|
|
217
|
+
```bash
|
|
218
|
+
git add library.properties library.json package.json CHANGELOG.md
|
|
219
|
+
git commit -m "release: v1.8.0 - Brief description"
|
|
220
|
+
git push origin main
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
5. **Verify workflow runs:**
|
|
224
|
+
- Go to: https://github.com/Alteriom/painlessMesh/actions
|
|
225
|
+
- Watch the "Automated Release" workflow
|
|
226
|
+
- Confirm it completes successfully
|
|
227
|
+
|
|
228
|
+
6. **Check release was created:**
|
|
229
|
+
```bash
|
|
230
|
+
gh release list --repo Alteriom/painlessMesh
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Monitoring Release Success
|
|
234
|
+
|
|
235
|
+
After pushing a release commit, verify:
|
|
236
|
+
|
|
237
|
+
- ✅ GitHub Actions workflow runs successfully
|
|
238
|
+
- ✅ Git tag is created and pushed
|
|
239
|
+
- ✅ GitHub release is created with notes
|
|
240
|
+
- ✅ NPM package is published
|
|
241
|
+
- ✅ GitHub Packages is updated
|
|
242
|
+
- ✅ Wiki is synchronized (if enabled)
|
|
243
|
+
|
|
244
|
+
View the workflow run:
|
|
245
|
+
```bash
|
|
246
|
+
gh run list --workflow=release.yml --repo Alteriom/painlessMesh
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
## Troubleshooting
|
|
250
|
+
|
|
251
|
+
### "Tag already exists" Error
|
|
252
|
+
|
|
253
|
+
If tags exist but releases don't:
|
|
254
|
+
```bash
|
|
255
|
+
# Delete existing tags (careful!)
|
|
256
|
+
git tag -d v1.7.8
|
|
257
|
+
git push origin :refs/tags/v1.7.8
|
|
258
|
+
|
|
259
|
+
# Then recreate using the script
|
|
260
|
+
./scripts/create-missing-releases.sh
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### "Permission denied" Error
|
|
264
|
+
|
|
265
|
+
You need write access to the repository:
|
|
266
|
+
- Verify you're authenticated: `gh auth status`
|
|
267
|
+
- Check your permissions on the repository
|
|
268
|
+
- Contact repository owner for access
|
|
269
|
+
|
|
270
|
+
### Script Fails
|
|
271
|
+
|
|
272
|
+
If the automated script fails:
|
|
273
|
+
1. Check error messages
|
|
274
|
+
2. Verify GitHub CLI is installed: `gh --version`
|
|
275
|
+
3. Verify you're authenticated: `gh auth login`
|
|
276
|
+
4. Try manual process (Option 2 above)
|
|
277
|
+
|
|
278
|
+
### Release Notes Are Empty
|
|
279
|
+
|
|
280
|
+
If release notes extraction fails:
|
|
281
|
+
1. Verify CHANGELOG.md format matches expected pattern
|
|
282
|
+
2. Check that version sections exist: `## [1.7.8]` and `## [1.7.9]`
|
|
283
|
+
3. Manually copy content from CHANGELOG.md
|
|
284
|
+
|
|
285
|
+
## Additional Resources
|
|
286
|
+
|
|
287
|
+
- **Release Guide**: See `RELEASE_GUIDE.md` for complete release process
|
|
288
|
+
- **GitHub Releases**: https://github.com/Alteriom/painlessMesh/releases
|
|
289
|
+
- **GitHub CLI Docs**: https://cli.github.com/manual/
|
|
290
|
+
- **Release Workflow**: `.github/workflows/release.yml`
|
|
291
|
+
|
|
292
|
+
## Summary
|
|
293
|
+
|
|
294
|
+
**To create missing releases:**
|
|
295
|
+
|
|
296
|
+
```bash
|
|
297
|
+
# Quick method (automated)
|
|
298
|
+
./scripts/create-missing-releases.sh
|
|
299
|
+
|
|
300
|
+
# Verify
|
|
301
|
+
gh release list --repo Alteriom/painlessMesh
|
|
302
|
+
|
|
303
|
+
# Publish packages if needed
|
|
304
|
+
gh workflow run manual-publish.yml --repo Alteriom/painlessMesh
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
**To prevent future issues:**
|
|
308
|
+
|
|
309
|
+
```bash
|
|
310
|
+
# Always use this workflow for releases:
|
|
311
|
+
./scripts/bump-version.sh patch
|
|
312
|
+
# Update CHANGELOG.md
|
|
313
|
+
./scripts/release-agent.sh # Validate
|
|
314
|
+
git add . && git commit -m "release: vX.Y.Z - Description"
|
|
315
|
+
git push origin main
|
|
316
|
+
# Watch GitHub Actions to confirm success
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
**Questions?** Open an issue with the `ci/cd` label.
|
package/docs/README.md
CHANGED
|
@@ -36,7 +36,7 @@ Welcome to the comprehensive documentation for the Alteriom fork of painlessMesh
|
|
|
36
36
|
- [Basic Examples](tutorials/basic-examples.md) - Simple mesh networking examples
|
|
37
37
|
- [Custom Packages](tutorials/custom-packages.md) - Creating your own message types
|
|
38
38
|
- [Sensor Networks](tutorials/sensor-networks.md) - Building IoT sensor networks
|
|
39
|
-
- [Bridge
|
|
39
|
+
- [Bridge to Internet](../BRIDGE_TO_INTERNET.md) - Connecting mesh to WiFi/Internet/MQTT
|
|
40
40
|
|
|
41
41
|
### Alteriom Extensions
|
|
42
42
|
|
|
@@ -63,6 +63,7 @@ Welcome to the comprehensive documentation for the Alteriom fork of painlessMesh
|
|
|
63
63
|
### Troubleshooting
|
|
64
64
|
|
|
65
65
|
- [Common Issues](troubleshooting/common-issues.md) - Solutions to frequent problems
|
|
66
|
+
- [ESP32-C6 Compatibility](troubleshooting/ESP32_C6_COMPATIBILITY.md) - ESP32-C6 specific issues and solutions
|
|
66
67
|
- [Debugging Guide](troubleshooting/debugging.md) - Tools and techniques for debugging
|
|
67
68
|
- [FAQ](troubleshooting/faq.md) - Frequently asked questions
|
|
68
69
|
- [Network Issues](troubleshooting/network-issues.md) - Connectivity and mesh topology problems
|