- Python 100%
| assets | ||
| custom_components | ||
| tests | ||
| .gitignore | ||
| hacs.json | ||
| LICENSE | ||
| pyproject.toml | ||
| README.md | ||
Viatom Oximeter for Home Assistant
Live SpO2, pulse rate and perfusion index from the SleepImage PO6 fingertip oximeter, over a local Bluetooth adapter or ESPHome Bluetooth proxies.
The PO6 is made by Viatom (FCC ID 2ADXK-4708) and speaks the same BLE protocol as Viatom's other PO-family devices (Wellue O2Ring, KidsO2, Checkme O2), so those will probably work too.
Install
- Copy
custom_components/viatom_oximeterinto your Home Assistantconfig/custom_components/folder (or add this repo to HACS as a custom repository). - Restart Home Assistant.
- Put a finger in the PO6 to switch it on. It advertises as
SI PO6 0042, where0042is the device ID you registered in the SleepImage app, and is discovered automatically under that name. Otherwise add Viatom Oximeter from Settings → Devices & services → Add integration.
Requires Home Assistant 2025.2 or newer. The integration icon (in brand/)
shows from Home Assistant 2026.3; older versions show a placeholder. The
frontend caches brand images for up to a day, so if the placeholder stays
after installing or updating, hard-refresh the browser (Ctrl+Shift+R). The
icon's source is assets/icon.svg.
Bluetooth proxies
The PO6 needs an active connection, not just passive advertisements, so proxies must have active connections enabled:
esp32_ble_tracker:
scan_parameters:
active: true
bluetooth_proxy:
active: true
Each connected PO6 holds one of the proxy's connection slots (three by default) for as long as it is on a finger.
Entities
| Entity | Notes |
|---|---|
| SpO2 (%) | unknown while acquiring signal or with no finger |
| Pulse rate (bpm) | |
| Perfusion index (%) | |
| Motion | Raw movement intensity, 0–255; unknown with no finger |
| Battery (%) | Keeps its last value after the device switches off |
| Finger detected | |
| Charging | |
| Connectivity | Whether Home Assistant currently holds the connection |
| Live monitoring (switch) | Turn off to release the device for the SleepImage app |
Live values are unavailable whenever the device is off. The PO6 only powers on while a finger is in the sensor, so this is normal.
The PO6 stays awake while something is connected to it, even with no finger in. So once the finger has been out for 30 seconds, Home Assistant lets go of it and leaves it alone until it has switched itself off. When you put your finger back in, it reconnects within about 10 seconds.
If the finger goes back in before the PO6 has switched off, Home Assistant only notices at its next check-up. Check-ups are 1, 2, 4 and 8 minutes apart, then every 10 minutes, and each lets go again at once if there's still no finger. To connect straight away, turn Live monitoring off and on again.
The poll interval (default 2 s) can be changed under the integration's Configure button.
Using it alongside the SleepImage app
The PO6 accepts one Bluetooth connection at a time. While Home Assistant is connected, the SleepImage app can't record a study, and vice versa. Turn off the Live monitoring switch before a recording night, or automate it, for example by switching it off at bedtime on nights you record.
Status and caveats
The protocol was worked out from open-source readers for other Viatom devices (ecostech/viatom-ble, MackeyStingray/o2r). It has not yet been checked against a real SleepImage PO6. In particular:
- perfusion index is assumed to be reported in tenths of a percent;
- SleepImage-branded firmware could differ from Wellue/Viatom firmware.
A quick check after the first connection: if the device page shows a serial
number ending in your device ID (e.g. …0042), the info command is working.
If something looks wrong, download diagnostics from the device page. They include the GATT table, the advertisement and the last 50 raw response frames, which is enough to fix the decoding. For a live trace, enable debug logging:
logger:
logs:
custom_components.viatom_oximeter: debug
Development
pip install pytest-homeassistant-custom-component
pytest
protocol.py has no Home Assistant dependencies and can be reused on its
own.
License
MIT, see LICENSE.