Commit 0103fd

2026-04-28 00:50:54 David Marsh: -/-
howto/grafana.md ..
@@ 1,48 1,75 @@
# Grafana
- ## snr
+ ## Battery
```
from(bucket: "meshcore")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
- |> filter(fn: (r) => r._measurement == "meshcore_trace")
- |> filter(fn: (r) => r._field == "snr")
+ |> filter(fn: (r) => r._measurement == "meshcore_status")
+ |> filter(fn: (r) => r._field == "bat")
|> map(fn: (r) => ({
- _time: r._time,
- _value: r._value,
- route: r.from + " → " + r.to
+ _time: r._time,
+ _value: r._value,
+ series: r.node
}))
- |> group(columns: ["route"])
+ |> group(columns: ["series"])
+ |> aggregateWindow(every:15m, fn:last, createEmpty:true)
```
- with avg
+ ## Noise Floor
```
from(bucket: "meshcore")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
- |> filter(fn: (r) => r._measurement == "meshcore_trace")
- |> filter(fn: (r) => r._field == "snr")
+ |> filter(fn: (r) => r._measurement == "meshcore_status")
+ |> filter(fn: (r) => r._field == "noise_floor")
+ |> group(columns: ["node"])
+ |> aggregateWindow(every: 15m, fn: mean, createEmpty: true)
+ ```
+
+ ## RF Link Health
+
+ ```
+ from(bucket: "meshcore")
+ |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
+ |> filter(fn: (r) => r._measurement == "meshcore_status")
+ |> filter(fn: (r) =>
+ r._field == "last_snr" or
+ r._field == "last_rssi" or
+ r._field == "noise_floor"
+ )
+ |> group(columns: ["node", "_field"])
+ |> aggregateWindow(every:15m, fn:mean, createEmpty:true)
+ ```
+
+ ## Status SNR
+
+ ```
+ from(bucket: "meshcore")
+ |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
+ |> filter(fn: (r) => r._measurement == "meshcore_status")
+ |> filter(fn: (r) => r._field == "last_snr")
|> map(fn: (r) => ({
- _time: r._time,
- _value: r._value,
- route: r.from + " → " + r.to
+ _time: r._time,
+ _value: r._value,
+ node: r.node
}))
- |> group(columns: ["route"])
- |> aggregateWindow(every: 15m, fn: mean, createEmpty: false)
- |> movingAverage(n: 2)
+ |> group(columns: ["node"])
+ |> aggregateWindow(every: 15m, fn: mean, createEmpty: true)
```
- ## status
+ ### Trace SNR
```
from(bucket: "meshcore")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r._measurement == "meshcore_trace")
- |> filter(fn: (r) => r._field == "success")
+ |> filter(fn: (r) => r._field == "snr")
|> map(fn: (r) => ({
- _time: r._time,
- _value: r._value,
- _field: r.path
+ _time: r._time,
+ _value: r._value,
+ route: r.from + " → " + r.to + " : " + r.site
}))
- |> group(columns: ["_field"])
+ |> group(columns: ["route"])
+ |> aggregateWindow(every: 15m, fn: mean, createEmpty: true)
```
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9