Fahrten, Statistik, Trip-Timer (2026.8.31.3)
Der 15-Minuten-Timer war doppelt: der FMM003 wartet laut Konfiguration (Trip \ Odometer, Ignition OFF Timeout) selbst 900 s, die App noch einmal 15 Minuten. Zusammen eine halbe Stunde. Die Pausenregel ist damit entfallen - in der Live-Erkennung, im Historienimport und in beiden Oberflaechen. Der Schwellwert "ab wann ist es ein Parkplatz" hing an derselben Einstellung, hat damit aber nichts zu tun und steht jetzt als eigene Zahl. Hoechst- und Durchschnittsgeschwindigkeit je Fahrt. Der Durchschnitt folgt aus Strecke und Dauer, vmax aus der neuen Rolle GESCHWINDIGKEIT_SENSOR - laut Konfiguration liest das Geraet die Geschwindigkeit vom OBD/CAN. Es ist der groesste gemeldete Wert, nicht die tatsaechliche Spitze: alle zehn Sekunden ein Datensatz. So ist es auch beschriftet. Der Langzeitverbrauch war um einen ganzen Tankinhalt zu hoch. Gemessen wird die Strecke ZWISCHEN erstem und letztem Tankstop; verbraucht wurde darauf, was ab dem ZWEITEN hineinkam - der erste fuellte die Strecke davor. Bei 13 Tankvorgaengen rund 8 Prozent, im Testfall 16,7 statt 8,3 l/100 km. Der Test hatte die falsche Rechnung festgeschrieben und ist mitkorrigiert. Eine negative Strecke (falscher Kilometerstand an einem Tankvorgang) gilt jetzt als unplausibel statt als Null ohne Erklaerung. Verbrauch je Fahrt bekommt Grenzen: am Sensor nachgemessen loest can_fuel_volume 0,1 l auf, ein Schritt entspricht also 10/Strecke l/100 km Fehler. Unter 3 km sagt die Differenz nichts mehr, ueber 60 l/100 km ist es kein Verbrauch. Statistik: zusaetzlich "Absolut", und die Einheit steht jetzt in eckigen Klammern an der Rubrik statt vier Mal am Zeitraum. Fuenf Spalten passen auf einem Telefon nicht nebeneinander, das Raster bricht um. Radfoto in Reifen war ein reines <Bild> - Ersetzen und Loeschen von dort aus gar nicht erreichbar. Jetzt BildMitMenue wie im Panel. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -19,7 +19,6 @@ hier behoben: der Zwischenstand liegt in einem Store (siehe koordinator.py),
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import asyncio
|
||||
import datetime
|
||||
import logging
|
||||
from typing import TYPE_CHECKING
|
||||
@@ -34,7 +33,15 @@ if TYPE_CHECKING:
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
STANDARD_PAUSENZEIT_MIN = 15
|
||||
# Die frühere Pausenregel (STANDARD_PAUSENZEIT_MIN = 15) ist am 2026-08-31
|
||||
# entfallen. Der FMM003 wendet sie selbst an - in seiner Konfiguration unter
|
||||
# "Trip Odometer" steht "Ignition OFF Timeout" auf 900 Sekunden. Eine
|
||||
# zweite Wartezeit hier oben drauf hätte daraus 30 Minuten gemacht.
|
||||
#
|
||||
# Zurückholen, falls die Erkennung je wieder ohne das Gerät auskommen muss:
|
||||
# eine abbrechbare Wartezeit vor fahrt_beenden() legen (k.warte_ende_ab /
|
||||
# k.warte_ende_ab_abbrechen im Koordinator sind dafür noch da) und die
|
||||
# Einstellung fahrten_pausenzeit_min in beiden Oberflächen wieder anbieten.
|
||||
|
||||
|
||||
def leere_fahrt(start_ts: datetime.datetime, ende_ts: datetime.datetime, quelle: str) -> dict:
|
||||
@@ -52,6 +59,7 @@ def leere_fahrt(start_ts: datetime.datetime, ende_ts: datetime.datetime, quelle:
|
||||
"odo_start": None,
|
||||
"odo_end": None,
|
||||
"avg_speed_kmh": None,
|
||||
"vmax_kmh": None,
|
||||
"verbrauch_l_100km": None,
|
||||
"start_lat": None,
|
||||
"start_lon": None,
|
||||
@@ -68,15 +76,6 @@ def leere_fahrt(start_ts: datetime.datetime, ende_ts: datetime.datetime, quelle:
|
||||
}
|
||||
|
||||
|
||||
async def pausenzeit_sekunden(k: Koordinator) -> int:
|
||||
profil = await k.ablage.profil_lesen()
|
||||
if profil is None:
|
||||
return STANDARD_PAUSENZEIT_MIN * 60
|
||||
minuten = profil.get("einstellungen", {}).get(
|
||||
"fahrten_pausenzeit_min", STANDARD_PAUSENZEIT_MIN
|
||||
)
|
||||
return int(minuten) * 60
|
||||
|
||||
|
||||
async def zuendung_geaendert(k: Koordinator, neu: str | None, alt: str | None) -> None:
|
||||
"""Reagiert auf jede Zustandsänderung der Zündungs-Entität.
|
||||
@@ -112,28 +111,17 @@ async def zuendung_geaendert(k: Koordinator, neu: str | None, alt: str | None) -
|
||||
return
|
||||
|
||||
if not an_jetzt and fahrt_laeuft:
|
||||
start_ts = k.fahrt_start_ts
|
||||
abbruch_ts = datetime.datetime.now(datetime.UTC)
|
||||
wartezeit = await pausenzeit_sekunden(k)
|
||||
k.warte_ende_ab(_ende_bestaetigen(k, start_ts, abbruch_ts, wartezeit))
|
||||
# Ohne Wartezeit: der FMM003 bringt die Pausenregel selbst mit
|
||||
# (Trip Odometer -> "Ignition OFF Timeout" = 900 s). Was hier
|
||||
# ankommt, ist bereits eine beendete Fahrt - noch einmal 15 Minuten
|
||||
# zu warten haette daraus eine halbe Stunde gemacht und zwei
|
||||
# aufeinanderfolgende Fahrten verschmolzen, die das Geraet sauber
|
||||
# getrennt hatte.
|
||||
await fahrt_beenden(k, k.fahrt_start_ts, datetime.datetime.now(datetime.UTC))
|
||||
|
||||
await k.fahrzeugstatus_veroeffentlichen()
|
||||
|
||||
|
||||
async def _ende_bestaetigen(
|
||||
k: Koordinator, start_ts: datetime.datetime, ende_ts: datetime.datetime, wartezeit: int
|
||||
) -> None:
|
||||
"""Wartet die Pausenzeit ab und beendet die Fahrt dann.
|
||||
|
||||
Kommt die Zündung vorher zurück, bricht zuendung_geaendert() genau diese
|
||||
Aufgabe ab und der Code hinter dem sleep läuft nie."""
|
||||
try:
|
||||
await asyncio.sleep(wartezeit)
|
||||
except asyncio.CancelledError:
|
||||
_LOGGER.debug("Fahrtende verworfen - Zündung kam innerhalb der Pausenzeit zurück")
|
||||
raise
|
||||
await fahrt_beenden(k, start_ts, ende_ts)
|
||||
|
||||
|
||||
async def nach_neustart_fortsetzen(k: Koordinator) -> None:
|
||||
"""Schließt eine Fahrt ab, die während eines HA-Ausfalls zu Ende ging.
|
||||
|
||||
Reference in New Issue
Block a user