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:
+31
-23
@@ -39,34 +39,22 @@ if [ -z "$TOKEN" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "==> pyscript installieren"
|
||||
VERSION="$(curl -s https://api.github.com/repos/custom-components/pyscript/releases/latest \
|
||||
| grep -o '"tag_name": *"[^"]*"' | cut -d'"' -f4)"
|
||||
TMPDL="$(mktemp -d)"
|
||||
curl -sL -o "$TMPDL/pyscript.zip" \
|
||||
"https://github.com/custom-components/pyscript/archive/refs/tags/${VERSION}.zip"
|
||||
unzip -oq "$TMPDL/pyscript.zip" -d "$TMPDL"
|
||||
mkdir -p "$ZIEL/custom_components"
|
||||
cp -r "$TMPDL/pyscript-${VERSION}/custom_components/pyscript" "$ZIEL/custom_components/"
|
||||
rm -rf "$TMPDL"
|
||||
echo " pyscript $VERSION"
|
||||
|
||||
echo "==> Projektdateien einspielen"
|
||||
# Seit dem Umbau zur eigenen Integration (2026-08-23) faellt hier einiges weg,
|
||||
# was frueher noetig war: pyscript herunterladen und entpacken, das Backend
|
||||
# nach pyscript/ kopieren, die Oberflaeche nach www/ kopieren, ein
|
||||
# Fahrzeugprofil aus der Vorlage anlegen, den Belegleser ablegen und das
|
||||
# Zugriffstoken in eine Datei schreiben. Alles davon macht die Integration
|
||||
# jetzt selbst - hier bleibt ein einziger Kopiervorgang.
|
||||
echo "==> Integration einspielen"
|
||||
cp "$HIER/konfiguration.yaml" "$ZIEL/configuration.yaml"
|
||||
cp -r "$PROJEKT/homeassistant/pyscript" "$ZIEL/pyscript"
|
||||
mkdir -p "$ZIEL/www" "$ZIEL/audi_dashboard"
|
||||
cp -r "$PROJEKT/homeassistant/www/." "$ZIEL/www/"
|
||||
cp "$PROJEKT/homeassistant/data/fahrzeugprofil.example.json" \
|
||||
"$ZIEL/audi_dashboard/fahrzeugprofil.json"
|
||||
cp "$PROJEKT/homeassistant/data/shell_beleg_parser.py" "$ZIEL/audi_dashboard/"
|
||||
: > "$ZIEL/audi_dashboard/fahrten.jsonl"
|
||||
: > "$ZIEL/audi_dashboard/tankvorgaenge.jsonl"
|
||||
printf '%s' "$TOKEN" > "$ZIEL/audi_dashboard/ha_token.txt"
|
||||
mkdir -p "$ZIEL/custom_components"
|
||||
cp -r "$PROJEKT/custom_components/audi_dashboard" "$ZIEL/custom_components/"
|
||||
find "$ZIEL/custom_components/audi_dashboard" -name __pycache__ -type d -exec rm -rf {} + 2>/dev/null || true
|
||||
|
||||
echo "==> Neu starten"
|
||||
docker restart "$NAME" >/dev/null
|
||||
|
||||
echo "==> Auf Backend warten"
|
||||
echo "==> Auf Home Assistant warten"
|
||||
for _ in $(seq 1 60); do
|
||||
if [ "$(curl -s -o /dev/null -w '%{http_code}' --max-time 3 \
|
||||
-H "Authorization: Bearer $TOKEN" "$BASIS/api/" || true)" = "200" ]; then
|
||||
@@ -75,6 +63,25 @@ for _ in $(seq 1 60); do
|
||||
sleep 5
|
||||
done
|
||||
|
||||
# Der Konfigurationseintrag entsteht sonst nur ueber die Oberflaeche. Der
|
||||
# Ablauf hat keine Eingabefelder, deshalb genuegen zwei Aufrufe: Ablauf
|
||||
# starten, Ablauf mit leerem Formular bestaetigen.
|
||||
echo "==> Integration hinzufuegen"
|
||||
FLOW="$(curl -s -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
|
||||
-d '{"handler":"audi_dashboard","show_advanced_options":false}' \
|
||||
"$BASIS/api/config/config_entries/flow" | sed 's/.*"flow_id":"\([^"]*\)".*/\1/')"
|
||||
if [ -z "$FLOW" ]; then
|
||||
echo "FEHLER: Konfigurationsablauf liess sich nicht starten" >&2
|
||||
exit 1
|
||||
fi
|
||||
curl -s -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
|
||||
-d '{}' "$BASIS/api/config/config_entries/flow/$FLOW" >/dev/null
|
||||
|
||||
echo "==> Pruefen, ob die Entitaeten da sind"
|
||||
ANZAHL="$(curl -s -H "Authorization: Bearer $TOKEN" "$BASIS/api/states" \
|
||||
| tr ',' '\n' | grep -c '"entity_id":"sensor.audi_dashboard' || true)"
|
||||
echo " $ANZAHL Entitaeten sensor.audi_dashboard_*"
|
||||
|
||||
echo "==> Token nach companion-app/.env.local schreiben"
|
||||
printf 'VITE_TEST_URL=%s\nVITE_TEST_TOKEN=%s\n' "$BASIS" "$TOKEN" \
|
||||
> "$PROJEKT/companion-app/.env.local"
|
||||
@@ -82,3 +89,4 @@ printf 'VITE_TEST_URL=%s\nVITE_TEST_TOKEN=%s\n' "$BASIS" "$TOKEN" \
|
||||
echo
|
||||
echo "Fertig. $BASIS · Benutzer test · Passwort testtest123"
|
||||
echo "Token liegt in companion-app/.env.local (gitignored)."
|
||||
echo "Sensoren zuordnen: in der App unter Einstellungen -> Fahrzeug einrichten -> Setup."
|
||||
|
||||
Reference in New Issue
Block a user