Files
audi-app/companion-app
tobias 08d8de60db Service-Kennzahl auf der Uebersicht 40px -> 32px; Farbe belegt statt erinnert
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.
2026-09-07 14:08:07 +02:00
..

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/ (von npx cap add erzeugt, 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, von main.tsx aktiviert) 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 serve angedacht, 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.ts abgeschaltet, bis der FMM003 echte Werte liefert