1354ca6b06
HACS kann laut eigener Dokumentation grundsätzlich nicht mit privaten GitHub-Repositories arbeiten (hacs.xyz/docs/faq/private_repositories) - keine Ausnahme für Tokens oder verbundene Konten. Meine frühere Annahme, HACS käme damit zurecht, wenn es unter dem richtigen Konto angemeldet ist, war falsch. Da das Repository aus Lizenzgründen privat bleiben muss (Audi-Hausschrift, Typenschilder), ist install.ps1 damit nicht die Rückfallebene, sondern der einzige Installationsweg - README, INSTALL.md, ANLEITUNG.md, install.ps1 und VERSIONIERUNG.md korrigiert. Oberflächen-Updates für die iOS-App laufen jetzt ohne Xcode: @capgo/capacitor-updater eingebaut, ein Update-Abschnitt in den Einstellungen lädt ein neues Bündel und tauscht die Oberfläche aus. Kein Selbstlauf (autoUpdate: false) - nur auf Tastendruck, nie während der Benutzung. Das Bündel liegt in der Integration selbst (custom_components/audi_dashboard/frontend/app/), nicht unter /local/: so reist es bei jeder Installation automatisch mit, ohne zweiten Auslieferungsweg. Gebaut von companion-app/scripts/ota-paket.ps1 (neuer Befehl: npm run ota), gemeldet über sensor.audi_dashboard_app_version (neues Feld daten.buendel). Ein echter Bug beim Bauen gefunden: [IO.Compression.ZipFile]::CreateFrom- Directory schreibt unter Windows PowerShell 5.1 Backslashes in die Zip-Einträge - iOS hätte das Archiv falsch entpackt. Behoben, indem die Einträge von Hand mit "/" geschrieben werden. Rückfallebene: notifyAppReady() läuft erst, wenn React nachweislich gerendert hat (App.tsx). Kommt diese Meldung nicht, rollt das Plugin nach 20 Sekunden von selbst auf das vorherige Bündel zurück. Am laufenden Testcontainer verifiziert: die ausgelieferte Zip hasht exakt auf den in bundle.json hinterlegten Wert, 13 Einträge, index.html in der Wurzel, keine Backslashes, keine Beschädigung. tsc sauber, 117/117 Tests (5 davon neu für buendelPasst() - dabei eine echte Lücke gefunden: die Funktion hätte bei unbekannter eigener Version fälschlich ein Update angeboten, jetzt genauso vorsichtig wie versionVergleichen). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
92 lines
4.0 KiB
Python
92 lines
4.0 KiB
Python
"""Feste Namen und Pfade der Integration.
|
|
|
|
Die Entity-IDs und Dienstnamen hier sind ein VERTRAG mit beiden Oberflächen
|
|
(homeassistant/www/audi-dashboard-app.js und companion-app/): dort stehen
|
|
dieselben Namen in je einer zentralen Tabelle. Wer hier umbenennt, muss beide
|
|
mitziehen - sonst liest die App ins Leere, ohne dass irgendetwas abstürzt.
|
|
|
|
Warum die Namen sich gegenüber der pyscript-Fassung überhaupt geändert haben:
|
|
dort hießen sie `pyscript.audi_dashboard_*`, weil pyscript der Besitzer der
|
|
Domain war. Ohne pyscript wäre dieser Präfix eine Lüge - die Entitäten
|
|
gehören jetzt dieser Integration. Aus `pyscript.audi_dashboard_x` wird
|
|
deshalb `sensor.audi_dashboard_x`, aus dem Dienst `pyscript.audi_dashboard_y`
|
|
wird `audi_dashboard.y`.
|
|
"""
|
|
|
|
DOMAIN = "audi_dashboard"
|
|
|
|
# Unterordner im HA-Konfigurationsverzeichnis für alle Nutzerdaten
|
|
# (Fahrzeugprofil, Fahrten, Tankvorgänge, Belege, Sicherungen). Bewusst
|
|
# derselbe Name und dasselbe Dateiformat wie in der pyscript-Fassung: eine
|
|
# bestehende Installation wird dadurch einfach weiterbenutzt, es gibt keine
|
|
# Datenmigration und damit auch keinen Weg, dabei etwas zu verlieren.
|
|
BASIS_ORDNER = "audi_dashboard"
|
|
|
|
# Panel: Sidebar-Eintrag und URL. Früher aus configuration.yaml
|
|
# (panel_custom:), jetzt von der Integration selbst registriert - deshalb
|
|
# entfällt der YAML-Block und mit ihm der Neustart beim ersten Einbau.
|
|
PANEL_URL = "audi-dashboard"
|
|
PANEL_TITEL = "Mein Audi"
|
|
PANEL_ICON = "mdi:car-sports"
|
|
PANEL_KOMPONENTE = "audi-dashboard-panel"
|
|
|
|
# Statischer Pfad, unter dem die Oberflächen-Dateien aus frontend/
|
|
# ausgeliefert werden. Ersetzt /local/ (also /config/www/): die Dateien
|
|
# gehören jetzt zum Installationspaket der Integration und werden von HACS
|
|
# mitgeliefert, statt separat nach www/ kopiert zu werden.
|
|
STATIK_URL = "/audi_dashboard_static"
|
|
STATIK_ORDNER = "frontend"
|
|
|
|
# Das OTA-Bündel der iOS-App: dieselbe Oberfläche, als Zip zum Nachladen.
|
|
# Liegt bewusst mit im Integrationsordner - dann liefert HACS es bei jedem
|
|
# Update mit aus, und Bündel und Integration können gar nicht auseinander-
|
|
# laufen (siehe companion-app/scripts/ota-paket.ps1).
|
|
BUENDEL_ORDNER = "frontend/app"
|
|
BUENDEL_URL = f"{STATIK_URL}/app/bundle.zip"
|
|
BUENDEL_INFO = "bundle.json"
|
|
|
|
# Vom Nutzer hochgeladene Fahrzeugfotos. Die bleiben in /config/www/bilder,
|
|
# also unter /local/bilder/: sie sind NUTZERDATEN, kein Auslieferbestandteil.
|
|
# Lägen sie im Integrationsordner, würde das nächste HACS-Update sie
|
|
# mitlöschen - genau das darf nicht passieren.
|
|
BILDER_ORDNER = "www/bilder"
|
|
|
|
# --------------------------------------------------------------- Entitäten
|
|
# Schlüssel -> Objekt-ID. Die vollständige Entity-ID ist
|
|
# sensor.audi_dashboard_<objekt-id>; sensor.py legt sie so an.
|
|
E_PROFIL = "profil"
|
|
E_FAHRTEN = "fahrten"
|
|
E_TANKVORGAENGE = "tankvorgaenge"
|
|
E_FAHRZEUGSTATUS = "fahrzeugstatus"
|
|
E_BATTERIEVERLAUF = "batterieverlauf"
|
|
E_ZUORDNUNG = "entitaeten"
|
|
E_BELEG_ERGEBNIS = "beleg_ergebnis"
|
|
E_IMPORT_STATUS = "import_status"
|
|
E_APP_VERSION = "app_version"
|
|
E_REIFEN_SOMMER = "reifen_sommer_km"
|
|
E_REIFEN_WINTER = "reifen_winter_km"
|
|
E_REIFEN_AKTIV = "reifen_aktiver_satz"
|
|
|
|
# Signal für den Weg Koordinator -> Entität (async_dispatcher_send).
|
|
SIGNAL_AKTUALISIERT = f"{DOMAIN}_aktualisiert"
|
|
|
|
# ----------------------------------------------------------------- Dienste
|
|
D_JETZT_AKTUALISIEREN = "jetzt_aktualisieren"
|
|
D_PROFIL_SCHREIBEN = "profil_schreiben"
|
|
D_ENTITAETEN_SCHREIBEN = "entitaeten_schreiben"
|
|
D_FAHRT_MANUELL_ANLEGEN = "fahrt_manuell_anlegen"
|
|
D_FAHRT_AKTUALISIEREN = "fahrt_aktualisieren"
|
|
D_FAHRT_LOESCHEN = "fahrt_loeschen"
|
|
D_SCREENING_JETZT = "screening_jetzt"
|
|
D_BELEG_HOCHLADEN = "beleg_hochladen"
|
|
D_TANKVORGANG_MANUELL = "tankvorgang_manuell"
|
|
D_TANKVORGANG_AKTUALISIEREN = "tankvorgang_aktualisieren"
|
|
D_TANKVORGANG_LOESCHEN = "tankvorgang_loeschen"
|
|
D_BILD_HOCHLADEN = "bild_hochladen"
|
|
D_BILD_LOESCHEN = "bild_loeschen"
|
|
D_REIFEN_WECHSELN = "reifen_wechseln"
|
|
D_REIFEN_KM_SETZEN = "reifen_km_setzen"
|
|
D_BACKUP_JETZT = "backup_jetzt"
|
|
D_BACKUP_WIEDERHERSTELLEN = "backup_wiederherstellen"
|
|
D_HISTORIE_IMPORTIEREN = "historie_importieren"
|