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:
@@ -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 1–3 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 1–1,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 1–1,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
|
||||
1–1,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.
|
||||
|
||||
Reference in New Issue
Block a user