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
@@ -48,6 +48,7 @@ from homeassistant.helpers.start import async_at_started
from homeassistant.helpers.storage import Store
from . import (
aktualisierung,
batterie,
belege,
bilder,
@@ -681,6 +682,19 @@ class Koordinator:
return None
return {**info, "url": BUENDEL_URL}
async def version_neu_lesen(self) -> None:
"""Liest die Versionsnummer erneut von der Platte.
Nach einem Update OHNE Neustart hat sich die manifest.json geaendert,
Home Assistants zwischengespeicherte Fassung aber nicht. Ohne diesen
Schritt zeigten Panel und App nach einem reinen Oberflaechen-Update
weiter die alte Nummer - und der Nutzer haette keinen Anhalt, ob das
Update wirklich angekommen ist."""
neu = await self.hass.async_add_executor_job(aktualisierung.version_von_platte)
if neu and neu != self.version:
_LOGGER.info("Version nach Update: %s -> %s", self.version, neu)
self.version = neu
async def app_version_veroeffentlichen(self) -> None:
buendel = await self.hass.async_add_executor_job(self._buendel_lesen)
bildstaende = await bilder.staende(