fb38c297bd
The "grey box around the icons" report turned out not to be a defect: the box on "10.000 km"/"1 Jahr"/"15" is the wanted pattern, and every value the user can change should carry it. All .feld inputs and selects now get the grey iOS fill; inputs with their own visual language (checkbox/radio/range/file) keep the transparent base rule, so the switches are unaffected. Fuel stations are now displayed as "Shell, Pascalstr. 8, Ingolstadt" instead of the bare operator name. New _marke()/_ist_strasse()/_tankstelle() helpers are shared by both parser paths so Shell and non-Shell receipts format the same. The brand is only matched against the receipt header - searching the whole text would let "Total" hit a totals line. Missing parts are dropped instead of leaving empty comma slots, and without a known brand the operator name takes its place. station_address still carries the full street and postcode. test_bekannte_stationen updated to the new format; suite stays green. installationspaket/ is versioned from now on (user request). It contains no real vehicle data - only the example profile with empty FIN/plate placeholders. Keep it in sync whenever pyscript/ or www/ changes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
63 lines
2.9 KiB
Python
63 lines
2.9 KiB
Python
"""Langfristige Aufzeichnung der 12V-Batteriespannung (Mein Audi -> Zustand
|
|
-> Batteriespannung antippen). Eine über die Jahre absinkende Spannung
|
|
deutet auf eine alternde Batterie hin - dafür braucht es einen Verlauf,
|
|
nicht nur den aktuellen Wert.
|
|
|
|
Ein Eintrag pro Tag ({datum, min, min_ts, max, max_ts}) reicht für diesen
|
|
Zweck aus und hält batteriespannung.jsonl auch über viele Jahre klein - auch
|
|
wenn der Sensor selbst künftig mehrfach pro Stunde meldet (aktive Fahrt:
|
|
Motor an/aus, Ladezustand des Alternators wechselt laufend).
|
|
batterie_verlauf_pruefen() läuft deshalb häufig (alle 5 Minuten) und trägt
|
|
jede Messung in den Tageseintrag ein, statt wie zuvor nur einmal täglich
|
|
einen Einzelwert zu speichern - profil.batterieverlauf_tageswert_aktualisieren()
|
|
erweitert dabei nur min/max samt dem genauen Zeitstempel der jeweiligen
|
|
Extremmessung, robust gegen Neustarts und schwankende Erreichbarkeit.
|
|
|
|
Der Tagesminimalwert ist die für die Entladung aussagekräftige Größe: er
|
|
fällt typischerweise auf den Moment kurz nach dem Start, bevor der
|
|
Alternator die Ladespannung hochfährt - also am nächsten an die "echte"
|
|
Ruhespannung heran, ohne 2+ Stunden Standzeit abwarten zu müssen. Deshalb
|
|
verwendet auch die Ladezustands-/Gesundheitsauswertung im Frontend
|
|
(audi-dashboard-app.js, AGM_RUHE_MAX_V) den Tagesminimalwert als
|
|
repräsentativen Wert des Tages, nicht den Maximalwert.
|
|
|
|
Anders als in der ersten Fassung wird hier NICHT mehr gefiltert, welche
|
|
Messwerte gespeichert werden - min UND max jedes Tages werden roh
|
|
aufgezeichnet (der Maximalwert ist z. B. informativ beim Antippen eines
|
|
Punkts im Diagramm sichtbar). Die AGM-Ruhespannungs-Grenze wird stattdessen
|
|
erst beim Anzeigen angewendet (siehe AGM_RUHE_MAX_V im Frontend): Tage, an
|
|
denen selbst der Minimalwert über der Grenze liegt (Fahrzeug nie im
|
|
Ruhezustand beobachtet, z. B. bei einer sehr langen Fahrt), tauchen dort
|
|
nicht in der Ladezustands-Statistik auf.
|
|
|
|
Ohne eingetragenen einstellungen.BATTERIE_SENSOR (aktuell der Fall - die
|
|
genutzte Integration liefert dafür keinen Sensor, siehe dortiger Kommentar)
|
|
passiert hier bewusst nichts, statt Platzhalter-Nullwerte aufzuzeichnen.
|
|
"""
|
|
|
|
import datetime
|
|
|
|
import einstellungen
|
|
import frontend_veroeffentlichung
|
|
import profil
|
|
|
|
|
|
@time_trigger("startup")
|
|
@time_trigger("period(now, 5 minutes)")
|
|
def batterie_verlauf_pruefen():
|
|
if not einstellungen.BATTERIE_SENSOR:
|
|
return
|
|
wert = frontend_veroeffentlichung.zustand_oder_none(einstellungen.BATTERIE_SENSOR)
|
|
if wert is None:
|
|
return
|
|
try:
|
|
spannung = float(wert)
|
|
except (TypeError, ValueError):
|
|
return
|
|
|
|
heute = datetime.date.today().isoformat()
|
|
ts = datetime.datetime.now(datetime.timezone.utc).isoformat()
|
|
profil.batterieverlauf_tageswert_aktualisieren(heute, ts, spannung)
|
|
frontend_veroeffentlichung.batterieverlauf_veroeffentlichen()
|
|
log.info(f"audi_dashboard: Batteriespannung erfasst ({heute}: {spannung} V)")
|