From d532c7da89ebfa17da23b79aa39c047cd9637969 Mon Sep 17 00:00:00 2001 From: Scott Penrose Date: Thu, 4 Jun 2026 22:53:45 +1000 Subject: [PATCH] work on diff methocds --- README.md | 48 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index a0e6866..1cf6981 100644 --- a/README.md +++ b/README.md @@ -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