Eine Neuschreibung ist kein Wechsel - Wartezeit startet nicht mehr neu
Home Assistant schreibt denselben Zustandswert auch neu, wenn sich nur ein Attribut geruehrt hat. Am 04.09.2026 gezaehlt: von 22 Zustandszeilen der Zuendung waren nur 6 echte Wechsel, die uebrigen 16 Neuschreibungen - und alle 6 Wechsel lagen ausserhalb der Fahrten. Das Zuendungssignal ist unterwegs stabil. Der Beobachter unterschied das nicht. Fiel eine Neuschreibung von "aus" in die laufende Wartezeit, brach Zweig 2 die wartende Bestaetigung ab und begann die 15 Minuten von vorn. Am 04.09. ist es nicht passiert - die Neuschreibungen lagen hinter dem Fenster -, aber das Loch war da. _signalwechsel() bekommt jetzt mit, ob es ein echter Wechsel war. Eine Neuschreibung, waehrend fuer diese Fahrt schon eine Bestaetigung wartet, laesst sie stehen. Bewusst NICHT als Filter ganz oben: _spaetes_aus() verlaesst sich darauf, ein Zuendungs-Aus auch als off -> off zu sehen - daran haengt das Nachtragen vorlaeufiger Enden. Die Pruefung sitzt nur in Zweig 2, und ein eigener Test belegt, dass der andere Weg weiter offen ist. 21 Tests (von 18), Gegenprobe mit ausgeschalteter Pruefung scheitert wie erwartet an einem. py_compile sauber, audi_ha_test auf 2026.9.4.25 ohne Traceback. AGENTS.md haelt ausserdem fest: die Beschreibung des Beenden-Knopfes war zu weit gefasst (die Korrektur zieht nur nach hinten, nie nach vorn), und der flespi-Cache laesst sich ueber DELETE auf die Einstellung zum Neulesen zwingen - mit dem Haken, dass dabei ausstehende Werte verloren gingen.
This commit is contained in:
@@ -392,11 +392,19 @@ async def zuendung_geaendert(
|
||||
# bisher und der nächste Auslöser schliesst die Fahrt nach. Ein früheres
|
||||
# Löschen hätte sie in dem Fall verloren.
|
||||
async with k.fahrt_sperre:
|
||||
await _signalwechsel(k, neu == "on", ereigniszeit)
|
||||
# `neu != alt` heisst: das ist wirklich ein Wechsel. Home Assistant
|
||||
# schreibt denselben Wert auch neu, wenn sich nur ein Attribut geruehrt
|
||||
# hat - am 04.09.2026 gezaehlt: von 22 Zustandszeilen der Zuendung
|
||||
# waren nur 6 echte Wechsel, die uebrigen 16 blosse Neuschreibungen.
|
||||
# Was das unterscheidet, braucht nur Zweig 2 (siehe dort).
|
||||
await _signalwechsel(k, neu == "on", ereigniszeit, neu != alt)
|
||||
|
||||
|
||||
async def _signalwechsel(
|
||||
k: Koordinator, an_jetzt: bool, ereigniszeit: datetime.datetime | None
|
||||
k: Koordinator,
|
||||
an_jetzt: bool,
|
||||
ereigniszeit: datetime.datetime | None,
|
||||
wechsel: bool = True,
|
||||
) -> None:
|
||||
# Ob eine Fahrt läuft, entscheidet der eigene Zwischenstand
|
||||
# (fahrt_start_ts) - nicht der vorherige Rohwert der Entität. Der wäre bei
|
||||
@@ -422,6 +430,33 @@ async def _signalwechsel(
|
||||
return
|
||||
|
||||
if not an_jetzt and fahrt_laeuft:
|
||||
# Eine blosse Neuschreibung von "aus", waehrend schon eine Bestaetigung
|
||||
# fuer DIESE Fahrt wartet, aendert nichts - und darf die Wartezeit
|
||||
# deshalb nicht von vorn beginnen lassen.
|
||||
#
|
||||
# Ohne diese Pruefung schob jede Neuschreibung das Schliessen um
|
||||
# weitere 15 Minuten hinaus. Am 04.09.2026 ist es nicht passiert - die
|
||||
# Neuschreibungen lagen 19,7 Minuten nach dem echten "aus" und damit
|
||||
# hinter dem Fenster -, aber das Loch war da.
|
||||
#
|
||||
# NUR HIER, nicht am Anfang von zuendung_geaendert(): _spaetes_aus()
|
||||
# weiter unten verlaesst sich ausdruecklich darauf, ein Zuendungs-Aus
|
||||
# auch dann zu sehen, wenn es "unter Umstaenden zusammen mit dem
|
||||
# naechsten on" ankommt. Ein zweites, spaeter gepuffertes Aus bei
|
||||
# bereits stehendem "off" waere ein off -> off - und genau daran haengt
|
||||
# das Nachtragen vorlaeufiger Enden.
|
||||
if (
|
||||
not wechsel
|
||||
and k.ende_wartet is not None
|
||||
and k.ende_wartet[0] == k.fahrt_start_ts
|
||||
):
|
||||
_LOGGER.debug(
|
||||
"Zuendung erneut als aus gemeldet, ohne Wechsel - die "
|
||||
"Bestaetigung fuer die Fahrt seit %s laeuft weiter",
|
||||
k.fahrt_start_ts.isoformat(),
|
||||
)
|
||||
await k.fahrzeugstatus_veroeffentlichen()
|
||||
return
|
||||
# Ein neues "aus" ersetzt ein aelteres, das noch wartet.
|
||||
k.warte_ende_ab_abbrechen()
|
||||
# Ob hier noch gewartet wird, entscheidet _pausenzeit_s(): liegt ein
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"version":"2026.9.4.24","sha256":"2d303b02b3d5ba9d2432856a528b32ed30c657a4ff43e1f39744d4f5c9f8c04a","bytes":324162,"gebaut":"2026-09-04T22:39:43Z"}
|
||||
{"version":"2026.9.4.25","sha256":"7a53dd0854bfe487c6efc1fc91581e616dc3464bd31baa3356743883f9477331","bytes":324151,"gebaut":"2026-09-04T23:01:16Z"}
|
||||
Binary file not shown.
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"domain": "audi_dashboard",
|
||||
"name": "Audi Dashboard",
|
||||
"version": "2026.9.4.24",
|
||||
"version": "2026.9.4.25",
|
||||
"documentation": "https://gitea.nothaft.cloud/paul/audi-app/src/branch/main/README.md",
|
||||
"issue_tracker": "https://gitea.nothaft.cloud/paul/audi-app/issues",
|
||||
"codeowners": [
|
||||
|
||||
Reference in New Issue
Block a user