Audit, zweite Runde: der Knopf schrieb ein erfundenes Ende (2026.9.3.14)

_letztes_lebenszeichen() fiel auf "jetzt" zurueck, sobald verlauf_lesen() eine
leere Liste lieferte - und die bedeutet sowohl "nichts aufgezeichnet" als auch
"nicht lesbar". Am 03.09. trat der zweite Fall ein: der Knopf traf einen
Neustart, der recorder war noch nicht bereit, die Abfrage lief 2:47 und kam leer
zurueck. Die Fahrt bekam 18:43 statt 17:59 als Ende, 74 Minuten statt 30.

Drei Quellen in fester Reihenfolge statt einer: Aufzeichnung, dann hass.states
(last_reported/last_updated - weiss dasselbe ohne Datenbank), dann "jetzt", und
das nur noch mit Warnung. Vier Regressionstests, drei davon gegen den alten
Stand nachweislich rot.

Dazu aus der Bestandspruefung: odometer_km liegt in drei alten Tankvorgaengen
als Zeichenkette vor, ablage.distanz_seit_letzter_tankung() rechnete damit
float - str. Laeuft jetzt durch als_kilometerstand(). Der Eingang war schon
zu; das ist Altbestand.

Und acht Dienste hatten keinen Klarnamen in translations/de.json - jetzt 28
Dienste, 28 Klarnamen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-03 21:15:42 +02:00
parent 2736c3d6e0
commit 6ec31b5275
8 changed files with 460 additions and 66 deletions
+15 -2
View File
@@ -325,9 +325,22 @@ class Ablage:
if not alle:
return None
letzter = max(alle, key=lambda t: t.get("ts") or "")
if letzter.get("odometer_km") is None:
# Durch als_kilometerstand(), nicht direkt: im Bestand liegen
# Tankvorgaenge mit odometer_km als ZEICHENKETTE ("50250") aus einer
# frueheren Fassung, und float - str waere hier ein TypeError. Der
# Eingang ist inzwischen zu (jede Schreibstelle normalisiert), der
# Altbestand aber bleibt - und dieselbe Funktion faengt gleich die 0
# und negative Werte mit ab.
#
# Funktionslokal importiert: verlauf.py zieht das recorder-Modul mit,
# und diese Datei ist sonst reine Datei-E/A. Kein Zyklus - verlauf.py
# hat selbst keine lokalen Importe.
from .verlauf import als_kilometerstand
vorher = als_kilometerstand(letzter.get("odometer_km"))
if vorher is None:
return None
return round(aktueller_km - letzter["odometer_km"], 1)
return round(aktueller_km - vorher, 1)
# ------------------------------------------------------ Batteriespannung