work on diff methocds
This commit is contained in:
@@ -27,22 +27,44 @@ The protocol is ported from the excellent
|
||||
time in round-robin.
|
||||
- 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) |
|
||||
|---|---|---|
|
||||
| Transport | GATT connect + Modbus poll | passive advertisement scan |
|
||||
| Data | full register set + **control** | monitoring snapshot, **read-only** |
|
||||
| Encryption | none (older models only) | **AES-128-CTR**, key from the app |
|
||||
| Works on | AC300, AC200M, EB3A, EP500P, … (older/plaintext generation) | newer **encrypted** generation: Elite / V2 / EP600, etc. |
|
||||
| # | Channel | Where | Status | Use for |
|
||||
|---|---|---|---|---|
|
||||
| 1 | **`BluettiBLE`** — BLE GATT connection | `src/BluettiBLE.*` | ✅ **Working** (builds, on-hardware-pending per model) | Older/plaintext models — full read **+ control** |
|
||||
| 2 | **`BluettiADV`** — BLE advertisement broadcast | `src/BluettiADV.*` | ⏳ **Ready, blocked on key** | Newer encrypted models — read-only, local |
|
||||
| 3 | **Cloud Open API** — HTTPS | `cloud/bluetti.mjs` | ⏳ **Ready, pending account approval** | Any model incl. EL300 — read **+ control**, via cloud |
|
||||
|
||||
If `BluettiBLE` connects but never returns data and the unit disconnects after a
|
||||
few seconds, your device is the newer encrypted generation — use **`BluettiADV`**
|
||||
instead (see [Advertisement mode](#advertisement-mode-bluettiadv) below). The
|
||||
connection/control channel on those models is locked behind a proprietary
|
||||
handshake and is not supported; the advertisement channel is open and documented.
|
||||
### 1. `BluettiBLE` — local GATT connection ✅ Working
|
||||
Connects over BLE GATT and polls the plaintext Modbus-style protocol. No pairing
|
||||
or key. Full register read plus AC/DC output control. **Works on the older /
|
||||
plaintext generation** (AC300, AC200M, EB3A, EP500P, …). The library compiles and
|
||||
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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user