<# .SYNOPSIS Spielt Code-Updates (pyscript + Frontend) in eine laufende Home-Assistant- Installation ein, ohne Neustart und ohne Cache-Probleme im Browser. .BESCHREIBUNG Kopiert nur Code, nie Daten: - pyscript/* -> /pyscript/ (pyscript lädt das automatisch neu, siehe Kopfkommentar dort - an einer Testinstanz bestätigt: eine geänderte Datei war innerhalb von Millisekunden aktiv, ganz ohne Neustart) - www/*.js, www/*.css, www/badges/*, www/bilder/* -> /www/ (audi-dashboard-ios.css nicht vergessen: die App hängt sich dieses Overlay-Stylesheet selbst per JS in den Shadow-Root - ohne es fehlt nur der optische Feinschliff, kein Fehler, aber ein veralteter Stand) - www/audi-dashboard-version.json wird IMMER neu geschrieben, mit der aktuellen Uhrzeit als Versionsnummer - der Lade-Stub (audi-dashboard-panel.js) liest diese Datei bei jedem Seitenaufruf ohne Cache und lädt den eigentlichen Code darüber immer frisch nach (siehe Kopfkommentar in www/audi-dashboard-panel.js). Absichtlich NICHT kopiert: die Datenbestände in data/ - das würde ein bereits laufendes Fahrzeugprofil, die Fahrten- und Tankvorgänge-Archive sowie die Sensor-Zuordnung überschreiben. Diese Dateien sind nur die Erstbefüllung für die einmalige Installation (siehe INSTALL.md Schritt 2). Eine Ausnahme davon ist shell_beleg_parser.py: die Datei liegt zwar in data/, ist aber Code, kein Datenbestand - belegverarbeitung.py ruft sie als Unterprozess aus /config/audi_dashboard/ auf. Ohne diese Ausnahme käme jede Änderung am Belegleser (dem einzigen getesteten Teil des Projekts) auf keiner Instanz an. .PARAMETER Ziel Pfad zum config-Verzeichnis von Home Assistant, z. B. ein per Samba eingebundenes Laufwerk (\\\config) oder ein lokal gemounteter Pfad. .BEISPIEL .\update.ps1 -Ziel "\\homeassistant.local\config" #> param( [Parameter(Mandatory = $true)] [string]$Ziel ) $ErrorActionPreference = "Stop" $hier = $PSScriptRoot if (-not (Test-Path $Ziel)) { throw "Ziel nicht erreichbar: $Ziel — Samba-Share verbunden? Pfad korrekt?" } Write-Host "Kopiere pyscript/ ..." -ForegroundColor Cyan robocopy "$hier\pyscript" "$Ziel\pyscript" /MIR /NFL /NDL /NJH /NJS | Out-Null Write-Host "Kopiere www/ (ohne bilder/ und badges/, die separat behandelt werden) ..." -ForegroundColor Cyan New-Item -ItemType Directory -Force -Path "$Ziel\www" | Out-Null Copy-Item "$hier\www\audi-dashboard-app.js" "$Ziel\www\audi-dashboard-app.js" -Force Copy-Item "$hier\www\audi-dashboard-panel.js" "$Ziel\www\audi-dashboard-panel.js" -Force Copy-Item "$hier\www\audi-dashboard.css" "$Ziel\www\audi-dashboard.css" -Force Copy-Item "$hier\www\audi-dashboard-ios.css" "$Ziel\www\audi-dashboard-ios.css" -Force # Code, der in data/ liegt (siehe Kopfkommentar) - der Ordner selbst wird # bewusst nicht gespiegelt, diese eine Datei aber schon. if (Test-Path "$Ziel\audi_dashboard") { Copy-Item "$hier\data\shell_beleg_parser.py" "$Ziel\audi_dashboard\shell_beleg_parser.py" -Force Write-Host " Belegleser aktualisiert" } if (Test-Path "$hier\www\bilder") { Write-Host "Kopiere www/bilder/ ..." -ForegroundColor Cyan New-Item -ItemType Directory -Force -Path "$Ziel\www\bilder" | Out-Null Copy-Item "$hier\www\bilder\*" "$Ziel\www\bilder\" -Force -Recurse } if (Test-Path "$hier\www\badges") { Write-Host "Kopiere www/badges/ ..." -ForegroundColor Cyan New-Item -ItemType Directory -Force -Path "$Ziel\www\badges" | Out-Null Copy-Item "$hier\www\badges\*" "$Ziel\www\badges\" -Force -Recurse } $version = [DateTimeOffset]::UtcNow.ToUnixTimeSeconds() "{ ""version"": $version }" | Out-File -FilePath "$Ziel\www\audi-dashboard-version.json" -Encoding utf8 -NoNewline Write-Host "" Write-Host "Fertig. Version $version." -ForegroundColor Green Write-Host "pyscript-Änderungen sind bereits aktiv (Auto-Reload, kein Neustart nötig)." Write-Host "Frontend-Änderungen: im Browser einmal ganz normal neu laden (F5) reicht -" Write-Host "kein Hard-Refresh, kein HA-Neustart."