"""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()