Sensor history, charts and status words
How to read a sensor's history charts, choose a date and time range, and what Normal, Warning, Alarm, Stale and Offline mean.
Every sensor has its own page with its history as charts and a set of panels for digging into the numbers. This page explains how to read it, how to pick the time range you want, and what the status words mean.
Opening a sensor's page#
- Open Hubs and choose the hub the sensor is paired to.
- Tap the sensor's card in the sensor list.
The address looks like /hubs/<hub id>/sensors/<sensor id>.
The top of the page#
Across the header you will see a back arrow to the hub, the sensor name, then:
- A pencil icon (Rename sensor) that opens a Rename Sensor box with a Name field, Cancel and Save.
- A green LIVE chip, which appears only after a new reading arrives while you have the page open.
- Watch this sensor, which opens the alert builder already pointed at this sensor.
- Make it a priority (or Priority device if it already is). This button is hidden on plans with no daily alert limit and on plans with no priority-device slots, so you will not see it on every account.
- Export, which opens the Export CSV box.
- A red trash icon, which opens a delete confirmation that also asks what should happen to the sensor's recorded history.
On a sensor added in the last 14 days that no alert watches yet, a card sits under the header: the sensor's name followed by "added - want the usual alerts?", with up to two one-tap suggestions and a Not now button. Taking a suggestion opens the alert builder with it filled in. Not now, or the X in the corner, retires the card for that sensor for good.
Under the header, one tile per measure shows a value with the measure name below it in capitals, for example TEMPERATURE or HUMIDITY. These tiles use your preferred units. Fahrenheit and psi are the defaults.
The tiles are drawn from the readings loaded for the range you have chosen, and they follow the oldest reading in that range rather than the newest. Switching between 1h, 6h, 24h and 7d therefore changes the numbers on the tiles. For the newest stored value, read the right-hand end of the chart below.
If a reading arrives while you have the page open, the tiles switch to that reading and the LIVE chip appears. From then on the tiles stay on the live reading and stop following the range you pick, until you leave the page and come back.
If the hub was shared with you rather than owned by you, you can read everything on this page, but renaming, deleting and saving calibration offsets are not yours to do: the box stays open and the change is not saved.
History and the charts#
The History panel draws one chart per measure, so a battery sitting at 13.7 V gets its own tight scale instead of being flattened against a temperature line.
What you will see:
- A row of chips, one per measure that appears in the loaded readings, labelled with the stored unit: Temperature (°C), Humidity (%), Voltage (V), Battery (%), and so on. Tap a chip to hide or show that chart. Your choice is remembered in this browser for this sensor. If you turn every chip off, all the charts come back rather than leaving an empty panel.
- The horizontal axis is labelled with the time of day on a 24-hour clock, so on a multi-day range the same labels repeat once per day.
- The vertical axis is fitted closely to the data rather than starting at zero, so small movements stay visible.
- Hover or tap a point on a line to see the value.
Units on the charts#
The charts plot the value exactly as the sensor stored it, and the chart title carries that stored unit. Temperature is stored in °C and pressure in psi.
So on a fridge sensor whose stored reading is 4 °C, with the default Fahrenheit preference:
- The tile for that reading reads 39.2 °F.
- The chart is titled Temperature (°C) and its line sits at about 4.
The tiles and the Statistics panel follow your unit preference. The charts use the stored units and say so in the title. The Anomalies chips, the Aggregated Readings table and the CSV export all show the stored numbers, with no unit printed next to them.
Choosing the time range#
The buttons on the right of the History heading are 1h, 6h, 24h, 7d and Custom.
The four quick buttons load a fixed number of the most recent readings, sized for a sensor that reports every 5 minutes: 12 readings for 1h, 72 for 6h, 288 for 24h and 2016 for 7d. They do not cut off at an exact clock time. Look at Polling in the Sensor Info panel at the bottom of the page to see how often this sensor reports. A sensor set to 900s reports every 15 minutes, so its 1h view actually covers about three hours.
Use Custom when you need an exact window.
Setting a custom range#
- Tap Custom. Two fields appear, From and To, with an Apply button. Until you apply something, the chart area reads "Choose a start and end, then Apply", with "Type a date and time (12h or 24h clock) or use the calendar picker" underneath.
- Type a date and time into each field, or tap the calendar icon (Pick date & time) to use your browser's own picker.
- Tap Apply.
When you leave a field, or press Enter in it, the text is read and rewritten into one standard form so you can see exactly what will be queried, for example 2026-08-14 7:30 PM.
What you can type#
Both the 12-hour and 24-hour clock are accepted, and the year is optional:
| You type | It becomes |
|---|---|
2026-08-14 19:30 | 2026-08-14 7:30 PM |
8/14/2026 7:30 pm | 2026-08-14 7:30 PM |
8/14 7:30 PM | 2026-08-14 7:30 PM (this year) |
8/14/26 7:30 PM | 2026-08-14 7:30 PM |
8/14 7:30 | 2026-08-14 7:30 AM (with no AM or PM the hour is taken as written) |
2026-08-14 | 2026-08-14 12:00 AM (start of that day) |
14:00 | today at 2:00 PM |
12:00 AM | midnight |
12:00 PM | noon |
2026-08-14 19:30 AM | 2026-08-14 7:30 PM (the hour digits win, the AM is dropped) |
Dates that do not exist are refused rather than shifted. 2026-02-30, 2026-13-01, 25:00 and 10:75 all fail, and so does 2026-02-29, because 2026 is not a leap year. When the text cannot be read, the field turns red and shows "Couldn't read that - try e.g. 2026-08-14 7:30 PM", and that end of the range is cleared, so Apply will then ask you to enter both a start and an end.
What Apply tells you#
- If you leave one of the fields empty: "Enter both a start and an end."
- If the range works out empty, because the two are the same moment or because both of them are in the future: "That range is empty - the end must come after the start."
- If you enter them the wrong way round, they are swapped for you and the note reads "Adjusted: start was after end - swapped."
- If the end is in the future, it is pulled back to the current time and the note reads "Adjusted: end was in the future - clamped to now." The To field is rewritten to that time.
A worked example#
You want to see whether the fridge warmed up overnight.
- Tap Custom.
- In From, type
8/14 7:30 pm. When you tab out it becomes2026-08-14 7:30 PM. - In To, type
8/15 6 am. It becomes2026-08-15 6:00 AM. - Tap Apply.
The charts redraw for that overnight window. If you had typed 8/20 6 am in To by mistake, the field would come back as the current date and time with the note "Adjusted: end was in the future - clamped to now."
A custom range loads up to 5000 readings, taking the most recent ones inside the window. If you pick a very long window on a busy sensor, the oldest part of it can be missing from the chart. Narrow the window if that happens.
Switching back to a quick button leaves your custom window remembered, so tapping Custom again returns to it. Tapping Apply again reloads it.
When the chart is empty#
- "No readings yet for this period" with "Data will appear here once the sensor starts reporting" means the sensor has nothing stored in that range. Try a wider range, and check the status words below.
- "No numeric measures to chart" means the readings that came back hold nothing that can be plotted.
When a live reading lands mid-view#
If a reading arrives over the live connection while you are looking at a past range, it is added to the chart and the LIVE chip appears. At the same moment the chart is trimmed to 288 readings, and the ones it keeps are the oldest in the window you loaded, so on 7d or a wide custom range most of what you were looking at drops off the chart.
To get your window back: on a custom range, tap Apply again. On a quick range, tap a different range button and then tap yours again, because tapping the button that is already selected does nothing.
Statistics#
The Statistics panel shows Min, Avg and Max for each measure, with the number of readings it used in the heading, for example Statistics (2014 readings).
The buttons 24h, 7 days, 30 days and All choose the period. This choice is saved on the sensor, so the same sensor opens with the same window on your phone and your laptop. Different sensors can have different windows.
A few things to know:
- The figures use at most the 10,000 most recent readings in the period, so on a very long history the All window reflects the recent part of it.
- If there is nothing in the period, the panel reads "No readings in this window."
- On a hub that was shared with you, the window still changes what you are looking at, but it is not saved for next time.
Export CSV#
Both Export in the header and Export CSV in the History panel open the same box. It has Start Date and End Date pickers, Cancel and Download CSV buttons, and the note "Optionally filter by date range. Leave blank to export all readings."
The file downloads as sensor_<first 8 characters of the sensor id>_readings.csv. Its columns are timestamp, sensor_id, unit, signal_strength, and then one column per measure named with the measure's key, such as temperature_c or humidity_pct. Rows run newest first. Values are the stored ones, not converted to your preferred units, and the file holds up to the 10,000 most recent readings in the range you chose, even when you leave both dates blank.
The dates here are set with your browser's own picker. The forgiving typing described above belongs to the From and To fields in History.
The other panels#
Anomalies lists readings that sit unusually far from that sensor's own average. Days sets how far back it looks and accepts 1 to 90; σ threshold sets how far from average counts and accepts 0.5 to 5. The panel reloads by itself whenever you change either number, and Refresh runs it again. Each result is a chip like Temperature: 31.4, showing the stored number. At most 30 chips are drawn, with "+N more" after them. Tapping a chip opens the alert builder prefilled with the boundary the reading crossed, converted into your preferred unit, so the number in the builder will not match the number on the chip when the two units differ. When there is nothing to show it reads "No anomalies detected." If the panel cannot load it says "Failed to load anomalies." with a Retry button.
Aggregated Readings groups history into buckets of 15m, 1h, 6h or 1d over the number of Days you set, and shows Bucket, Avg, Min, Max and Count for each measure, under a heading giving the measure's key and how many buckets it has. Metric (opt.) narrows it to one measure and takes the measure key, the same name used as a column heading in the CSV export, for example temperature_c. The panel reloads on its own as soon as you change any of these, and Apply reloads it again. The table lists the first 20 buckets per measure, then "… N more buckets". With nothing to show it reads "No aggregated data for the selected range."
The times in the Bucket column are in UTC rather than your own clock, so unless you are on UTC they will not line up with the times on the charts. Take the bucket rows as a shape, and read the charts for when something happened.
Calibration Offsets lets you record a number to add to a measure. + Add takes a New metric key and an Offset value and adds a row; each row then shows a read-only Metric key, an editable Offset and a Remove button, and Save stores the lot. With nothing set it reads "No offsets set."
Offsets you save here do not change anything you can see. The tiles, the charts, the Statistics, Anomalies and Aggregated Readings panels, the CSV export and your alerts all keep using the raw stored values. Nothing in the app reads the offsets back, so treat this panel as a note to yourself rather than a correction. If a sensor reads consistently wrong, calibrate it in the hub's own screens or in the manufacturer's app instead.
Sensor Info at the bottom lists Type, MAC, Status, Signal and Polling. Signal is the last radio strength in dBm, or - if the hub has not reported one, and Polling is the interval in seconds, such as 900s. Status here is the raw connection word your hub last reported: connected, disconnected, error, or unknown if it has never reported one.
Normal, Warning, Alarm, Stale and Offline#
The app uses five status pills. Each one is drawn as a shape followed by a word, so you can tell them apart without relying on colour:
| Pill | Meaning |
|---|---|
| ● Normal | Nothing wrong. |
| ▲ Warning | Something needs a look. |
| ◆ Critical | Something is wrong. |
| ○ Offline | Nothing is reaching us. Drawn with a dashed outline, because a gap in data is not a danger. |
| ◷ Stale | We are connected, but no fresh reading has arrived. Also drawn with a dashed outline. |
Where you see them for a sensor. The sensor cards on your hub's page carry one of these pills. For a sensor it is worked out like this:
- Offline if your hub last reported the sensor as disconnected, and also if the hub has never reported anything about it at all. If the hub cannot reach a sensor five times in a row, it rebuilds the connection and reports it as disconnected rather than leaving it looking connected, so a sensor that has wandered out of range or lost its battery ends up here.
- Critical if your hub reported an error for that sensor.
- Stale if the sensor is connected but its last reading is more than 30 minutes old.
- Normal otherwise.
A sensor card never shows Warning on its own, because a sensor is either reporting or not. Warning belongs to alerts.
Where Alarm comes in. Alerts have their own three levels: Just log it ·, Warning ▲ and Alarm ◆. Alarm is the top level, the one you set for the thing you want to be woken up for, and it is what you choose in the alert builder and see on the Alerts page. The Recent Alerts list on the Dashboard shows the stored wording for the same level, Critical. They mean the same thing.
Stale is a note, not an alarm. When a sensor goes quiet, your Dashboard shows a line such as "Fridge has been quiet for over 30 min - probably fine, just no signal", with a Stale pill next to it. It never becomes a full-width banner and it never takes over the screen. Losing a signal is a situation, not a danger.
What to do if#
The sensor says Stale. Give it a few minutes. Bluetooth sensors miss the occasional reading, especially at the edge of range or through a wall or a fridge door. If it stays Stale for hours, move the sensor closer to the hub, or check its battery. Watch the Battery (%) chart on this page if the sensor reports one.
The sensor says Offline. The hub has stopped being able to reach it. Check that the sensor still has power, that it is within range, and that nothing else, such as a phone app from the sensor's own manufacturer, is holding a connection to it. Once the hub gets a reading again the sensor returns to Normal by itself.
Everything is Offline or Stale at once. Check the hub itself on the Hubs page. If the hub is offline, no readings are reaching us from any sensor and your Dashboard will say so.
The charts are empty but the sensor is Normal. A sensor that has only just been added has no history yet. Wait for a couple of reporting intervals, and check Polling in Sensor Info to see how long that is.
My custom range shows nothing. Confirm the range is in the past and that the sensor was reporting then. If the window is very long, narrow it, since only the most recent 5000 readings inside a window are loaded.
The tile at the top does not match the end of the chart. It will not: the tiles follow the oldest reading in the range you have loaded, and the chart's right-hand end is the newest one. Read the chart for the current value.
The chart says °C but I want °F. The charts always use stored units, and there is no setting on this page that changes them. The tiles at the top of the page and the Statistics panel do follow your unit preference, which is set in the Measurement Units section of your hub's own settings screen and syncs up from there.
I set a calibration offset and nothing moved. That is expected. Saved offsets are stored but never applied to anything the app shows you.