Rollende Zeitraeume, zwei Gesten, CI-Symbole und das Screening faellt nach (2026.9.2.8-.12)
Gemeldet vom Eigentuemer an der realen Instanz, in einem Zug abgearbeitet. STATISTIK. "Monat kleiner als Woche" war kein Rechenfehler, sondern die Definition: am 02.09. begann die Kalenderwoche am 31.08., der Monat erst am 01.09. Umgestellt auf rollende Fenster (1/7/30/365 Tage), damit 1 ⊂ 7 ⊂ 30 ⊂ 365 an jedem Tag gilt. "Jahr" meint damit nicht mehr das Kalenderjahr - so entschieden. Zwei neue Tests halten die Verschachtelung fest. Aus dem Langzeitverbrauch sind Herleitung und Erklaerabsatz aus der ANSICHT genommen, nicht aus der Rechnung; das Datum des letzten Tankstops ebenfalls. UEBERSICHT. Unter "Letzter Tankvorgang" steht das Datum statt der Tankstelle. BILDER. Die Draufsicht war der einzige sichtbare Bildplatz ohne Zugang - bilder.py kannte den Dateinamen, BILDER/BILDPLAETZE nicht. Jetzt ein Platz wie jeder andere. Die Vorschau in den Einstellungen schneidet Fotos nicht mehr an, und der Bildbereich der Fahrzeugseite steht eingerueckt statt randlos. ZAHNRAD. Es lag mit seiner 44px-Trefferflaeche 21px im Kachelinhalt und fing die obere Haelfte des ersten Knopfes ab (Versicherung, "Inland"). Die Kopfzeile bekommt jetzt die Hoehe, die es braucht. SCREENING. Lief ausschliesslich bei einer Aenderung des Kilometerstands, also nur waehrend der Fahrt - im Stand blieben Ortsnamen und Verbrauch liegen. Jetzt zusaetzlich einmal nach dem Start, und danach faellt es selbst nach, solange ein Lauf sein Ortsbudget aufbraucht UND dabei etwas aufloest. Kein Dauertakt: die Kette endet, sobald ein Lauf mit uebrigem Budget durchkommt. GESTEN. Zum Loeschen nach links wischen, jetzt auch im Radarchiv (das Panel hatte die Mechanik, das Archiv war nie angeschlossen; die App hatte sie gar nicht). Vom linken Rand nach rechts wischen = zurueck, jetzt auch in der App, mit denselben Zahlen wie im Panel und in beiden mit sichtbarer Rueckmeldung. CI-SYMBOLE. Das Kachel-Zahnrad ist settings-s - im Panel stand der Pfad sechsmal wortgleich im Markup, jetzt einmal als CI.settingsS. Das handgezeichnete Zahnrad der Seitenleiste ist ersetzt und geloescht. Die Zapfsaeule des Tanken-Reiters ist fuel-station-s, Faktor 0,84 um die Rastermitte - live per getBBox() gemessen, damit sie auf dieselbe senkrechte Spanne kommt wie Statistik. Zurueckgenommen: die Titel der Unterseiten stehen wieder mittig. Zentriert ist Apples HIG fuer Navigationsleisten; die linksbuendigen Titel sind die der Hauptbereiche und folgen der anderen Regel. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -18,7 +18,9 @@ verlauf.py ausschließt.
|
||||
|
||||
Läuft nach jedem Fahrtende und zusätzlich bei jeder Änderung des
|
||||
Kilometerstand-Sensors - unabhängig vom Fahrtende-Ereignis selbst, eben weil
|
||||
der Wert auch erst mit der nächsten Fahrt eintreffen kann.
|
||||
der Wert auch erst mit der nächsten Fahrt eintreffen kann. Dazu einmal nach
|
||||
dem Start von Home Assistant, und danach so lange erneut, wie ein Lauf mehr
|
||||
Ortsauflösungen bräuchte, als sein Budget hergibt (_nachfassen_planen).
|
||||
|
||||
VORBEHALT: Der GPS-Fallback (km_quelle="gps") ist weiterhin nicht umgesetzt,
|
||||
da die Adressauflösung ein eigenes Arbeitspaket ist. Fahrten ohne passenden
|
||||
@@ -31,6 +33,8 @@ import datetime
|
||||
import logging
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from homeassistant.helpers.event import async_call_later
|
||||
|
||||
from . import reifen, verbrauchskorrektur
|
||||
from .verlauf import (
|
||||
UNPLAUSIBLE_KMH,
|
||||
@@ -51,6 +55,10 @@ if TYPE_CHECKING:
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
# Wie lange nach einem Lauf gewartet wird, dessen Ortsbudget nicht gereicht
|
||||
# hat. Siehe _nachfassen_planen().
|
||||
NACHFASSEN_S = 60
|
||||
|
||||
# Wie weit vor/zurück gesucht wird, ausgehend von Fahrtbeginn bzw. -ende.
|
||||
# 48h deckt auch länger stehende Fahrzeuge ab, ohne bei jedem Screening die
|
||||
# komplette Historie zu laden.
|
||||
@@ -214,6 +222,43 @@ async def durchfuehren(k: Koordinator) -> None:
|
||||
|
||||
await _lueckenlos_verketten(k)
|
||||
await k.fahrten_veroeffentlichen()
|
||||
_nachfassen_planen(k)
|
||||
|
||||
|
||||
def _nachfassen_planen(k: Koordinator) -> None:
|
||||
"""Plant einen zweiten Lauf, wenn dieser hier nicht gereicht hat.
|
||||
|
||||
Das Ortsbudget sind acht Anfragen je Lauf (PRO_DURCHLAUF in
|
||||
geokodierung.py, damit Nominatims Bitte um keinen Vorratsabruf gewahrt
|
||||
bleibt). Eine einzelne Fahrt braucht zwei davon - im Normalbetrieb ist das
|
||||
Budget also nie das Ende. Aufgebraucht wird es genau in zwei Lagen: nach
|
||||
einem Rueckblick-Import aus Home Assistant, der viele Fahrten auf einmal
|
||||
anlegt, und einmalig nach einem Update, das ein neues Feld einfuehrt.
|
||||
|
||||
Genau dafuer und nur dafuer ist dieses Nachfassen da - kein Dauertakt.
|
||||
Bedingung ist BEIDES: das Budget ist leer (es liegt also noch Arbeit an)
|
||||
UND es ist in diesem Lauf mindestens ein Ort dazugekommen (die Gegenstelle
|
||||
antwortet also). Kommt ein Lauf mit uebrigem Budget durch, ist alles
|
||||
aufgeloest und es wird nichts mehr eingeplant - die Kette endet von
|
||||
selbst. Antwortet Nominatim gerade nicht, endet sie ebenfalls, statt im
|
||||
Minutentakt gegen eine Wand zu laufen; der naechste natuerliche Ausloeser
|
||||
(Fahrtende, Kilometerstand, Neustart) versucht es wieder.
|
||||
"""
|
||||
if k.screening_nachlauf is not None:
|
||||
return
|
||||
if k.geokodierung.rest > 0 or k.geokodierung.neu <= 0:
|
||||
return
|
||||
|
||||
async def _spaeter(_jetzt) -> None:
|
||||
k.screening_nachlauf = None
|
||||
await durchfuehren(k)
|
||||
|
||||
_LOGGER.debug(
|
||||
"Ortsbudget aufgebraucht, %s Orte neu - weiterer Lauf in %s s",
|
||||
k.geokodierung.neu,
|
||||
NACHFASSEN_S,
|
||||
)
|
||||
k.screening_nachlauf = async_call_later(k.hass, NACHFASSEN_S, _spaeter)
|
||||
|
||||
|
||||
async def _fahrt_screenen(k: Koordinator, km_sensor: str, fahrt: dict) -> None:
|
||||
|
||||
Reference in New Issue
Block a user