Bilder: der Cache-Brecher haengt am Foto statt an der Startzeit
Beide Oberflaechen haengten Date.now() an jede Bildadresse - richtig gegen ein veraltetes Foto (31 Tage Cache-Vorgabe unter /local/), aber die Adresse aendert sich damit bei JEDEM Start, der Zwischenspeicher greift zwischen zwei Starts also nie. Mit dem Vorladen waeren das 5,3 MB je Start gewesen. bilder.staende() liefert jetzt den Zeitstempel je Datei, veroeffentlicht an sensor.audi_dashboard_app_version; eine Bildadresse aendert sich damit genau dann, wenn das Foto ein anderes ist. Ein fehlendes Foto bekommt 0 (dann loest sich auch ein gespeicherter 404 von selbst auf), ein Backend ohne Staende faellt auf das bisherige Verhalten zurueck, und Upload wie Loeschen veroeffentlichen sofort neu. Die App merkt sich den letzten Stand im Browserspeicher: sie malt ihren ersten Bildschirm, bevor die Versionsangabe eintrifft - ohne das Gedaechtnis trug genau dieser Durchlauf noch die Startzeit und holte das Uebersichtsfoto doch wieder bei jedem Start. Live gemessen: Neuladen ohne Aenderung 5.328.771 Bytes Inhalt bei 0 Bytes uebertragen; ein per touch geaendertes Foto wird neu geholt (513.403 Bytes), die anderen nicht; App-Start ohne eine einzige Adresse mit Startzeit. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -9,8 +9,9 @@ installieren - der Erweiterung fehlte die CFBundleVersion; dazu der QR-Scanner
|
||||
fuer den Zugangs-Token; dazu Debug-Mode, eine Version-Kachel, das Knopfpaar nach
|
||||
HIG und Bilder ohne Verzoegerung; dazu eine Musterseite, die die App ohne Token
|
||||
und ohne Netz rendert; dazu der QR-Code aus einem gespeicherten Bild, ein stiller
|
||||
Debug-Knopf und der HA-Zugang bei den Zugaengen, `2026.9.4.12`,
|
||||
Abschnitte CC bis CH. Davor: Geraetezeit statt Ankunftszeit - die Wurzel hinter der 3-km-Fahrt:
|
||||
Debug-Knopf und der HA-Zugang bei den Zugaengen; der Cache-Brecher der Bilder haengt
|
||||
jetzt am Foto statt am App-Start, `2026.9.4.14`,
|
||||
Abschnitte CC bis CI. 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
|
||||
@@ -10101,3 +10102,67 @@ App meldet daraufhin voellig zu Recht „Der Server ist unter dieser Adresse nic
|
||||
erreichbar". Einzutragen ist die **eigene** Adresse `http://localhost:5173`; der
|
||||
Vite-Proxy reicht `/api` serverseitig an `:18123` weiter (Abschnitt AK). Nach der
|
||||
Korrektur stand die Uebersicht mit echten Daten.
|
||||
|
||||
## CI. Der Cache-Brecher haengt jetzt am Foto, nicht am App-Start (2026.9.4.14)
|
||||
|
||||
Entscheidung des Eigentuemers auf die drei vorgelegten Wege (Abschnitt CG):
|
||||
nicht weniger vorladen, sondern den wiederholten Abruf ganz abschaffen.
|
||||
|
||||
### Was falsch war
|
||||
|
||||
Beide Oberflaechen haengten `?v=${Date.now()}` an jede Bildadresse - gesetzt
|
||||
beim Start und nach jedem Hochladen. Das loest zwar zuverlaessig den
|
||||
eigentlichen Zweck (Home Assistant liefert `/local/` mit 31 Tagen
|
||||
Cache-Vorgabe, ohne Anhaengsel bliebe ein ersetztes Foto einen Monat lang das
|
||||
alte), erkauft ihn aber teuer: die Adresse ist bei **jedem** Start eine andere,
|
||||
der Zwischenspeicher des Browsers kann also zwischen zwei Starts nie greifen.
|
||||
Mit dem Vorladen aller Fotos waeren das **5,3 MB je Start** gewesen.
|
||||
|
||||
### Was jetzt gilt
|
||||
|
||||
`bilder.staende()` liefert den Zeitstempel **je Datei**
|
||||
(`{"seitenansicht.webp": 1788161081, …}`), veroeffentlicht in den `daten` von
|
||||
`sensor.audi_dashboard_app_version` - dieselbe Entitaet, die schon Buendel,
|
||||
Zugaenge, Dongle und den letzten Datensatz traegt. Elf Dateizugriffe, im
|
||||
Executor, weil blockierende Aufrufe in der Ereignisschleife seit 2026.8 als
|
||||
Fehler gemeldet werden.
|
||||
|
||||
Damit aendert sich eine Bildadresse **genau dann, wenn das Foto ein anderes
|
||||
ist** - und sonst nie.
|
||||
|
||||
Drei Feinheiten, jede aus einem konkreten Fall:
|
||||
|
||||
- **Ein Foto, das es nicht gibt, bekommt `v=0`.** Home Assistant liefert auch
|
||||
den 404 mit Cache-Vorgabe; sobald das Foto hochgeladen ist, traegt die
|
||||
Adresse seinen Zeitstempel und der gespeicherte Fehlschlag ist ueberholt.
|
||||
- **Ohne Staende gilt das alte Verhalten** (`Date.now()`). Ein aelteres Backend
|
||||
darf nicht dazu fuehren, dass alle Adressen auf einem festen `v=0` stehen
|
||||
bleiben - das waere ein Foto, das sich nie mehr aktualisiert.
|
||||
- **Die App merkt sich den letzten Stand im Browserspeicher.** Sie malt ihren
|
||||
ersten Bildschirm, BEVOR die Versionsangabe eintrifft; ohne das Gedaechtnis
|
||||
trug genau dieser eine Durchlauf noch die Startzeit und holte das
|
||||
Uebersichtsfoto bei jedem Start erneut - live gesehen, nachdem der Rest
|
||||
schon stimmte. Ein veralteter gemerkter Stand ist ungefaehrlich: sobald die
|
||||
frische Angabe da ist, wechselt die Adresse und das Bild wird nachgeholt.
|
||||
|
||||
`bild_hochladen`/`bild_loeschen` veroeffentlichen jetzt sofort neu - sonst
|
||||
saehe die Oberflaeche das neue Foto erst beim naechsten Minutentakt.
|
||||
|
||||
Das Vorladen laeuft nur noch einmal je **Bildstand** statt einmal je Start;
|
||||
die Kennung ist die Liste der Staende.
|
||||
|
||||
### Live nachgewiesen, beide Haelften
|
||||
|
||||
Im Panel und in der App, gegen die echten Dateien des Testcontainers:
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| veroeffentlichte Staende | deckungsgleich mit den `mtime` der sechs vorhandenen Dateien |
|
||||
| Neuladen ohne Aenderung | **5.328.771 Bytes Inhalt, 0 Bytes uebertragen**, 0 ms - alles aus dem Zwischenspeicher |
|
||||
| ein Foto geaendert (`touch`) | neuer Stand veroeffentlicht, neue Adresse, **513.403 Bytes** neu geholt - die anderen unangetastet |
|
||||
| App-Start, zweiter Durchlauf | **0 Bytes uebertragen insgesamt**, keine einzige Adresse mit Startzeit |
|
||||
|
||||
Dazu 6 Regressionstests (`src/screens/bilder.test.ts`): Zeitstempel statt
|
||||
Startzeit, gleich bleibend ohne Aenderung, wechselnd bei Aenderung, `0` fuer
|
||||
ein fehlendes Foto, Rueckfall ohne Staende, und der gemerkte Stand ueber einen
|
||||
Neustart.
|
||||
|
||||
Reference in New Issue
Block a user