Statistik-Icon-Groesse, Batteriediagramm-Ueberarbeitung, Temperatur-Kopplung mit 300s-Fenster, letzte gueltige Spannung als Fallback
- Statistik-Tab-Icon per zentrierter Stauchung an die Fuellflaeche der anderen Tab-Icons angeglichen (Panel + companion-app), auf Nutzerwunsch anschliessend 10% groesser. - Batteriediagramm neu gezeichnet: dynamische viewBox (1 Einheit = 1 Pixel, kein preserveAspectRatio-Verzerren mehr), ein Punkt je Ruhespannungsmessung statt Datumsbeschriftung, Tageshoechstwert nur noch im Tooltip. Generator- spannungen (> AGM_RUHE_MAX_V = 13,0 V, vom Nutzer festgelegt) bleiben aus dem Diagramm aussen vor; der SOC-Kurve-Eckwert "100% / voll" bleibt bei den ursprünglich recherchierten 12,8 V. companion-app auf dieselbe lineare SOC-Interpolation umgestellt (vorher eine abweichende Stufenkurve). - Außentemperatur wird jetzt auch beim Batterieverlauf-Import nachgetragen (vorher nur live) - Kopplung an die naechstgelegene Messung innerhalb NEBENWERT_MAX_ABSTAND_S (verlauf.py), vom Nutzer nach Live-Daten-Analyse auf 300s festgelegt. Merge-Logik in ablage.py ergaenzt: ein erneuter Import kann eine zuvor fehlende Temperatur jetzt tatsaechlich nachtragen, auch wenn sich der Tagesminimalwert selbst nicht aendert. - "Mein Audi"/Zustand zeigt bei unplausibler Live-Messung (z. B. Dongle offline) die zuletzt gemessene Spannung statt "unbekannt". Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -192,3 +192,43 @@ def naechster_wert(
|
||||
bester_wert = gezahlt
|
||||
beste_diff = diff
|
||||
return bester_wert
|
||||
|
||||
|
||||
# Wie lange eine Nebenmessung (z. B. Außentemperatur) höchstens von der
|
||||
# Hauptmessung entfernt liegen darf, um noch als "zur selben Zeit" zu gelten -
|
||||
# vom Nutzer auf 300s (5 Minuten) festgelegt, nach ursprünglich 60s. Der
|
||||
# Wechsel ist an echten FMM003-Daten begründet, nicht geschätzt: das Gerät
|
||||
# sendet Außentemperatur deutlich seltener als Spannung (an einem
|
||||
# beobachteten Fahrtfenster 851 Spannungs- gegen 187 Temperaturmeldungen in
|
||||
# 48h) - selbst bei laufender Fahrt und ohne jede Verbindungsstörung wurden
|
||||
# reale Lücken bis 593s zwischen zwei Temperaturmeldungen gemessen. 60s hätte
|
||||
# genau diesen völlig normalen Fall verworfen. Physikalisch unproblematisch:
|
||||
# die Außentemperatur ändert sich über wenige Minuten kaum, anders als z. B.
|
||||
# eine GPS-Position oder die Spannung selbst - und die Live-Prüfung
|
||||
# (batterie.py's pruefen()) läuft ohnehin nur alle 5 Minuten, verlangt hier
|
||||
# also keine feinere Genauigkeit, als sie selbst liefert. Ein Verbindungs-
|
||||
# abbruch des Geräts (beobachtet: 45 Minuten, beide Sensoren gleichzeitig
|
||||
# stumm) bleibt mit 300s weiterhin sicher außerhalb der Grenze und liefert
|
||||
# bewusst KEINEN Wert statt eines beliebig alten.
|
||||
NEBENWERT_MAX_ABSTAND_S = 300
|
||||
|
||||
|
||||
def wert_in_naehe(
|
||||
zielzeit: datetime.datetime, verlauf: list[Verlaufspunkt], max_abstand_s: float = NEBENWERT_MAX_ABSTAND_S
|
||||
) -> float | None:
|
||||
"""Wie naechster_wert(), aber None statt eines beliebig weit entfernten
|
||||
Werts, wenn selbst der zeitlich nächste mehr als max_abstand_s von
|
||||
zielzeit entfernt liegt."""
|
||||
bester_wert = None
|
||||
beste_diff = None
|
||||
for ts, wert in verlauf:
|
||||
gezahlt = zahl(wert)
|
||||
if gezahlt is None:
|
||||
continue
|
||||
diff = abs((ts - zielzeit).total_seconds())
|
||||
if beste_diff is None or diff < beste_diff:
|
||||
bester_wert = gezahlt
|
||||
beste_diff = diff
|
||||
if beste_diff is None or beste_diff > max_abstand_s:
|
||||
return None
|
||||
return bester_wert
|
||||
|
||||
Reference in New Issue
Block a user