Update ohne Neustart, wenn nur Oberflaechendateien wechseln

Bisher verlangte jedes Update einen Home-Assistant-Neustart. Noetig ist er
aber nur fuer Python-Code: HA importiert die Module einmal beim Start und
haengt danach mit lebenden Objekten daran. frontend/ dagegen wird direkt von
der Platte ausgeliefert (StaticPathConfig, cache_headers=False) - eine
ersetzte .js ist sofort wirksam, es braucht nur ein Neuladen im Browser.

aktualisierung.neustart_noetig() vergleicht die alte gegen die neue Fassung
ueber sha256 je Datei und meldet "kein Neustart" nur, wenn JEDE Abweichung
unter frontend/ liegt oder die manifest.json ist. Alles andere - .py,
services.yaml, translations/, vorlage/ - gilt als neustartpflichtig, auch wo
es das im Einzelfall nicht waere. Die Schieflage ist Absicht: ein
faelschlich ausgelassener Neustart laesst neuen Python-Code nie anlaufen, und
der Fehler wird woanders gesucht.

manifest.json ist ausgenommen, weil sich seine Versionsnummer bei jeder
Veroeffentlichung aendert - sonst waere die Unterscheidung wertlos. Weil HA
das Manifest fuer die Laufzeit festhaelt (loader.py: hass.data[
DATA_INTEGRATIONS]), liest version_von_platte() die Nummer direkt von der
Platte; koordinator.version_neu_lesen() zieht sie nach einem Update ohne
Neustart nach, damit Panel und App die neue Fassung auch anzeigen.

Panel und App zeigen im Neustart-freien Fall "Seite neu laden" statt
"Installation abschliessen - Jetzt neu starten".

Neun neue Testfaelle fuer die Unterscheidung, 23 Tests in der
Aktualisierungs-Suite gruen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-05 13:30:25 +02:00
parent 4dad3d21a8
commit 81808dbc10
10 changed files with 265 additions and 14 deletions
@@ -1 +1 @@
{"version":"2026.9.5.22","sha256":"a83dcedbf835def7fedebdb55e136ec5cf6cd1e046bbe02b41a21477a4801547","bytes":324556,"gebaut":"2026-09-05T10:46:04Z"}
{"version":"2026.9.5.23","sha256":"3ff0de25e28b5cf00a9015ec3af3e27f0e4d0ae8a13eb9e443dd47100ebc9d1e","bytes":324637,"gebaut":"2026-09-05T11:29:36Z"}
@@ -3743,6 +3743,18 @@ function vEinst() {
if (laeuft === "installieren") return spinner("Installiere …");
if (laeuft === "neustart") return spinner("Home Assistant startet neu …");
if (u && u.installiert) {
/* Ob ein Neustart noetig ist, entscheidet der Updater am
Datei-Vergleich (aktualisierung.neustart_noetig). Betrifft das
Update nur frontend/, reicht ein Neuladen der Seite: die Dateien
werden direkt von der Platte ausgeliefert, und zwar mit
cache_headers=False - der Browser holt sie beim naechsten Laden
ohnehin frisch. Nur geaenderter Python-Code braucht wirklich einen
Neustart (Abschnitt CZ in AGENTS.md). */
if (u.neustart_noetig === false) {
return `<span style="display:block;margin-top:8px;color:var(--fg2);font-size:13px;line-height:1.6">
Version ${esc(u.version)} installiert - nur Oberflächendateien, kein Neustart nötig.</span>
<button class="aktion primaer" style="margin-top:14px" data-update="neuladen">Seite neu laden</button>`;
}
return `<span style="display:block;margin-top:8px;color:var(--fg2);font-size:13px;line-height:1.6">
Version ${esc(u.version)} installiert - die neue Fassung wird erst nach einem Neustart
geladen.</span>
@@ -6693,6 +6705,8 @@ function ereignisseVerdrahten() {
);
})
.finally(() => { INTEGRATION_UPDATE_LAEUFT = null; render(); scrollWiederherstellen(); });
} else if (aktion === "neuladen") {
location.reload();
} else if (aktion === "neustart") {
INTEGRATION_UPDATE_LAEUFT = "neustart"; render();
HASS.callService("homeassistant", "restart", {}).catch((err) => {