Files
audi-app/custom_components/audi_dashboard/const.py
T
tobias bfb7dec1e9 TANK_DISTANZ_SENSOR + Datensatz sichern/laden mit echtem CSV-Import (Panel)
- Neuer optionaler Sensor TANK_DISTANZ_SENSOR ersetzt die eigene
  Kilometerstand-Subtraktion fuer die Tankvorgang-Strecke, wo zugeordnet
  (Live-Erkennung, manuelle Erfassung, historischer Import)
- "Fahrzeugprofil" und "Daten ausgeben" zu einer Kachel zusammengelegt:
  "Datensatz sichern" (4 Exporte wie bisher) / "Datensatz laden" (neu:
  echter CSV-Import fuer Fahrten/Tankvorgaenge/Wartungsplan)
- Import gleicht per ID ab (Fahrten/Tankvorgaenge) bzw. Datum+Art
  (Wartungsplan, hat keine eigene ID) und aktualisiert nur die in der CSV
  enthaltenen Spalten - alles andere am Datensatz bleibt unangetastet
- Nebenbei gefunden und behoben: belege.tankvorgang_aktualisieren()
  ueberschrieb bisher immer alle Felder, auch mit None, wenn irgendeins
  geaendert wurde - fuer den CSV-Import gefaehrlich, jetzt nur noch
  tatsaechlich uebergebene Felder
- Ebenfalls gefunden und behoben: Panel las das Import-Ergebnis per
  HASS.states direkt nach dem Dienstaufruf - ein Wettlauf mit dem
  state_changed-Push. Nutzt jetzt denselben HASS.callWS(get_states)-Weg
  wie der bestehende historie_importieren-Ablauf.

companion-app-Portierung von "Datensatz sichern/laden" steht noch aus.

Version 2026.8.28.3, live im Testcontainer verifiziert (alle drei
CSV-Datensatztypen: anlegen + aktualisieren per ID/Datum+Art getestet,
Testdaten danach geloescht).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-28 10:19:06 +02:00

105 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_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"