fb251154c7
Zwei getrennte Themen in einem Commit, beide in derselben Sitzung entstanden:
1. Ölwechsel/Inspektion wurden komplett ausgeblendet ("kein Eintrag im
Servicebuch"), sobald kein Servicebucheintrag vorlag - selbst wenn der
zugeordnete Sensor eine gültige Fälligkeit meldete. In beiden Frontends
prüfte die Anzeige nur den Servicebuch-Zweig, bevor sie die
Fahrzeugmeldung überhaupt las. Jetzt steht die Fahrzeugmeldung für sich;
fehlt zusätzlich ein Servicebucheintrag, übernimmt eine neue,
fahrtenlog-basierte Prognose (kmProTagAusFahrten()/meldungsPrognose())
die Hochrechnung statt der Servicebuch-Rate - deckelt auf die vom
Fahrzeug selbst gemeldete Zeitgrenze, falls zu wenig gefahren wird.
2. install.ps1 als Update-Weg wird von Windows Smart App Control blockiert,
ohne Umgehungsmöglichkeit. Die Integration lädt sich jetzt auf
Tastendruck selbst von Gitea (aktualisierung.py), verifiziert das
Manifest vor jedem Tausch und tauscht per os.rename mit automatischem
Rollback bei Fehlern - install.ps1 bleibt nur noch für die
Erstinstallation nötig. Zugangstoken über einen neuen OptionsFlow in
entry.options, nie in configuration.yaml.
Nebenbei: mehrere seit der HACS-Ausschluss-Entscheidung liegen gebliebene
falsche HACS-Referenzen in Code-Kommentaren und einem UI-Text korrigiert.
Details, Sicherheitsbegründung und Verifikationsstand in AGENTS.md,
Abschnitte I und J.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
100 lines
4.4 KiB
Python
100 lines
4.4 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_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"
|
|
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"
|