Readings that cross a line, devices that go quiet.
Keep a running total for every sensor, machine and gateway, rolled up to its site and region. Aggrelis tells your systems when readings stay over a limit, and when a device stops reporting at all.
watching
watching
watching
The questions this answers
Typical questions, each with the window it usually looks at. Thresholds are starting points you set yourself.
- Over a limit, for a while
How many readings above 8 °C did this container have, and what was the highest?
rolling 30 minutes - Gone silent
Which devices have sent no heartbeat for 10 minutes?
no event for 10 minutes - Errors per site
Which site, and which region, has the most device errors this hour?
rolling 1 hour, device → site → region - Failing firmware
How many different devices on this firmware version reported errors?
rolling 24 hours, distinct devices - Energy per local day
How many kilowatt-hours did this meter use today, against its daily cap?
calendar day, building's time zone - Off its own norm
Is this machine's vibration far outside its own last seven days?
rolling 7 days, standard deviation
Open a ticket when a gateway goes quiet
A gateway in a cold store stops sending heartbeats. Ten minutes later Aggrelis pushes a signed webhook to your on-call tool, with the last heartbeat and the errors across the gateway's site, so on-call can tell one dead device from a site in trouble. Nothing has to poll.
- Send a heartbeat from each gateway, and each error it reports
- Define heartbeats per gateway, errors rolled up to the site, and a trigger that fires after 10 minutes of silence
- Be told: the trigger pushes the answer as a signed webhook
- Act: open a ticket for one silent gateway, page on-call when its site is failing too
{
"id": "hb_gw17_1029",
"type": "heartbeat",
"ts": "2026-10-22T10:12:41Z",
"attrs": {
"gateway_id": "gw_17",
"firmware": "fw-4.2.1"
}
}{
"name": "gateway_health",
"description": "Is this gateway alive, and its site healthy?",
"spec": {
"entity": "gateway",
"features": {
"heartbeats15m": {"state": "heartbeats_by_gateway",
"window": {"rolling": "15m"}},
"lastHeartbeatAt": {"state": "heartbeats_by_gateway",
"window": "lifetime", "select": "last"},
"siteErrors1h": {"state": "errors_by_gateway",
"path": "gateway_at", "window": {"rolling": "1h"}}
},
"reasons": [
{"name": "gone_silent",
"when": "now - lastHeartbeatAt > duration('10m')"},
{"name": "site_degraded", "when": "siteErrors1h >= 10"}
],
"triggers": [
{"name": "silent", "on": "heartbeat", "absent": "10m"}
]
}
}{
"type": "trigger.result",
"timestamp": "2026-10-22T10:22:44.208113402Z",
"data": {
"trigger": "silent",
"profile": "gateway_health",
"timing": "absence",
"status": "ok",
"entity": {"type": "gateway", "id": "gw_17"},
"values": {
"heartbeats15m": 5,
"lastHeartbeatAt": "2026-10-22T10:12:41Z",
"siteErrors1h": 14
},
"reasons": ["gone_silent", "site_degraded"],
"event": {"id": "hb_gw17_1029", "type": "heartbeat",
"ts": "2026-10-22T10:12:41Z"},
"profileVersion": "gateway_health@v1"
}
}The parts of Aggrelis behind it
Nothing built for one industry: the same building blocks, configured for this job.
- Filters and maximums
Count only the readings over a limit, and keep the highest one per window.
- Device → site → region
One error counts for the device, its site and its region at once.
- Absence triggers
Fire when a device sends nothing for a time you choose, from one minute to 30 days.
- Signed webhooks
Results reach your on-call or ticketing tool, signed to the Standard Webhooks spec, or a stream you read.
- Local days, exact units
Energy per calendar day in each building's time zone, kept as exact decimals.
- Change without a release
Operations adjust limits in the workspace and test them on recent readings first.
Your first live numbers, configured not coded
Tell us what you would count first, and we'll help you set it up.