d5562c71ef
Fünf Erweiterungen des bestehenden Setup-Popups: Live-Wert neben jedem Such-Kandidaten, Warnhinweis bei unavailable/unknown/fehlender Entität, Duplikat-Check mit Bestätigung vor dem Speichern, Zurücksetzen-Button je Feld (Standardwerte-Snapshot in entitaeten.py, vor jedem Override genommen), und ein bestätigter "Jetzt neu starten"-Knopf nach dem Speichern, falls sich eines der drei trigger-gebundenen Felder geändert hat (neuer Service audi_dashboard_neustart). Im Docker-Testcontainer Feld für Feld verifiziert.
113 lines
5.0 KiB
Python
113 lines
5.0 KiB
Python
"""Verbindung zwischen Frontend und Backend.
|
|
|
|
Lesen: das Frontend liest hass.states["pyscript.audi_dashboard_profil"] usw.
|
|
direkt - kein Service-Aufruf mit Rückgabewert. Die Frontend-Dokumentation von
|
|
Home Assistant zu response-fähigen Services beschreibt das Verhalten aus
|
|
Sicht des Browsers nicht abschließend (Community-Diskussionen deuten auf
|
|
Einschränkungen hin); Zustände lesen ist dagegen ein seit Jahren stabiler,
|
|
einfacher Weg. Veröffentlicht wird periodisch UND sofort nach jeder
|
|
Schreibaktion (siehe frontend_veroeffentlichung.py, dort auch der Hinweis zur
|
|
Größengrenze von Zustands-Attributen).
|
|
|
|
Schreiben: einzig audi_dashboard_profil_schreiben() als generischer Weg für
|
|
das gesamte Profil - das Frontend hält Profil, Fahrzeugdaten und
|
|
Einstellungen ohnehin als einen zusammenhängenden Stand im Speicher (wie
|
|
schon im Prototyp) und schickt ihn nach jeder Änderung komplett zurück,
|
|
statt für jedes einzelne Feld einen eigenen Service zu brauchen.
|
|
"""
|
|
|
|
import json
|
|
|
|
import einstellungen
|
|
import entitaeten
|
|
import frontend_veroeffentlichung
|
|
import profil
|
|
|
|
|
|
@time_trigger("startup")
|
|
def beim_start():
|
|
profil.ordner_sicherstellen()
|
|
# Vor der ersten Veröffentlichung anwenden, damit sie die im Setup-Menü
|
|
# gespeicherten Zuordnungen (data/entitaeten.json) schon zeigt, siehe
|
|
# entitaeten.py-Kopfkommentar.
|
|
entitaeten.overrides_anwenden()
|
|
frontend_veroeffentlichung.alles_veroeffentlichen()
|
|
|
|
|
|
@time_trigger("period(now, 20 seconds)")
|
|
def periodisch_aktualisieren():
|
|
frontend_veroeffentlichung.fahrzeugstatus_veroeffentlichen()
|
|
|
|
|
|
@time_trigger("period(now, 60 seconds)")
|
|
def periodisch_daten_aktualisieren():
|
|
# seltener als der Fahrzeugstatus - Profil/Fahrten/Tankvorgänge ändern
|
|
# sich normalerweise nur durch Aktionen, die ohnehin sofort selbst
|
|
# veröffentlichen (siehe unten); das hier ist nur das Sicherheitsnetz
|
|
# für Änderungen direkt im Dateisystem (§6.2, dritter Bearbeitungsweg).
|
|
frontend_veroeffentlichung.profil_veroeffentlichen()
|
|
frontend_veroeffentlichung.fahrten_veroeffentlichen()
|
|
frontend_veroeffentlichung.tankvorgaenge_veroeffentlichen()
|
|
|
|
|
|
@service
|
|
def audi_dashboard_jetzt_aktualisieren():
|
|
"""Gegenstück zum "Ziehen zum Aktualisieren" auf der Übersicht: stößt den
|
|
von der Integration bereitgestellten Refresh-Knopf an (siehe
|
|
einstellungen.REFRESH_BUTTON) statt auf den nächsten periodischen Takt zu
|
|
warten, und veröffentlicht den Status danach sofort neu. Ohne
|
|
eingetragenen Knopf (leerer Platzhalter) nur die direkte Neu-
|
|
veröffentlichung - besser als gar nichts, auch wenn dann kein echter neuer
|
|
Abruf beim Fahrzeug passiert. Aufruf als
|
|
pyscript.audi_dashboard_jetzt_aktualisieren."""
|
|
if einstellungen.REFRESH_BUTTON:
|
|
button.press(entity_id=einstellungen.REFRESH_BUTTON)
|
|
task.sleep(3)
|
|
frontend_veroeffentlichung.fahrzeugstatus_veroeffentlichen()
|
|
log.info("audi_dashboard: manuelle Aktualisierung (Ziehen zum Aktualisieren) ausgelöst")
|
|
|
|
|
|
@service
|
|
def audi_dashboard_profil_schreiben(profil_json=None):
|
|
"""Überschreibt das komplette Fahrzeugprofil. Aufruf als
|
|
pyscript.audi_dashboard_profil_schreiben."""
|
|
if not profil_json:
|
|
log.warning("audi_dashboard: profil_schreiben ohne profil_json aufgerufen")
|
|
return
|
|
p = json.loads(profil_json) if isinstance(profil_json, str) else profil_json
|
|
profil.profil_schreiben(p)
|
|
frontend_veroeffentlichung.profil_veroeffentlichen()
|
|
log.info("audi_dashboard: Profil aktualisiert")
|
|
|
|
|
|
@service
|
|
def audi_dashboard_entitaeten_schreiben(zuordnung_json=None):
|
|
"""Speichert die im Setup-Menü (Einstellungen -> Fahrzeug einrichten ->
|
|
Setup) gewählte Sensor-zu-Entität-Zuordnung, wendet sie sofort an und
|
|
veröffentlicht Katalog+Status neu, damit Übersicht/Mein Audi ohne
|
|
Neustart die neuen Werte zeigen (Ausnahme: die drei trigger-gebundenen
|
|
Felder, siehe entitaeten.py). Aufruf als
|
|
pyscript.audi_dashboard_entitaeten_schreiben."""
|
|
if not zuordnung_json:
|
|
log.warning("audi_dashboard: entitaeten_schreiben ohne zuordnung_json aufgerufen")
|
|
return
|
|
mapping = json.loads(zuordnung_json) if isinstance(zuordnung_json, str) else zuordnung_json
|
|
entitaeten.overrides_schreiben(mapping)
|
|
entitaeten.overrides_anwenden()
|
|
frontend_veroeffentlichung.entitaeten_veroeffentlichen()
|
|
frontend_veroeffentlichung.fahrzeugstatus_veroeffentlichen()
|
|
log.info("audi_dashboard: Entitäten-Zuordnung aktualisiert")
|
|
|
|
|
|
@service
|
|
def audi_dashboard_neustart():
|
|
"""Startet Home Assistant neu. Einziger Zweck: eine Änderung an einem der
|
|
drei trigger-gebundenen Setup-Felder (ZUENDUNG_SENSOR/KM_SENSOR/
|
|
TANK_SENSOR, siehe entitaeten.py) wird erst nach einem Neustart wirksam,
|
|
weil @state_trigger die Entity-ID beim Modul-Laden einmalig einliest.
|
|
Wird vom Setup-Popup als expliziter, vom Nutzer bestätigter Knopf
|
|
angeboten - kein automatischer Selbst-Reload direkt nach dem Speichern.
|
|
Aufruf als pyscript.audi_dashboard_neustart."""
|
|
log.info("audi_dashboard: Neustart über das Setup-Menü ausgelöst")
|
|
homeassistant.restart()
|