GROESSE: vom Eigentuemer als "sehr gross" gemeldet, im Browser bei 375x812 nachgemessen (Kachel 307px): "8.600 km" war bei 40px 133px breit (43% der Kachel) und damit BREITER als die Reichweite darueber (60px, 107px, 35%) - der zweitrangige Wert schlug den Hauptwert in der Flaeche. Mit einem Datum stand es deutlicher: "01.03.2028" misst bei 40px 231px, 75% der Kachel. Auf 32px sind es 108px bzw. 185px, damit liegt der Servicewert auf der Reichweite gleichauf statt darueber. Schrift und Gewicht waren nie das Problem und bleiben Audi Type Wide 300. Nimmt die Entscheidung vom 18.08.2026 (40 statt 30) zurueck. FARBE: auf die Frage "HIG oder Audi CI" nachgeschlagen. Die Werte stehen auf developer.apple.com nur im Alternativtext der Farbfelder, nicht im Text. Meine Erinnerung war falsch - Apples Yellow "Increased contrast (light)" ist #A16A00, nicht #A05A00. Uebernommen wird er trotzdem nicht: auf unserem 12% hinterlegten Grund liefert er 4.19:1, Apples Orange #C55300 4.16:1, beide unter 4.5:1. Apples Schwelle gilt fuer Schrift auf einfarbigem Grund. Der gemessene Wert #A15800 (4.90:1) bleibt, jetzt mit belegter Begruendung statt ohne. Nebenbefund: die Seite zeigt inzwischen die neue "unified"-Palette (systemRed dunkel #FF4245), dieses Projekt fuehrt die aeltere (#FF453A) - ein einzelner Wert aus der neuen waere ohnehin inkonsistent. LIVE GEPRUEFT: der Eigentuemer hat auf einen offenen Browser hingewiesen, damit liess sich der offene Punkt aus DJ schliessen. Mit voruebergehend zurueckdatierter Erstzulassung (Profil gesichert, hinterher zurueckgestellt und geprueft) zeigen alle drei Stellen die Markierung, und nur die ueberschrittene Gruppe ist hinterlegt - Oelwechsel 2028 und Inspektion 2027 blieben unmarkiert. Das Panel ist weiterhin nur ueber den Paritaetstest belegt, nicht am Bild. 327/327, tsc sauber, Panel als Modul geparst, Manifest und Buendel auf 2026.9.6.7, Container sauber gestartet.
companion-app — DataMetric360
Private Fahrzeug-App für einen Audi RS 4 Avant competition. Läuft als Web-App im Browser, als PWA auf dem Homescreen, später über Capacitor nativ auf iOS/Android und eingebettet als Iframe im Home-Assistant-Dashboard.
Kein eigenes Backend. Die App spricht direkt mit der REST- und
WebSocket-Schnittstelle von Home Assistant und ruft dieselben
pyscript.audi_dashboard_*-Dienste auf wie das bestehende Panel. Alle Daten
liegen auf dem eigenen Server; das Gerät hält nur den Zugangstoken und einen
Zwischenspeicher für die Offline-Anzeige.
Architektur: ../COMPANION_APP_ARCHITECTURE.md · Umsetzungsschritte:
../UMSETZUNGSPLAN.md · Projektstand: ../AGENTS.md
Loslegen
npm install # im Repo-Wurzelverzeichnis, nicht hier (npm-Workspace)
npm run build:ds # Design-System bauen, die App importiert aus dessen dist/
npm run dev --workspace datametric360
Beim ersten Start fragt die App nach Server-Adresse und Zugangstoken. Für die
Entwicklung setzt ../testumgebung/aufsetzen.sh eine vollständige
Home-Assistant-Instanz mit dem echten Backend auf.
Aufbau
| Ordner | Inhalt |
|---|---|
src/api/ |
Datenschicht: REST, WebSocket mit Wiederverbindung, Offline-Warteschlange, Zugangsdaten |
src/daten/ |
Fachlogik: Profil-Umrechnung, Statistik, Service-Prognose, Datenkontext |
src/screens/ |
Die 21 Seiten der App |
src/stile/ |
Layout, Bildschirmbausteine, Audi-Schrift |
src/assets/audi/ |
Schrift, Vier-Ringe, Typenschilder — lizenzpflichtig, siehe unten |
src/tests/ |
Testaufbau und Beispieldaten |
Gestaltung kommt vollständig aus @audi-dash/ui (../design-system/). Neue
Komponenten entstehen dort, nicht hier.
Prüfen
npm run typecheck # TypeScript, sehr streng (exactOptionalPropertyTypes u. a.)
npm run test # 90 Tests: Rechenlogik, Layoutwechsel, alle Seiten gerendert
npm run smoke # Adressbildung und Endpunkte, ohne Token
npm run smoke:auth # gegen die laufende Testinstanz, mit Token
npm run build # Produktionsbündel
smoke:auth liest Adresse und Token aus .env.local (schreibt
../testumgebung/aufsetzen.sh, gitignored). Ohne die Datei überspringt der
Test sich selbst, statt fehlzuschlagen.
Die Rendertests decken alle 21 Seiten in beiden Layouts ab — schmal mit Tab-Leiste, breit mit Seitenleiste.
Rechtlicher Hinweis
src/assets/audi/ enthält die Hausschrift Audi Type, das Vier-Ringe-Zeichen
und die Modell-Typenschilder. Diese sind lizenz- beziehungsweise
markenrechtlich geschützt und ausschließlich für diese eine private,
unveröffentlichte Installation freigegeben (../bauauftrag.md §8/§12).
Daraus folgt: Die App wird nur seitlich installiert, nie in einem App Store
veröffentlicht, und dieses Repository bleibt privat. ../design-system/
kommt bewusst ohne diese Dateien aus, weil es nach außen hochgeladen wird —
dort niemals Markendateien ablegen.
Die signierte App
auslieferung/App.ipa ist der fertige, Ad-hoc signierte Stand (Team
RMACS9VLS4, Profil gültig bis 29.08.2027, nur für das eingetragene iPhone).
Neu bauen: bash scripts/ios-signieren.sh - baut Webbündel, synchronisiert die
Hülle, signiert und legt die .ipa wieder hier ab.
Beim ersten Signieren fragt der Schlüsselbund um Erlaubnis. Dort „Immer
erlauben" wählen, sonst hängt xcodebuild wortlos und endet nach Minuten mit
errSecInternalComponent.
Noch offen
- Native Hülle selbst:
ios//android/(vonnpx cap adderzeugt, absichtlich gitignored) existieren in keinem Checkout dauerhaft und müssen auf einem Mac (für iOS zwingend, Xcode) neu erzeugt werden - die sichere Tokenablage (Keychain/Keystore) ist dagegen bereits vollständig angebunden (src/api/ablageNativ.ts, vonmain.tsxaktiviert) und wird automatisch aktiv, sobald die Hülle existiert - Übertragung über die Luft:
scripts/ios-luftweg.sh https://<host>erzeugt Manifest und Installationsseite; es fehlt nur noch ein Host, der den Ordner über HTTPS mit gültigem Zertifikat ausliefert (tailscale serveangedacht, dieser Mac ist dort noch abgemeldet) - QR-Einrichtung als Alternative zum Einfügen des Tokens
- Live-Ansicht der laufenden Fahrt: gebaut, aber über
src/funktionen.tsabgeschaltet, bis der FMM003 echte Werte liefert