Home Assistant Viatom Oximeter Integration
Find a file
2026-11-04 13:06:26 -05:00
assets Add Viatom Oximeter integration for SleepImage PO6 over Bluetooth 2026-11-04 11:58:19 -05:00
custom_components Stop reconnecting to a released PO6 so it can switch off 2026-11-04 13:06:26 -05:00
tests Stop reconnecting to a released PO6 so it can switch off 2026-11-04 13:06:26 -05:00
.gitignore Add Viatom Oximeter integration for SleepImage PO6 over Bluetooth 2026-11-04 11:58:19 -05:00
hacs.json Add Viatom Oximeter integration for SleepImage PO6 over Bluetooth 2026-11-04 11:58:19 -05:00
LICENSE Add Viatom Oximeter integration for SleepImage PO6 over Bluetooth 2026-11-04 11:58:19 -05:00
pyproject.toml Add Viatom Oximeter integration for SleepImage PO6 over Bluetooth 2026-11-04 11:58:19 -05:00
README.md Stop reconnecting to a released PO6 so it can switch off 2026-11-04 13:06:26 -05:00

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

  1. Copy custom_components/viatom_oximeter into your Home Assistant config/custom_components/ folder (or add this repo to HACS as a custom repository).
  2. Restart Home Assistant.
  3. Put a finger in the PO6 to switch it on. It advertises as SI PO6 0042, where 0042 is 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.