diff --git a/companion-app/src/screens/FahrtDetail.tsx b/companion-app/src/screens/FahrtDetail.tsx index 610cb25..779a16a 100644 --- a/companion-app/src/screens/FahrtDetail.tsx +++ b/companion-app/src/screens/FahrtDetail.tsx @@ -213,7 +213,7 @@ export function FahrtDetail({ id, geheZu }: { id: string | undefined; geheZu: (n diff --git a/companion-app/src/screens/Fahrten.tsx b/companion-app/src/screens/Fahrten.tsx index 996b8bd..f03092a 100644 --- a/companion-app/src/screens/Fahrten.tsx +++ b/companion-app/src/screens/Fahrten.tsx @@ -112,13 +112,15 @@ export function Fahrten({ geheZu }: { geheZu: (name: SeitenName, id?: string) => geheZu("trip", fahrt.trip_id)} letzte={i === monat.eintraege.length - 1} diff --git a/companion-app/src/stile/screens.css b/companion-app/src/stile/screens.css index b4d75ab..562f489 100644 --- a/companion-app/src/stile/screens.css +++ b/companion-app/src/stile/screens.css @@ -1014,8 +1014,13 @@ button.dm-blatt:active { color: var(--fg); } +/* Feste Mindestbreite, damit Strecke und Verbrauch ueber alle Zeilen hinweg in + einer Spalte stehen. Ohne sie waechst der Kasten mit dem Inhalt - im Panel + gemessen 86px bei "11,4 l/100 km" gegen 37px bei einer Zeile ohne Werte, und + die Zahlen standen entsprechend versetzt. */ .dm-blatt__v { flex: 0 0 auto; + min-width: 104px; display: flex; flex-direction: column; gap: 3px; diff --git a/custom_components/audi_dashboard/frontend/app/bundle.json b/custom_components/audi_dashboard/frontend/app/bundle.json index b25058a..9aad6ff 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.23","sha256":"c3e1376f4e314b2994bc6341c423b92d251142e0abd2abe4752e1f5f1a578d13","bytes":266223,"gebaut":"2026-09-01T18:35:21Z"} \ No newline at end of file +{"version":"2026.9.1.24","sha256":"1d08e5fe05d30095db34e6eaaf5f9765dad94c8e14fbc1a501cfe3e5daec572a","bytes":266230,"gebaut":"2026-09-01T19:12:38Z"} \ 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 e48b24f..62ec6b5 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 76ac985..ebe38ed 100644 --- a/custom_components/audi_dashboard/frontend/audi-dashboard-app.js +++ b/custom_components/audi_dashboard/frontend/audi-dashboard-app.js @@ -1503,7 +1503,7 @@ function teaser() { return `
Zuletzt ${t ? `` : ""} ${f ? ``); }); h += `
`; }); @@ -3675,7 +3675,7 @@ function vTrip(id) {
Endkilometer
${t.odo_end != null ? de(t.odo_end) + " km" : "noch offen"}
Dauer
${dauerText(t.duration_s)}
Ø Geschwindigkeit
${t.avg_speed_kmh != null ? de(t.avg_speed_kmh, 1) + " km/h" : "liegt nicht vor"}
-
Höchstgeschwindigkeit
${t.vmax_kmh != null ? de(t.vmax_kmh, 1) + " km/h" : "liegt nicht vor"}
+
Höchstgeschwindigkeit
${t.vmax_kmh != null ? de(t.vmax_kmh) + " km/h" : "liegt nicht vor"}
Verbrauch
${fahrtVerbrauch(t) != null ? de(fahrtVerbrauch(t), 1) + " l/100 km" : "liegt nicht vor"}
diff --git a/custom_components/audi_dashboard/frontend/audi-dashboard.css b/custom_components/audi_dashboard/frontend/audi-dashboard.css index 803546c..ff2c1f8 100644 --- a/custom_components/audi_dashboard/frontend/audi-dashboard.css +++ b/custom_components/audi_dashboard/frontend/audi-dashboard.css @@ -461,7 +461,12 @@ button.sicherheitszeile:active { background: var(--tile-2); } } .leaf .k { font-size: 14px; color: var(--fg); display: flex; flex-direction: column; gap: 3px; line-height: 1.35; } .leaf .k small { font-size: 12.5px; color: var(--fg3); } -.leaf .v { font-size: 13px; color: var(--fg2); text-align: right; display: flex; flex-direction: column; gap: 3px; flex: 0 0 auto; } +/* Feste Mindestbreite, damit Strecke und Verbrauch ueber alle Zeilen hinweg + in einer Spalte stehen. Ohne sie waechst der Kasten mit dem Inhalt: gemessen + 86px bei "11,4 l/100 km" gegen 37px bei einer Zeile ohne Werte, und die + Zahlen standen entsprechend versetzt. 92px traegt die laengste Form + ("11,4 l/100 km") ohne Umbruch. */ +.leaf .v { font-size: 13px; color: var(--fg2); text-align: right; display: flex; flex-direction: column; gap: 3px; flex: 0 0 auto; min-width: 92px; } .leaf .v small { font-size: 12.5px; color: var(--fg3); } /* .teaser (die "Zuletzt"-Kachel auf der Übersicht, teaser()): genau zwei Zeilen mit sehr unterschiedlich breiten Werten ("offen" vs. "51,59 l") - diff --git a/custom_components/audi_dashboard/historienimport.py b/custom_components/audi_dashboard/historienimport.py index 1faddd3..297b414 100644 --- a/custom_components/audi_dashboard/historienimport.py +++ b/custom_components/audi_dashboard/historienimport.py @@ -57,6 +57,7 @@ from .verlauf import ( verbrauch_aus_literstaenden, verlauf_lesen, Verlaufspunkt, + wert_ab, wert_bei, wert_in_naehe, zahl, @@ -256,7 +257,9 @@ async def _fahrten_importieren(k: Koordinator, verlaeufe: dict) -> dict: "end_lon": wert_bei(lon_verlauf, f_ende), "route": route_aus_verlauf(lat_verlauf, lon_verlauf, f_start, f_ende), "verbrauch_l_100km": verbrauch_aus_literstaenden( - wert_bei(tank_liter_verlauf, f_start), wert_bei(tank_liter_verlauf, f_ende), distanz + # Erster Stand AB Fahrtbeginn, siehe wert_ab() - beide Wege + # muessen dieselbe Fahrt gleich bewerten. + wert_ab(tank_liter_verlauf, f_start), wert_bei(tank_liter_verlauf, f_ende), distanz ), "status": "vollständig" if distanz is not None else "offen", }) diff --git a/custom_components/audi_dashboard/manifest.json b/custom_components/audi_dashboard/manifest.json index 0bcc0e0..2cbefaf 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.23", + "version": "2026.9.1.24", "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"], diff --git a/custom_components/audi_dashboard/screening.py b/custom_components/audi_dashboard/screening.py index d62508b..135e840 100644 --- a/custom_components/audi_dashboard/screening.py +++ b/custom_components/audi_dashboard/screening.py @@ -41,6 +41,7 @@ from .verlauf import ( route_aus_verlauf, verbrauch_aus_literstaenden, verlauf_lesen, + wert_ab, wert_bei, ) @@ -338,13 +339,12 @@ async def _verbrauch_screenen( if not verlauf: return - # wert_bei() aus demselben Grund wie beim Kilometerstand (siehe Modulkopf): - # der Tankstand zu Fahrtbeginn ist der zuletzt DAVOR gemeldete, nicht der - # zeitlich nächstgelegene - der läge womöglich schon in der Fahrt und hätte - # einen Teil des Verbrauchs vorweggenommen. historienimport.py liest ihn - # seit jeher so. + # Anders als beim Kilometerstand: fuer den Tankstand gilt der erste Wert AB + # dem Fahrtbeginn, nicht der letzte davor. Ein Fuellstand ist keine + # Zaehlung, er driftet im Stand - siehe wert_ab() in verlauf.py fuer die + # Messung, die das gezeigt hat. Das Ende bleibt bei wert_bei(). verbrauch = verbrauch_aus_literstaenden( - wert_bei(verlauf, start), wert_bei(verlauf, ende), fahrt.get("distance_km") + wert_ab(verlauf, start), wert_bei(verlauf, ende), fahrt.get("distance_km") ) if verbrauch is not None: await k.ablage.fahrt_aktualisieren(fahrt["trip_id"], {"verbrauch_l_100km": verbrauch}) diff --git a/custom_components/audi_dashboard/verlauf.py b/custom_components/audi_dashboard/verlauf.py index 4e61947..2b608b2 100644 --- a/custom_components/audi_dashboard/verlauf.py +++ b/custom_components/audi_dashboard/verlauf.py @@ -244,6 +244,37 @@ def wert_bei( return davor +def wert_ab( + verlauf: list[Verlaufspunkt], zeitpunkt: datetime.datetime +) -> float | None: + """Der erste ab `zeitpunkt` gemeldete Zahlenwert, sonst der letzte davor. + + Gegenstueck zu wert_bei(). Fuer einen ZAEHLER ist -zuletzt davor- richtig + (der Kilometerstand aendert sich im Stand nicht), fuer einen gemessenen + FUELLSTAND nicht: der driftet. + + Am 01.09.2026 an der Fahrt Eichstaett - Adelschlag nachgemessen. Der + Tankstand stand am Ende der vorigen Fahrt (13:52) auf 36,4 l, beim ersten + Datensatz der neuen Fahrt (16:20:49) auf 36,2 l - in der Standzeit dazwischen + ist niemand gefahren. Diese 0,2 l Setzung wurden der neuen Fahrt zugerechnet: + 0,8 l statt 0,6 l auf 6,9 km, also **11,4 statt 8,7 l/100 km**. + + Das Fahrtende bleibt bei wert_bei(): dort ist die Fahrt vorbei, und der + letzte waehrend der Fahrt gemeldete Stand ist der richtige - der naechste + kaeme erst Stunden spaeter und traege dieselbe Setzung wieder herein.""" + danach = None + for ts, wert in verlauf: + gezahlt = zahl(wert) + if gezahlt is None: + continue + if ts >= zeitpunkt: + danach = gezahlt + break + if danach is not None: + return danach + return wert_bei(verlauf, zeitpunkt) + + def route_aus_verlauf( lat_verlauf: list[Verlaufspunkt], lon_verlauf: list[Verlaufspunkt],