Skip to main content

solarflow-ble

Async Python library for Zendure SolarFlow devices over Bluetooth Low Energy. The protocol work builds on esphome-solarflow-ble and reverse engineering of the Zendure Android app.

The library has been tested with a SolarFlow 2400AC through a Home Assistant Connect AUX-2 Bluetooth proxy. It requires Python 3.14 or newer.

Install

uv add solarflow-ble

Library usage

SolarFlowClient accepts an injected BleTransport. Tests can use a fake transport without Bluetooth hardware.

import asyncio

from bleak.backends.device import BLEDevice

from solarflow_ble import BleakTransport, SolarFlowClient


async def main() -> None:
    device = BLEDevice("AA:BB:CC:DD:EE:FF", "SolarFlow", {})
    client = SolarFlowClient(BleakTransport(device))
    try:
        await client.connect()
        print(client.device_id)
        print(client.state)
    finally:
        await client.disconnect()


asyncio.run(main())

The client waits for BLESPP, sends BLESPP_OK, requests getInfo, then sends a read request for getAll. It keeps the session updated with report messages. Always disconnect the client.

Control methods are disabled unless allow_control=True. Validated ranges are:

  • input and output limits: 0..2400 W
  • minimum SOC: 0..50%
  • target SOC: 70..100%
  • AC mode: 1 or 2

Probe

The developer-only probe captures raw GATT traffic through an ESPHome Bluetooth proxy. It never sends device-setting writes.

List advertisements:

uv run scripts/probe_solarflow.py \
  --proxy "the-ip-of-your-esphome-bluetooth-proxy" \
  --noise-psk "the-encryption-key-of-your-esphome-bluetooth-proxy" \
  --list-advertisements \
  --show-identities

Capture a target by address or SolarFlow advertisement identifier:

uv run scripts/probe_solarflow.py \
  --proxy "the-ip-of-your-esphome-bluetooth-proxy" \
  --noise-psk "the-encryption-key-of-your-esphome-bluetooth-proxy" \
  --identifier "DEVICE_IDENTIFIER" \
  --capture-seconds 30 \
  --output /tmp/solarflow.jsonl

Use --no-handshake for passive notification capture. Addresses, identifiers, device IDs, product keys, pack serials, and credentials are redacted from capture files. --show-identities affects logs only.

The probe uses the same SolarFlowClient protocol flow as the library in normal mode. Passive mode connects directly to the notification characteristic without sending protocol writes.

Standalone library test

scripts/test_solarflow_client.py exercises the library directly. It does not use the probe script. The default run is read-only and requires exactly one of --address or --identifier.

uv run scripts/test_solarflow_client.py \
  --proxy "the-ip-of-your-esphome-bluetooth-proxy" \
  --noise-psk "the-encryption-key-of-your-esphome-bluetooth-proxy" \
  --identifier "DEVICE_IDENTIFIER" \
  --duration 30 \
  --output /tmp/solarflow-library-test.jsonl

You can put the connection settings in the ignored file scripts/test_solarflow_client.local.json:

{
  "proxy": "the-ip-of-your-esphome-bluetooth-proxy",
  "noise_psk": "the-encryption-key-of-your-esphome-bluetooth-proxy",
  "identifier": "DEVICE_IDENTIFIER"
}

Then run:

uv run scripts/test_solarflow_client.py --duration 30

The script prints decoded updates to stdout and always redacts optional JSONL output. Controls require both --controls and --confirm-controls. Never commit the local config or a real PSK.

Development

uv sync
uv run python -m scripts.check

Run focused tests:

uv run pytest tests/test_solarflow.py
uv run pytest tests/test_solarflow_client_script.py

The full gate runs format, Ruff, mypy, branch-covered tests, coverage, and uv build in that order.

License

MIT. See LICENSE.

Metadata

Release files for solarflow-ble 0.1.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for solarflow-ble 0.1.3
File Size Uploaded
solarflow_ble-0.1.3.tar.gz 8.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for solarflow-ble 0.1.3
File Interpreter ABI Platform
solarflow_ble-0.1.3-py3-none-any.whl Python 3 none any Details

Total release size: 19.7 kB

Release files / solarflow_ble-0.1.3.tar.gz

Download URL solarflow_ble-0.1.3.tar.gz
Size 8.7 kB
Tags Source
SHA-256 checksum
How to use checksums
f9e9933deaa16801b22d340266787ddf8c60cb0f647893a3568619029d817e21
BLAKE2b-256 checksum
How to use checksums
2aa4425a5486a3ddb3e525f69f73f16170598e439f9370e7c97e2ef2b18d7af5
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 21, 2026.

Transparency log

Release files / solarflow_ble-0.1.3-py3-none-any.whl

Download URL solarflow_ble-0.1.3-py3-none-any.whl
Size 11.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d4853553b5f83b4ff346ce4dede1e8c9174e270b589910c4999e1e741dff9ad3
BLAKE2b-256 checksum
How to use checksums
a599ce72b8c1066d42d97342e0b7821a7c71d2ba83569f4318055b07ce52b036
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 21, 2026.

Transparency log

Release history Release notifications | RSS feed

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

This release

0.1.3 This release

2 release files

0.1.2

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page