Grafana

Battery

from(bucket: "meshcore")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r._measurement == "meshcore_status")
  |> filter(fn: (r) => r._field == "bat")
  |> map(fn: (r) => ({
      _time: r._time,
      _value: r._value,
      series: r.node
  }))
  |> group(columns: ["series"])
  |> aggregateWindow(every:15m, fn:last, createEmpty:true)

Noise Floor

from(bucket: "meshcore")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r._measurement == "meshcore_status")
  |> filter(fn: (r) => r._field == "noise_floor")
  |> group(columns: ["node"])
  |> aggregateWindow(every: 15m, fn: mean, createEmpty: true)
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,
      node: r.node
  }))
  |> group(columns: ["node"])
  |> aggregateWindow(every: 15m, fn: mean, createEmpty: true)

Trace SNR

from(bucket: "meshcore")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r._measurement == "meshcore_trace")
  |> filter(fn: (r) => r._field == "snr")
  |> map(fn: (r) => ({
    _time: r._time,
    _value: r._value,
    route: r.from + " → " + r.to + " : " + r.site
  }))
  |> 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