pyscript-Backend zur echten HA-Integration umgebaut (HACS-fähig)
Das Backend liegt jetzt als custom_components/audi_dashboard/ vor - eine normale Home-Assistant-Integration mit Config-Flow, einer sensor-Plattform und 18 Diensten. Damit ist die App über HACS installierbar; bis das Repo auf GitHub gespiegelt ist (HACS spricht ausschließlich mit GitHub), installiert homeassistant/installationspaket/install.ps1 denselben Ordner ohne HACS. Fünf Installationsschritte entfallen ersatzlos: der pyscript:-Block, der panel_custom:-Block, das Kopieren der Oberfläche nach www/, das langlebige Zugriffstoken (der Verlauf wird direkt über die recorder-API gelesen) und "pip install pypdf" (steht in manifest.json). Das Fahrzeugprofil legt die Integration beim ersten Start aus ihrer Vorlage an. Drei alte Schwächen sind dabei mit erledigt: - Die Nutzlast landet nicht mehr in der Recorder-Datenbank (_unrecorded_attributes - das kann nur eine echte Entität). - Eine laufende Fahrt überlebt einen Neustart (Store statt Arbeitsspeicher); fiel sie während eines Ausfalls ins Ende, schließt nach_neustart_fortsetzen() sie beim letzten aufgezeichneten Zeitpunkt. - Sensor-Zuordnungen wirken sofort - die Zustandsbeobachter werden neu gebunden, der Neustart-Hinweis und der Neustart-Dienst sind weg. Namensvertrag geändert, beide Oberflächen mitgezogen: pyscript.audi_dashboard_x -> sensor.audi_dashboard_x, pyscript.audi_dashboard_y -> audi_dashboard.y. Eine Companion-App vom alten Stand findet nach dem Umstieg nichts mehr und muss neu gebaut werden; das Panel liegt in der Integration und kann nicht driften. Der selbstgebaute Updater entfällt - HACS ist die Update-Mechanik, die Home Assistant kennt. Die Versionierung schrumpft auf eine Quelle: manifest.json. Geprüft am laufenden Testcontainer (Container byteweise identisch mit dem Repo): alle 18 Dienste, Panel, Config-Entry neu laden, Historienimport, echter Shell-Beleg in-process, Neuinstallation im Wegwerf-Container blank mit automatisch nachinstalliertem pypdf. Companion-App: tsc sauber, 112/112 Tests, beide Rauchtests gegen das laufende Backend grün. Belegparser 8/8. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
"""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"
|
||||
|
||||
# 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"
|
||||
Reference in New Issue
Block a user