Oral-B iO10 / iO Sense – Limited Data Available in Home Assistant Compared to App

Hi all,

I recently upgraded from an older Oral-B model to the Oral-B iO10 with iO Sense charger, expecting improved Home Assistant integration and access to more brushing metrics.

The official Home Assistant Oral-B integration successfully discovers the toothbrush and exposes the following entities:

  • Status (charging, selection_menu, etc.)
  • Battery level
  • Brushing mode
  • Pressure state
  • Number of sectors

However, the most interesting data available in the Oral-B app does not appear to be exposed through Home Assistant:

  • Brushing session duration
  • Coverage / brushing zone completion
  • Detailed sector progress
  • Pressure statistics
  • Historical brushing results
  • Coverage percentages (Inside / Outside / Chewing surfaces)

In the Oral-B app these metrics are available immediately after brushing, but Home Assistant only seems to receive a limited subset of information.

My questions are:

  1. Is this a limitation of the current BLE decoder?
  2. Does the iO10 expose additional data that is currently not parsed by Home Assistant?
  3. Is any data available through the iO Sense WiFi charger or Oral-B cloud APIs?
  4. Would support for iO10/iO Sense be a useful future enhancement for the Oral-B integration?

I'd be happy to assist with testing and provide BLE advertisements, logs, or packet captures if needed.

Thanks for all the work on the integration.

Note:
Model: Oral-B iO10
Home Assistant OS
Core: 2026.6.0
Supervisor: 2026.05.1
OS: 17.3
Frontend: 20260527.4
Bluetooth integration: Official Oral-B integration
Observed entities:

  • status
  • battery
  • brushing mode
  • pressure
  • number_of_sectors

Missing:

  • session duration
  • coverage
  • zone statistics
  • pressure history

I’m having the same issue with the io9 limited edition, which also has the iSense charger. This is quite unfortunate to be missing duration.

Have you Installed the Toothbrush Card in HACS

Per, Am I missing something?

If the toothbrush does not expose the following data:

Brushing session duration, coverage / brushing zone completion, detailed sector progress, pressure statistics, historical brushing results, and coverage percentages for inside, outside and chewing surfaces.

Then how would another card make a difference?

The data never reaches Home Assistant. If the data was available in HA, then it would make sense to use the custom card.

@Robert_it I hit the same thing on an iO Series 10 and spent a while digging into it with a
BLE sniffer. Short version: it’s not a decoder limitation, the brush simply stopped
broadcasting during sessions on recent firmware.

What I measured: while the motor runs, the brush sends no advertisements at all.
Three receivers (ESPHome proxy at -66 dBm, a Shelly scanner, and the host adapter),
phone Bluetooth off, iO Sense unplugged — silence for the whole session, then a
single post-session advertisement carrying the final duration. That’s why the
official integration shows a timer stuck at 0 that jumps at the end, and pressure
frozen at whatever it read before you started.

The data still exists, it just moved to GATT notifications, which need an active
connection:

ff08 brushing time [minutes, seconds], 1 Hz while running
ff0b pressure (0 low, 1 normal, 2 high)
ff09 quadrant
ff07 mode
ff04 state
ff05 status blob, byte 0 = battery %

No pairing or bonding needed — an anonymous connection is accepted.

Two traps if you go looking yourself: ff06 looks like it should be pressure but is
actually the button state (it reads 00 00 00 00 no matter how hard you press), and
the ff80 service is the firmware update channel, not session data.

On the app’s extra metrics (coverage, history): I couldn’t get those. ff29 holds a
session record with a timestamp but never updates on its own, ff0c requires
authentication, and ff2c doesn’t exist on this firmware. Retrieving stored history
appears to need writes to the ff21 control channel, whose command set also contains
a factory reset, so I stopped there.

I wrapped what does work into a custom integration in case it’s useful to you:
GitHub - thomasgregg/oralb-ha · GitHub — hybrid passive/active, live timer,
pressure, quadrant, plus a brushing log it builds itself. Full protocol notes
(including the negative results above) are in the README. Tested on exactly one
brush, so mileage may vary.

Wow, Thanks Thomas, will try your custom integration in the weekend when I have some time :slight_smile: