Philips bluetooth shaver monitoring

So, late last year I replaced my old Philips shaver with a new one, and found it had bluetooth. To access it you need to install the “GroomTribe” app - and then you can use the app to do things like monitor the battery as well as give hints on how to get a better shave based on the shaver motion etc etc. All kinda nice to have, but the big one is the battery.

Now, I prefer to not leave my shaver on charge constantly both because it’s annoying to have to unplug/plug the thing each day but also the risk of slowly reducing the lifespan of the battery. My desire was to get an alert once the battery drops below a certain level so I am reminded to put the thing on charge but whilst it still has more than enough charge for the morning shave. I actually have the same thing for my toothbrush via the OralB integration. But I digress.

I had a search in the forums, and could not find any mention of direct or even indirect support for the Philips shavers. Searching further afield I found someone on reddit who had done this. So big shout out to max24688. :wink:

If you want to do this, then you will need:

  • A Philips shaver that supports bluetooth. In my case I have a 7000 series S7887, but this should work for 9000 and 8000 series shavers, although it is likely some of UUID info might be different. This general process would of course work with pretty much any bluetooth device, although might need to tweak the connection settings as well as the UUID info.
  • An ESP32 that supports bluetooth. In my case I used an ESP32-C3 SuperMini (my current favourite as it’s tiny, is quick, has a built in RGB light, and can be bought with an external antenna that provides decent wifi pickup)
  • Far too much spare time on your hands

The steps are optionally:

  1. Connect to the shaver using the GroomTribe app
  2. Use the nRF app to confirm the mac address of the device and that the various UUIDs are correct, collecting any additional ones you might be interested i
  3. Remove the shaver from GroomTribe and then remove the saved bluetooth connection from the mobile
  4. Remove the connection from the shaver (process is described in the GroomTribe app, but basically it’s hold the power button down for ten seconds). Note that the shaver only allows one device to pair with it.

I say the above is optional, as it is quite possible that (other than the mac address that you can collect in other ways) all the settings in the following code will be fine - just need to modify to match your environment eg board etc. You may also not be interested in some of the other info like serial number - frankly I’ve just included that because I could. :slight_smile:

So the steps after that are:

  1. Install the code onto your ESP32, modified to suit your setup (board, secrets, shaver mac address etc)
  2. Start up the shaver and leave it running near the ESP32 (probably don’t absolutely need to leave it running, but rules out the possibility of pairing issues)
  3. Start the ESP32, watching the log for any errors
  4. Enjoy
# Compiled and tested on esphome 2025.2.0 and HA 2025.2.5
# Thanks to max24688 - https://www.reddit.com/r/Esphome/comments/1fyenty/philips_shaver_7000/

substitutions:
  name: ble01
  friendly_name: ble01
  devicename: ble01
  location: master

esphome:
  name: ${name}
  friendly_name: ${friendly_name}
  min_version: 2024.6.0
  name_add_mac_suffix: false
  project:
    name: zagnut.ble
    version: '1.0'
  comment: BLE Sensor ESP32-C3 SuperMini $location
  
esp32:
  variant: ESP32C3 # ESP32-C3 Supermini Plus Black Gold
  board: esp32-c3-devkitm-1
  framework:
    type: esp-idf
#    version: recommended
    version: latest

# Enable logging
logger:
  baud_rate: 0  # disable serial uart logging to maybe save a little ram
  logs:
    component: ERROR

api:
  encryption:
    key: !secret esphome_encryption_key

ota:
  password: !secret ota_password
  platform: esphome

wifi:
  networks:
  - ssid: !secret wifIoT_ssid
    password: !secret wifIoT_password
    priority: 2
# Backup SSID just in case
  - ssid: !secret wifi_ssid
    password: !secret wifi_password
    priority: 1
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "$devicename Fallback Hotspot"
    password: !secret ota_password

# The following is for when using esp-idf framework. Note if using the arduino framework, can change
light:
  - platform: esp32_rmt_led_strip
    id: led
    rgb_order: GRB
    pin:
      number: GPIO8
      ignore_strapping_warning: true
    num_leds: 1
    chipset: ws2812
    name: "Status LED"
    default_transition_length: 0s
    effects:
      - pulse:
          name: "extra_slow_pulse"
          transition_length: 800ms
          update_interval: 800ms
          min_brightness: 0%
          max_brightness: 30%
      - pulse:
          name: "slow_pulse"
          transition_length: 250ms
          update_interval: 250ms
          min_brightness: 50%
          max_brightness: 100%
      - pulse:
          name: "fast_pulse"
          transition_length: 100ms
          update_interval: 100ms
          min_brightness: 50%
          max_brightness: 100%

esp32_ble_tracker:
  scan_parameters:
#    continuous: True
    active: True
    interval: 211ms # default 320ms
    window: 120ms # default 30ms

# Enable this for Bermuda BLE Trilateration
#bluetooth_proxy:
#  active: true

globals:
  - id: ble_client_connected
    type: bool
    initial_value: 'false'

ble_client:
  - mac_address: F4:E6:DE:AD:ME:AT
    id: shaver
    auto_connect: true
    on_connect:
      then:
        - logger.log: "Connected"
        - lambda: |-
            id(ble_client_connected) = true;
    on_disconnect:
      then:
        - lambda: |-
            id(ble_client_connected) = false;

binary_sensor:
  - platform: template
    name: 'Shaver Connection'
    id: shaver_connection
    lambda: 'return id(ble_client_connected);'
    icon: 'mdi:bluetooth-connect'

sensor:
  - platform: wifi_signal
    name: "WiFi Signal Sensor"
    id: wifisignal
    update_interval: 60s
    unit_of_measurement: dBm
    accuracy_decimals: 0
    device_class: signal_strength
    state_class: measurement
    entity_category: diagnostic
  - platform: copy # Reports the WiFi signal strength in %
    source_id: wifisignal
    id: wifipercent
    name: "WiFi Signal Percent"
    filters:
      - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0);
    unit_of_measurement: "Signal %"
    entity_category: "diagnostic"
  - platform: uptime
    id: uptime_s
    name: "$devicename Uptime"
    update_interval: 60s          
  - platform: template
    name: $devicename free memory
    lambda: return heap_caps_get_free_size(MALLOC_CAP_INTERNAL);
    icon: "mdi:memory"
    entity_category: diagnostic
    state_class: measurement
    unit_of_measurement: "b"
    update_interval: 60s
# The following were added to track the shaver
# Confirmed the UUIDs via nRF Connect app
#
# Note - UUID can be in
# 16 bit 'XXXX',
# 32 bit 'XXXXXXXX', 
# or 128 bit 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX' format.
#
# eg
#    service_uuid: '0000180f-0000-1000-8000-00805f9b34fb'
#    characteristic_uuid: '00002a19-0000-1000-8000-00805f9b34fb' 
# is the same as:
#    service_uuid: '180f'
#    characteristic_uuid: '2a19' 
#
  - platform: ble_client
    type: characteristic
    ble_client_id: shaver
    name: "Shaver battery level"
    service_uuid: '180f'
    characteristic_uuid: '2a19' 
    notify: true
    icon: 'mdi:battery'
    accuracy_decimals: 0
    unit_of_measurement: '%'
  - platform: ble_client
    type: rssi
    ble_client_id: shaver
    name: "Shaver RSSI"
  - platform: ble_client
    type: characteristic
    ble_client_id: shaver
    name: "Shaver head remaining"
    service_uuid: '8d560100-3cb9-4387-a7e8-b79d826a7025'
    characteristic_uuid: '8d560117-3cb9-4387-a7e8-b79d826a7025'
    icon: 'mdi:saw-blade'
    accuracy_decimals: 0
    unit_of_measurement: '%'
  - platform: ble_client
    type: characteristic
    ble_client_id: shaver
    name: "Days since last used"
    service_uuid: '8d560100-3cb9-4387-a7e8-b79d826a7025'
    characteristic_uuid: '8d560108-3cb9-4387-a7e8-b79d826a7025' 
    accuracy_decimals: 0

text_sensor:
  - platform: ble_client
    ble_client_id: shaver
    name: "Shaver Model"
    service_uuid: '0000180a'
    characteristic_uuid: '00002a24' 
  - platform: ble_client
    ble_client_id: shaver
    name: "Shaver serial"
    service_uuid: '0000180a'
    characteristic_uuid: '00002a25'
    icon: 'mdi:barcode' 

Once installed, then hopefully you should start to see info such as the battery level,

allowing you to setup an automation eg:

alias: Alert - shaver battery below 30%
description: ""
triggers:
  - entity_id:
      - sensor.ble01_shaver_battery_level
    for:
      hours: 0
      minutes: 5
      seconds: 0
    below: 30
    trigger: numeric_state
conditions: []
actions:
  - data:
      title: Shaver battery getting low!
      message: Shaver battery getting low!
    action: persistent_notification.create
  - metadata: {}
    data:
      message: Shaver battery getting low!
      title: Shaver battery getting low!
      target: [email protected]
    action: notify.zagnut_test_com
  - data:
      message: Shaver battery getting low!
      title: Shaver battery getting low!
    action: notify.mobile_app_sm_g990e
mode: single

If you find that info is not appearing, then standard troubleshooting:

  1. Make sure that the shaver is close to the ESP32 when starting the initial connection
  2. Make sure that the ESP32 is not too far away from the shaver - the signal is not strong, so ideally it should be in the same room or the one next to where the shaver lives.
  3. It might not be connecting initially - if so change the code that says
    on_connect:
      then:
        - logger.log: "Connected"
        - lambda: |-
            id(ble_client_connected) = true;

to

    on_connect:
      then:
        - logger.log: "Connected"
        - lambda: |-
            id(ble_client_connected) = true;
            ESP_LOGE("custom", "Connected to shaver, trying to pair");
            id(shaver)->pair();

Once the initial connection has been established, you probably don’t need those extra two lines
7. Reset the shaver - again just hold the power button down for ten seconds or so
8. Keep the shaver running and restart the ESP32 device, monitoring the log whilst it starts for any obvious errors

Final notes:

The ESP32 uses memory & processor cycles on the ESP32 when connected - probably would not want to connect too many devices like this. This code also keeps the connection alive constantly - having said that, this is sort of the case if connected via a mobile, although the mobile is only connected when near it. Even so, I might change this to connect and retrieve info once every hour or similar, rather than being constantly connected - which would lower the risk of issues if you start to monitor more devices like this. I would note that, so far, being constantly connected does not seem to be causing any significant drain on the shaver battery.

Enjoy!

5 Likes

@zagnuts
Thanks for the clear explanation and sample code. It works for me with the Philips S7788

2 Likes

Quick PSA - I’ve found that the ESP device can sometimes lose the pairing with the shaver. I think this is normally after recompiling the firmware. When this happens you of course no longer get sensor readings, and the constant failing to connect I suspect can drain the battery on the shaver prematurely. As the shaver is still paired with the ‘old’ esp device, you need to remove the pairing on the shaver (press and hold the power button for over ten seconds) and then leave the shaver powered on (eg running) close to the ESP device so it can pair again.

TLDR - if you find your shaver battery dies quickly or you update the esp code, make sure that you are still getting sensor readings. If not, then pair the shaver with the ESP again.

1 Like

@zagnuts thank you for your work!

I’ve created a custom integration for the Philips shaver:

Is anyone interested in trying out the integration?

Ah - I’d give it a go, but just saw that it requires home assistant to be running bluetooth, and a) I run HA in a container and haven’t set that up and b) my physical server is sitting in my study downstairs a fair distance away from where my shaver lives. So I’ll need to pass for now, and stick with my esp32 hack. But well done on the integration! Cheers.

1 Like

I have not tried it. But couldnt you use your ESP32 as bluetooth proxy for home Assistant?

See: Bluetooth Proxy. how to enable device

Hey @zagnuts,

quick update – the integration now has full ESP32 bridge support since v0.5.0. This is exactly what you need since your HA runs in a container without Bluetooth.

How it works:

  • Your ESP32 runs a custom ESPHome component that handles the BLE connection to the shaver (including pairing)
  • Home Assistant communicates with the ESP32 via the ESPHome API – no Bluetooth on the HA host needed
  • Setup is done entirely through the UI config flow – it auto-detects your ESPHome device

What you get on top of your current setup:

  • All sensors as proper HA entities (battery, head wear, usage count, motor stats, shaving mode, pressure, motion feedback, …)
  • Light ring color control & shaving mode selection
  • Blade replacement button (resets the head wear counter)
  • Live updates via BLE notifications (no polling needed)

The ESP component also handles re-pairing automatically and has a configurable notification throttle to avoid overloading the API buffer – so the battery drain issue you mentioned should be much less of a problem.

Setup guide: ESP_BRIDGE_SETUP.md

Your ESP32-C3 SuperMini should work fine. Would be great to hear if it works with your S7887 – so far it’s been tested with the i9000/XP9201.

1 Like

Good oh - well it’s a public holiday here today so time to play! :wink:

The good news is it appears to connect fine. FYI This is using a Lolin D32. I reset the shaver first (held the button down for 30 seconds) and the shaver was found and it connected:

[10:52:44.375][D][esp32_ble_tracker:705]: Found device F4:E6:96:E3:EF:5E RSSI=-78
[10:52:44.377][D][esp32_ble_tracker:726]:   Address Type: RANDOM
[10:52:44.377][D][esp32_ble_tracker:728]:   Name: 'Philips S7887'
[10:52:44.377][D][esp32_ble_tracker:157]: connecting: 0, discovered: 1, disconnecting: 0
[10:52:44.390][D][esp32_ble_tracker:856]: Stopping scan to make connection
[10:52:44.390][D][esp32_ble_tracker:864]: Promoting client to connect
[10:52:44.390][D][esp32_ble_tracker:900]: Setting coexistence to Bluetooth to make connection.
[10:52:44.394][I][esp32_ble_client:111]: [3] [F4:E6:96:E3:EF:5E] 0x01 Connecting
[10:52:44.394][D][esp32_ble_tracker:157]: connecting: 1, discovered: 0, disconnecting: 0
[10:52:44.394][D][esp32_ble_tracker:815]: Scan stop complete, set scanner state to IDLE.
[10:52:44.759][D][esp32_ble_client:197]: [3] [F4:E6:96:E3:EF:5E] ESP_GATTC_CONNECT_EVT
[10:52:44.765][D][esp32_ble_client:197]: [3] [F4:E6:96:E3:EF:5E] ESP_GATTC_OPEN_EVT
[10:52:44.766][I][esp32_ble_client:326]: [3] [F4:E6:96:E3:EF:5E] Connection open
[10:52:44.768][D][esp32_ble_client:193]: [3] [F4:E6:96:E3:EF:5E] Searching for services
[10:52:44.768][I][philips_shaver:055]: SMP security params applied (io_cap=DisplayYesNo, auth=0x2D)
[10:52:44.768][I][philips_shaver:121]: Connected to shaver (F4:E6:96:E3:EF:5E)
[10:52:44.794][D][binary_sensor:044]: 'Shaver Connected' >> ON
[10:52:44.794][D][esp32_ble_tracker:157]: connecting: 0, discovered: 0, disconnecting: 0
[10:52:44.794][D][esp32_ble_tracker:904]: Setting coexistence preference to balanced.
[10:52:44.870][D][esp32_ble_tracker:240]: Starting scan, set scanner state to STARTING.
[10:52:44.870][D][esp32_ble_client:197]: [3] [F4:E6:96:E3:EF:5E] ESP_GATTC_SEARCH_CMPL_EVT
[10:52:44.870][I][esp32_ble_client:435]: [3] [F4:E6:96:E3:EF:5E] Service discovery complete
[10:52:44.896][D][main:290]: Connected to shaver, attempting pairing...
[10:52:44.896][I][philips_shaver:164]: Service discovery complete
[10:52:44.896][D][esp-idf:000][BTU_TASK]: W (20399) BT_BTM: Security Manager: BTM_SetEncryption busy, enqueue request
[10:52:44.977][D][esp32_ble_client:379]: [3] [F4:E6:96:E3:EF:5E] cfg_mtu status 0, mtu 247
[10:52:44.988][I][esp32_ble_client:542]: [3] [F4:E6:96:E3:EF:5E] auth complete addr: F4:E6:96:E3:EF:5E
[10:52:44.989][D][esp32_ble_client:547]: [3] [F4:E6:96:E3:EF:5E] auth success type = 1 mode = 1

So in esphome the sensor is showing the shaver as connected - so yay!

Now, installed the integration, and on setting that up I get:

Successfully connected to Philips S7887.
Model: Philips S7887
ESP Bridge: ble03 (v1.2.0)

Hardware Capabilities:
✅ Motion Sensing
⬜ Brush Programs
⬜ Motion Speed Sensing
⬜ Pressure Feedback
⬜ Unit Cleaning
✅ Cleaning Mode
⬜ Light Ring

GATT Service Status:
✅ 0000180a-0000-1000-8000-00805f9b34fb
✅ 0000180f-0000-1000-8000-00805f9b34fb
✅ 8d560100-3cb9-4387-a7e8-b79d826a7025
✅ 8d560200-3cb9-4387-a7e8-b79d826a7025
✅ 8d560300-3cb9-4387-a7e8-b79d826a7025
❌ 8d560600-3cb9-4387-a7e8-b79d826a7025

Legend:
✅ Service found & supported
❌ Expected service missing
❔ Unknown service from device

Click Submit to finish the setup.


So also yay. Now a number of settings don’t appear to be working (for example detecting if it’s charging), no doubt due to the differences between the models, but the main ones - in particular the battery level (which is why I started all this way back when so I could get alerted in advance if the shaver should be charged) - are working fine.

1 Like

@zagnuts
Thanks for testing with the S7887 and great to hear the battery level is working! :tada:

I’d like to look into the charging detection issue. To narrow it down, it would help to know a few things:

1. Which entities don’t work?

Could you check the integration’s entity list and let me know which sensors/entities show “unavailable”, “unknown”, or seem stuck at a default value? Especially interested in:

  • Device State sensor – does it show “off”, “unknown”, or “unavailable”?
  • Charging binary sensor – always off, or unavailable?
  • Activity sensor – does it change at all?

2. Do live updates work during shaving?

When you actually shave, do you see real-time changes for things like motor RPM or device state switching to “shaving”? This would tell us whether GATT notifications are working in general on the S7887.

3. Debug logs

If you have a moment, could you enable debug logging for the integration and share a snippet? This will show us whether the notification subscriptions actually succeed and whether the device state characteristic is being read/notified.

Add this to your configuration.yaml:

logger:
  default: warning
  logs:
    custom_components.philips_shaver: debug

Then restart HA, wait for the shaver to connect, and grab the relevant log lines (Settings → System → Logs → search for “philips_shaver”). Ideally covering:

  • The initial connection + subscription phase
  • A short shaving session (a few seconds is enough)
  • Putting the shaver on the charger (if possible while still in BLE range)

Also, the ESP-side logs might be useful – if you have access to the ESPHome device logs, look for lines like Notify registered for handle, CCCD written, or Notify registration failed.

No rush at all – the main goal (battery alerts) is working, so this is just to improve things further for the S7887 and similar models. Any testing support from the community is hugely appreciated – it’s really hard to develop for a range of models when you only have one shaver on your desk! :smile:

1 Like

Sure, will do. No guarantees when, but happy to grab what info I can. :slight_smile:

1 Like

OK - so got some time to check this. I suspect as well as the less fancy shaver not supporting some sensors, the service_uuid’s etc may be different between the shavers. Again, no rush about this. The main thing is the battery tracking works. Anyhow, the results are as follows:

sensor.philips_shaver_state - is stuck on ‘unknown’. Full diagnostic info is:


binary_sensor.philips_shaver_charging - stays at ‘not charging’ even when plugged into charger
sensor.philips_shaver_activity - stays at ‘off’ even when in use

Live updates don’t seem to happen - no change to motion, rpm, etc

esphome log from after just resetting the shaver so it establishes a new connection etc:

0000180a-0000-1000-8000-00805f9b34fb
[12:44:14.715][I][esp32_ble_client:570]: [3] [F4:E6:96:E3:EF:5E] auth complete addr: F4:E6:96:E3:EF:5E
[12:44:14.782][D][esp32_ble_client:575]: [3] [F4:E6:96:E3:EF:5E] auth success type = 1 mode = 1
[12:44:17.232][I][philips_shaver:105]: BLE connected, no subscriptions — re-firing ready
[12:44:17.863][D][sensor:124]: 'ble03 Uptime' >> 241 s
[12:44:17.952][D][sensor:124]: 'WiFi Signal Sensor' >> -69 dBm
[12:44:17.953][D][sensor:124]: 'WiFi Signal Percent' >> 62 Signal %
[12:44:18.148][D][sensor:124]: 'ble03 free memory' >> 86976.0 b
[12:44:32.274][I][philips_shaver:105]: BLE connected, no subscriptions — re-firing ready
[12:44:32.384][I][philips_shaver:438]: Reading 00002a19-0000-1000-8000-00805f9b34fb (handle 0x0010)...
[12:44:32.394][I][philips_shaver:312]: Read 00002a19-0000-1000-8000-00805f9b34fb: 3c (1 bytes)
[12:44:32.482][W][philips_shaver:422]: Characteristic 00002a26-0000-1000-8000-00805f9b34fb not found in service 0000180a-0000-1000-8000-00805f9b34fb
[12:44:43.353][D][esp-idf:000][BTU_TASK]: W (268268) BT_HCI: hcif disc complete: hdl 0x0, rsn 0x13 dev_find 1
[12:44:43.355][D][esp32_ble_client:379]: [3] [F4:E6:96:E3:EF:5E] ESP_GATTC_DISCONNECT_EVT, reason 0x13
[12:44:43.355][W][philips_shaver:185]: Disconnected from shaver (reason=0x13). 0 subscription(s) will be restored on reconnect.
[12:44:43.356][D][binary_sensor:048]: 'Shaver Connected' >> OFF
[12:44:43.358][D][esp32_ble_client:211]: [3] [F4:E6:96:E3:EF:5E] ESP_GATTC_CLOSE_EVT
[12:44:43.359][D][main:243]: Disconnected from shaver
[12:44:43.359][D][esp32_ble_client:207]: [3] [F4:E6:96:E3:EF:5E] Found device
[12:44:43.359][D][esp32_ble_tracker:716]: Found device F4:E6:96:E3:EF:5E RSSI=-73
[12:44:43.359][D][esp32_ble_tracker:737]:   Address Type: RANDOM
[12:44:43.359][D][esp32_ble_tracker:739]:   Name: 'Philips S7887'
[12:44:43.359][D][esp32_ble_tracker:163]: connecting: 0, discovered: 1, disconnecting: 0
[12:44:43.359][D][esp32_ble_tracker:867]: Stopping scan to make connection
[12:44:43.366][D][esp32_ble_tracker:875]: Promoting client to connect
[12:44:43.366][D][esp32_ble_tracker:911]: Setting coexistence to Bluetooth to make connection.
[12:44:43.367][I][esp32_ble_client:125]: [3] [F4:E6:96:E3:EF:5E] 0x01 Connecting
[12:44:43.367][D][esp32_ble_tracker:163]: connecting: 1, discovered: 0, disconnecting: 0
[12:44:43.435][D][esp32_ble_tracker:826]: Scan stop complete, set scanner state to IDLE.
[12:45:03.373][D][esp32_ble_client:379]: [3] [F4:E6:96:E3:EF:5E] ESP_GATTC_DISCONNECT_EVT, reason 0x100
[12:45:03.485][W][philips_shaver:185]: Disconnected from shaver (reason=0x100). 0 subscription(s) will be restored on reconnect.
[12:45:03.485][D][esp32_ble_client:211]: [3] [F4:E6:96:E3:EF:5E] ESP_GATTC_OPEN_EVT
[12:45:03.486][E][esp32_ble_client:324]: [3] [F4:E6:96:E3:EF:5E] ESP_GATTC_OPEN_EVT in DISCONNECTING state (status=133)
[12:45:03.486][W][esp32_ble_client:223]: [3] [F4:E6:96:E3:EF:5E] Connection open error, status=133
[12:45:03.486][W][philips_shaver:160]: Connection failed, status=133
[12:45:03.486][D][esp32_ble_tracker:163]: connecting: 0, discovered: 0, disconnecting: 0
[12:45:03.584][D][esp32_ble_tracker:915]: Setting coexistence preference to balanced.
[12:45:03.584][D][esp32_ble_tracker:246]: Starting scan, set scanner state to STARTING.
[12:45:17.917][D][sensor:124]: 'ble03 Uptime' >> 301 s
[12:45:17.951][D][sensor:124]: 'WiFi Signal Sensor' >> -69 dBm
[12:45:17.957][D][sensor:124]: 'WiFi Signal Percent' >> 62 Signal %
[12:45:18.139][D][sensor:124]: 'ble03 free memory' >> 98416.0 b
[12:45:26.541][D][wifi:2432]: Roam scan (-69 dBm, attempt 1/3)
[12:45:35.238][W][api.connection:298]: Buffer full, ping queued
[12:46:17.913][D][sensor:124]: 'ble03 Uptime' >> 361 s
[12:46:18.010][D][sensor:124]: 'WiFi Signal Sensor' >> -67 dBm
[12:46:18.010][D][sensor:124]: 'WiFi Signal Percent' >> 66 Signal %
[12:46:18.092][D][sensor:124]: 'ble03 free memory' >> 98320.0 b
[12:46:18.522][D][sensor:124]: 'Battery Capacity' >> 94 %
[12:46:18.703][D][main:217]: Battery voltage is above threshold
[12:46:21.875][D][esp32.preferences:144]: Writing 1 items: 1 cached, 0 written, 0 failed
[12:46:34.041][D][esp32_ble_client:207]: [3] [F4:E6:96:E3:EF:5E] Found device
[12:46:34.061][D][esp32_ble_tracker:716]: Found device F4:E6:96:E3:EF:5E RSSI=-80
[12:46:34.061][D][esp32_ble_tracker:737]:   Address Type: RANDOM
[12:46:34.061][D][esp32_ble_tracker:739]:   Name: 'Philips S7887'
[12:46:34.061][D][esp32_ble_tracker:163]: connecting: 0, discovered: 1, disconnecting: 0
[12:46:34.081][D][esp32_ble_tracker:867]: Stopping scan to make connection
[12:46:34.081][D][esp32_ble_tracker:875]: Promoting client to connect
[12:46:34.082][D][esp32_ble_tracker:911]: Setting coexistence to Bluetooth to make connection.
[12:46:34.082][I][esp32_ble_client:125]: [3] [F4:E6:96:E3:EF:5E] 0x01 Connecting
[12:46:34.100][D][esp32_ble_tracker:163]: connecting: 1, discovered: 0, disconnecting: 0
[12:46:34.100][D][esp32_ble_tracker:826]: Scan stop complete, set scanner state to IDLE.
[12:46:34.162][D][esp32_ble_client:211]: [3] [F4:E6:96:E3:EF:5E] ESP_GATTC_CONNECT_EVT
[12:46:34.163][D][esp32_ble_client:211]: [3] [F4:E6:96:E3:EF:5E] ESP_GATTC_OPEN_EVT
[12:46:34.164][I][esp32_ble_client:343]: [3] [F4:E6:96:E3:EF:5E] Connection open
[12:46:34.164][D][esp32_ble_client:207]: [3] [F4:E6:96:E3:EF:5E] Searching for services
[12:46:34.164][I][philips_shaver:056]: SMP security params applied (io_cap=DisplayYesNo, auth=0x2D)
[12:46:34.164][I][philips_shaver:149]: Connected to shaver (F4:E6:96:E3:EF:5E)
[12:46:34.168][D][binary_sensor:048]: 'Shaver Connected' >> ON
[12:46:34.168][D][esp32_ble_client:211]: [3] [F4:E6:96:E3:EF:5E] ESP_GATTC_SEARCH_CMPL_EVT
[12:46:34.168][I][esp32_ble_client:463]: [3] [F4:E6:96:E3:EF:5E] Service discovery complete
[12:46:34.169][D][main:273]: Connected to shaver, attempting pairing...
[12:46:34.184][I][philips_shaver:213]: Service discovery complete
[12:46:34.184][I][philips_shaver:238]: Device is bonded — re-encrypting with stored keys
[12:46:34.184][D][esp32_ble_tracker:163]: connecting: 0, discovered: 0, disconnecting: 0
[12:46:34.184][D][esp32_ble_tracker:915]: Setting coexistence preference to balanced.
[12:46:34.261][D][esp32_ble_tracker:246]: Starting scan, set scanner state to STARTING.
[12:46:34.287][I][philips_shaver:438]: Reading 00002a19-0000-1000-8000-00805f9b34fb (handle 0x0010)...
[12:46:34.287][D][esp32_ble_client:410]: [3] [F4:E6:96:E3:EF:5E] cfg_mtu status 0, mtu 247
[12:46:34.589][W][esp32_ble:625][BTC_TASK]: Ignoring unexpected GAP event type: 9
[12:46:34.600][W][esp32_ble:625][BTC_TASK]: Ignoring unexpected GAP event type: 9
[12:46:34.601][W][esp32_ble:625][BTC_TASK]: Ignoring unexpected GAP event type: 9
[12:46:34.601][W][esp32_ble:625][BTC_TASK]: Ignoring unexpected GAP event type: 9
[12:46:34.601][I][philips_shaver:312]: Read 00002a19-0000-1000-8000-00805f9b34fb: 0f (1 bytes)
[12:46:34.666][W][philips_shaver:422]: Characteristic 00002a26-0000-1000-8000-00805f9b34fb not found in service 0000180a-0000-1000-8000-00805f9b34fb
[12:46:34.676][I][esp32_ble_client:570]: [3] [F4:E6:96:E3:EF:5E] auth complete addr: F4:E6:96:E3:EF:5E
[12:46:34.676][D][esp32_ble_client:575]: [3] [F4:E6:96:E3:EF:5E] auth success type = 1 mode = 1
[12:46:47.356][I][philips_shaver:105]: BLE connected, no subscriptions — re-firing ready
[12:46:47.389][I][philips_shaver:438]: Reading 00002a19-0000-1000-8000-00805f9b34fb (handle 0x0010)...
[12:46:47.491][I][philips_shaver:312]: Read 00002a19-0000-1000-8000-00805f9b34fb: 0f (1 bytes)
[12:46:47.563][W][philips_shaver:422]: Characteristic 00002a26-0000-1000-8000-00805f9b34fb not found in service 0000180a-0000-1000-8000-00805f9b34fb

Will add the ha log in a follow-up message due to size.

ha log file - taken when the shaver has been reset so it re-establishes connection, have run the shaver for maybe ten seconds waving it around, and then plugged into charger - converted to csv to make life easier-ish:

2026-04-17 13:01:12.546 INFO (MainThread) ,[custom_components.philips_shaver.sensor], Restored battery level: 37%
2026-04-17 13:01:12.546 INFO (MainThread) ,[custom_components.philips_shaver.sensor], Shaver does not support pressure feedback – skipping pressure sensors
2026-04-17 13:01:12.548 INFO (MainThread) ,[custom_components.philips_shaver.sensor], Restored last_seen: 2026-04-17T13:00:23.968688
2026-04-17 13:01:12.550 INFO (MainThread) ,[custom_components.philips_shaver.light], Shaver does not support light ring configuration – skipping light entities
2026-04-17 13:01:12.553 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Finished fetching Philips Shaver F4:E6:96:E3:EF:5E data in 0.000 seconds (success: True)
2026-04-17 13:01:12.553 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Recent data (48.58432s < poll interval 60s) – polling skipped
2026-04-17 13:01:12.554 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:01:12.554 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Transport error: No characteristics could be read – bridge may not be ready – retrying in 5s
2026-04-17 13:01:12.554 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:01:12.554 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:01:17.556 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Transport error: No characteristics could be read – bridge may not be ready – retrying in 10s
2026-04-17 13:01:17.556 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:01:17.738 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:01:17.738 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:01:17.738 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP bridge alive (status: heartbeat)
2026-04-17 13:01:17.740 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP↔Shaver BLE: connected (via heartbeat)
2026-04-17 13:01:17.741 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:01:17.741 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: connected
2026-04-17 13:01:17.742 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:01:18.736 DEBUG (MainThread) ,[custom_components.philips_shaver.transport], Detected shaver MAC: F4:E6:96:E3:EF:5E
2026-04-17 13:01:23.737 WARNING (MainThread) ,[custom_components.philips_shaver.transport], ESP read timeout for 00002a26-0000-1000-8000-00805f9b34fb — bridge not responding
2026-04-17 13:01:23.738 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:01:23.738 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:01:23.740 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:01:23.742 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live connection ended – polling will resume
2026-04-17 13:01:23.742 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live monitoring active – polling paused
2026-04-17 13:01:28.743 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:01:28.744 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Transport error: No characteristics could be read – bridge may not be ready – retrying in 5s
2026-04-17 13:01:32.751 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:01:32.751 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:01:32.751 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP bridge alive (status: heartbeat)
2026-04-17 13:01:32.754 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:01:32.754 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: connected
2026-04-17 13:01:32.754 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP↔Shaver BLE: connected (via heartbeat)
2026-04-17 13:01:32.756 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:01:38.678 WARNING (MainThread) ,[custom_components.philips_shaver.transport], ESP read timeout for 00002a26-0000-1000-8000-00805f9b34fb — bridge not responding
2026-04-17 13:01:38.679 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:01:38.679 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:01:38.681 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:01:38.683 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live connection ended – polling will resume
2026-04-17 13:01:38.683 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live monitoring active – polling paused
2026-04-17 13:01:43.684 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Transport error: No characteristics could be read – bridge may not be ready – retrying in 5s
2026-04-17 13:01:43.684 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:01:47.788 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:01:47.788 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:01:47.788 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP bridge alive (status: heartbeat)
2026-04-17 13:01:47.789 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:01:47.789 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: connected
2026-04-17 13:01:47.789 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP↔Shaver BLE: connected (via heartbeat)
2026-04-17 13:01:47.797 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:01:54.221 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:01:54.221 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:01:54.221 WARNING (MainThread) ,[custom_components.philips_shaver.transport], ESP read timeout for 00002a26-0000-1000-8000-00805f9b34fb — bridge not responding
2026-04-17 13:01:54.223 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:01:54.223 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live monitoring active – polling paused
2026-04-17 13:01:54.224 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live connection ended – polling will resume
2026-04-17 13:01:59.225 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Transport error: No characteristics could be read – bridge may not be ready – retrying in 5s
2026-04-17 13:01:59.225 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:02:02.761 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:02:02.761 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:02:02.761 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP bridge alive (status: heartbeat)
2026-04-17 13:02:02.764 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:02:02.764 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: connected
2026-04-17 13:02:02.764 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP↔Shaver BLE: connected (via heartbeat)
2026-04-17 13:02:02.771 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:02:08.951 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:02:08.951 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:02:08.951 WARNING (MainThread) ,[custom_components.philips_shaver.transport], ESP read timeout for 00002a26-0000-1000-8000-00805f9b34fb — bridge not responding
2026-04-17 13:02:08.954 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:02:08.955 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live connection ended – polling will resume
2026-04-17 13:02:08.955 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live monitoring active – polling paused
2026-04-17 13:02:13.957 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Transport error: No characteristics could be read – bridge may not be ready – retrying in 5s
2026-04-17 13:02:13.957 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:02:17.768 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP bridge alive (status: heartbeat)
2026-04-17 13:02:17.769 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:02:17.769 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:02:17.771 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:02:17.771 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: connected
2026-04-17 13:02:17.771 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP↔Shaver BLE: connected (via heartbeat)
2026-04-17 13:02:17.793 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:02:22.174 WARNING (MainThread) ,[custom_components.philips_shaver.transport], ESP↔Shaver BLE: disconnected
2026-04-17 13:02:22.175 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:02:22.175 DEBUG (MainThread) ,[custom_components.philips_shaver.transport], Cancelled 1 pending reads
2026-04-17 13:02:22.175 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:02:22.177 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:02:22.179 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live connection ended – polling will resume
2026-04-17 13:02:22.179 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live monitoring active – polling paused
2026-04-17 13:02:25.352 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:02:25.352 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: connected
2026-04-17 13:02:25.352 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP↔Shaver BLE: connected
2026-04-17 13:02:27.180 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:02:32.300 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:02:32.300 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:02:32.300 WARNING (MainThread) ,[custom_components.philips_shaver.transport], ESP read timeout for 00002a26-0000-1000-8000-00805f9b34fb — bridge not responding
2026-04-17 13:02:32.302 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:02:32.304 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live connection ended – polling will resume
2026-04-17 13:02:32.304 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live monitoring active – polling paused
2026-04-17 13:02:32.812 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP bridge alive (status: heartbeat)
2026-04-17 13:02:32.813 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:02:32.813 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:02:32.815 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:02:32.815 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: connected
2026-04-17 13:02:32.815 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP↔Shaver BLE: connected (via heartbeat)
2026-04-17 13:02:37.306 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:02:42.720 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:02:42.720 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:02:42.720 WARNING (MainThread) ,[custom_components.philips_shaver.transport], ESP read timeout for 00002a26-0000-1000-8000-00805f9b34fb — bridge not responding
2026-04-17 13:02:42.722 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:02:42.723 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live connection ended – polling will resume
2026-04-17 13:02:42.723 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live monitoring active – polling paused
2026-04-17 13:02:47.724 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Transport error: No characteristics could be read – bridge may not be ready – retrying in 5s
2026-04-17 13:02:47.724 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:02:47.765 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:02:47.765 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:02:47.765 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP bridge alive (status: heartbeat)
2026-04-17 13:02:47.767 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP↔Shaver BLE: connected (via heartbeat)
2026-04-17 13:02:47.768 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:02:47.768 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: connected
2026-04-17 13:02:47.789 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:02:52.888 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:02:52.888 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:02:52.888 WARNING (MainThread) ,[custom_components.philips_shaver.transport], ESP read timeout for 00002a26-0000-1000-8000-00805f9b34fb — bridge not responding
2026-04-17 13:02:52.889 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:02:52.889 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live connection ended – polling will resume
2026-04-17 13:02:52.889 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live monitoring active – polling paused
2026-04-17 13:02:57.890 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:02:57.891 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Transport error: No characteristics could be read – bridge may not be ready – retrying in 5s
2026-04-17 13:03:02.799 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:03:02.799 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:03:02.799 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP bridge alive (status: heartbeat)
2026-04-17 13:03:02.801 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: connected
2026-04-17 13:03:02.801 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP↔Shaver BLE: connected (via heartbeat)
2026-04-17 13:03:02.802 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:03:02.810 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:03:08.832 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:03:08.832 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:03:08.832 WARNING (MainThread) ,[custom_components.philips_shaver.transport], ESP read timeout for 00002a26-0000-1000-8000-00805f9b34fb — bridge not responding
2026-04-17 13:03:08.833 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:03:08.833 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live connection ended – polling will resume
2026-04-17 13:03:08.833 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live monitoring active – polling paused
2026-04-17 13:03:13.834 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Transport error: No characteristics could be read – bridge may not be ready – retrying in 5s
2026-04-17 13:03:13.834 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:03:17.848 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:03:17.848 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:03:17.848 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP bridge alive (status: heartbeat)
2026-04-17 13:03:17.851 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:03:17.851 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: connected
2026-04-17 13:03:17.851 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP↔Shaver BLE: connected (via heartbeat)
2026-04-17 13:03:17.866 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:03:24.072 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:03:24.072 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:03:24.072 WARNING (MainThread) ,[custom_components.philips_shaver.transport], ESP read timeout for 00002a26-0000-1000-8000-00805f9b34fb — bridge not responding
2026-04-17 13:03:24.075 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:03:24.077 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live connection ended – polling will resume
2026-04-17 13:03:24.077 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live monitoring active – polling paused
2026-04-17 13:03:29.085 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:03:29.086 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Transport error: No characteristics could be read – bridge may not be ready – retrying in 5s
2026-04-17 13:03:32.807 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:03:32.807 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:03:32.807 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP bridge alive (status: heartbeat)
2026-04-17 13:03:32.810 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:03:32.810 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: connected
2026-04-17 13:03:32.810 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP↔Shaver BLE: connected (via heartbeat)
2026-04-17 13:03:32.833 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:03:38.620 WARNING (MainThread) ,[custom_components.philips_shaver.transport], ESP read timeout for 00002a26-0000-1000-8000-00805f9b34fb — bridge not responding
2026-04-17 13:03:38.621 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:03:38.621 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:03:38.624 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:03:38.630 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live connection ended – polling will resume
2026-04-17 13:03:38.630 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live monitoring active – polling paused
2026-04-17 13:03:43.631 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Transport error: No characteristics could be read – bridge may not be ready – retrying in 5s
2026-04-17 13:03:43.631 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:03:47.825 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:03:47.825 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:03:47.825 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP bridge alive (status: heartbeat)
2026-04-17 13:03:47.827 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP↔Shaver BLE: connected (via heartbeat)
2026-04-17 13:03:47.828 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:03:47.828 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: connected
2026-04-17 13:03:47.850 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:03:54.068 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:03:54.068 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:03:54.068 WARNING (MainThread) ,[custom_components.philips_shaver.transport], ESP read timeout for 00002a26-0000-1000-8000-00805f9b34fb — bridge not responding
2026-04-17 13:03:54.070 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:03:54.072 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live connection ended – polling will resume
2026-04-17 13:03:54.072 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live monitoring active – polling paused
2026-04-17 13:03:59.074 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Transport error: No characteristics could be read – bridge may not be ready – retrying in 5s
2026-04-17 13:03:59.074 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:04:02.804 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:04:02.804 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:04:02.804 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP bridge alive (status: heartbeat)
2026-04-17 13:04:02.806 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:04:02.806 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: connected
2026-04-17 13:04:02.806 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP↔Shaver BLE: connected (via heartbeat)
2026-04-17 13:04:02.818 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:04:08.595 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:04:08.595 WARNING (MainThread) ,[custom_components.philips_shaver.transport], ESP read timeout for 00002a26-0000-1000-8000-00805f9b34fb — bridge not responding
2026-04-17 13:04:08.596 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:04:08.598 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:04:08.600 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live connection ended – polling will resume
2026-04-17 13:04:08.600 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live monitoring active – polling paused
2026-04-17 13:04:13.602 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Transport error: No characteristics could be read – bridge may not be ready – retrying in 5s
2026-04-17 13:04:13.602 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:04:17.817 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:04:17.817 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP bridge alive (status: heartbeat)
2026-04-17 13:04:17.818 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:04:17.820 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:04:17.820 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: connected
2026-04-17 13:04:17.820 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP↔Shaver BLE: connected (via heartbeat)
2026-04-17 13:04:17.840 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:04:23.568 WARNING (MainThread) ,[custom_components.philips_shaver.transport], ESP read timeout for 00002a26-0000-1000-8000-00805f9b34fb — bridge not responding
2026-04-17 13:04:23.569 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:04:23.569 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:04:23.571 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:04:23.573 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live connection ended – polling will resume
2026-04-17 13:04:23.573 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Live monitoring active – polling paused
2026-04-17 13:04:28.575 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Transport error: No characteristics could be read – bridge may not be ready – retrying in 5s
2026-04-17 13:04:28.575 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:04:32.858 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:04:32.858 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: disconnected
2026-04-17 13:04:32.858 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP bridge alive (status: heartbeat)
2026-04-17 13:04:32.861 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data
2026-04-17 13:04:32.861 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Transport state: connected
2026-04-17 13:04:32.861 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP↔Shaver BLE: connected (via heartbeat)
2026-04-17 13:04:32.884 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...
2026-04-17 13:04:38.583 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data

Hi @zagnuts,

thanks a lot for the detailed diagnostics — really helpful! I looked through both logs and I think the main issue is that you’re running a pre-v0.12.0 version of the integration. I can tell from two log signatures that only exist in the old polling-based coordinator:

Recent data (48.58s < poll interval 60s) – polling skipped
Live connection ended – polling will resume
Live monitoring active – polling paused

These were removed in v0.12.0 (early April), which replaced the dual live+polling design with a pure event-driven architecture. The current release is v0.12.4, and the ESP Bridge component is now at v1.5.2. Quite a few reliability fixes landed in that window (reconnect loop fix in v0.12.1, auth-after-reboot fix in v1.5.2, charger-on entity availability fix in v0.12.4).

Before I dig into the S7887-specific quirks, would you mind upgrading and sending another round of logs? Two steps:

  1. Update the HA integration to v0.12.4 (via HACS → Update, then restart HA).
  2. Update the ESP Bridge component to v1.5.2 — in your ESPHome YAML, bump the ref of the philips_shaver external_component, then recompile + flash. See ESP_BRIDGE_SETUP.md for the exact snippet.

Then:

  • Reset the shaver pairing once (hold power button ~10s until it flashes four times), let the ESP re-pair, and capture the same two logs again (ESPHome device log + HA debug log for custom_components.philips_shaver).

Appreciate the testing — this kind of feedback is what makes the integration usable across models I don’t own.

Cheers,
Martin

Hi @zagnuts,

thanks again for the logs — they had enough for me to pin the root cause down without a second round, so I went ahead and released the fix as v0.12.5 (integration) + v1.6.1 (ESP bridge).

Short version: two bugs on top of each other. The integration tore down the BLE transport on the first read timeout, and the bridge fired its ready event before encryption completed — so reads for some characteristics were happening against a pre-encryption GATT cache. Both fixed.

To update:

  1. HACS → Philips Shaver → Update (goes straight to v0.12.5).
  2. Bump the ref of the philips_shaver external_components entry in your ESPHome YAML to main (or the v1.6.1 tag) and reflash. HA will show a Repair notification if the bridge is still outdated.

If you have a few minutes after that, I’d love another short log on the S7887 — just initial connect + ten seconds of shaving + plugging in. Happy to dig in further if anything still looks off.

Cheers,
Martin

Coolio. Fantastic work, Martin. Updated the integration and added “refresh: 0s” to the external components section of my esp code. Oops. :wink:

Everything works now except for:

  • Motor blocked & unplug required - both showing ‘problem’
  • Motor speed - 0 rpm (likely shaver does not report this)
  • Total operating time - stays at 0.00s
    Obviously none of those are critical. I’m just going to disable the sensors. :slight_smile:

HA Log (debug) of shaver being configured:

2026-04-18 11:49:11.509 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Initializing coordinator for F4:E6:96:E3:EF:5E (transport: ESP),
2026-04-18 11:49:11.514 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data,
2026-04-18 11:49:11.555 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], Establishing live connection to F4:E6:96:E3:EF:5E...,
2026-04-18 11:49:14.740 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], F4:E6:96:E3:EF:5E: connected,
2026-04-18 11:49:14.740 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data,
2026-04-18 11:49:24.296 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], Manually updated Philips Shaver F4:E6:96:E3:EF:5E data,
2026-04-18 11:49:24.297 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], F4:E6:96:E3:EF:5E: full initial data read complete (16 chars),
2026-04-18 11:49:24.297 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], F4:E6:96:E3:EF:5E: subscribed to 8d56010a-3cb9-4387-a7e8-b79d826a7025,
2026-04-18 11:49:24.297 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], F4:E6:96:E3:EF:5E: subscribed to 8d560104-3cb9-4387-a7e8-b79d826a7025,
2026-04-18 11:49:24.297 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], F4:E6:96:E3:EF:5E: subscribed to 8d560102-3cb9-4387-a7e8-b79d826a7025,
2026-04-18 11:49:24.297 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], F4:E6:96:E3:EF:5E: subscribed to 8d56010f-3cb9-4387-a7e8-b79d826a7025,
2026-04-18 11:49:24.298 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], F4:E6:96:E3:EF:5E: subscribed to 00002a19-0000-1000-8000-00805f9b34fb,
2026-04-18 11:49:24.298 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], F4:E6:96:E3:EF:5E: subscribed to 8d560110-3cb9-4387-a7e8-b79d826a7025,
2026-04-18 11:49:24.298 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], F4:E6:96:E3:EF:5E: subscribed to 8d56010c-3cb9-4387-a7e8-b79d826a7025,
2026-04-18 11:49:24.298 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], F4:E6:96:E3:EF:5E: subscribed to 8d560109-3cb9-4387-a7e8-b79d826a7025,
2026-04-18 11:49:24.298 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], F4:E6:96:E3:EF:5E: subscribed to 8d560107-3cb9-4387-a7e8-b79d826a7025,
2026-04-18 11:49:24.299 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], F4:E6:96:E3:EF:5E: subscribed to 8d56011a-3cb9-4387-a7e8-b79d826a7025,
2026-04-18 11:49:24.299 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], F4:E6:96:E3:EF:5E: subscribed to 8d560117-3cb9-4387-a7e8-b79d826a7025,
2026-04-18 11:49:24.299 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], F4:E6:96:E3:EF:5E: subscribed to 8d560118-3cb9-4387-a7e8-b79d826a7025,
2026-04-18 11:49:24.299 DEBUG (MainThread) ,[custom_components.philips_shaver.coordinator], F4:E6:96:E3:EF:5E: subscribed to 8d560106-3cb9-4387-a7e8-b79d826a7025,
2026-04-18 11:49:24.299 INFO (MainThread) ,[custom_components.philips_shaver.coordinator], F4:E6:96:E3:EF:5E: live monitoring active (13 subscriptions),
2026-04-18 11:49:11.549 INFO (MainThread) ,[custom_components.philips_shaver.light], Shaver does not support light ring configuration – skipping light entities,
2026-04-18 11:49:11.544 INFO (MainThread) ,[custom_components.philips_shaver.sensor], Shaver does not support pressure feedback – skipping pressure sensors,
2026-04-18 11:49:11.545 INFO (MainThread) ,[custom_components.philips_shaver.sensor], Shaver does not support cleaning mode – skipping cleaning sensors,
2026-04-18 11:49:11.545 INFO (MainThread) ,[custom_components.philips_shaver.sensor], Shaver does not support motion sensing – skipping motion sensor,
2026-04-18 11:49:11.545 INFO (MainThread) ,[custom_components.philips_shaver.sensor], Restored battery level: 97%,
2026-04-18 11:49:11.547 INFO (MainThread) ,[custom_components.philips_shaver.sensor], Restored last_seen: 2026-04-18T01:44:03+00:00,
2026-04-18 11:49:11.555 DEBUG (MainThread) ,[custom_components.philips_shaver.transport], F4:E6:96:E3:EF:5E: Waiting for ESP bridge ready event...,
2026-04-18 11:49:14.757 INFO (MainThread) ,[custom_components.philips_shaver.transport], ESP bridge ready (mac=F4:E6:96:E3:EF:5E, version=1.6.1)
2026-04-18 11:49:14.758 INFO (MainThread) ,[custom_components.philips_shaver.transport], Notification throttle set to 500 ms on ESP bridge,
2026-04-18 11:49:16.185 DEBUG (MainThread) ,[custom_components.philips_shaver.transport], ESP read error for 00002a26-0000-1000-8000-00805f9b34fb: not_found,
2026-04-18 11:49:11.555 INFO (MainThread) ,[custom_components.philips_shaver], Linked shaver device to ESP bridge 'ble03',
2026-04-18 11:49:11.556 INFO (MainThread) ,[custom_components.philips_shaver], Philips Shaver integration loaded – device: F4:E6:96:E3:EF:5E,

ESP log (on debug) is now as follows (re-establishing connection to shaver after esp reboot from recompile, running shaver for a little while, stopping it, and plugging into power)

[12:02:42.262][I][philips_shaver:106]: BLE connected, no subscriptions — re-firing ready
[12:02:48.199][D][esp-idf:000][BTU_TASK]: W (97804) BT_HCI: hcif disc complete: hdl 0x0, rsn 0x13 dev_find 1
[12:02:48.203][D][esp32_ble_client:379]: [3] [F4:E6:96:E3:EF:5E] ESP_GATTC_DISCONNECT_EVT, reason 0x13
[12:02:48.205][W][philips_shaver:189]: Disconnected from shaver (reason=0x13). 0 subscription(s) will be restored on reconnect.
[12:02:48.205][D][binary_sensor:048]: 'Shaver Connected' >> OFF
[12:02:48.206][D][esp32_ble_client:211]: [3] [F4:E6:96:E3:EF:5E] ESP_GATTC_CLOSE_EVT
[12:02:48.206][D][main:244]: Disconnected from shaver
[12:02:53.944][D][esp32_ble_client:207]: [3] [F4:E6:96:E3:EF:5E] Found device
[12:02:53.955][D][esp32_ble_tracker:716]: Found device F4:E6:96:E3:EF:5E RSSI=-68
[12:02:53.955][D][esp32_ble_tracker:737]:   Address Type: RANDOM
[12:02:53.955][D][esp32_ble_tracker:739]:   Name: 'Philips S7887'
[12:02:53.962][D][esp32_ble_tracker:163]: connecting: 0, discovered: 1, disconnecting: 0
[12:02:53.962][D][esp32_ble_tracker:867]: Stopping scan to make connection
[12:02:53.962][D][esp32_ble_tracker:875]: Promoting client to connect
[12:02:53.963][D][esp32_ble_tracker:911]: Setting coexistence to Bluetooth to make connection.
[12:02:53.972][I][esp32_ble_client:125]: [3] [F4:E6:96:E3:EF:5E] 0x01 Connecting
[12:02:53.973][D][esp32_ble_tracker:163]: connecting: 1, discovered: 0, disconnecting: 0
[12:02:53.973][D][esp32_ble_tracker:826]: Scan stop complete, set scanner state to IDLE.
[12:02:54.042][D][esp32_ble_client:211]: [3] [F4:E6:96:E3:EF:5E] ESP_GATTC_CONNECT_EVT
[12:02:54.121][D][esp32_ble_client:211]: [3] [F4:E6:96:E3:EF:5E] ESP_GATTC_OPEN_EVT
[12:02:54.121][I][esp32_ble_client:343]: [3] [F4:E6:96:E3:EF:5E] Connection open
[12:02:54.121][D][esp32_ble_client:207]: [3] [F4:E6:96:E3:EF:5E] Searching for services
[12:02:54.121][I][philips_shaver:056]: SMP security params applied (io_cap=DisplayYesNo, auth=0x2D)
[12:02:54.123][I][philips_shaver:150]: Connected to shaver (F4:E6:96:E3:EF:5E)
[12:02:54.123][D][binary_sensor:048]: 'Shaver Connected' >> ON
[12:02:54.123][D][esp32_ble_client:211]: [3] [F4:E6:96:E3:EF:5E] ESP_GATTC_SEARCH_CMPL_EVT
[12:02:54.123][I][esp32_ble_client:463]: [3] [F4:E6:96:E3:EF:5E] Service discovery complete
[12:02:54.129][D][main:274]: Connected to shaver, attempting pairing...
[12:02:54.129][I][philips_shaver:219]: Service discovery complete
[12:02:54.129][I][philips_shaver:244]: Device is bonded — re-encrypting with stored keys
[12:02:54.129][D][esp32_ble_tracker:163]: connecting: 0, discovered: 0, disconnecting: 0
[12:02:54.138][D][esp32_ble_tracker:915]: Setting coexistence preference to balanced.
[12:02:54.138][D][esp32_ble_tracker:246]: Starting scan, set scanner state to STARTING.
[12:02:54.138][D][esp32_ble_client:410]: [3] [F4:E6:96:E3:EF:5E] cfg_mtu status 0, mtu 247
[12:02:54.530][W][esp32_ble:625][BTC_TASK]: Ignoring unexpected GAP event type: 9
[12:02:54.537][W][esp32_ble:625][BTC_TASK]: Ignoring unexpected GAP event type: 9
[12:02:54.537][W][esp32_ble:625][BTC_TASK]: Ignoring unexpected GAP event type: 9
[12:02:54.537][W][esp32_ble:625][BTC_TASK]: Ignoring unexpected GAP event type: 9
[12:02:54.630][I][esp32_ble_client:570]: [3] [F4:E6:96:E3:EF:5E] auth complete addr: F4:E6:96:E3:EF:5E
[12:02:54.644][D][esp32_ble_client:575]: [3] [F4:E6:96:E3:EF:5E] auth success type = 1 mode = 1
[12:02:54.750][I][philips_shaver:627]: Notification throttle set to 500 ms
[12:02:54.750][I][philips_shaver:450]: Reading 00002a19-0000-1000-8000-00805f9b34fb (handle 0x0010)...
[12:02:54.769][I][philips_shaver:314]: Read 00002a19-0000-1000-8000-00805f9b34fb: 63 (1 bytes)
[12:02:54.837][W][philips_shaver:434]: Characteristic 00002a26-0000-1000-8000-00805f9b34fb not found in service 0000180a-0000-1000-8000-00805f9b34fb
[12:02:54.875][I][philips_shaver:450]: Reading 00002a28-0000-1000-8000-00805f9b34fb (handle 0x001C)...
[12:02:54.938][I][philips_shaver:314]: Read 00002a28-0000-1000-8000-00805f9b34fb: 353138 (3 bytes)
[12:02:55.047][I][philips_shaver:450]: Reading 8d560117-3cb9-4387-a7e8-b79d826a7025 (handle 0x0051)...
[12:02:55.146][I][philips_shaver:314]: Read 8d560117-3cb9-4387-a7e8-b79d826a7025: 63 (1 bytes)
[12:02:55.172][I][philips_shaver:450]: Reading 8d560118-3cb9-4387-a7e8-b79d826a7025 (handle 0x0054)...
[12:02:55.245][I][philips_shaver:314]: Read 8d560118-3cb9-4387-a7e8-b79d826a7025: 2901 (2 bytes)
[12:02:55.277][I][philips_shaver:450]: Reading 8d560108-3cb9-4387-a7e8-b79d826a7025 (handle 0x0031)...
[12:02:55.351][I][philips_shaver:314]: Read 8d560108-3cb9-4387-a7e8-b79d826a7025: 0000 (2 bytes)
[12:02:55.392][I][philips_shaver:450]: Reading 00002a24-0000-1000-8000-00805f9b34fb (handle 0x0016)...
[12:02:55.486][I][philips_shaver:314]: Read 00002a24-0000-1000-8000-00805f9b34fb: 5068696c697073205337383837 (13 bytes)
[12:02:55.553][I][philips_shaver:450]: Reading 00002a25-0000-1000-8000-00805f9b34fb (handle 0x0018)...
[12:02:55.560][I][philips_shaver:314]: Read 00002a25-0000-1000-8000-00805f9b34fb: 5258303137383837323430373031333634343436 (20 bytes)
[12:02:55.577][I][philips_shaver:450]: Reading 8d56010f-3cb9-4387-a7e8-b79d826a7025 (handle 0x0041)...
[12:02:55.694][I][philips_shaver:314]: Read 8d56010f-3cb9-4387-a7e8-b79d826a7025: 6800 (2 bytes)
[12:02:55.767][I][philips_shaver:450]: Reading 8d56010a-3cb9-4387-a7e8-b79d826a7025 (handle 0x0037)...
[12:02:55.860][I][philips_shaver:314]: Read 8d56010a-3cb9-4387-a7e8-b79d826a7025: 01 (1 bytes)
[12:02:55.892][I][philips_shaver:450]: Reading 8d56010c-3cb9-4387-a7e8-b79d826a7025 (handle 0x003A)...
[12:02:55.970][I][philips_shaver:314]: Read 8d56010c-3cb9-4387-a7e8-b79d826a7025: 01 (1 bytes)
[12:02:56.066][I][philips_shaver:450]: Reading 8d560103-3cb9-4387-a7e8-b79d826a7025 (handle 0x0024)...
[12:02:56.072][I][philips_shaver:314]: Read 8d560103-3cb9-4387-a7e8-b79d826a7025: d007 (2 bytes)
[12:02:56.089][I][philips_shaver:450]: Reading 8d560109-3cb9-4387-a7e8-b79d826a7025 (handle 0x0034)...
[12:02:56.171][I][philips_shaver:314]: Read 8d560109-3cb9-4387-a7e8-b79d826a7025: 0100 (2 bytes)
[12:02:56.183][I][philips_shaver:450]: Reading 8d560107-3cb9-4387-a7e8-b79d826a7025 (handle 0x002E)...
[12:02:56.283][I][philips_shaver:314]: Read 8d560107-3cb9-4387-a7e8-b79d826a7025: 0200 (2 bytes)
[12:02:56.305][I][philips_shaver:450]: Reading 8d560106-3cb9-4387-a7e8-b79d826a7025 (handle 0x002B)...
[12:02:56.370][I][philips_shaver:314]: Read 8d560106-3cb9-4387-a7e8-b79d826a7025: 00000000 (4 bytes)
[12:02:56.382][I][philips_shaver:450]: Reading 8d560110-3cb9-4387-a7e8-b79d826a7025 (handle 0x0044)...
[12:02:56.475][I][philips_shaver:314]: Read 8d560110-3cb9-4387-a7e8-b79d826a7025: 13000000 (4 bytes)
[12:02:56.517][D][philips_shaver:766]: CCCD found via ESP-IDF API: handle 0x0038 for char 0x0037
[12:02:56.564][I][philips_shaver:527]: Subscribing to 8d56010a-3cb9-4387-a7e8-b79d826a7025 (handle 0x0037, cccd 0x0038)...
[12:02:56.564][I][philips_shaver:343]: Notify registered for handle 0x0037
[12:02:56.677][I][philips_shaver:367]: CCCD written for handle 0x0037 (descr 0x0038, value 0x0001)
[12:02:56.678][D][philips_shaver:766]: CCCD found via ESP-IDF API: handle 0x0027 for char 0x0026
[12:02:56.678][I][philips_shaver:527]: Subscribing to 8d560104-3cb9-4387-a7e8-b79d826a7025 (handle 0x0026, cccd 0x0027)...
[12:02:56.678][D][philips_shaver:766]: CCCD found via ESP-IDF API: handle 0x0022 for char 0x0021
[12:02:56.679][I][philips_shaver:527]: Subscribing to 8d560102-3cb9-4387-a7e8-b79d826a7025 (handle 0x0021, cccd 0x0022)...
[12:02:56.679][D][philips_shaver:766]: CCCD found via ESP-IDF API: handle 0x0042 for char 0x0041
[12:02:56.679][I][philips_shaver:527]: Subscribing to 8d56010f-3cb9-4387-a7e8-b79d826a7025 (handle 0x0041, cccd 0x0042)...
[12:02:56.680][D][philips_shaver:766]: CCCD found via ESP-IDF API: handle 0x0011 for char 0x0010
[12:02:56.682][I][philips_shaver:527]: Subscribing to 00002a19-0000-1000-8000-00805f9b34fb (handle 0x0010, cccd 0x0011)...
[12:02:56.682][D][philips_shaver:766]: CCCD found via ESP-IDF API: handle 0x0045 for char 0x0044
[12:02:56.683][I][philips_shaver:527]: Subscribing to 8d560110-3cb9-4387-a7e8-b79d826a7025 (handle 0x0044, cccd 0x0045)...
[12:02:56.683][I][philips_shaver:343]: Notify registered for handle 0x0026
[12:02:56.686][I][philips_shaver:367]: CCCD written for handle 0x0026 (descr 0x0027, value 0x0001)
[12:02:56.686][I][philips_shaver:343]: Notify registered for handle 0x0021
[12:02:56.686][I][philips_shaver:367]: CCCD written for handle 0x0021 (descr 0x0022, value 0x0001)
[12:02:56.686][I][philips_shaver:343]: Notify registered for handle 0x0041
[12:02:56.690][I][philips_shaver:367]: CCCD written for handle 0x0041 (descr 0x0042, value 0x0001)
[12:02:56.690][I][philips_shaver:343]: Notify registered for handle 0x0010
[12:02:56.690][I][philips_shaver:367]: CCCD written for handle 0x0010 (descr 0x0011, value 0x0001)
[12:02:56.690][I][philips_shaver:343]: Notify registered for handle 0x0044
[12:02:56.697][I][philips_shaver:367]: CCCD written for handle 0x0044 (descr 0x0045, value 0x0001)
[12:02:56.697][D][philips_shaver:766]: CCCD found via ESP-IDF API: handle 0x003B for char 0x003A
[12:02:56.697][I][philips_shaver:527]: Subscribing to 8d56010c-3cb9-4387-a7e8-b79d826a7025 (handle 0x003A, cccd 0x003B)...
[12:02:56.697][I][philips_shaver:343]: Notify registered for handle 0x003A
[12:02:56.714][I][philips_shaver:367]: CCCD written for handle 0x003A (descr 0x003B, value 0x0001)
[12:02:56.715][D][philips_shaver:766]: CCCD found via ESP-IDF API: handle 0x0035 for char 0x0034
[12:02:56.715][I][philips_shaver:527]: Subscribing to 8d560109-3cb9-4387-a7e8-b79d826a7025 (handle 0x0034, cccd 0x0035)...
[12:02:56.715][D][philips_shaver:766]: CCCD found via ESP-IDF API: handle 0x002F for char 0x002E
[12:02:56.719][I][philips_shaver:527]: Subscribing to 8d560107-3cb9-4387-a7e8-b79d826a7025 (handle 0x002E, cccd 0x002F)...
[12:02:56.719][W][philips_shaver:487]: Characteristic 8d56011a-3cb9-4387-a7e8-b79d826a7025 not found in service 8d560100-3cb9-4387-a7e8-b79d826a7025
[12:02:56.719][D][philips_shaver:766]: CCCD found via ESP-IDF API: handle 0x0052 for char 0x0051
[12:02:56.719][I][philips_shaver:527]: Subscribing to 8d560117-3cb9-4387-a7e8-b79d826a7025 (handle 0x0051, cccd 0x0052)...
[12:02:56.784][D][philips_shaver:766]: CCCD found via ESP-IDF API: handle 0x0055 for char 0x0054
[12:02:56.784][I][philips_shaver:527]: Subscribing to 8d560118-3cb9-4387-a7e8-b79d826a7025 (handle 0x0054, cccd 0x0055)...
[12:02:56.784][I][philips_shaver:343]: Notify registered for handle 0x0034
[12:02:56.784][I][philips_shaver:367]: CCCD written for handle 0x0034 (descr 0x0035, value 0x0001)
[12:02:56.790][I][philips_shaver:343]: Notify registered for handle 0x002E
[12:02:56.790][I][philips_shaver:367]: CCCD written for handle 0x002E (descr 0x002F, value 0x0001)
[12:02:56.790][I][philips_shaver:343]: Notify registered for handle 0x0051
[12:02:56.790][I][philips_shaver:367]: CCCD written for handle 0x0051 (descr 0x0052, value 0x0001)
[12:02:56.812][I][philips_shaver:343]: Notify registered for handle 0x0054
[12:02:56.812][I][philips_shaver:367]: CCCD written for handle 0x0054 (descr 0x0055, value 0x0001)
[12:02:57.743][D][philips_shaver:394]: Notify 8d56010a-3cb9-4387-a7e8-b79d826a7025: 02 (1 bytes)
[12:02:57.907][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: 9403 (2 bytes)
[12:02:58.661][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: 2e03 (2 bytes)
[12:02:59.375][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: 0c03 (2 bytes)
[12:02:59.888][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: fe02 (2 bytes)
[12:03:00.148][D][philips_shaver:394]: Notify 00002a19-0000-1000-8000-00805f9b34fb: 62 (1 bytes)
[12:03:00.396][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: f002 (2 bytes)
[12:03:00.912][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: eb02 (2 bytes)
[12:03:01.625][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: de02 (2 bytes)
[12:03:02.136][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: da02 (2 bytes)
[12:03:02.651][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: d302 (2 bytes)
[12:03:03.421][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: d002 (2 bytes)
[12:03:04.153][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: ce02 (2 bytes)
[12:03:04.975][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: c502 (2 bytes)
[12:03:05.687][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: c602 (2 bytes)
[12:03:06.097][D][philips_shaver:394]: Notify 8d56010f-3cb9-4387-a7e8-b79d826a7025: 7000 (2 bytes)
[12:03:06.112][D][philips_shaver:394]: Notify 8d56010a-3cb9-4387-a7e8-b79d826a7025: 01 (1 bytes)
[12:03:10.491][D][philips_shaver:394]: Notify 8d56010a-3cb9-4387-a7e8-b79d826a7025: 02 (1 bytes)
[12:03:10.705][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: 4b03 (2 bytes)
[12:03:11.148][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: 1a03 (2 bytes)
[12:03:11.720][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: f702 (2 bytes)
[12:03:12.378][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: e902 (2 bytes)
[12:03:13.152][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: e002 (2 bytes)
[12:03:13.395][D][sensor:124]: 'ble03 free memory' >> 83772.0 b
[12:03:13.680][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: d702 (2 bytes)
[12:03:14.398][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: d902 (2 bytes)
[12:03:14.494][D][sensor:124]: 'ble03 Uptime' >> 122 s
[12:03:15.722][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: cd02 (2 bytes)
[12:03:15.814][D][philips_shaver:394]: Notify 8d56010f-3cb9-4387-a7e8-b79d826a7025: 7500 (2 bytes)
[12:03:15.815][D][philips_shaver:394]: Notify 8d56010a-3cb9-4387-a7e8-b79d826a7025: 01 (1 bytes)
[12:03:22.155][D][philips_shaver:394]: Notify 8d56010a-3cb9-4387-a7e8-b79d826a7025: 02 (1 bytes)
[12:03:22.398][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: 4f03 (2 bytes)
[12:03:22.908][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: 2f03 (2 bytes)
[12:03:23.634][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: 0703 (2 bytes)
[12:03:24.135][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: 0203 (2 bytes)
[12:03:24.921][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: f602 (2 bytes)
[12:03:25.433][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: ea02 (2 bytes)
[12:03:26.152][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: ea02 (2 bytes)
[12:03:26.393][D][philips_shaver:394]: Notify 8d560117-3cb9-4387-a7e8-b79d826a7025: 63 (1 bytes)
[12:03:26.452][D][philips_shaver:394]: Notify 8d560118-3cb9-4387-a7e8-b79d826a7025: 2801 (2 bytes)
[12:03:27.169][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: d902 (2 bytes)
[12:03:27.688][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: d002 (2 bytes)
[12:03:28.402][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: cf02 (2 bytes)
[12:03:28.911][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: cd02 (2 bytes)
[12:03:29.933][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: d002 (2 bytes)
[12:03:30.383][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: c402 (2 bytes)
[12:03:30.886][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: c802 (2 bytes)
[12:03:31.678][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: cd02 (2 bytes)
[12:03:32.400][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: c702 (2 bytes)
[12:03:33.137][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: ca02 (2 bytes)
[12:03:33.924][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: c402 (2 bytes)
[12:03:34.455][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: c102 (2 bytes)
[12:03:34.886][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: c802 (2 bytes)
[12:03:35.399][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: c402 (2 bytes)
[12:03:36.176][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: c302 (2 bytes)
[12:03:36.678][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: c202 (2 bytes)
[12:03:37.404][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: c202 (2 bytes)
[12:03:38.141][D][philips_shaver:394]: Notify 8d56010f-3cb9-4387-a7e8-b79d826a7025: 8500 (2 bytes)
[12:03:38.163][D][philips_shaver:394]: Notify 8d56010a-3cb9-4387-a7e8-b79d826a7025: 01 (1 bytes)
[12:03:38.163][D][philips_shaver:394]: Notify 8d560102-3cb9-4387-a7e8-b79d826a7025: 0000 (2 bytes)
[12:03:43.457][D][philips_shaver:394]: Notify 8d560110-3cb9-4387-a7e8-b79d826a7025: 13000000 (4 bytes)
[12:03:43.485][D][philips_shaver:394]: Notify 8d56010a-3cb9-4387-a7e8-b79d826a7025: 03 (1 bytes)
[12:03:56.685][D][philips_shaver:766]: CCCD found via ESP-IDF API: handle 0x002C for char 0x002B
[12:03:56.686][I][philips_shaver:527]: Subscribing to 8d560106-3cb9-4387-a7e8-b79d826a7025 (handle 0x002B, cccd 0x002C)...
[12:03:56.754][I][philips_shaver:343]: Notify registered for handle 0x002B
[12:03:56.754][I][philips_shaver:367]: CCCD written for handle 0x002B (descr 0x002C, value 0x0001)
1 Like

@zagnuts
Great, glad the update landed cleanly — your logs show reads going through against the post-encryption cache now, which is exactly what I was hoping to see. Appreciate you running
the retest.

Quick take on the three leftovers:

“Motor blocked” + “Unplug required” stuck at Problem

Your 0x0110 reads 13 00 00 00 — that’s a bitfield with bits 0+1+4 set: motor_blocked, clean_reminder (the entity for that only appears on models with a cleaning station, so you probably don’t see it), and unplug_required. These are sticky flags: the shaver latches them until the corresponding bit is written back to zero. The integration doesn’t auto-acknowledge yet, which is why they stay on forever.

Before I wire up an auto-ack toggle, can you clear them manually once? Developer Tools → Actions → switch to YAML mode, paste and run:

action: philips_shaver.acknowledge_notification                                                                                                                                       
data:
  notification: notification_motor_blocked                                                                                                                                            
action: philips_shaver.acknowledge_notification
data:
  notification: notification_unplug_required                                                                                                                                          

If both binary sensors flip to OK and stay OK for a minute or two, I’ll ship auto-ack as an option in the next release. If they snap back right away, I’d rather leave the flags visible than fight the firmware on something that might actually mean something on your model.

“Motor speed: 0 rpm” and “Total operating time: 0.00s”

I dug a bit deeper into the protocol and the semantics aren’t quite what my sensor labels suggest:

  • Motor speed reads characteristic 0x0104. On your S7887 it’s subscribed but the firmware never sends a notification.
  • “Total operating time” is actually the wrong label on my end — 0x0106 is an internal seconds counter the firmware uses as a clock reference for on-device shave history, not a motor runtime total. Reading 00 00 00 00 forty days after your reset means that counter is effectively frozen on the S7887.
  • The actual motor lifetime counter should live on a different characteristic (0x0112) that I’m not currently reading.

If you’ve got a minute, could you fire this one call and paste the response? It reads all three in one shot:

action: philips_shaver.read_characteristic_raw                                                                                                                                        
data:                                                           
  characteristic_uuid:
    - "0x0104"
    - "0x0106"
    - "0x0112"

Ideally once at rest, then start shaving and run the same call again. That tells me three things:

  1. Whether 0x0104 on read (vs. notify) returns a real value while the motor is running — if so I can poll it instead of relying on subscriptions.
  2. Whether 0x0106 is really frozen at zero or just slow to update.
  3. Whether 0x0112 exists on the S7887 at all. If it does, that’s the total-runtime source I should have been exposing, and I’ll rename the current sensor and add this in the next
    release.

Either way — integration’s working, the rest is for my own curiosity and for the next Series 7 user who shows up. No rush at all.

Cheers,
Martin

1 Like

OK - here goes!

  1. Ran the two actions, and both the binary sensors have gone to ‘OK’ and haven’t changed
  2. Ran the next one, and the response was:
status: partial
results:
  8d560104-3cb9-4387-a7e8-b79d826a7025:
    value: e818
    bytes: 2
  8d560106-3cb9-4387-a7e8-b79d826a7025:
    value: "00000000"
    bytes: 4
  8d560112-3cb9-4387-a7e8-b79d826a7025:
    value: null
    bytes: 0
    error: >-
      No service UUID mapping for characteristic
      8d560112-3cb9-4387-a7e8-b79d826a7025

Then during shaving:

status: partial
results:
  8d560104-3cb9-4387-a7e8-b79d826a7025:
    value: e818
    bytes: 2
  8d560106-3cb9-4387-a7e8-b79d826a7025:
    value: "00000000"
    bytes: 4
  8d560112-3cb9-4387-a7e8-b79d826a7025:
    value: null
    bytes: 0
    error: >-
      No service UUID mapping for characteristic
      8d560112-3cb9-4387-a7e8-b79d826a7025

Then after shaving - the same ie no change. So end result is I suspect they can be ignored for this shaver. Not an issue, but good to know. FYI The Motor Speed sensor now stays at 2,100rpm.

HACS update: philips_shaver is now in the HACS default repository (hacs/default#6309, merged 2026-05-14).

No more custom-repository step — open HACS → Integrations and search for Philips Shaver.

Confirmed working: OneBlade QP4530, XP9201, S7887, XP9405 — see the README for the full list and protocol matrix.

Thanks to everyone here who sent shaver MACs, FW versions and pairing logs — the S7887 and XP9405 coverage came directly out of this thread.

1 Like

Well done, @mtheli!

1 Like