Contributing a new Bluetti device¶
This guide walks you through capturing the data needed to add support for a new Bluetti device model to voltkeeper.
What you need¶
The device, charged and powered on
An Android phone with the official Bluetti app installed
adbaccess (USB debugging enabled on the phone)A Linux/macOS/Windows machine with Python 3.13+ and
uvA Bluetooth adapter
Step 1: Identify the device¶
Run a scan to confirm voltkeeper can see the device:
voltkeeper scan
Note the MAC address and Bluetooth name (e.g. AC2A2305000).
Step 2: Probe the register layout¶
Use voltkeeper probe to capture every readable Modbus register block:
voltkeeper probe <ADDRESS> -o my-device.yaml
This writes my-device.yaml with the device’s protocol version and raw
register data. Save this file — you’ll submit it later.
Step 3: Capture official-app traffic¶
We need to see what the Android app sends and receives so we can map register values to field names.
On your Android phone, enable Developer options, then enable “Enable Bluetooth HCI snoop log”.
Open the Bluetti app and exercise the features you want to map (toggle AC output, change charging mode, view battery details, etc.).
Once you’ve exercised everything, disable Bluetooth HCI snoop log (toggling it off writes the log buffer to disk).
Pull the log with
adb bugreportor extract directly:adb pull /sdcard/btsnoop_hci.log
Parse the log into a CSV timeline:
python scripts/parse_btsnoop.py btsnoop_hci.log > capture.csv
If your device uses BLE encryption (protocolVer >= 2000), the
parser can decrypt frames with --key and --iv, but extracting
the per-session AES key is not yet automated. For now: submit the raw
btsnoop log alongside your my-device.yaml, and a maintainer will pair
it with a session derived from voltkeeper’s handshake to decrypt and
analyze.
Once you have a key (16 bytes / 32 hex chars) and initial IV:
python scripts/parse_btsnoop.py btsnoop_hci.log --key a1b2... --iv c3d4... > capture.csv
Step 4: Submit¶
Open a GitHub issue on voltkeeper with both files attached:
my-device.yaml(the probe output)capture.csv(the parsed btsnoop timeline)
In your issue, include the device model name and any notes about what features you tested (e.g. “toggled AC output, observed grid+mode, max battery SOC was 95%”).
A maintainer will use these files to build a device class and get it merged — no coding required on your part.
Encryption notes¶
Most V1 devices (
protocolVer < 2000) use plaintext BLE — no key needed.V2 devices may use AES-CBC encryption. If your probe YAML shows
protocol: v2, try the parse with and without--key.
macOS notes¶
macOS uses a different Bluetooth stack. If you encounter device discovery issues, try using a Linux VM or a Raspberry Pi for the BLE capture step. The btsnoop parsing step doesn’t require Bluetooth — it can run on any platform.