diff --git a/companion-app/src/api/types.ts b/companion-app/src/api/types.ts index eea4d2d..e5eeaab 100644 --- a/companion-app/src/api/types.ts +++ b/companion-app/src/api/types.ts @@ -163,6 +163,7 @@ export interface ImportErgebnis { fahrten_angelegt?: number; fahrten_uebersprungen?: number; fahrten_zu_kurz?: number; + fahrten_nicht_gefahren?: number; tankvorgaenge_angelegt?: number; tankvorgaenge_uebersprungen?: number; batterie_tage?: number; diff --git a/companion-app/src/screens/HistorienImport.tsx b/companion-app/src/screens/HistorienImport.tsx index 5af37b4..fd53cb4 100644 --- a/companion-app/src/screens/HistorienImport.tsx +++ b/companion-app/src/screens/HistorienImport.tsx @@ -44,6 +44,14 @@ export function ergebnisText(d: ImportErgebnis): string { "Zündungen zu kurz für eine Fahrt", ), ) + if (d.fahrten_nicht_gefahren) + teile.push( + anzahl( + d.fahrten_nicht_gefahren, + "Zündung ohne gefahrene Strecke", + "Zündungen ohne gefahrene Strecke", + ), + ) if (d.tankvorgaenge_angelegt) teile.push(anzahl(d.tankvorgaenge_angelegt, "Tankvorgang", "Tankvorgänge")) if (d.batterie_tage) diff --git a/custom_components/audi_dashboard/frontend/app/bundle.json b/custom_components/audi_dashboard/frontend/app/bundle.json index a327d58..820463b 100644 --- a/custom_components/audi_dashboard/frontend/app/bundle.json +++ b/custom_components/audi_dashboard/frontend/app/bundle.json @@ -1 +1 @@ -{"version":"2026.9.1.11","sha256":"02c280790b205ea78638997a92aca00dbe7c099c2ad897ccf7eee50394e598b2","bytes":265708,"gebaut":"2026-09-01T16:21:24Z"} \ No newline at end of file +{"version":"2026.9.1.12","sha256":"5a2d5547cbc6db6850e46892ea422de08642f86fc634b5887322389b4e0af589","bytes":265724,"gebaut":"2026-09-01T16:35:22Z"} \ No newline at end of file diff --git a/custom_components/audi_dashboard/frontend/app/bundle.zip b/custom_components/audi_dashboard/frontend/app/bundle.zip index c465371..2014068 100644 Binary files a/custom_components/audi_dashboard/frontend/app/bundle.zip and b/custom_components/audi_dashboard/frontend/app/bundle.zip differ diff --git a/custom_components/audi_dashboard/frontend/audi-dashboard-app.js b/custom_components/audi_dashboard/frontend/audi-dashboard-app.js index 8eaefbc..0c33259 100644 --- a/custom_components/audi_dashboard/frontend/audi-dashboard-app.js +++ b/custom_components/audi_dashboard/frontend/audi-dashboard-app.js @@ -4269,6 +4269,7 @@ function importErgebnisText(d) { const teile = [anzahl(d.fahrten_angelegt || 0, "Fahrt", "Fahrten") + " angelegt"]; if (d.fahrten_uebersprungen) teile.push(`${de(d.fahrten_uebersprungen)} bereits vorhanden`); if (d.fahrten_zu_kurz) teile.push(anzahl(d.fahrten_zu_kurz, "Zündung zu kurz für eine Fahrt", "Zündungen zu kurz für eine Fahrt")); + if (d.fahrten_nicht_gefahren) teile.push(anzahl(d.fahrten_nicht_gefahren, "Zündung ohne gefahrene Strecke", "Zündungen ohne gefahrene Strecke")); if (d.tankvorgaenge_angelegt) teile.push(anzahl(d.tankvorgaenge_angelegt, "Tankvorgang", "Tankvorgänge")); if (d.batterie_tage) teile.push(anzahl(d.batterie_tage, "Tag Batteriespannung", "Tage Batteriespannung")); return teile.join(" · "); diff --git a/custom_components/audi_dashboard/historienimport.py b/custom_components/audi_dashboard/historienimport.py index d624c32..7ed12cc 100644 --- a/custom_components/audi_dashboard/historienimport.py +++ b/custom_components/audi_dashboard/historienimport.py @@ -159,7 +159,7 @@ async def _fahrten_importieren(k: Koordinator, verlaeufe: dict) -> dict: Zielkoordinaten aus den übrigen Verläufen ergänzt.""" fenster = _fahrtfenster(verlaeufe["zuendung"]) if not fenster: - return {"angelegt": 0, "uebersprungen": 0, "zu_kurz": 0} + return {"angelegt": 0, "uebersprungen": 0, "zu_kurz": 0, "nicht_gefahren": 0} bestehende = await k.ablage.fahrten_lesen() km_verlauf = verlaeufe["km"] @@ -168,7 +168,7 @@ async def _fahrten_importieren(k: Koordinator, verlaeufe: dict) -> dict: tank_liter_verlauf = verlaeufe["tank_liter"] tempo_verlauf = verlaeufe["tempo"] - angelegt = uebersprungen = zu_kurz = 0 + angelegt = uebersprungen = zu_kurz = nicht_gefahren = 0 neue: list[dict] = [] for f_start, f_ende in fenster: @@ -186,6 +186,26 @@ async def _fahrten_importieren(k: Koordinator, verlaeufe: dict) -> dict: if odo_start is not None and odo_end is not None and odo_end >= odo_start: distanz = round(odo_end - odo_start, 1) + if distanz == 0: + # Der Kilometerstand stand an beiden Enden gleich: das Fahrzeug hat + # sich nicht bewegt. Zündung an, aber nicht gefahren - Radio, Tür + # öffnen, warten. Keine Fahrt. + # + # Die Dauer allein reicht als Prüfung nicht: der Eigentümer hatte + # nach dem Löschen aller Nullfahrten bei JEDEM Import wieder eine + # davon im Bestand (31.08.2026, 14:48-15:21, 33 Minuten, + # 209177 -> 209177 km, vmax 3 km/h). MINDESTDAUER_S ließ sie durch, + # weil sie mit 33 Minuten lang genug war. + # + # Nur die GEMESSENE Null wird verworfen, nicht die unbekannte: + # liegt kein Kilometerstand vor, bleibt distanz None und die Fahrt + # wird angelegt. Der Preis, bewusst getragen: eine echte Fahrt unter + # einem Kilometer, bei der der Zähler nicht umsprang, geht dabei + # verloren - sie wäre aber genau der Nulleintrag, den der + # Eigentümer nicht im Bestand haben will. + nicht_gefahren += 1 + continue + durchschnitt = durchschnitt_kmh(distanz, dauer_s) if durchschnitt is not None and durchschnitt > UNPLAUSIBLE_KMH: _LOGGER.warning( @@ -223,7 +243,12 @@ async def _fahrten_importieren(k: Koordinator, verlaeufe: dict) -> dict: angelegt += 1 await k.ablage.fahrten_ergaenzen(neue) - return {"angelegt": angelegt, "uebersprungen": uebersprungen, "zu_kurz": zu_kurz} + return { + "angelegt": angelegt, + "uebersprungen": uebersprungen, + "zu_kurz": zu_kurz, + "nicht_gefahren": nicht_gefahren, + } async def _tankvorgaenge_importieren(k: Koordinator, verlaeufe: dict) -> dict: @@ -476,6 +501,7 @@ async def importieren(k: Koordinator, start: object, ende: object) -> None: "fahrten_angelegt": fahrten["angelegt"], "fahrten_uebersprungen": fahrten["uebersprungen"], "fahrten_zu_kurz": fahrten["zu_kurz"], + "fahrten_nicht_gefahren": fahrten.get("nicht_gefahren", 0), "tankvorgaenge_angelegt": tank["angelegt"], "tankvorgaenge_uebersprungen": tank["uebersprungen"], "batterie_tage": batterie["tage"], diff --git a/custom_components/audi_dashboard/manifest.json b/custom_components/audi_dashboard/manifest.json index 2b3cfa9..7914d4f 100644 --- a/custom_components/audi_dashboard/manifest.json +++ b/custom_components/audi_dashboard/manifest.json @@ -1,7 +1,7 @@ { "domain": "audi_dashboard", "name": "Audi Dashboard", - "version": "2026.9.1.11", + "version": "2026.9.1.12", "documentation": "https://gitea.nothaft.cloud/paul/audi-app/src/branch/main/README.md", "issue_tracker": "https://gitea.nothaft.cloud/paul/audi-app/issues", "codeowners": ["@paul"],