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 <noreply@anthropic.com>
This commit is contained in:
@@ -176,6 +176,50 @@ def route_aus_verlauf(
|
||||
return punkte if len(punkte) >= 2 else None
|
||||
|
||||
|
||||
def hoechstwert_im_fenster(
|
||||
verlauf: list[Verlaufspunkt],
|
||||
start: datetime.datetime,
|
||||
ende: datetime.datetime,
|
||||
) -> float | None:
|
||||
"""Der größte Zahlenwert eines Verlaufs innerhalb von [start, ende].
|
||||
|
||||
Für die Höchstgeschwindigkeit einer Fahrt. Das ist der größte
|
||||
GEMELDETE Wert, nicht die tatsächliche Spitze: der FMM003 schreibt
|
||||
während der Fahrt alle zehn Sekunden einen Datensatz (Data
|
||||
Acquisition -> Moving -> "Min Period" = 10 s), eine kurze Spitze
|
||||
dazwischen sieht niemand. Für eine Fahrtenübersicht ist das genau
|
||||
genug; als Beweismittel taugt es nicht, und so ist es auch
|
||||
beschriftet.
|
||||
|
||||
None, wenn im Fenster kein einziger Zahlenwert liegt."""
|
||||
werte = [
|
||||
float(wert)
|
||||
for ts, wert in verlauf
|
||||
if start <= ts <= ende and _als_zahl(wert) is not None
|
||||
]
|
||||
return round(max(werte), 1) if werte else None
|
||||
|
||||
|
||||
def _als_zahl(wert: object) -> float | None:
|
||||
"""Ein Verlaufswert als Zahl, oder None - Zustände wie "unavailable"
|
||||
kommen hier genauso an wie Messwerte."""
|
||||
try:
|
||||
return float(wert) # type: ignore[arg-type]
|
||||
except (TypeError, ValueError):
|
||||
return None
|
||||
|
||||
|
||||
# Unterhalb dieser Strecke sagt die Literdifferenz nichts mehr: der
|
||||
# Tanksensor löst 0,1 l auf (an der echten Aufzeichnung nachgemessen,
|
||||
# 2026-08-31), ein Quantisierungsschritt entspricht also 10/Strecke
|
||||
# l/100 km Fehler - bei 3 km sind das ±3,3, bei 1 km schon ±10.
|
||||
MIN_STRECKE_VERBRAUCH_KM = 3.0
|
||||
|
||||
# Ein Verbrennerwert darüber ist kein Verbrauch, sondern ein Messfehler
|
||||
# (Sensorsprung, Tankvorgang kurz vor Fahrtende, Betankung im Stand).
|
||||
UNPLAUSIBLE_L_100KM = 60.0
|
||||
|
||||
|
||||
def verbrauch_aus_literstaenden(
|
||||
start_liter: float | None, end_liter: float | None, distance_km: float | None
|
||||
) -> float | None:
|
||||
@@ -188,12 +232,15 @@ def verbrauch_aus_literstaenden(
|
||||
Literstand nicht gefallen ist (z. B. ein Tankvorgang während der Fahrt,
|
||||
oder unveränderter Füllstand) - in beiden Fällen ist der Quotient nicht
|
||||
aussagekräftig."""
|
||||
if start_liter is None or end_liter is None or not distance_km or distance_km <= 0:
|
||||
if start_liter is None or end_liter is None or not distance_km:
|
||||
return None
|
||||
if distance_km < MIN_STRECKE_VERBRAUCH_KM:
|
||||
return None
|
||||
verbraucht = start_liter - end_liter
|
||||
if verbraucht <= 0:
|
||||
return None
|
||||
return round(verbraucht / distance_km * 100, 1)
|
||||
wert = round(verbraucht / distance_km * 100, 1)
|
||||
return wert if wert <= UNPLAUSIBLE_L_100KM else None
|
||||
|
||||
|
||||
def naechster_wert(
|
||||
|
||||
Reference in New Issue
Block a user