Add River 3 telemetry and schema-based diagnostics

Decode River 3 separately and accumulate partial reports against a field-level checklist. Keep watch mode running after completion.

Label fields and nested records from the pinned pr705 schema. Preserve unknown values and document unverified meanings and routing.

Add synthetic regressions, the River 3 field reference, schema-generation tooling, and upstream attribution.
This commit is contained in:
tim
2026-10-08 14:08:20 +02:00
parent bac953bf48
commit c2faeb669a
14 changed files with 3055 additions and 263 deletions
+18 -15
View File
@@ -73,17 +73,18 @@ curl --fail --location --output bmspy/ecoflow_keydata.py \
This file is ignored by Git and excluded from packages. Type 1 devices do not need it.
#### Dump a River 2
#### Dump both Rivers
Device arguments use `name@ADDRESS/SERIAL/USERID`. Replace the placeholders below
with the device's Bluetooth address, serial number, and your account user ID:
with each device's Bluetooth address, serial number, and your account user ID:
```bash
uv run --extra ecoflow-bt bmspy-server --socket /tmp/bmspy-rivers.sock \
-d 'river2@RIVER2_MAC/RIVER2_SERIAL/YOUR_USER_ID'
-d 'river2@RIVER2_MAC/RIVER2_SERIAL/YOUR_USER_ID' \
-d 'river3@RIVER3_MAC/RIVER3_SERIAL/YOUR_USER_ID'
```
Leave the server running. In another terminal, print its snapshot:
Leave the server running. In another terminal, print both snapshots:
```bash
uv run bmspy --socket /tmp/bmspy-rivers.sock
@@ -98,7 +99,7 @@ before retrying. Unavailable devices are omitted from the response.
#### Diagnostics
Stop the server before connecting directly. Scan and collect reports from nearby supported devices:
Stop the server before connecting directly. Scan and collect reports from both Rivers:
```bash
uv run --extra ecoflow-bt python -u tools/ecoflow-bt.py --user-id YOUR_USER_ID --scan --timeout 30
@@ -114,18 +115,20 @@ add `--device ADDRESS`. Without scanning, replace `--scan` with
Session keys stay internal. The script has no encryption override or key-export option.
River 2 collection waits for three valid core reports, not optional inverter or
solar reports. A timeout reports incomplete collection. Use `--watch` to receive
later reports.
solar reports. River 3 waits for 53 baseline fields across several reports.
These checks do not guarantee every possible field. A timeout reports incomplete
collection. Use `--watch` to receive later reports.
River 2 reports charge, temperature, power, and time estimates. Missing measurements
stay absent. See the [River 2 measurement reference](docs/ecoflow-river2-fields.md)
for units, decoding rules, and known limits.
Both models report charge, temperature, power, and time estimates through separate
decoders. Missing measurements stay absent. See the
[River 2 measurement reference](docs/ecoflow-river2-fields.md) and
[River 3 field reference](docs/ecoflow-river3-fields.md) for units, decoding rules,
and known limits.
Client snapshots include all complete River 2 heartbeat fields under
`ef_river2_*`, alongside the shared measurements and raw packets.
Partial reports retain earlier field values. See the
[River 2 field reference](docs/ecoflow-river2-fields.md#reported-fields-available-to-clients)
for names, units, and limits.
Client snapshots also include reported protocol fields under `ef_river2_*` and
`ef_river3_display_*`, alongside the shared measurements and raw packets.
Partial reports retain earlier field values. Nested River 3 groups use JSON text
in their `info` fields. The references above describe names, units, and limits.
### Running via systemd