Meldezeit auch nach hinten prüfen - "Geparkt seit 20698 Tg." war die Unix-Epoche
geraetezeit() prüfte nur, ob die Meldezeit in der Zukunft liegt. Ein Sensor, der 0 meldet, rutschte durch, und fromtimestamp(0) ergibt 1970 - auf der realen Instanz sichtbar als "Geparkt seit 20698 Tg. 9 Std. 39 Min.". Neu geraetezeit_plausibel(): nicht aus der Zukunft und nicht älter als MELDEZEIT_RUECKLAUF (365 Tage). Geprüft wird an drei Stellen - beim Auslesen der Gerätezeit, beim Setzen des Parkbeginns und beim LADEN aus dem Laufzeit-Store, denn ein einmal falsch gespeicherter Wert überlebt sonst jedes Update. Fängt auch eine im Setup falsch zugeordnete ID-Entität ab: das flespi-Gerät hat drei ID-Sensoren, deren Namen dem Zeitstempel ähneln, und deren Werte ergeben als Unix-Zeit ebenfalls 1970. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -353,9 +353,23 @@ class Koordinator:
|
||||
roh = gespeichert.get("geparkt_seit_ts")
|
||||
if roh:
|
||||
try:
|
||||
self.geparkt_seit_ts = datetime.datetime.fromisoformat(roh)
|
||||
geladen = datetime.datetime.fromisoformat(roh)
|
||||
except ValueError:
|
||||
self.geparkt_seit_ts = None
|
||||
geladen = None
|
||||
# Auch beim LADEN pruefen, nicht nur beim Setzen: ein einmal
|
||||
# falsch gespeicherter Wert (auf der Instanz des Eigentuemers am
|
||||
# 02.09.2026 die Unix-Epoche, weil der Meldezeit-Sensor 0 lieferte)
|
||||
# ueberlebt sonst jeden Neustart - und _parkbeginn_nachholen()
|
||||
# springt nicht ein, weil ja etwas gespeichert ist.
|
||||
if geladen is not None and not verlauf.geraetezeit_plausibel(
|
||||
geladen, datetime.datetime.now(datetime.UTC)
|
||||
):
|
||||
_LOGGER.warning(
|
||||
"Gespeicherter Parkbeginn %s ist unglaubwuerdig - verworfen",
|
||||
geladen.isoformat(),
|
||||
)
|
||||
geladen = None
|
||||
self.geparkt_seit_ts = geladen
|
||||
|
||||
async def _laufzeit_sichern(self) -> None:
|
||||
await self._store.async_save({
|
||||
@@ -422,7 +436,7 @@ class Koordinator:
|
||||
gemeldet = datetime.datetime.fromtimestamp(epoche, datetime.UTC)
|
||||
except (ValueError, OSError, OverflowError):
|
||||
gemeldet = None
|
||||
if gemeldet is not None and gemeldet <= jetzt:
|
||||
if verlauf.geraetezeit_plausibel(gemeldet, jetzt):
|
||||
seit = gemeldet
|
||||
|
||||
await self.geparkt_seit_setzen(seit)
|
||||
@@ -431,6 +445,11 @@ class Koordinator:
|
||||
)
|
||||
|
||||
async def geparkt_seit_setzen(self, ts: datetime.datetime | None) -> None:
|
||||
if ts is not None and not verlauf.geraetezeit_plausibel(
|
||||
ts, datetime.datetime.now(datetime.UTC)
|
||||
):
|
||||
_LOGGER.warning("Parkbeginn %s ist unglaubwuerdig - nicht gesetzt", ts.isoformat())
|
||||
ts = None
|
||||
self.geparkt_seit_ts = ts
|
||||
await self._laufzeit_sichern()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user