SkyRC Charger (BLE) — per-channel monitoring + “charging done” notifications

I got tired of walking over to my SkyRC Q200neo to see whether a pack had finished, so I built a custom integration that monitors it over Bluetooth and lets Home Assistant push me a notification the moment a channel is done. There was no existing HA support for these chargers, and the BLE protocol isn’t documented, so this is a from-scratch, reverse-engineered integration (standing on shoulders of giants like sidhantgoel).

Repo: GitHub - lightheaded/ha-skyrc: Unofficial Home Assistant custom integration for the SkyRC Q200neo BLE charger — per-channel monitoring + charge-complete notifications · GitHub

What it does

Each of the charger’s four channels (A-D) becomes a set of entities:

  • Status: enum sensor: working / idle / done / error / ready / standby / dc_power
  • Charging: binary sensor
  • Capacity (mAh), Voltage (V), Current (A), Battery temperature (°C)
  • Duration (disabled by default)
  • Plus a device-level charger internal temperature (diagnostic)

The status sensor also carries cell_count / cell_configuration attributes (2S, 3S, …), so notifications can include the pack configuration.

No local Bluetooth on your HA host? No problem

My HA runs as a VM with no Bluetooth radio — this works entirely through an ESPHome Bluetooth Proxy, so the charger just needs to be near any proxy (or a local adapter). The integration uses a connect → poll → disconnect cycle so it doesn’t hog the charger’s single BLE slot — the SkyCharger phone app can still connect between polls.

Example: notify when a battery is done

The integration ships no notification logic on purpose — you wire it up with a normal automation. This one reports the channel, cell configuration and pack voltage:

:battery: SkyRC charging complete
Channel B finished charging (2S) — 8.39 V

alias: SkyRC — notify when charging done
mode: queued
triggers:
  - trigger: state
    entity_id:
      - sensor.charger_8f12_channel_a_status
      - sensor.charger_8f12_channel_b_status
      - sensor.charger_8f12_channel_c_status
      - sensor.charger_8f12_channel_d_status
    to: "done"
actions:
  - action: notify.mobile_app_your_phone
    data:
      title: 🔋 SkyRC charging complete
      message: >-
        {%- set eid = trigger.entity_id -%}
        {%- set ch = eid.split('_channel_')[1].split('_status')[0] | upper -%}
        {%- set v = states(eid.replace('_status', '_voltage')) | float(0) | round(2) -%}
        {%- set cells = state_attr(eid, 'cell_configuration') -%}
        Channel {{ ch }} finished charging{% if cells %} ({{ cells }}){% endif %} — {{ v }} V

Installation (HACS custom repository)

  1. HACS → ⋮ → Custom repositories
  2. Add https://github.com/lightheaded/ha-skyrc, category Integration
  3. Install, restart HA — the charger is auto-discovered (it advertises as #Charger-XXXX)

Requires HA 2024.12+ and a Bluetooth adapter or ESPHome proxy in range.

Supported hardware

Model Status
Q200neo (product code 100197) :white_check_mark: Tested on real hardware
Other SkyRC “neo”-series chargers :warning: Likely works — same BLE protocol. Reports very welcome

The domain is generic (skyrc) so other models can be added without breaking existing entities.

Honest caveats

  • Unofficial & reverse-engineered. Not affiliated with SkyRC. Protocol notes are in PROTOCOL.md. A firmware update could change payloads.
  • Single BLE client — while HA is polling, the phone app can’t connect (and vice-versa). The disconnect-between-polls cycle keeps this friendly.
  • No channel-password support yet — if you’ve set a channel password in the SkyCharger app, queries won’t return data (the integration surfaces a clear error). Contributions welcome.
  • Full disclosure: this was built entirely by Claude (Opus 4.8) — protocol port, integration code, unit tests and on-hardware validation against my live Q200neo. I’d still review the code before trusting it near LiPos.

Feedback, issues and PRs welcome — especially confirmation on other SkyRC models.