In HA kann man Automationen nicht nur über das GUI und über YAML erstellen, es geht auch direkt in Python, und das wollte ich mal kennenlernen.
Ich habe gleich 4 Möglichkeiten gefunden, wie man Python in HA verwenden kann.
Variante 1: Python Script Integration
Das ist die einfachste aller Varianten und daher habe ich sie auch für meinen ersten Versuch gewählt.
Sollte ich an ihre Grenzen stoßen kann ich jederzeit auf eine andere Variante umsteigen.
Der Nachteil dieser Variante ist, dass man keine Python Libraries importieren kann.
Alle weiteren Varianten haben diesen Nachteil nicht.
Variante 2: HACS Pyscript
Diese Lösung bietet deutlich mehr Möglichkeiten und auch eine gute Dokumentation.
Variante 3: AppDaemon Add-On
Eine Anleitung zur Konfiguration hab ich hier gefunden.
Variante 4: Python Scripts Pro von Alex X via Custom-Repository
Auch dazu gibt es eine Anleitung mit Beispielen.
Während alle anderen Varianten unabhängig voneinander sind, ist die Variante 4 nur als Ersatz der Variante 1 gedacht und kann nicht parallel dazu verwendet werden.
Um meine ersten Erfahrungen zu sammeln verwende ich trotz der Einschränkung zuerst einmal die Variante 1, mal sehen wie weit ich damit komme.
Wenn man versucht, die Integration wie üblich über das GUI hinzuzufügen, dann bekommt man folgende Meldung.
Diese Integration kann nicht über die Benutzeroberfläche hinzugefügt werden.
Du kannst diese Integration hinzufügen, indem du sie zu deiner „configuration.yaml“ hinzufügst. Weitere Informationen findest du in der Dokumentation.
Die Installation in der configuration.yaml ist eigentlich nur ein 1-Zeiler, wobei aber auch noch empfohlen wird, den log-level auf info zu stellen.
Da dann aber vermutlich viel zu viele Infos geloggt werden, habe ich einige Log-Levels wieder auf warning gesetzt.
Eine andere Möglichkeit wäre, die Log-Meldungen die man sich von Python anzeigen lässt als logger.warning auszugeben, dann gehen sie nicht in den info Meldungen unter und sind besser sichtbar.
Der Log-Viewer sollte als Add-On installiert sein, dort kann man sich die Meldungen dann ansehen.
configuration.yaml
Erst mit einem HA-Neustart wird diese Änderung wirksam.
Als nächstes müssen wir unter config/ einen python_scripts/ Ordner erstellen, da kommen dann alle Scripte rein.
Das erste Beispiel-Skript aus der Doku lautet (wie könnte es anders sein)
hello_world.py
Ich habe das Skript gegenüber der Doku etwas erweitert, um die Date Funktionen besser kennenzulernen, und auch den Workaround für das fehlende strftime.
Aufgerufen wird dieses Skript über die Entwicklerwerkzeuge|Aktionen im YAML-Modus
Und das ist dann die Ausgabe im Log Viewer: Hallo Walter, es ist 18:29:26 am Mo, 17.03.2025
Die output Variable wird ebenfalls angezeigt, üblicherweise holt man sich diese aber von der aufrufenden Stelle ab, das sieht in einem Skript dann so aus.
Über die Entwicklerwerkzeuge können wir das aber nicht testen.
Wer noch den Umgang mit einer Response-Variable nachlesen möchte, siehe dazu: Use Templates to handle response data
In der Doku findet man noch weitere Beispiele,
etwa wie man ein Service aufruft (hass.services.call), um bei diesem Beispiel ein Licht einzuschalten oder Wetterdaten abzurufen,
oder wie man ein Event triggert (hass.bus.fire), auf das dann z.B. ein Trigger reagieren kann.
Der entsprechende Trigger-Code dazu fehlt leider in der offiziellen Doku, er war aber nicht schwierig zu erstellen:
automations.yaml
Die beiden Beispiele mit dem Licht und den Wetterdaten kann jeder selbst ausprobieren, sie sind auch nicht aufwändiger als die anderen.
Das war jetzt natürlich noch keine sinnvolle Automatisierung, aber es zeigt zumindest wie Python funktioniert und auch bereits, was nicht verfügbar ist (z.B. strftime).
Wer strftime vermisst, der kann sich mal dt_util ansehen, das ist vorhanden und ChatGPT hilft sicher gerne weiter.
Wer bereits Automationen mit Python erstellt hat, kann diese ja gerne hier vorstellen, ein paar konnte ich auch selbst finden,
z.B. diese Snapshot Lösung, oder dieses Skript für den Roomba.
Am besten gefallen hat mir diese ISS Berechnung, da man hier recht schön das Zusammenspiel zwischen HA und Python erkennen kann.
Nachdem ich Python nun kurz kennengelernt habe, stellt sich natürlich die Frage, wofür ich es einsetzen könnte.
Die Antwort ist vermutlich die gleiche wie bei Node-RED. Es ist einfach eine weitere Möglichkeit, die ich nutzen kann, oder auch nicht.
Sollte ich bei irgendeiner Aufgabenstellung mit YAML an die Grenze kommen, kann ich jederzeit versuchen, hiermit eine Lösung zu finden.
Und sollte ich auch damit keinen Erfolg haben, kann ich ja auch noch HACS Pyscript ausprobieren, oder eine der anderen Varianten.
Weitere Beiträge dieser Serie:
HACS Wetterkarte
HACS Sonne & Mond (inkl. Tipps zur configuration.yaml)
HACS Schieberegler (inkl. Möglichkeiten der Icon Farbanpassung & erste Vorstellung Farbschema)
HACS Gauges (Tachoanzeigen, inkl. senkrechte Balken-Cards)
HACS stack-in-card für Raum-Card
HACS Graph-Cards
HACS Thermostat-Cards
HACS Entity Cards (inkl. stacking Beispiele mit der custom:button-card)
HACS Reminder (trash-card, atomic-calendar-revive)
HACS Person- & Öffi-Card (inkl. Geschichte zu ChatGPT)
HA-Behaglichkeits-Diagramm
HA Kurzeinführung
HACS Sidebar & Dashboard-Entwurf
HACS Bewässerung
HA & Node-Red
HA Notifications
HA Recorder, SQLite, InfluxDB, Grafana
Ich habe gleich 4 Möglichkeiten gefunden, wie man Python in HA verwenden kann.
Variante 1: Python Script Integration
Das ist die einfachste aller Varianten und daher habe ich sie auch für meinen ersten Versuch gewählt.
Sollte ich an ihre Grenzen stoßen kann ich jederzeit auf eine andere Variante umsteigen.
Der Nachteil dieser Variante ist, dass man keine Python Libraries importieren kann.
Alle weiteren Varianten haben diesen Nachteil nicht.
Variante 2: HACS Pyscript
Diese Lösung bietet deutlich mehr Möglichkeiten und auch eine gute Dokumentation.
Variante 3: AppDaemon Add-On
Eine Anleitung zur Konfiguration hab ich hier gefunden.
Variante 4: Python Scripts Pro von Alex X via Custom-Repository
Auch dazu gibt es eine Anleitung mit Beispielen.
Während alle anderen Varianten unabhängig voneinander sind, ist die Variante 4 nur als Ersatz der Variante 1 gedacht und kann nicht parallel dazu verwendet werden.
Um meine ersten Erfahrungen zu sammeln verwende ich trotz der Einschränkung zuerst einmal die Variante 1, mal sehen wie weit ich damit komme.
Wenn man versucht, die Integration wie üblich über das GUI hinzuzufügen, dann bekommt man folgende Meldung.
Diese Integration kann nicht über die Benutzeroberfläche hinzugefügt werden.
Du kannst diese Integration hinzufügen, indem du sie zu deiner „configuration.yaml“ hinzufügst. Weitere Informationen findest du in der Dokumentation.
Die Installation in der configuration.yaml ist eigentlich nur ein 1-Zeiler, wobei aber auch noch empfohlen wird, den log-level auf info zu stellen.
Da dann aber vermutlich viel zu viele Infos geloggt werden, habe ich einige Log-Levels wieder auf warning gesetzt.
Eine andere Möglichkeit wäre, die Log-Meldungen die man sich von Python anzeigen lässt als logger.warning auszugeben, dann gehen sie nicht in den info Meldungen unter und sind besser sichtbar.
Der Log-Viewer sollte als Add-On installiert sein, dort kann man sich die Meldungen dann ansehen.
configuration.yaml
HTML-Code:
python_script: logger: default: info # alle Komponenten die zu viel info melden werden mit warning level wieder ausgeblendet logs: homeassistant.helpers: warning homeassistant.setup: warning pyfritzhome.fritzhome: warning custom_components.hacs: warning custom_components.places: warning
Als nächstes müssen wir unter config/ einen python_scripts/ Ordner erstellen, da kommen dann alle Scripte rein.
Das erste Beispiel-Skript aus der Doku lautet (wie könnte es anders sein)
hello_world.py
HTML-Code:
# `data`, `logger` and `time` are available as builtin without the need of explicit import. # 'data.get' holt den übergebenen Parameter 'name' ab oder übergibt den Defaultwert 'world', falls der Parameter fehlt name = data.get("name", "World") # aktuelle Zeit auf 2 verschiedene Arten abrufen timestamp = time.time() now = datetime.datetime.now() logger.warning("time: {}, datetime.now: {}".format(timestamp, now)) # in ein lesbares Datum umwandeln (strftime scheint hier nicht verfügbar zu sein) formatierte_zeit = "%02d:%02d:%02d" % (now.hour, now.minute, now.second) formatiertes_datum = "%02d.%02d.%04d" % (now.day, now.month, now.year) wochentage_deutsch = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"] wochentag = wochentage_deutsch[now.weekday()] # Eine Nachricht erstellen nachricht = "Hallo {}, es ist {} am {}, {}".format(name, formatierte_zeit, wochentag, formatiertes_datum) # und als Warnung im Log Viewer ausgeben logger.warning(nachricht) # über die output Variable in eine response_variable schreiben. output["hello_world"] = nachricht # und als custom event an einen Trigger senden hass.bus.fire("hello_world_event", {"wow": nachricht})
Aufgerufen wird dieses Skript über die Entwicklerwerkzeuge|Aktionen im YAML-Modus
HTML-Code:
action: python_script.hello_world data: name: Walter
Die output Variable wird ebenfalls angezeigt, üblicherweise holt man sich diese aber von der aufrufenden Stelle ab, das sieht in einem Skript dann so aus.
HTML-Code:
- action: python_script.hello_world data: name: Walter response_variable: python_script_output
Wer noch den Umgang mit einer Response-Variable nachlesen möchte, siehe dazu: Use Templates to handle response data
In der Doku findet man noch weitere Beispiele,
etwa wie man ein Service aufruft (hass.services.call), um bei diesem Beispiel ein Licht einzuschalten oder Wetterdaten abzurufen,
oder wie man ein Event triggert (hass.bus.fire), auf das dann z.B. ein Trigger reagieren kann.
Der entsprechende Trigger-Code dazu fehlt leider in der offiziellen Doku, er war aber nicht schwierig zu erstellen:
automations.yaml
HTML-Code:
- alias: "Python Event Trigger" triggers: - trigger: event event_type: hello_world_event actions: - action: persistent_notification.create data: title: Python Event message: > gesendet wurde: wow={{ trigger.event.data.wow }}
Das war jetzt natürlich noch keine sinnvolle Automatisierung, aber es zeigt zumindest wie Python funktioniert und auch bereits, was nicht verfügbar ist (z.B. strftime).
Wer strftime vermisst, der kann sich mal dt_util ansehen, das ist vorhanden und ChatGPT hilft sicher gerne weiter.
Wer bereits Automationen mit Python erstellt hat, kann diese ja gerne hier vorstellen, ein paar konnte ich auch selbst finden,
z.B. diese Snapshot Lösung, oder dieses Skript für den Roomba.
Am besten gefallen hat mir diese ISS Berechnung, da man hier recht schön das Zusammenspiel zwischen HA und Python erkennen kann.
Nachdem ich Python nun kurz kennengelernt habe, stellt sich natürlich die Frage, wofür ich es einsetzen könnte.
Die Antwort ist vermutlich die gleiche wie bei Node-RED. Es ist einfach eine weitere Möglichkeit, die ich nutzen kann, oder auch nicht.
Sollte ich bei irgendeiner Aufgabenstellung mit YAML an die Grenze kommen, kann ich jederzeit versuchen, hiermit eine Lösung zu finden.
Und sollte ich auch damit keinen Erfolg haben, kann ich ja auch noch HACS Pyscript ausprobieren, oder eine der anderen Varianten.
Weitere Beiträge dieser Serie:
HACS Wetterkarte
HACS Sonne & Mond (inkl. Tipps zur configuration.yaml)
HACS Schieberegler (inkl. Möglichkeiten der Icon Farbanpassung & erste Vorstellung Farbschema)
HACS Gauges (Tachoanzeigen, inkl. senkrechte Balken-Cards)
HACS stack-in-card für Raum-Card
HACS Graph-Cards
HACS Thermostat-Cards
HACS Entity Cards (inkl. stacking Beispiele mit der custom:button-card)
HACS Reminder (trash-card, atomic-calendar-revive)
HACS Person- & Öffi-Card (inkl. Geschichte zu ChatGPT)
HA-Behaglichkeits-Diagramm
HA Kurzeinführung
HACS Sidebar & Dashboard-Entwurf
HACS Bewässerung
HA & Node-Red
HA Notifications
HA Recorder, SQLite, InfluxDB, Grafana