5ccbfec92d
Vier Themen aus einer Sitzung. 1. Die Fahrt endet wieder bei uns statt im Dongle (Abschnitt BW). Der Ignition-OFF-Timeout des FMM003 (900 s) und sein Schlaf-Timeout (ebenfalls 900 s) starten beide beim Zuendungs-Aus und fallen in derselben Sekunde - am 02.09. zweimal beobachtet, einmal ging das Trip-Ende verloren, einmal kam es eine Sekunde vor dem Schlaf an. Ausloeser ist jetzt die Zuendung, die Wartezeit laeuft in Home Assistant. ZUENDUNG_NACHLAUF_S = 180 wird in beiden Wegen abgezogen (ueber das Trip-Signal 1080 s, weil dessen Ende selbst an der verzoegerten Zuendung haengt). 2. Schieberegler, neu in beiden Codebasen. Schrittweite 5 Minuten; der Daumen war im Tagmodus weiss auf weiss und traegt jetzt einen Ring aus --line-strong - ein Token, das genau dort sichtbar ist, wo es gebraucht wird. 3. Knopf "Fahrt beenden" in der Zuletzt-Kachel (Abschnitt BX). Schliesst auf das letzte Lebenszeichen, nicht auf "jetzt", und kennzeichnet das Ende als vorlaeufig. Ein spaet eintreffendes Zuendungs-Aus zieht es nach - innerhalb von sechs Stunden, nur nach vorn, und nur bei einer vorlaeufigen Fahrt. ts_end wandert bewusst NICHT in edited_fields, sonst blockierte der Schutz fuer Handeingaben genau diese Korrektur. 4. Das OTA-Buendel kann auf dem Mac gar nicht entstehen (Abschnitt BV): npm run ota ist eine Windows-PowerShell-Datei, ios-signieren.sh baut ein frisches dist/ und fasst das Buendel nie an. Ausgeliefert war deshalb eine Oberflaeche ohne den Versionshinweis unter richtiger Nummer. Verifiziert: Backend 27/27 (5 Signalwechsel, 14 Zuendungspause, 8 Fahrtende), companion-app tsc sauber und 179/179, Panel als Modul geparst, audi_ha_test auf 2026.9.3.7 sauber gestartet. Live am laufenden Panel und ohne Rueckstand belegt: Wartezeit samt Abbruch, die 180-s-Rechnung, der Regler im Tagmodus und der Knopf von der laufenden Fahrt bis zum verworfenen Kurzvorgang - Fahrten vorher 16, nachher 16. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
106 lines
4.7 KiB
Python
106 lines
4.7 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_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"
|