work on diff methocds

This commit is contained in:
2026-06-04 22:53:45 +10:00
parent 436bee235f
commit d532c7da89
+35 -13
View File
@@ -27,22 +27,44 @@ The protocol is ported from the excellent
time in round-robin. time in round-robin.
- Zero external dependencies — uses the stock ESP32 Arduino BLE stack. - Zero external dependencies — uses the stock ESP32 Arduino BLE stack.
## Two modes: connection vs. advertisement ## Three ways to read a Bluetti — and their status
Bluetti exposes two different BLE channels, and this library has a class for each: Bluetti data is reachable over three different channels. This project covers all
three; which one you use depends on your model's generation.
| | `BluettiBLE` (connection) | `BluettiADV` (advertisement) | | # | Channel | Where | Status | Use for |
|---|---|---| |---|---|---|---|---|
| Transport | GATT connect + Modbus poll | passive advertisement scan | | 1 | **`BluettiBLE`** — BLE GATT connection | `src/BluettiBLE.*` | ✅ **Working** (builds, on-hardware-pending per model) | Older/plaintext models — full read **+ control** |
| Data | full register set + **control** | monitoring snapshot, **read-only** | | 2 | **`BluettiADV`** — BLE advertisement broadcast | `src/BluettiADV.*` | ⏳ **Ready, blocked on key** | Newer encrypted models — read-only, local |
| Encryption | none (older models only) | **AES-128-CTR**, key from the app | | 3 | **Cloud Open API** — HTTPS | `cloud/bluetti.mjs` | ⏳ **Ready, pending account approval** | Any model incl. EL300 — read **+ control**, via cloud |
| Works on | AC300, AC200M, EB3A, EP500P, … (older/plaintext generation) | newer **encrypted** generation: Elite / V2 / EP600, etc. |
If `BluettiBLE` connects but never returns data and the unit disconnects after a ### 1. `BluettiBLE` — local GATT connection ✅ Working
few seconds, your device is the newer encrypted generation — use **`BluettiADV`** Connects over BLE GATT and polls the plaintext Modbus-style protocol. No pairing
instead (see [Advertisement mode](#advertisement-mode-bluettiadv) below). The or key. Full register read plus AC/DC output control. **Works on the older /
connection/control channel on those models is locked behind a proprietary plaintext generation** (AC300, AC200M, EB3A, EP500P, …). The library compiles and
handshake and is not supported; the advertisement channel is open and documented. links; per-model field maps are ported from the reference project and want a
final on-hardware sanity check. See [Quick start](#quick-start).
### 2. `BluettiADV` — local advertisement broadcast ⏳ Ready, blocked on key
Passively decodes the encrypted monitoring broadcast that **newer** units emit
(Elite / V2 / EP600 / AC180 / AC200L …). Read-only, no connection. The decoder is
implemented (AES-128-CTR + the official BLE-ADV field layout) and builds, but it
needs the device's **16-byte AES key**, which Bluetti has not yet exposed in the
app for these models. Ready to run the moment a key is available. See
[Advertisement mode](#advertisement-mode-bluettiadv).
### 3. Cloud Open API — HTTPS ⏳ Ready, pending account approval
For encrypted models (incl. the **EL300**) whose local channels are locked, the
official cloud Open Platform works today — full read and control, no AES key. The
signed client is implemented in [`cloud/bluetti.mjs`](cloud/README.md). It needs a
registered developer app + IoT API permission + the device SN authorized to your
account; **app approval is currently pending** (Bluetti review, ~1 day). Not
ESP32-native (HTTPS/cloud).
> **Quick decision:** older Bluetti → use **#1** locally. Newer/Elite (EL300) →
> use **#3** (cloud) now, switch to **#2** (local) once the broadcast key ships.
> If `BluettiBLE` connects then disconnects within seconds with no data, you have
> a newer encrypted unit — that's the #2/#3 path.
## Supported devices ## Supported devices