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).
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:
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)
- HACS → ⋮ → Custom repositories
- Add
https://github.com/lightheaded/ha-skyrc, category Integration - 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) |
|
| Other SkyRC “neo”-series chargers |
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.
