You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Neues Fahrzeug-(SoC)-Modul byd: liest SoC, Reichweite und Kilometerstand über die BYD-Cloud-API. Protokoll reverse-engineered von pyBYD (MIT) und ioBroker.byd (MIT), synchron mit requests nachgebaut (pyBYD selbst braucht Python ≥3.11, openWB läuft auf 3.9). official=False.
Wichtig: BYD erlaubt nur eine aktive Sitzung pro Account – ein zweiter/geteilter Account ist nötig (Workaround in der UI dokumentiert, siehe separater UI-PR). Ein fehlgeschlagener Login wird daher 1h pausiert, um keine Login-Versuche zu verbrennen. Jeder Account bekommt außerdem einen eigenen, zufälligen Geräte-Fingerprint statt eines global geteilten (wirkte sonst wie ein Bot-Signal).
Live getestet über den normalen Control-Loop: Login, Fingerprint-Generierung, VIN-Auflösung und SoC-Abruf erfolgreich. flake8 sauber, volle Testsuite ohne Regressionen. Hybrid-Fahrzeuge (energy_type) technisch unterstützt, aber nur an einem reinen EV-Account getestet.
_fetch_realtime() checked elecPercent is not None to detect real data,
but the vehicleRealTimeRequest trigger response is a placeholder that
already contains elecPercent=0 (not absent), so it was accepted
immediately instead of waiting for the vehicleRealTimeResult poll.
Confirmed via a clean upstream-pybyd-only test against the affected
account: the backend returns real telemetry fine, so this was a bug
in our own readiness check, not a BYD-side restriction. Ports pyBYD's
own is_ready_raw() heuristic (onlineState/time/tire-pressure/
enduranceMileage) instead of the elecPercent check.
- Bisher hat jede openWB-Installation beim Login denselben hart codierten
(und ungültig formatierten) Geräte-Fingerprint an BYD geschickt - aus
Sicht des Backends ein klassisches Bot/Credential-Stuffing-Signal und ein
plausibler Mitverursacher der beobachteten Login-Sperren. Jeder
konfigurierte Account bekommt jetzt einen eigenen, zufälligen aber
plausiblen Android-Fingerprint (gültige IMEI per Luhn-Prüfziffer,
zufällige MAC, aus einem kleinen Pool echter Geräte), einmalig generiert
und über den bestehenden retained-MQTT-Mechanismus dauerhaft gespeichert
(analog zu key_expires_at bei myskoda), damit der Account immer als
dasselbe Gerät auftritt. Pool/Generator von
https://github.com/TA2k/ioBroker.byd (MIT) übernommen.
- Ein fehlgeschlagener Login (falsches Passwort, Sperre durch gleichzeitig
aktive Session, etc.) verbraucht einen von wenigen Versuchen, bevor der
BYD-Account gesperrt wird. Neuer Cooldown von 1h nach jedem Login-Fehler,
damit das reguläre Polling (alle 5min während des Ladens) den Account
nicht einfach weiter verbrennt.
- Veralteten Kommentar korrigiert, der behauptete, der VIN-Cache würde wie
key_expires_at bei myskoda dauerhaft gespeichert - tut er nicht (kein
Pub()-Aufruf dafür), nur der Geräte-Fingerprint jetzt tatsächlich.
vehicle ist zwar als int typisiert, wird vom Aufrufer (subdata.py, direkt
aus dem MQTT-Topic geparst) aber tatsächlich als str übergeben - bestätigt
durch einen echten Crash beim ersten Live-Test. Betraf sowohl die neue
Fingerprint-Logzeile in soc.py als auch eine bereits bestehende Logzeile
in api.py (Session-Ablauf-Meldung). Beide auf %s umgestellt.
Concurrent session refresh invalidates another vehicle's replacement session
packages/modules/vehicles/byd/api.py:403
If two vehicles on the same account reject the same expired session, both call _get_session(..., force_relogin=True). The account lock serializes the logins but does not deduplicate them. Under BYD's one-active-session rule, the second login invalidates the first vehicle's replacement session, so its only retry can fail. Pass the rejected session into _get_session and, under the account lock, reuse the cached session if another thread has already replaced it. Add a concurrent refresh test; the existing concurrency test covers only initial login.
Older SoC readings bypass stale-data protection
packages/modules/vehicles/byd/api.py:411
A response with an older positive time can pass _is_realtime_ready, but its timestamp is discarded here. CarState then assigns the current time, bypassing ConfigurableVehicle's stale-data charging fallback and out-of-order check. This can replace a newer SoC with an older reading. Pass the positive measurement timestamp as soc_timestamp; CarState already converts millisecond timestamps to seconds.
* Add BYD vehicle SoC module (community, login blocked on unresolved upstream protocol issue)
* Fix BYD realtime data detection returning placeholder as final data
_fetch_realtime() checked elecPercent is not None to detect real data,
but the vehicleRealTimeRequest trigger response is a placeholder that
already contains elecPercent=0 (not absent), so it was accepted
immediately instead of waiting for the vehicleRealTimeResult poll.
Confirmed via a clean upstream-pybyd-only test against the affected
account: the backend returns real telemetry fine, so this was a bug
in our own readiness check, not a BYD-side restriction. Ports pyBYD's
own is_ready_raw() heuristic (onlineState/time/tire-pressure/
enduranceMileage) instead of the elecPercent check.
* BYD-Fahrzeugmodul: Geräte-Fingerprint pro Account, Login-Cooldown
- Bisher hat jede openWB-Installation beim Login denselben hart codierten
(und ungültig formatierten) Geräte-Fingerprint an BYD geschickt - aus
Sicht des Backends ein klassisches Bot/Credential-Stuffing-Signal und ein
plausibler Mitverursacher der beobachteten Login-Sperren. Jeder
konfigurierte Account bekommt jetzt einen eigenen, zufälligen aber
plausiblen Android-Fingerprint (gültige IMEI per Luhn-Prüfziffer,
zufällige MAC, aus einem kleinen Pool echter Geräte), einmalig generiert
und über den bestehenden retained-MQTT-Mechanismus dauerhaft gespeichert
(analog zu key_expires_at bei myskoda), damit der Account immer als
dasselbe Gerät auftritt. Pool/Generator von
https://github.com/TA2k/ioBroker.byd (MIT) übernommen.
- Ein fehlgeschlagener Login (falsches Passwort, Sperre durch gleichzeitig
aktive Session, etc.) verbraucht einen von wenigen Versuchen, bevor der
BYD-Account gesperrt wird. Neuer Cooldown von 1h nach jedem Login-Fehler,
damit das reguläre Polling (alle 5min während des Ladens) den Account
nicht einfach weiter verbrennt.
- Veralteten Kommentar korrigiert, der behauptete, der VIN-Cache würde wie
key_expires_at bei myskoda dauerhaft gespeichert - tut er nicht (kein
Pub()-Aufruf dafür), nur der Geräte-Fingerprint jetzt tatsächlich.
* BYD-Fahrzeugmodul: %d-Logging-Crash bei String-Fahrzeug-ID beheben
vehicle ist zwar als int typisiert, wird vom Aufrufer (subdata.py, direkt
aus dem MQTT-Topic geparst) aber tatsächlich als str übergeben - bestätigt
durch einen echten Crash beim ersten Live-Test. Betraf sowohl die neue
Fingerprint-Logzeile in soc.py als auch eine bereits bestehende Logzeile
in api.py (Session-Ablauf-Meldung). Beide auf %s umgestellt.
* BYD-Fahrzeugmodul: Anzeigename auf "BYD" kürzen
* fix copilot findings: require VIN, serialize per-account login, fix poll auth retry
* fix copilot findings: seed account fingerprint cache early, reuse refreshed session, pass real soc_timestamp
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
UI: openWB/openwb-ui-settings#1121
Neues Fahrzeug-(SoC)-Modul
byd: liest SoC, Reichweite und Kilometerstand über die BYD-Cloud-API. Protokoll reverse-engineered von pyBYD (MIT) und ioBroker.byd (MIT), synchron mitrequestsnachgebaut (pyBYD selbst braucht Python ≥3.11, openWB läuft auf 3.9).official=False.Wichtig: BYD erlaubt nur eine aktive Sitzung pro Account – ein zweiter/geteilter Account ist nötig (Workaround in der UI dokumentiert, siehe separater UI-PR). Ein fehlgeschlagener Login wird daher 1h pausiert, um keine Login-Versuche zu verbrennen. Jeder Account bekommt außerdem einen eigenen, zufälligen Geräte-Fingerprint statt eines global geteilten (wirkte sonst wie ein Bot-Signal).
Live getestet über den normalen Control-Loop: Login, Fingerprint-Generierung, VIN-Auflösung und SoC-Abruf erfolgreich. flake8 sauber, volle Testsuite ohne Regressionen. Hybrid-Fahrzeuge (
energy_type) technisch unterstützt, aber nur an einem reinen EV-Account getestet.