Skip to content

Metrics & Telemetry

Everything Nereus shows you — a dashboard reading, a report KPI, an alert threshold — resolves to a metric: a named, unit-bearing quantity like pressure_kpa or level_m. Sensors from different vendors speak different payload formats, but they all land on this one shared vocabulary, so a widget or a rule binds to a metric key, never to a particular device’s byte layout.

This page explains that vocabulary, how raw readings roll up into the aggregates you see on charts, and how a sensor that goes quiet becomes an offline alert.

The catalogue is the canonical set of metrics every part of the product agrees on. Each entry has a key (the stable identifier), a unit, and a kind that decides how it aggregates.

Metric Key Unit Kind
Total volume water_volume_m3 counter
Flow rate flow_rate_lpm L/min gauge
Pressure pressure_kpa kPa gauge
Level level_m m gauge
Temperature temperature_c °C gauge
Battery battery_v V gauge
Signal (RSSI) rssi_dbm dBm gauge
Signal (SNR) snr_db dB gauge
Leak · Burst pipe · Empty pipe · Tamper · Reverse flow · Low battery (event keys) event

The catalogue is data, not code — it is seeded into the database and can grow with new rows, so a new metric doesn’t need a release. The set above is the canonical starter catalogue.

A metric’s kind sets how a stream of raw readings collapses into the single number a chart bucket or KPI shows. You never pick this — it follows from what the metric means:

Kind Aggregates as Why
gauge time-weighted mean An instantaneous level or pressure — averaged over the bucket, weighted by how long each reading held
counter delta A cumulative total (a meter that only ever climbs) — the bucket’s value is how much it rose
state last / duration A discrete condition — the bucket carries the latest state and how long it held
event count A discrete occurrence (a leak flag, a tamper) — the bucket counts how many fired

So a flow gauge over an hour is its time-weighted average; a volume counter over the same hour is the consumption in that hour (end minus start), not the odometer reading. Event metrics also record each occurrence individually, so you can see not just how many leaks fired but when.

Widgets and reports may override the reducer per bucket, but when they don’t, this default is what you get.

Three metrics — battery (battery_v), signal RSSI (rssi_dbm), and signal SNR (snr_db) — describe the sensor’s own health, not the water network. Nereus treats them as diagnostics: they populate the sensor’s health view and drive low-battery / weak-signal warnings, but they never stand in for “the asset’s latest reading”. A reservoir’s headline number is its level, never the voltage of the box bolted to it.

Each asset class also has a primary metric — the headline reading the map and popovers lead with:

Asset class Primary metric
Water meter Flow rate (flow_rate_lpm)
Reservoir Level (level_m)
Pressure point Pressure (pressure_kpa)

A pump station has no fixed primary, so it falls back to its most recent non-diagnostic reading.

642 kPa
Pressure — Valley Pump Station
3.41 V
Battery — diagnostic, not a reading

Each sensor keeps a shadow — a small record of its last uplink time and latest signal/battery snapshot. The shadow starts empty and comes alive when the first uplink lands (which is why a freshly enrolled sensor sits as Commissioned until then).

Nereus watches the gap between now and each sensor’s last-seen time. When that gap grows past the staleness window (a multiple of the device’s expected reporting cadence — roughly 6× cadence), the sensor is stale, and the staleness detector raises an offline alert automatically. This is the one alert nobody authors: it fires on the absence of data rather than a value crossing a threshold.

ReportingOffline — no uplink

When the sensor reports again, its shadow updates and the offline alert resolves. See Alert rules for how the stale comparator fits alongside value-based rules.