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:
2026-09-05 01:02:11 +02:00
parent 242312441d
commit 9ac69cdf44
6 changed files with 193 additions and 4 deletions
@@ -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"}
@@ -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": [