8c96d9b78e
Die Token liegen seit jeher in entry.options, geschrieben vom Options-Flow unter Einstellungen -> Geraete & Dienste -> Konfigurieren. Der Weg bleibt und ist der Rueckfall, wenn die App den Server nicht erreicht - genau der Fall, in dem ein abgelaufener Token auffaellt. Erreichbar ist er aber nur ueber HAs eigene Weboberflaeche; die iOS-App zeigt keine Konfigurationsdialoge. Die neue Kachel ist die Bedienflaeche dafuer, kein zweiter Speicherort. Der Wert kommt nie zurueck: veroeffentlicht werden nur "gesetzt/nicht gesetzt" und die letzten vier Zeichen (unter zwoelf Zeichen Laenge gar nichts). Auch das Protokoll bekommt ihn nicht, und das Panel leert das Eingabefeld sofort nach dem Absenden. Bewusst NICHT im Fahrzeugprofil: sicherung.py sichert fahrzeugprofil.json, und "Backup exportieren" laedt es als Datei auf das Geraet - ein Token dort wanderte in jede Sicherung und jede weitergegebene Datei. Ein Dienst statt zwei: zugang_setzen(dienst, token), leerer Text loescht. In der App nicht ueber die Warteschlange - ein Stunden spaeter nachgereichter Token ueberschriebe womoeglich einen inzwischen eingetragenen neuen. CONF_FLESPI_TOKEN ist neu und noch ohne Leser; der Flespi-Weg zum Auslesen der Geraetekonfiguration ist damit vorbereitet, aber nicht gebaut. Verifiziert: py_compile auf sechs Backend-Dateien, Panel als Modul geparst, companion-app tsc sauber und 179/179, audi_ha_test auf 2026.9.3.8 sauber gestartet. Live am laufenden Panel der ganze Kreis, Container hinterher wie vorgefunden: Wegwerf-Token gesetzt -> "gesetzt . ...0000", der Wert selbst taucht in den veroeffentlichten Attributen nirgends auf (darauf geprueft), ueber die Sicherheitsabfrage geloescht -> wieder "nicht gesetzt", der Gitea-Token unberuehrt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
108 lines
4.8 KiB
Python
108 lines
4.8 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
|
|
# install.ps1 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 install.ps1 es bei
|
|
# jeder Auslieferung mit aus, und Bündel und Integration können gar nicht
|
|
# auseinanderlaufen (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 der nächste install.ps1-Lauf 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_FAHRT_JETZT_BEENDEN = "fahrt_jetzt_beenden"
|
|
D_ZUGANG_SETZEN = "zugang_setzen"
|
|
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_BATTERIEVERLAUF_LOESCHEN = "batterieverlauf_loeschen"
|
|
D_REIFEN_WECHSELN = "reifen_wechseln"
|
|
D_REIFEN_KM_SETZEN = "reifen_km_setzen"
|
|
D_REIFEN_ARCHIVIEREN = "reifen_archivieren"
|
|
D_REIFEN_ARCHIV_AKTUALISIEREN = "reifen_archiv_aktualisieren"
|
|
D_REIFEN_ARCHIV_LOESCHEN = "reifen_archiv_loeschen"
|
|
D_BACKUP_JETZT = "backup_jetzt"
|
|
D_BACKUP_WIEDERHERSTELLEN = "backup_wiederherstellen"
|
|
D_HISTORIE_IMPORTIEREN = "historie_importieren"
|
|
D_CSV_IMPORTIEREN = "csv_importieren"
|
|
D_UPDATE_PRUEFEN = "update_pruefen"
|
|
D_UPDATE_INSTALLIEREN = "update_installieren"
|
|
|
|
# Schlüssel für den Gitea-Zugriffstoken in entry.options (siehe
|
|
# config_flow.py's AudiDashboardOptionsFlow und aktualisierung.py). Hier statt
|
|
# in config_flow.py definiert, damit aktualisierung.py/dienste.py ihn ohne
|
|
# Umweg über den Options-Flow importieren können.
|
|
CONF_GITEA_TOKEN = "gitea_token"
|
|
CONF_FLESPI_TOKEN = "flespi_token"
|