Files
audi-app/testumgebung/aufsetzen.sh
T
tobias d8b12da36d 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 <noreply@anthropic.com>
2026-08-23 23:53:56 +02:00

93 lines
3.4 KiB
Bash
Executable File

#!/usr/bin/env bash
# Setzt die Wegwerf-Testinstanz auf. Mehrfach ausfuehrbar.
# Siehe README.md im selben Ordner.
set -euo pipefail
HIER="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJEKT="$(dirname "$HIER")"
NAME="audi_ha_test"
PORT="18123"
ZIEL="${AUDI_TEST_CONFIG:-${TMPDIR:-/tmp}/audi-ha-test-config}"
BASIS="http://localhost:${PORT}"
echo "==> Zielordner: $ZIEL"
rm -rf "$ZIEL"
mkdir -p "$ZIEL"
echo "==> Alten Container entfernen (falls vorhanden)"
docker rm -f "$NAME" >/dev/null 2>&1 || true
echo "==> Image laden"
docker pull ghcr.io/home-assistant/home-assistant:stable
echo "==> Container starten"
docker run -d --name "$NAME" -p "${PORT}:8123" -v "$ZIEL:/config" \
ghcr.io/home-assistant/home-assistant:stable >/dev/null
echo "==> Auf Home Assistant warten"
for _ in $(seq 1 60); do
if [ "$(curl -s -o /dev/null -w '%{http_code}' --max-time 3 "$BASIS/" || true)" != "000" ]; then
break
fi
sleep 5
done
echo "==> Nutzer anlegen und Token erzeugen"
TOKEN="$(node "$HIER/einrichten.mjs" "$BASIS")"
if [ -z "$TOKEN" ]; then
echo "FEHLER: kein Token erhalten" >&2
exit 1
fi
# 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"
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 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
break
fi
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"
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."