e1d570992e
Drei zusammengehörige Teile in einem Repository: - homeassistant/ Das fertige, im Einsatz befindliche Home-Assistant-Panel (panel_custom Custom Element + pyscript-Backend). Echte Fahrzeug- und Personendaten (fahrzeugprofil.json, fahrten.jsonl, tankvorgaenge.jsonl, Tankbelege) bleiben per .gitignore außen vor; die anonymisierte Vorlage fahrzeugprofil.example.json ist mit dabei. - design-system/ Eigenständige React-Komponentenbibliothek (@audi-dash/ui), die die visuelle Sprache des Panels nachbildet - ohne Audi-Markenzeichen und ohne die lizenzierte Hausschrift. Dient als Grundlage für Claude Design. War bis hierher ein eigenes Repository und ist in dieses eingeschmolzen worden. - companion-app/ Datenschicht der neuen App DataMetric360 (iOS/Android via Capacitor, zusätzlich als Iframe im HA-Dashboard). Noch ohne Oberfläche: REST- und WebSocket-Zugriff auf Home Assistant plus Warteschlange für Änderungen ohne Netz. Ersetzt das eingespritzte hass-Objekt, das nur innerhalb des HA-Frontends existiert. Dazu die Projektdokumentation: SPECIFICATION.md (Ist-Stand des Panels), COMPANION_APP_ARCHITECTURE.md (Architekturentscheidungen der neuen App), AUDIT_2026-08-10.md, DESIGN_BRIEF_DATAMETRIC360.md und der ursprüngliche Bauauftrag. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
48 lines
2.7 KiB
JavaScript
48 lines
2.7 KiB
JavaScript
/* ================================================================
|
|
Audi-Dashboard — Lade-Stub für panel_custom
|
|
================================================================
|
|
Diese Datei selbst ändert sich praktisch nie und bleibt deshalb auch mit
|
|
der langen Standard-Cache-Zeit von Home Assistant für /local/ (31 Tage,
|
|
Cache-Control: public, max-age=2678400 - an der Testinstanz nachgemessen,
|
|
nicht vermutet) unproblematisch: sie lädt bei jedem vollständigen
|
|
Seitenaufruf zuerst audi-dashboard-version.json mit cache:"no-store" -
|
|
das erzwingt eine echte Netzwerkanfrage, unabhängig vom HTTP-Cache -, und
|
|
reicht deren Versionsnummer als Query-Parameter an den eigentlichen
|
|
Code (audi-dashboard-app.js) weiter. Jede neue Versionsnummer ist aus
|
|
Sicht des Browsers eine neue URL und wird deshalb nie aus einem alten
|
|
Cache bedient.
|
|
|
|
Update-Ablauf ohne Neustart und ohne Cache-Probleme:
|
|
1. audi-dashboard-app.js und/oder audi-dashboard.css ersetzen
|
|
2. die Zahl in audi-dashboard-version.json um 1 erhöhen
|
|
3. im Browser einmal ganz normal neu laden (kein Hard-Refresh nötig)
|
|
Diese Datei hier (audi-dashboard-panel.js) bleibt dabei unangetastet -
|
|
configuration.yaml und damit ein HA-Neustart sind für Frontend-Updates
|
|
nicht mehr nötig, nur noch für den allerersten Einbau (§10 Punkt 1).
|
|
|
|
Bekannte HA-Eigenheit (an der Testinstanz reproduziert, nicht vermutet):
|
|
ha-panel-custom cached geladene Skripte nur für den alten js_url-Typ,
|
|
nicht für module_url (siehe dessen eigener Quellcode - für "js" gibt es
|
|
ein url-indiziertes Cache-Objekt, für "module" fehlt das komplett). Bei
|
|
einem direkten/harten Seitenaufruf (nicht bei SPA-interner Navigation)
|
|
kann das dazu führen, dass dieses Skript zweimal als <script type=module>
|
|
eingefügt wird, bevor das erste fertig geladen hat - beobachtet als zwei
|
|
Netzwerk-Requests für diese Datei und ein hängenbleibendes "Lädt …" ohne
|
|
Fehler in der eigentlichen App. Der Cache unten macht starten() robust
|
|
gegen so einen doppelten Aufruf: der zweite Aufruf wartet einfach auf das
|
|
Ergebnis des ersten, statt selbst nochmal zu fetchen/zu importieren. */
|
|
window.__audiDashboardStarten =
|
|
window.__audiDashboardStarten ||
|
|
(async () => {
|
|
let version = Date.now(); // Fallback, falls version.json nicht erreichbar ist
|
|
try {
|
|
const antwort = await fetch("/local/audi-dashboard-version.json", { cache: "no-store" });
|
|
const daten = await antwort.json();
|
|
version = daten.version;
|
|
} catch (e) {
|
|
console.warn("audi_dashboard: version.json nicht erreichbar, nutze Zeitstempel als Cache-Buster", e);
|
|
}
|
|
await import(`/local/audi-dashboard-app.js?v=${version}`);
|
|
})();
|
|
await window.__audiDashboardStarten;
|