Calibration
Real-world sensors drift. A thermometer that reads 0.5°C high relative to a reference, a flow meter that under-reports by 2%, a humidity probe that has aged a few years past its accuracy window. Calibration in ioX-Pulse applies a per-device adjustment so the value users see matches reality, without modifying the device or the profile.
Where to find it: Device detail page -> Fields tab -> Calibrate button on the field row.
How calibration works
Calibration is a linear transform applied to a single field on a single device:
calibrated_value = raw_value × scale + offset
Two parameters: scale and offset. The defaults are scale = 1 and offset = 0, which is the identity transform (no adjustment).
The corrected value is computed when each reading arrives and stored beside the raw reading. Raw telemetry stays unchanged in storage, and every surface reads the stored corrected value; see How computed values are stored.
A few practical examples:
| What you want | scale | offset |
|---|---|---|
| Shift temperature reading down by 0.5°C | 1 | -0.5 |
| Convert a sensor that reports in mV to dBm (mV * 0.01 - 50) | 0.01 | -50 |
| Correct a flow meter under-reporting by 2% | 1.02 | 0 |
| Two-point linear fit (e.g., 0% at raw 100, 100% at raw 900) | 0.125 | -12.5 |
Calibration is per-device, per-field. Two devices using the same profile can have different calibrations. A device can have calibrations on multiple fields independently.
Why per-device, not per-profile?
Calibration corrects for individual device characteristics: manufacturing tolerances, sensor age, installation environment. A profile-level adjustment would shift every device of that type, which isn't what you want.
If a whole batch of devices reads systematically wrong, that's typically a decoder bug or a unit-conversion mistake, not a calibration case. Fix the profile decoder instead of calibrating every device.
Applying a calibration
- Open the device's detail page (click it in the Device List).
- Go to the Fields tab.
- Find the field you want to calibrate. Number fields only; calibration doesn't apply to strings or booleans.
- Click Calibrate on the field row.
- The modal shows:
- Current calibrated value (what users see now).
- Offset input.
- Scale input.
- Live preview:
raw × scale + offset = preview_calibrated_value, updating as you type. - Apply from: how far back stored readings are corrected. Now (the default) corrects new readings only; A date or Earliest reading kept recomputes the stored values from that point on. See Apply from.
- Adjust values until the preview matches your reference reading.
- Save.
Every reading from then on is decoded normally and its corrected value is stored with it. When you chose a date, the stored values from that date on are recomputed in the background, with progress shown on the profile's Fields tab under Recompute history; readings before that date keep the values they had.
Permission required: Partner Admin or Sub-account Admin (for devices in their sub-account).
Two-way semantics
Calibration is two-way: ioX-Pulse always knows both the raw and the calibrated value, and applies the transform consistently wherever the field is used.
| Surface | What's shown / used |
|---|---|
| Device list, Primary/Secondary columns | Calibrated value |
| Device detail page, Fields tab "Latest" column | Calibrated value |
| Charts, history widgets, Analytics and CSV downloads | Calibrated values as stored with each reading, from the apply-from point on; earlier readings keep the values they had |
| Rule conditions (e.g., "temperature > 25") | Calibrated value |
| Set Value override (see below) | You enter the calibrated value you want; ioX-Pulse stores the corresponding raw value |
| Webhooks, the live feed and the API | Raw value under data, calibrated value under derived (see webhooks and endpoints) |
| Audit logs | Raw value (so you have ground truth) |
The implication: when you author a rule that says "alert when temperature > 25", and the user calibrated this device by -0.5°C, the rule compares against the adjusted reading. The user's mental model and the rule's behavior stay in sync.
Removing a calibration
To revert a device to the profile defaults (no transform):
- Open the Calibrate modal for the field.
- Click Remove calibration.
- Choose Apply from and confirm. Now keeps the stored corrected values and shows raw values from the next reading on; a date or the earliest reading kept removes the corrected values from that point on, so those readings show raw again.
ioX-Pulse deletes the calibration record. New readings show the raw decoded value with no adjustment.
You can also remove a calibration by setting scale = 1 and offset = 0 and saving. ioX-Pulse recognizes the identity transform and removes the row automatically.
Manually setting a value (synthetic uplink)
Sometimes you want to inject a value into a device for testing: confirm a rule fires, populate a dashboard while setting up a deployment, simulate a worst-case reading for a demo. Set Value is the tool.
- Device detail page -> Fields tab.
- Find the field. Number fields only.
- Click Set Value.
- Enter the calibrated value you want the device to "appear" to be reading.
- Click Set.
ioX-Pulse:
- Reverses any active calibration to compute the matching raw value.
- Creates a synthetic uplink with that raw value, flagged with
source: manual. - Broadcasts it to live dashboards just like a real uplink.
- Runs the rule engine against it. Rules fire as if the device sent this reading.
Important caveats
Synthetic uplinks count for rule evaluation but not for "last seen" timestamps. A device's last seen time only advances on real uplinks. Set Value doesn't make a device look online when it's actually offline.
Use Set Value carefully on production devices. It runs rules. If you Set Value a temperature to 30°C and you have a rule alerting on > 25°C, that rule fires immediately and emails its notification group. For testing, prefer a dev/test sub-account or a known-test device.
Permission required: Partner Admin or Sub-account Admin.
Two-point calibration (practical recipe)
When you don't know the scale and offset analytically, derive them from two known points.
You have two reference readings:
- At raw value
R1the true value isT1. - At raw value
R2the true value isT2.
Then:
scale = (T2 - T1) / (R2 - R1)
offset = T1 - (scale × R1)
Worked example: a humidity sensor reports raw 100 when the calibrated reference shows 5%, and raw 900 when the reference shows 95%.
scale = (95 - 5) / (900 - 100) = 90 / 800 = 0.1125
offset = 5 - (0.1125 × 100) = 5 - 11.25 = -6.25
So you'd enter scale = 0.1125 and offset = -6.25 in the Calibrate modal.
Frequently asked
A device's calibration looks right in the preview but the device list still shows the old value.
The Device List shows the value stored with the device's latest reading. With Apply from set to Now, that value changes on the device's next reading. To correct the latest reading at once, choose a date that covers it; the stored values are recomputed within a minute or two and the row updates.
Can I see when a calibration was applied?
Yes. Open the device's Events tab and filter by event type. Calibration set/cleared events appear with the user who made the change and the parameters at the time.
What happens to historical data when I add a calibration?
The raw uplink values are always preserved. The corrected value is stored beside each reading from the Apply from point you chose; readings before that point keep the values they had, raw or corrected by an earlier calibration. Removing a calibration works the same way: from the chosen point on, readings show raw again. Nothing is lost either way.
Can I apply different calibrations to different time periods?
In effect, yes. Each calibration applies from the point you choose, and readings before it keep the correction that was in force when they arrived, so a sensor recalibrated every few months carries each period's correction in its history. A device still has one current calibration per field; you cannot schedule a future one.
My field is "battery_percent" and the device reports a raw value in millivolts. Should I use calibration or change the decoder?
Decoder. Calibration is for fine-tuning individual devices, not for unit conversion across an entire product line. Convert in the decoder so every device of that profile reports battery_percent correctly from the start. Use calibration only when this specific device reads systematically off relative to the calibrated decoder output.