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 <[email protected]>
This commit is contained in:
2026-08-23 23:53:56 +02:00
co-authored by Claude Opus 5
parent 99cef7c393
commit d8b12da36d
136 changed files with 5289 additions and 17641 deletions
+119 -157
View File
@@ -1,189 +1,151 @@
# Kurzanleitung — Installation auf einer neuen Home-Assistant-Instanz
# Kurzanleitung — Installation auf einer Home-Assistant-Instanz
Alle Dateien, die dafür nötig sind, liegen schon in diesem Ordner. Ausführliche
Erklärungen, Troubleshooting und Hintergründe stehen in `../INSTALL.md` — hier
nur die Checkliste.
Ausführliche Erklärungen, Umstieg von der alten Fassung und Troubleshooting
stehen in [`../INSTALL.md`](../INSTALL.md) — hier nur die Checkliste.
## Voraussetzungen
- HACS installiert, darüber **pyscript** installiert (HACS → Integrationen →
„pyscript" suchen → Download → HA neu starten)
- Home Assistant 2025.1 oder neuer
- Das **Samba-Share-Add-on** in HA läuft, damit `\\<HA-IP>\config` vom PC aus
erreichbar ist
Das war's. Anders als früher braucht es weder HACS noch pyscript, kein
Zugriffstoken und keinen `pip install` auf der HA-Maschine.
---
## Der schnelle Weg: `Installieren.cmd`
**Doppelklick auf `Installieren.cmd`** — das erledigt die Schritte 13 unten von
selbst: es sucht die HA-Instanz im Netz (`\\homeassistant\config` und die
üblichen Alternativen, sonst fragt es nach dem Pfad), kopiert `pyscript\`,
`data\``audi_dashboard\` und `www\`, trägt die beiden Blöcke in die
`configuration.yaml` ein und listet am Ende auf, was noch von Hand zu tun ist
(Neustart, Token, Sensoren zuordnen).
**Doppelklick auf `Installieren.cmd`.** Das Skript sucht die HA-Instanz im
Netz (`\\homeassistant\config` und die üblichen Alternativen, sonst fragt es
nach dem Pfad) und kopiert einen einzigen Ordner:
Was es dabei **nicht** tut:
```
custom_components\audi_dashboard\ -> <config>\custom_components\
```
- Bestehende Daten überschreiben. `fahrzeugprofil.json`, `fahrten.jsonl`,
`tankvorgaenge.jsonl`, `entitaeten.json` und `ha_token.txt` bleiben
unangetastet — ein zweiter Lauf auf einer laufenden Installation ist deshalb
gefahrlos.
- Die `configuration.yaml` blind verändern. Sie wird vorher zeitgestempelt
gesichert (`configuration.yaml.<Datum-Uhrzeit>.bak`), und stehen dort schon
eigene `pyscript:`- oder `panel_custom:`-Einträge, fasst das Skript sie gar
nicht an und sagt stattdessen, was zu ergänzen ist (zwei gleiche
Top-Level-Schlüssel wären ungültiges YAML — HA würde nicht mehr starten).
Nach dem Schreiben liest es die Datei zurück und prüft sie; weicht auch nur
eine Kleinigkeit ab, rollt es selbsttätig auf die Sicherung zurück.
Am Ende listet es auf, was noch von Hand zu tun ist.
### Ist das für meine bestehende HA-Installation gefährlich?
Nein — und das lässt sich nachprüfen statt glauben:
- Es **löscht nie etwas**. Im ganzen Skript kommt kein `Remove-Item` vor, und
kopiert wird ohne `robocopy /MIR`; fremde Dateien in `pyscript\` und `www\`
bleiben liegen.
- Es fasst **`.storage\` nicht an** — keine Integrationen, Geräte, Entitäten,
Benutzer, Automatisierungen. `automations.yaml`, `scripts.yaml`, `scenes.yaml`
und `secrets.yaml` werden weder gelesen noch geschrieben.
- Es **startet HA nicht neu**. Bis zum manuellen Neustart ändert sich am
laufenden Betrieb nichts.
- Die einzige Datei außerhalb der eigenen Ordner, die es überhaupt anfasst, ist
`configuration.yaml` — mit den drei Netzen oben.
Der einzige Punkt, der einer sonst gesunden Installation gefährlich werden
kann, ist **nicht** der Installer, sondern die Datenaufbewahrung aus Schritt 3:
ein Jahr Fahrzeugverlauf braucht grob 11,5 GB. Auf HA OS mit SD-Karte oder
kleiner eMMC vorher unter **Einstellungen → System → Speicher** nachsehen; ist
der Datenträger voll, startet HA nicht mehr — unabhängig von dieser App.
Erst schauen, was passieren würde, ohne etwas zu schreiben:
Erst schauen, was passieren würde, ohne dass etwas geschrieben wird:
```powershell
.\install.ps1 -Pruefen
```
Mit festem Ziel und Token in einem Rutsch:
Mit festem Ziel:
```powershell
.\install.ps1 -Ziel "\\192.168.1.50\config" -Token "eyJhb..."
.\install.ps1 -Ziel "\\192.168.1.50\config"
```
Danach weiter bei **Schritt 3** (Datenaufbewahrung — macht der Installer
bewusst nicht selbst, siehe dort), **4** (Token, falls nicht übergeben),
**5** und **6**.
### Ist das für meine bestehende HA-Installation gefährlich?
Nein — und das lässt sich nachprüfen statt glauben.
Die riskanteste Stelle der früheren Fassung ist weg: sie musste Blöcke in die
`configuration.yaml` eintragen, und eine kaputte `configuration.yaml` ist der
eine Weg, auf dem ein Installer Home Assistant am Starten hindern kann.
**Diese Fassung fasst die Datei überhaupt nicht mehr an** — die Integration
meldet ihr Panel selbst an, dafür braucht es kein YAML.
Was bleibt:
- Geschrieben wird **ausschließlich** in
`<config>\custom_components\audi_dashboard`. Kein anderer Pfad — nicht
`.storage\`, nicht `configuration.yaml`, nicht `automations.yaml`, nicht
`www\`, nicht `audi_dashboard\` (die Fahrzeugdaten).
- Gelöscht wird nur der eigene Ordner, und auch der nur, wenn darin eine
`manifest.json` mit `"domain": "audi_dashboard"` liegt. Ein fremder Ordner
unter demselben Namen führt zum Abbruch, nicht zum Löschen.
- Nach dem Kopieren liest das Skript die `manifest.json` im Ziel zurück und
prüft die Version. Stimmt sie nicht, bricht es mit einer Meldung ab, statt
eine halbe Installation stehen zu lassen.
- Es **startet HA nicht neu**. Bis zum manuellen Neustart ändert sich am
laufenden Betrieb nichts.
Ein zweiter Lauf auf einer laufenden Installation ist damit gefahrlos — er ist
sogar der vorgesehene Weg für Updates.
Der einzige Punkt, der einer sonst gesunden Installation gefährlich werden
kann, ist **nicht** der Installer, sondern die Datenaufbewahrung aus Schritt 3
unten: ein Jahr Fahrzeugverlauf braucht grob 11,5 GB. Auf HA OS mit SD-Karte
oder kleiner eMMC vorher unter **Einstellungen → System → Speicher**
nachsehen; ist der Datenträger voll, startet HA nicht mehr — unabhängig von
dieser App.
---
## Der Weg von Hand
Falls `Installieren.cmd` nicht durchläuft oder lieber nachvollziehbar
Schritt für Schritt gearbeitet werden soll:
Falls `Installieren.cmd` nicht durchläuft oder lieber nachvollziehbar:
## 1. Dateien kopieren
Ziel ist das `config`-Verzeichnis der neuen HA-Instanz, z. B. über das
Samba-Share-Add-on (`\\<HA-IP>\config`):
| Aus diesem Ordner | Nach |
|---|---|
| `pyscript\` | `\\<HA-IP>\config\pyscript\` |
| `data\` | `\\<HA-IP>\config\audi_dashboard\` (**umbenennen** von `data` zu `audi_dashboard`) |
| `www\` | `\\<HA-IP>\config\www\` |
In `audi_dashboard\` danach `fahrzeugprofil.example.json` zu
`fahrzeugprofil.json` umbenennen — die Platzhalter darin lassen sich nach dem
ersten Start direkt in der App unter **Einstellungen → Fahrzeug einrichten**
eintragen.
## 2. configuration.yaml ergänzen
Die beiden Blöcke aus `configuration_snippet.yaml` (`pyscript:` und
`panel_custom:`) in die bestehende `configuration.yaml` übernehmen — nicht
ersetzen. Falls dort schon `pyscript:` existiert, nur die beiden Zeilen
`allow_all_imports: true` und `hass_is_global: true` ergänzen.
## 3. Datenaufbewahrung — je früher, desto besser
Auch `recorder_snippet.yaml` übernehmen. Home Assistant löscht Sensor-Verläufe
**standardmäßig nach 10 Tagen**; der Block hebt das auf ein Jahr an.
Das ist der einzige zeitkritische Schritt der ganzen Anleitung: was der
recorder einmal gelöscht hat, ist endgültig weg und lässt sich auch mit „Daten
importieren aus Home Assistant" (Schritt 7) nicht mehr nachtragen. Jeder Tag
ohne diesen Block ist ein Tag Vergangenheit, den es später nicht mehr gibt.
Vorher **Einstellungen → System → Speicher** ansehen: ein Jahr braucht grob
11,5 GB. Bei wenig Platz mit `purge_keep_days: 90` anfangen — Begründung,
gemessene Zahlen und eine `exclude:`-Liste zum Kürzen stehen im Kopf der Datei.
Nicht betroffen sind die Bestände der App selbst (`fahrten.jsonl`,
`tankvorgaenge.jsonl`, `batteriespannung.jsonl`, `fahrzeugprofil.json`) — die
werden nirgends automatisch gekürzt.
## 4. Long-Lived Access Token
Profil-Avatar (unten links) → „Long-lived access tokens" → Token erstellen →
Wert in eine neue Datei `audi_dashboard\ha_token.txt` einfügen (nur der Token,
keine Anführungszeichen). Wird fürs Kilometerstand-Screening gebraucht.
## 5. Neu starten
**Einstellungen → System → Neu starten.**
## 6. Sensoren zuordnen
Nach dem Neustart sollte „Mein Audi" in der Sidebar erscheinen. Dort:
**Einstellungen → Fahrzeug einrichten → Einrichten → „Setup — Sensoren
zuordnen"**. Im Auslieferstand ist **kein** Sensor vorbelegt.
Zwingend für die Fahrterkennung: der Zündungs-/ACC-Sensor (`binary_sensor`,
meist vom Teltonika FMM003). Alles Weitere ist optional — ohne zugeordneten
Sensor zeigt die App „unbekannt" statt eines Werts.
Danach **noch einmal neu starten**: die drei trigger-gebundenen Felder
(Zündung, Kilometerstand, Tankfüllstand) werden erst mit einem Neustart
wirksam. Das Setup-Menü weist bei diesen Feldern selbst darauf hin.
Beim Kilometerstand nicht den vom FMM003 selbst berechneten Wert
(`*_total_calculated_mileage`) nehmen — der beruht auf GPS-Streckenrechnung
statt auf dem Tacho und verfälscht Reifenzähler, Ölwechsel-Prognose und
Fahrtabschluss. Richtig ist der CAN-Wert
(`*_total_vehicle_mileage_read_from_can`) oder der Kilometerstand der
EU-Data-Act-Integration.
## 7. Optional: Vergangenheit nachtragen
Sobald die Sensoren zugeordnet sind, holt **Einstellungen → Einrichten →
„Daten importieren aus Home Assistant"** nach, was Home Assistant schon vor
der Installation aufgezeichnet hat: Zeitraum wählen, „Importieren", fertig.
Es entstehen dieselben Fahrten, Tankvorgänge und Spannungswerte, die die
Live-Erkennung erzeugt hätte.
Gefahrlos wiederholbar — überschneidet sich ein Zeitraum mit bereits erfassten
Fahrten, wird er übersprungen statt doppelt angelegt. Wie weit er zurückreicht,
hängt allein an Schritt 3.
## 8. Optional: Beleg-Parser
Nur nötig, wenn Shell-Tankbelege hochgeladen werden sollen: im Terminal &
SSH-Add-on (oder `docker exec`) `pip install pypdf` ausführen.
## Künftige Updates
Nicht diesen Ordner erneut kopieren — stattdessen `..\update.ps1` aus dem
Hauptprojekt verwenden:
```powershell
..\update.ps1 -Ziel "\\<HA-IP-Adresse>\config"
```
Kopiert `pyscript\` und alle `www\`-Dateien (inkl. `audi-dashboard-ios.css`
und `badges\`, die früher hier im Skript fehlten), lässt `data\`/
`audi_dashboard\` unangetastet. pyscript lädt automatisch neu, fürs Frontend
reicht ein normales Neuladen der Seite (F5).
Den Ordner `custom_components\audi_dashboard` aus dem Projekt nach
`<config>\custom_components\` kopieren. Ist dort schon eine ältere Fassung,
diese vorher komplett löschen — bleibt eine Datei liegen, die es im neuen
Stand nicht mehr gibt, lädt Home Assistant sie trotzdem mit.
---
Details, Screenshots-Ersatz-Erklärungen und die vollständige
Troubleshooting-Tabelle: siehe `../INSTALL.md`.
## Danach
### 1. Home Assistant neu starten
**Einstellungen → System → Neu starten.** Beim ersten Start lädt HA die
Abhängigkeit `pypdf` nach (für die Tankbelege) — das kann eine Minute dauern.
### 2. Integration hinzufügen
**Einstellungen → Geräte & Dienste → Integration hinzufügen → Audi
Dashboard.** Es gibt nichts einzugeben.
Danach steht **Mein Audi** in der Seitenleiste.
### 3. Datenaufbewahrung — zeitkritisch
Den Block aus [`recorder_snippet.yaml`](recorder_snippet.yaml) in die
`configuration.yaml` übernehmen. Home Assistant löscht Sensor-Verläufe sonst
nach 10 Tagen; was weg ist, lässt sich auch mit „Daten importieren aus Home
Assistant" nicht mehr nachtragen. Je früher der Block drin ist, desto mehr
Vergangenheit bleibt erhalten.
Vorher den Speicher prüfen (siehe oben). Bei knappem Platz mit
`purge_keep_days: 90` anfangen — Details im Kopf der Datei.
Bewusst nicht vom Installer erledigt: das ist eine Entscheidung über den
Plattenplatz der Instanz, und viele Instanzen haben schon einen eigenen
`recorder:`-Block, den man zusammenführen muss statt zu überschreiben.
### 4. Sensoren zuordnen
In der App: **Einstellungen → Fahrzeug einrichten → Setup.**
Im Auslieferstand ist **kein** Sensor vorbelegt — das ist Absicht, siehe
`../INSTALL.md`. Zwingend ist allein der Zündungs-/ACC-Sensor
(`binary_sensor`, meist vom Teltonika FMM003): er trägt die Fahrterkennung.
Änderungen wirken sofort, ein Neustart ist dafür nicht mehr nötig.
### 5. Fahrzeugdaten eintragen
**Einstellungen → Fahrzeug einrichten.** Das Profil ist bereits da — die
Integration hat es beim ersten Start aus ihrer Vorlage angelegt. Zu ersetzen
sind die Platzhalter: VIN, Kennzeichen, Erstzulassung, HU-Termin,
Versicherung, Werkstatt, Servicebuch.
### 6. Vergangenes nachholen (optional)
**Einstellungen → Einrichten → Daten importieren aus Home Assistant** holt
Fahrten, Tankvorgänge und Spannungswerte aus dem bereits aufgezeichneten
HA-Verlauf nach.
---
## Updates
Denselben Aufruf noch einmal — `Installieren.cmd` oder `install.ps1`. Der
Ordner wird ersetzt, die Fahrzeugdaten unter `audi_dashboard\` und die eigenen
Fotos unter `www\bilder\` bleiben unangetastet. Danach HA neu starten (oder
kürzer: **Einstellungen → Geräte & Dienste → Audi Dashboard → Neu laden**).
Liegt das Projekt auf GitHub, übernimmt HACS das: es meldet neue Fassungen
von selbst, installiert sie und kann zurückrollen.