Rueckblick misst auf Meter, Streckenwahl gemeinsam (2026.9.1.14)

Der erste Wurf (2026.9.1.12) verwarf jedes Importfenster mit distanz == 0. Zu
grob: seit der GNSS-Verfeinerung messen wir Meter, und eine Fahrt von 400
Metern steht im CAN-Wert als Null. Der Eigentuemer hat es auf den Punkt
gebracht - "0,0 moechte ich nicht, ab 0,1 schon".

Der Rueckblick liest jetzt ebenfalls den GNSS-Zaehler und entscheidet auf eine
Nachkommastelle.

Dabei stand die Toleranzlogik kurz doppelt im Code - in screening.py und in
historienimport.py. Genau die Doppelung, die dieses Projekt bei
UNPLAUSIBLE_KMH und MINDESTDAUER_S schon einmal teuer bezahlt hat. Sie liegt
jetzt gemeinsam in verlauf.py:

  strecke_waehlen(grob, fein) - die feine Zahl gilt, solange sie in der
  Rundungsunschaerfe des Ankers liegt, oder wenn es keinen Anker gibt.

  ist_gefahren(distanz) - ab 0,1 km ja. Eine unbekannte Strecke gilt als
  gefahren; nur die gemessene Null ist ein Nein.

VERIFIZIERT: 13 Faelle gegen beide Funktionen, darunter die zwei echten
Fahrten, die 400-Meter-Fahrt, die 100-Meter-Untergrenze, 40 Meter, fehlender
Anker, fehlender GNSS-Wert, gedrifteter Zaehler und beide Seiten der Grenze.
Import live: 1 Fenster uebersprungen, null 0-km-Fahrten im Bestand. Livepfad
live: vier alte Fahrten korrekt abgelehnt.

NICHT live gezeigt: ein Fenster mit 0,1-0,9 km, das der Import nun behaelt -
der Recorder enthaelt kein geschlossenes Fenster dieser Groesse.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-01 18:47:51 +02:00
co-authored by Claude Opus 5
parent be95b40d79
commit 09c7461892
7 changed files with 136 additions and 26 deletions
+11 -12
View File
@@ -32,11 +32,11 @@ import logging
from typing import TYPE_CHECKING
from .verlauf import (
GNSS_TOLERANZ_KM,
UNPLAUSIBLE_KMH,
durchschnitt_kmh,
hoechstwert_im_fenster,
strecke_aus_zaehler,
strecke_waehlen,
naechster_wert,
route_aus_verlauf,
verbrauch_aus_literstaenden,
@@ -259,23 +259,22 @@ async def _gnss_verfeinern(k: Koordinator, gnss_sensor: str, fahrt: dict) -> Non
punkte = await verlauf_lesen(k.hass, gnss_sensor, start, ende)
fein = strecke_aus_zaehler(punkte)
if fein is None:
gewaehlt, genommen = strecke_waehlen(grob, fein)
if not genommen:
if fein is not None:
_LOGGER.info(
"Fahrt %s: GNSS-Strecke %s km passt nicht zum Kilometerstand "
"(%s km) - der Fahrzeugwert bleibt stehen",
fahrt.get("trip_id"), fein, grob,
)
return
if abs(fein - grob) > GNSS_TOLERANZ_KM:
_LOGGER.info(
"Fahrt %s: GNSS-Strecke %s km weicht um mehr als %s km vom "
"Kilometerstand (%s km) ab - der Fahrzeugwert bleibt stehen",
fahrt.get("trip_id"), fein, GNSS_TOLERANZ_KM, grob,
)
return
aenderungen = {"distance_km": fein, "km_quelle": "odometer+gnss"}
aenderungen = {"distance_km": gewaehlt, "km_quelle": "odometer+gnss"}
await k.ablage.fahrt_aktualisieren(fahrt["trip_id"], aenderungen)
fahrt.update(aenderungen)
_LOGGER.info(
"Fahrt %s: Strecke auf %s km verfeinert (Kilometerstand sagte %s km)",
fahrt.get("trip_id"), fein, grob,
fahrt.get("trip_id"), gewaehlt, grob,
)