Debug-Mode, eine Version-Kachel, Knoepfe nach HIG, Bilder ohne Verzoegerung (2026.9.4.11)

Debug-Mode: Zugaenge und Dongle stehen nicht mehr verstreut oben in den
Einstellungen, sondern zusammen hinter einem Schalter am Seitenende - dazu
neu der letzte Datensatz des Dongles (geraet.py). "Letzter Datensatz" heisst
dabei: alle Entitaeten des Geraets, deren Aktualisierung hoechstens zwei
Sekunden nach der juengsten liegt - die flespi-Integration setzt einen
Datensatz in Millisekunden. Angezeigt mit Ankunft, Geraetezeit und dem
Rueckstand zwischen beiden.

Beim Verifizieren gefunden: app_version_veroeffentlichen() lief nur beim
Start und nach einer Aktion, und beim Start haben die Entitaeten des Geraets
noch keinen Zustand - die Kachel waere dauerhaft leer geblieben. Laeuft
jetzt im Minutentakt mit, ohne Netzaufruf.

Ausserdem:
- "Version" und "Integration-Update" sind eine Kachel
- Speichern/Verwerfen als zwei gleich breite Knoepfe, der bestaetigende
  gefuellt und rechts; "Verwerfen" war in der App blosser Text
- Bilder werden nach dem ersten Zeichnen in der Leerlaufzeit vorgeladen UND
  dekodiert. Die Verzoegerung beim Seitenwechsel kam nicht vom Netz (31 Tage
  Cache), sondern vom asynchronen Dekodieren eines frisch erzeugten <img>.

214/214 Tests, Panel als Modul geparst, live gegen audi_ha_test geprueft.
This commit is contained in:
2026-09-04 12:15:33 +02:00
parent 63a45d4ee2
commit 4ab6b9fca5
14 changed files with 695 additions and 182 deletions
+100 -2
View File
@@ -6,8 +6,9 @@ Speichern-Knopf, und die Share-Erweiterung trug eine andere Versionsnummer als d
dazu die Kopfmarke statt der Firmierung des Betreibers und ein
Cache-Brecher auf der .ipa-Adresse; die .ipa liess sich zuletzt nicht mehr
installieren - der Erweiterung fehlte die CFBundleVersion; dazu der QR-Scanner
fuer den Zugangs-Token, `2026.9.4.8`,
Abschnitte CC bis CE. Davor: Geraetezeit statt Ankunftszeit - die Wurzel hinter der 3-km-Fahrt:
fuer den Zugangs-Token; dazu Debug-Mode, eine Version-Kachel, das Knopfpaar nach
HIG und Bilder ohne Verzoegerung, `2026.9.4.11`,
Abschnitte CC bis CF. Davor: Geraetezeit statt Ankunftszeit - die Wurzel hinter der 3-km-Fahrt:
das Fahrtfenster stand in Geraetezeit, der Verlauf war nach Ankunftszeit sortiert. Dazu die neun
Paritaetsbefunde und die verunreinigte Batteriehistorie, `2026.9.4.1`, Abschnitt CB. Davor: Der Regler stellt den Schlaf-Timeout des Dongles, flespi lesend und
schreibend, die eigene Warteschlange wieder entfallen, `2026.9.3.10`, Abschnitt BZ. Davor: Zugaenge: die Dienste-Token aus App und Panel bedienbar, der Wert kommt nie
@@ -9844,3 +9845,100 @@ unter „Zugangs-Token", das Blatt oeffnet mit Videofeld und Zielrahmen, und ohn
Kamerafreigabe steht dort die erklaerende Meldung statt einer leeren Flaeche.
**Nicht geprueft, weil es in dieser Umgebung nicht geht:** ein echter Scan - die
Browser-Vorschau gibt keine Kamera heraus. Das zeigt sich erst auf dem Geraet.
## CF. Debug-Mode, eine Version-Kachel, Knoepfe nach HIG, Bilder ohne Verzoegerung (2026.9.4.11)
Vier Punkte aus demselben Stapel des Eigentuemers, beide Codebasen.
### Debug-Mode: Zugaenge, Dongle und der letzte Datensatz, zugeklappt und unten
„Zugaenge" stand bisher als zweite Kachel ganz oben, „Dongle" mitten in der
Seite - beides Dinge, die man einmal im Vierteljahr anfasst. Sie stehen jetzt
zusammen hinter einem Schalter am Seitenende, zusammen mit einer dritten,
neuen Kachel.
**`geraet.py` (neu): der letzte Datensatz des Dongles.** Die flespi-Integration
setzt die Entitaeten EINES Geraetedatensatzes nacheinander, aber innerhalb
weniger Millisekunden (am 01.09.2026 gemessen: 2 ms zwischen Zuendung und
zugehoeriger Meldezeit, Abschnitt AY). „Der letzte Datensatz" ist deshalb
definiert als: alle Entitaeten des Geraets, deren letzte Aktualisierung
hoechstens `FENSTER_S` (2 s) nach der juengsten liegt. Das Geraet wird nicht
geraten, sondern ueber das Entitaetsregister der zugeordneten Meldezeit
bestimmt (sonst Fahrtsignal, sonst Zuendung); findet sich keines, bleibt der
Wert `None`.
Angezeigt werden Geraetename, **Ankunft**, **Geraetezeit** und der **Rueckstand**
zwischen beiden - genau die Angabe, deren Missachtung die Wurzel des
3-km-Fahrt-Fehlers war (Abschnitt CB).
**Ein echter Fund beim Verifizieren:** die Kachel blieb leer.
`app_version_veroeffentlichen()` laeuft naemlich **nur** beim Start und nach
einer Aktion (Token, Dongle, Update) - beim Start haben die Entitaeten des
Geraets aber noch gar keinen Zustand, und danach wurde nie wieder
veroeffentlicht. Der Minutentakt ruft sie jetzt mit. Kosten: ein kleiner
Dateilesevorgang (`bundle.json`) je Minute, **kein** Netzaufruf - die Pruefung
bei Gitea bleibt an ihrem Dienst (Abschnitt J).
Live nachgewiesen im Panel: 46 Werte aus derselben Meldung, Geraetezeit
04.09. 00:49 gegen Ankunft 12:08 - Rueckstand 40.745 s, weil der Dongle seit
dem Vorabend schweigt und „Angekommen" nach einem Neustart Home Assistants
eigener Zeitpunkt ist. Genau das sagt die Fussnote der Kachel auch.
### „Version" und „Integration-Update" sind eine Kachel
Es ist dieselbe Sache aus zwei Blickwinkeln; zwei Kacheln nebeneinander
zwangen dazu, zwei Zahlen ueber eine Kachelgrenze hinweg zu vergleichen.
### Das Knopfpaar Speichern/Verwerfen
Gemeldet: „Verwerfen ist kein richtiger Button". Stimmt - in der App war es
ein blosser Textknopf neben einem vollen. Jetzt **zwei gleich breite Knoepfe**,
der bestaetigende gefuellt und rechts, der Ausweg daneben als zweite Rolle:
ein Paar aus Bestaetigen und Abbrechen ist eine Entscheidung zwischen zwei
Wegen, keine Haupt- und Nebensache, und welcher gewollt ist, sagt die Fuellung
und nicht die Groesse.
Geaendert an **beiden** Stellen der App (Regler-Kachel und Speicherleiste am
Seitenende), sonst haette dieselbe Sache zwei Muster auf einer Seite. Im Panel
standen beide bereits als volle Knoepfe, nur untereinander - dort jetzt
dieselbe Zeile (`.knopfpaar`).
**Nicht angefasst:** die „Abbrechen"-Textknoepfe der Bearbeiten-Formulare in
`FahrtDetail.tsx`/`TankDetail.tsx`. Dieselbe Frage, aber nicht gemeldet und ein
anderer Zusammenhang (Formular statt Einstellung) - hier vermerkt, nicht still
mitgeaendert.
### Bilder erscheinen ohne Verzoegerung
Gemeldet: „Bilder laden beim Umschalten der Menues einige ms verzoegert."
**Am Netz liegt es nicht**, und das ist der Punkt: die Adresse ist innerhalb
einer Sitzung stabil, und Home Assistant liefert `/local/` mit 31 Tagen
Cache-Dauer (in Abschnitt AR gemessen). Verzoegert wird das Bild selbst - ein
frisch erzeugtes `<img>` wird standardmaessig **asynchron dekodiert** und erst
danach gezeichnet, und beim Seitenwechsel entsteht jedes Mal ein neues.
`bilderVorladen()` holt alle Fahrzeugfotos einmal und ruft `decode()` darauf.
Danach zeichnet dasselbe Bild beim naechsten Einhaengen sofort. Ausgefuehrt in
der **Leerlaufzeit** nach dem ersten Zeichnen (`requestIdleCallback`, sonst
`setTimeout`), damit es nicht mit dem Abruf von Profil, Fahrten und
Tankvorgaengen konkurriert; das Datenvolumen ist dasselbe wie beim
Durchblaettern aller Seiten, nur frueher.
Live nachgewiesen im Panel: nach dem Laden stehen alle neun Bildplaetze plus
die Winter-Seitenansicht in `performance.getEntriesByType("resource")`.
### Verifiziert
`py_compile` auf `geraet.py` und `koordinator.py`, Panel als **Modul** geparst,
`tsc --noEmit` sauber, **214/214** Tests, `vite build` sauber, `audi_ha_test`
auf `2026.9.4.11` sauber gestartet, und im Panel live nachgesehen: Debug-Mode
klappt auf und zeigt Zugaenge, Dongle und die 49 Zeilen des letzten
Datensatzes; „Version" traegt jetzt Installiert **und** Update.
**Nicht live geprueft:** dieselben Kacheln in der App. Die Browser-Vorschau
kennt keinen gespeicherten Zugang, und einen Token anzulegen oder einzugeben
ist ausgeschlossen. Abgedeckt sind sie durch `tsc`, den
Alle-Seiten-Rendertest und die Tatsache, dass das Panel dieselbe Struktur aus
denselben Backend-Daten baut - der Zweig MIT Datensatz ist in der App damit
strukturell, nicht optisch belegt.