Ölwechsel/Inspektion-Anzeige repariert, Selbst-Update der Integration gebaut
Zwei getrennte Themen in einem Commit, beide in derselben Sitzung entstanden:
1. Ölwechsel/Inspektion wurden komplett ausgeblendet ("kein Eintrag im
Servicebuch"), sobald kein Servicebucheintrag vorlag - selbst wenn der
zugeordnete Sensor eine gültige Fälligkeit meldete. In beiden Frontends
prüfte die Anzeige nur den Servicebuch-Zweig, bevor sie die
Fahrzeugmeldung überhaupt las. Jetzt steht die Fahrzeugmeldung für sich;
fehlt zusätzlich ein Servicebucheintrag, übernimmt eine neue,
fahrtenlog-basierte Prognose (kmProTagAusFahrten()/meldungsPrognose())
die Hochrechnung statt der Servicebuch-Rate - deckelt auf die vom
Fahrzeug selbst gemeldete Zeitgrenze, falls zu wenig gefahren wird.
2. install.ps1 als Update-Weg wird von Windows Smart App Control blockiert,
ohne Umgehungsmöglichkeit. Die Integration lädt sich jetzt auf
Tastendruck selbst von Gitea (aktualisierung.py), verifiziert das
Manifest vor jedem Tausch und tauscht per os.rename mit automatischem
Rollback bei Fehlern - install.ps1 bleibt nur noch für die
Erstinstallation nötig. Zugangstoken über einen neuen OptionsFlow in
entry.options, nie in configuration.yaml.
Nebenbei: mehrere seit der HACS-Ausschluss-Entscheidung liegen gebliebene
falsche HACS-Referenzen in Code-Kommentaren und einem UI-Text korrigiert.
Details, Sicherheitsbegründung und Verifikationsstand in AGENTS.md,
Abschnitte I und J.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -99,6 +99,13 @@ class Koordinator:
|
||||
self._store = Store[dict](hass, STORE_VERSION, f"{entry.entry_id}_laufzeit")
|
||||
self.fahrt_start_ts: datetime.datetime | None = None
|
||||
self.tiefststand_pct: float | None = None
|
||||
# Ergebnis des letzten "Auf Update prüfen"/"Update installieren" -
|
||||
# nur auf Tastendruck gesetzt (siehe dienste.py), nie im normalen
|
||||
# Veröffentlichungs-Takt neu berechnet, damit keine automatischen
|
||||
# Gitea-Abfragen im Hintergrund laufen. app_version_veroeffentlichen()
|
||||
# liest diesen Wert bei jedem Takt erneut mit, damit er nicht
|
||||
# zwischen zwei Prüfungen verschwindet.
|
||||
self.letzte_update_pruefung: dict | None = None
|
||||
|
||||
self._takte: list[CALLBACK_TYPE] = []
|
||||
self._beobachter: list[CALLBACK_TYPE] = []
|
||||
@@ -329,13 +336,25 @@ class Koordinator:
|
||||
return None
|
||||
return {**info, "url": BUENDEL_URL}
|
||||
|
||||
async def alles_veroeffentlichen(self) -> None:
|
||||
async def app_version_veroeffentlichen(self) -> None:
|
||||
buendel = await self.hass.async_add_executor_job(self._buendel_lesen)
|
||||
# Die App liest beides aus derselben Entität: welchen Stand diese
|
||||
# Installation ausliefert, und ob ein nachladbares Bündel danebenliegt.
|
||||
# Zusammen an einer Stelle, damit die App nicht zwei Quellen abgleichen
|
||||
# muss, die auseinanderlaufen können.
|
||||
self.setzen(E_APP_VERSION, self.version, {"app": self.version, "buendel": buendel})
|
||||
# Die App liest alle drei aus derselben Entität: welchen Stand diese
|
||||
# Installation ausliefert, ob ein nachladbares OTA-Bündel danebenliegt,
|
||||
# und ob eine neuere Fassung bei Gitea bereitliegt. Zusammen an einer
|
||||
# Stelle, damit die App nicht mehrere Quellen abgleichen muss, die
|
||||
# auseinanderlaufen können.
|
||||
self.setzen(
|
||||
E_APP_VERSION,
|
||||
self.version,
|
||||
{
|
||||
"app": self.version,
|
||||
"buendel": buendel,
|
||||
"integration_update": self.letzte_update_pruefung,
|
||||
},
|
||||
)
|
||||
|
||||
async def alles_veroeffentlichen(self) -> None:
|
||||
await self.app_version_veroeffentlichen()
|
||||
await self.profil_veroeffentlichen()
|
||||
await self.fahrten_veroeffentlichen()
|
||||
await self.tankvorgaenge_veroeffentlichen()
|
||||
|
||||
Reference in New Issue
Block a user