Skip to content

Rule metrics ​

Every quantity a rule condition can test, what it means, its unit, and which operators it accepts.

Read out of the platform

This page is generated from the code that runs your instance, so it cannot drift from what the platform actually does.

A rule is when this metric compares like this to that value, do these actions. This page is the left-hand side of that sentence. You pick it from a dropdown in the rule builder (/admin/manage/rule/create), so you never have to type these names — but the AI rule builder and the API do take them literally, and the exact spelling matters there.

Two things decide whether a rule can fire at all: whether the metric has a value for the scope you chose, and how fresh that value is. Both are in the tables below.

Computed live, when the rule runs ​

Rules are evaluated every minute. These metrics are worked out at that moment from the live position, occupancy or utilisation services, so what a rule sees is what the Right Now page would show you — there is no rollup delay.

MetricWhat it meansUnitOperators
anomaly_eventDevice anomaly detected — Anomaly detection flagged a device (an event, real-time only). value is the type: any, silent, frequency_drop, frequency_spike, rssi_drop, battery_drain, config. Scope a device, label, entity or a place.—equal, not_equal, contains
energy_today_kwhEnergy Used Today — Net energy since local midnight, in kWh, over the meters in scope: the top-level consumption meters (a sub-meter whose parent meter is also in scope is not added again) minus the meters marked as generating power. Negative when the site exported more than it used. A scope of only generating meters gives what they generated, as a positive number. The delta, not the meter reading - the meter only ever rises, so a rule on it would fire once and then for ever. Resets daily, which is what makes a threshold mean something. Use for "this floor has already used more today than it usually does".kWhequal, not_equal, less_than, greater_than, between
entity_fieldLabel field (person / asset) — A label field on a person or asset (the Label Fields button on the Entity page). field = the field key. A date field is read as days from today, negative once passed ("due within 7 days" = less_than 8). Entity or label (tag) scope; trigger_type "scheduled" (1440 = daily).—equal, not_equal, less_than, greater_than, between, contains
fall_detectedFall / man-down detected — A worn tag fell or has stopped moving (an event: value "fall" or "man_down"). Real-time trigger; scope to one device, a label or a person / asset. Quiet in rest places. Needs Fall detection on under System > Config.—equal, not_equal, contains
footfall_todayFootfall Today (people so far) — People heard in the place today so far (since local midnight; tags people carry, fixed sensors left out), each once however often they came back - the Footfall report's distinct daily count. Location, venue or zone scope; trigger_type must be "scheduled" (60 is plenty: it moves with the hourly roll-up, so it can be up to about an hour behind). Not computed on a day the place's gateways sent nothing (an outage is not an empty building). Use for "tell me when more than 200 people have come in today": footfall_today greater_than 200.paxgreater_than, less_than, between
footfall_vs_usualFootfall vs Usual (% of a normal day so far) — Today so far as a percent of a normal day for this weekday up to the same hour: the hour-by-hour presence (people heard in each complete hour, added up) today, against the average of the same hours on the last 4 same weekdays. 100 = a normal day, 150 = half as busy again, 50 = half as busy. Compares hour-by-hour presence, not distinct people: someone there for three hours counts three times on both sides. Location, venue or zone scope; trigger_type must be "scheduled". Not computed before the first complete hour of the day, on a day with no or too little data, or when the past weekdays had no data or nobody. Use for "this floor is unusually busy/quiet today": footfall_vs_usual greater_than 150, or less_than 50.%greater_than, less_than, between
gateway_statusGateway status — A gateway stopped (value "offline") or started again ("online") reporting; fires once per change. Scope a gateway for one, or a venue or location for any gateway in it. Works scheduled too (the current status).—equal, not_equal, contains
geofence_eventGeofence entered / left (GPS) — A tag with GPS (a tracker, or one an Omaya Scout phone places) entered or left a geofence (an event: value "entered" or "left"). Scope the rule to the geofence for any tracker, or to one device for any geofence.—equal, not_equal, contains
home_zone_statusHome Zone Status — Whether a tag is in its assigned home zone.—equal, not_equal, contains
incident_eventSecurity Watch incident — Security Watch opened an incident in a place: value "opened" (event, real-time only). Location, venue or zone scope.—equal
most_inside_pct_capacityMost Inside Today (% of capacity) — The most people inside at once today, from the door counters (entries minus exits, hour by hour since local midnight), as a percent of the place's capacity (a venue's own capacity or its zones' sum; a zone's capacity; a location only when every venue in it has one). Location, venue or zone scope; trigger_type must be "scheduled". Only for places with a door counter and a capacity. Use for "we got close to capacity today": most_inside_pct_capacity greater_than 90.%greater_than, less_than, between
outside_minTime outside (GPS) — Minutes a person or asset has been outside (GPS took over from the gateways), all their tags together. Device, label (tag) or entity scope; checked every minute, fires once each time they are out that long. Use for "tell me when anyone in Field team has been out more than 2 hours": scope_type tag, outside_min greater_than 120.mingreater_than
people_countPeople Count — How many people are in the zone, venue or location right now (fused radar, counting-sensor and tag count, refreshed every minute), not a running total. Use for occupancy: people_count greater_than 0 means someone is there.paxequal, not_equal, less_than, greater_than, between
place_eventEntered / left a place — A tag was confirmed in a new room: value "entered" or "left" (an event; real-time only). On a zone, venue or location scope the place is the scope itself. On a device, label (tag) or entity scope, set the condition's field to the place as "zone:" + the zone uid, "venue:" + the venue uid or "location:" + the location uid. Use for "tell me when any Tools item leaves Level 5": scope_type tag with the Tools label uid, place_event equal left, field "venue:" + the Level 5 venue uid. A tag that goes silent has not left; use device_status offline for that.—equal
power_wPower Draw Now — Net electrical draw right now in watts over the meters in scope: the top-level consumption meters (a sub-meter whose parent meter is also in scope is not added again) minus the meters marked as generating power (solar, a generator). Negative when the site is exporting. A scope of only generating meters gives their output as a positive number. Only counts a reading from the last 15 minutes, so a meter that has stopped reporting has no value rather than zero and "below X" never fires on a dead meter.Wequal, not_equal, less_than, greater_than, between
quiet_outside_minNot heard while outside (GPS) — Minutes with nothing heard from a person or asset (no GPS fix, no gateway) when the last thing heard put them outside: a lone-worker check. Not when they were last at home. Device, label (tag) or entity scope; fires once per silence. Use: quiet_outside_min greater_than 30.mingreater_than
radar_dwellArea Occupied For (radar) — Minutes the zone has been continuously occupied according to the radar. Zone-scoped. Use for loitering: radar_dwell greater_than 10.minequal, not_equal, less_than, greater_than, between
radar_peoplePeople in Area (radar) — People a position radar sees inside the zone right now. Zone-scoped; the zone can be a room with a calibrated radar or a smaller area drawn inside it (a door area, a restricted corner).paxequal, not_equal, less_than, greater_than, between
radar_vacantArea Empty For (radar) — Minutes the zone has been continuously empty according to the radar. Zone-scoped. Use to switch things off after people leave: radar_vacant greater_than 9 with a home_assistant action. Operators are equal, not_equal, less_than, greater_than, between, contains; for "at least N" write greater_than N-1.minequal, not_equal, less_than, greater_than, between
room_next_booking_minMinutes Until Next Booking (meeting room) — Minutes until the room's next Meeting Room booking: 0 while one is running (a sensor-detected walk-in counts), 1440 when nothing is booked within a day. Zone-scoped; only rooms the Meeting Room app books. Pair with radar_vacant (or people_count equal 0) before switching a room off, so it is not cooled down and switched off minutes before a meeting: radar_vacant greater_than 9 AND room_next_booking_min greater_than 14 -> climate.turn_off.minequal, not_equal, less_than, greater_than, between
sensor_fieldSensor reading (any field) ——equal, not_equal, less_than, greater_than, between, contains, becomes, changes
speed_kmhSpeed (GPS) — Speed in km/h at the latest GPS fix in the last 10 minutes (the tracker's own figure, or worked out from its previous fix). Device, label (tag) or entity scope; fires once per stretch outside. Use for speeding: speed_kmh greater_than 90.km/hgreater_than, between
stopped_outside_minStopped outside a geofence (GPS) — Minutes a person or asset has been stopped in one spot that is not inside any geofence (0 while moving or inside a geofence). Never counts a person stopped at their home. Device, label (tag) or entity scope; fires once per stop. Use for an unplanned stop: stopped_outside_min greater_than 20.mingreater_than
visitor_eventVisitor event ——equal, not_equal, contains
wifi_eventWi-Fi sign-in (Kiwire) — A guest signed in to the Wi-Fi in a place: value "signed_in" (event, real-time only, from the Kiwire connector). Location, venue or zone scope; the Kiwire zone must be mapped to an Omaya zone.—equal
work_order_eventWork order opened / resolved — A work order was "opened" or "resolved" in a place (event, real-time only). Location, venue or zone scope; a location also hears work orders tied to no room.—equal
zone_densityZone Density (pax / 100 sqft) — People per 100 square feet in a zone, so the threshold means the same thing in a small room and a big one.pax/100ft²equal, not_equal, less_than, greater_than, between
zone_hours_at_capacityHours at Capacity, last 7 days — Operating hours in the last 7 days the zone was at or over its capacity. Zone-scoped; needs a capacity set on the zone. Use for "this room is too small": zone_hours_at_capacity greater_than 5.hequal, not_equal, less_than, greater_than, between
zone_utilisationUtilisation, last 7 days (% of operating hours occupied) — Share of the venue's operating hours the zone was occupied over the last 7 days, in percent (0-100), from the Space Utilisation report. Zone-scoped; only zones something counts people in get a value. Use for "tell me when a room is underused": zone_utilisation less_than 25. For a weekly note rather than a daily nag, set active_days to one day (e.g. ["mon"]) and action_every to 86400 - one day is the longest cooldown a rule allows.%equal, not_equal, less_than, greater_than, between

Read from the report tables ​

These come from the rolled-up report tables. Packets are rolled up every five minutes, so a rule on one of these can lag real life by up to about that long. That is the right trade for "temperature above 30 for an hour" and the wrong one for "someone just walked into the server room" — for the second, use a live metric above.

MetricWhat it meansUnitOperators
battery_levelBattery Level — Remaining battery, percent. Low values mean a device needs attention.%equal, not_equal, less_than, greater_than, between
button_pressedButton Pressed — A panic or call button was pressed.—equal, not_equal, contains
custom_fieldCustom Field — A tenant-defined field. Avoid unless the admin names it.—equal, not_equal, less_than, greater_than
device_statusDevice Status — Whether a device is reporting. Compare with "online" or "offline".—equal, not_equal, contains
distanceDistance — Distance in metres.mequal, not_equal, less_than, greater_than, between
dwell_timeDwell Time — How long a visit lasted, in minutes.minequal, not_equal, less_than, greater_than, between
enter_countEntry Count — Entries counted so far today at the scope; a running daily total, not a rate.paxequal, not_equal, less_than, greater_than, between
exit_countExit Count — Exits counted so far today at the scope; a running daily total, not a rate.paxequal, not_equal, less_than, greater_than, between
humidityHumidity — Relative humidity, percent.%equal, not_equal, less_than, greater_than, between
noiseNoise Level — Sound level in dBA.dBequal, not_equal, less_than, greater_than, between
rssiRSSI — Signal strength in dBm. Values are negative; -90 is weaker than -60.dBmequal, not_equal, less_than, greater_than, between
temperatureTemperature — Temperature reading in °C.°Cequal, not_equal, less_than, greater_than, between

Metrics that compare to a word, not a number ​

Most metrics take a number. These take one of a fixed set of values, offered as a dropdown in the builder. Anything else is rejected.

MetricAccepted values
device_statusonline, offline, stale
button_pressedpressed, single_click, double_click, triple_click, long_press, sos, alert, man_down, not_pressed
home_zone_statusin_home, not_in_home, no_home_set, unmapped
visitor_eventregistered, approved, denied, checked_in, checked_out, cancelled, badge_changed
geofence_evententered, left
fall_detectedfall, man_down
place_evententered, left
gateway_statusoffline, online
anomaly_eventany, silent, frequency_drop, frequency_spike, rssi_drop, battery_drain, config
work_order_eventopened, resolved
incident_eventopened
wifi_eventsigned_in

Operators ​

OperatorSymbolMeans
equal=Equal to
not_equal≠Not equal to
less_than<Less than
greater_than>Greater than
between↔Between
contains∋Contains
becomes→Becomes (changes to)
changesΔChanges (any change)

between is inclusive and needs a second value (value_max). contains is a substring match and only applies to the word-valued metrics above.

There is no greater_or_equal. For "at least 10 people", write greater_than 9 — the values these metrics carry are whole numbers, so the two say the same thing.

Last updated:

Omaya platform documentation