This release is a pre-release and may not be stable for production use.
bluetti-bt-lib
Inofficial Library for basic communication to bluetti powerstations. Core functions based on https://github.com/warhammerkid/bluetti_mqtt
The current Roadmap for this project and repositories using this library can be found here
Disclaimer
This library is provided without any warranty or support by Bluetti. I do not take responsibility for any problems it may cause in all cases. Use it at your own risk.
Projects using this library
- Home Assistant Integration
- MQTT Server (planned)
- UPS Server (NUT compatible)
Supported Powerstations and data
Validated
| Device Name | total_battery_percent | dc_input_power | ac_input_power | dc_output_power | ac_output_power |
|---|---|---|---|---|---|
| AC70 | ✅ | ✅ | ✅ | ✅ | ✅ |
| AC180 | ✅ | ✅ | ✅ | ✅ | ✅ |
| EB3A | ✅ | ✅ | ✅ | ✅ | ✅ |
| EP600 | ✅ | PV | Grid | ❌ | AC Phases |
| Handsfree 1 | ✅ | ✅ | ✅ | ✅ | ✅ |
Added and mostly validated by contributors (some are moved here from the HA Integration https://github.com/Patrick762/hassio-bluetti-bt):
| Device Name | Contributor | total_battery_percent | dc_input_power | ac_input_power | dc_output_power | ac_output_power |
|---|---|---|---|---|---|---|
| AC2A | @ruanmed | ✅ | ✅ | ✅ | ✅ | ✅ |
| AC50B | @goetzc | ✅ | ❌ | ✅ | ✅ | ✅ |
| AC60 | @mzpwr | ✅ | ✅ | ✅ | ✅ | ✅ |
| AC60P | @mzpwr | ✅ | ✅ | ✅ | ✅ | ✅ |
| AC70P | @matthewpucc | ✅ | ✅ | ✅ | ✅ | ✅ |
| AC180P | @Patrick762 | ✅ | ✅ | ✅ | ✅ | ✅ |
| AC200L | bluetti-mqtt | ✅ | ✅ | ✅ | ✅ | ✅ |
| AC200M | bluetti-mqtt | ✅ | ✅ | ✅ | ✅ | ✅ |
| AC200PL | @0x4E4448 | ✅ | ✅ | ✅ | ✅ | ✅ |
| AC300 | bluetti-mqtt | ✅ | ✅ | ✅ | ✅ | ✅ |
| AC500 | bluetti-mqtt | ✅ | ✅ | ✅ | ✅ | ✅ |
| AP300 | @seaburger, @sidieje | ✅ | ✅ | ✅ | ✅ | ✅ |
| EL30V2 | @dgudim | ✅ | ✅ | ✅ | ✅ | ✅ |
| EL100V2 | @seaburger, lesolas20 | ✅ | ✅ | ✅ | ✅ | ✅ |
| EP500 | bluetti-mqtt | ✅ | ✅ | ✅ | ✅ | ✅ |
| EP500P | bluetti-mqtt | ✅ | ✅ | ✅ | ✅ | ✅ |
| EP760 | @Apfuntimes | ✅ | PV | Grid | ❌ | AC Phases |
| EP800 | @jhagenk | ✅ | ❌ | ❌ | ❌ | ❌ |
| Handsfree 2 | @pablogiaccaglia | ✅ | ✅ | ✅ | ✅ | ✅ |
| PR30V2 | @gentoo90 | ✅ | ✅ | ✅ | ✅ | ✅ |
| PR100V2 | shares PR30V2 register layout (pending validation) | ✅ | ✅ | ✅ | ✅ | ✅ |
| EL10 | sidieje | ✅ | ✅ | ✅ | ✅ | ✅ |
Controls
Validated:
| Device Name | ctrl_ac | ctrl_dc |
|---|---|---|
| EB3A | ✅ | ✅ |
| EP600 | ✅ | ❌ |
Added and mostly validated by contributors:
| Device Name | Contributor | ctrl_ac | ctrl_dc | ctrl_ups_mode | soc_range_start | soc_range_end |
|---|---|---|---|---|---|---|
| AC200L | bluetti-mqtt, @seaburger | ✅ | ✅ | ✅ | ❌ | ❌ |
| EL30V2 | @x3ccd4828 | ✅ | ✅ | ❌ | ❌ | ❌ |
| Handsfree 2 | @pablogiaccaglia | ✅ | ✅ | ❌ | ❌ | ❌ |
Battery pack data
| Device Name | voltage | battery_soc | cell_voltages |
|---|---|---|---|
| AC300 | ✅ | ✅ | ✅ |
Installation
pip install bluetti-bt-lib
Commands for testing
Commands included in this library should only be used for testing.
Scan for supported devices
usage: bluetti-scan [-h] [-r REGEX] [-s SCAN_TIME]
Detect bluetti devices by bluetooth name
options:
-h, --help show this help message and exit
-r REGEX, --regex REGEX
Custom regex to match device name
-s SCAN_TIME, --scan-time SCAN_TIME
How long to scan for devices (seconds)
Example output: ['EB3A', '00:00:00:00:00:00']
Detect device type by mac address
usage: bluetti-detect [-h] mac
Detect bluetti devices
positional arguments:
mac Mac-address of the powerstation
options:
-h, --help show this help message and exit
Example:
bluetti-detect 00:00:00:00:00:00
Example output: Device type is 'EB3A' with iot version 1 and serial 0000000000000. Full name: EB3A0000000000000
Read device data for supported devices
usage: bluetti-read [-h] [-m MAC] [-t TYPE] [-e ENCRYPTION]
Detect bluetti devices
options:
-h, --help show this help message and exit
-m MAC, --mac MAC Mac-address of the powerstation
-t TYPE, --type TYPE Type of the powerstation (AC70 f.ex.)
-e ENCRYPTION, --encryption ENCRYPTION
Add this if encryption is needed
Example:
bluetti-read -m 00:00:00:00:00:00 -t EB3A
Example output:
FieldName.DEVICE_TYPE: EB3A
FieldName.DEVICE_SN: 0000000000000
FieldName.BATTERY_SOC: 92%
FieldName.DC_INPUT_POWER: 0W
FieldName.AC_INPUT_POWER: 0W
FieldName.AC_OUTPUT_POWER: 0W
FieldName.DC_OUTPUT_POWER: 0W
FieldName.CTRL_AC: False
FieldName.CTRL_DC: True
FieldName.CTRL_LED_MODE: LedMode.OFF
FieldName.CTRL_POWER_OFF: False
FieldName.CTRL_ECO: False
FieldName.CTRL_ECO_TIME_MODE: EcoMode.HOURS1
FieldName.CTRL_CHARGING_MODE: ChargingMode.STANDARD
FieldName.CTRL_POWER_LIFTING: False
Write to supported device
INFO: Devices with encryption are currently not supported!
usage: bluetti-write [-h] [-m MAC] [-t TYPE] [--on ON] [--off OFF] [-v VALUE] [-e ENCRYPTION] field
Write to bluetti device
positional arguments:
field Field name (ctrl_dc f.ex.)
options:
-h, --help show this help message and exit
-m MAC, --mac MAC Mac-address of the powerstation
-t TYPE, --type TYPE Type of the powerstation (AC70 f.ex.)
--on ON Value to write
--off OFF Value to write
-v VALUE, --value VALUE
Value to write (integer, see enum for value)
-e ENCRYPTION, --encryption ENCRYPTION
Add this if encryption is needed
Example:
bluetti-write -m 00:00:00:00:00:00 -t EB3A --on on ctrl_ac
Adding fields
To add new fields, you can use the bluetti-detect command to first find out which version of iot protocol is used and if it uses encryption.
After you got this information, you can use the bluetti-readall command to read every registry and save the data to a json file and a hexdump (10 bytes per line). You should also note all values you see in the app to later compare the data.
Here's how to use the bluetti-readall command:
usage: bluetti-readall [-h] [-m MAC] [-v VERSION] [-e ENCRYPTION]
Detect bluetti devices
options:
-h, --help show this help message and exit
-m MAC, --mac MAC Mac-address of the powerstation
-v VERSION, --version VERSION
IoT protocol version
-e ENCRYPTION, --encryption ENCRYPTION
Add this if encryption is needed
With the separate tool at bluetti-bt-raw-reader you can view those values in a more understandable way.
You can also share the output with me using this form
To test added fields with the created json file, use bluetti-parse:
usage: bluetti-parse [-h] file
Parse readall output files
positional arguments:
file JSON file of the powerstation readall output
options:
-h, --help show this help message and exit
Release files for bluetti-bt-lib 0.2.0b5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| bluetti_bt_lib-0.2.0b5.tar.gz | 29.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| bluetti_bt_lib-0.2.0b5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 87.1 kB
Release files / bluetti_bt_lib-0.2.0b5.tar.gz
| Download URL | bluetti_bt_lib-0.2.0b5.tar.gz |
|---|---|
| Size | 29.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3f9cbb0c5556e7942ff6d4aed5692fd7de67b7e761f910431dfdfeebd954f6be
|
|
BLAKE2b-256 checksum How to use checksums |
1623b365d3911b7a61c999ccc077120c9560f8a2c9a634a9052c487f372770cb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / bluetti_bt_lib-0.2.0b5-py3-none-any.whl
| Download URL | bluetti_bt_lib-0.2.0b5-py3-none-any.whl |
|---|---|
| Size | 57.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2913b7078f66986f103294e2da0991bbfb176d755adcb9e9161366ee91e93c2a
|
|
BLAKE2b-256 checksum How to use checksums |
c5dc4bd5f215e4857ad9f91c2ab09479add2b9817b9a944afe3664d6f4b822ef
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency log