Ankündigung

Einklappen
Keine Ankündigung bisher.

HA Python Scripts

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    HA Python Scripts

    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
    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
    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
    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})
    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
    HTML-Code:
    action: python_script.hello_world
    data:
      name: Walter
    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.
    HTML-Code:
    - action: python_script.hello_world
      data:
        name: Walter
      response_variable: python_script_output
    Ü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
    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 }}
    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
Lädt...
X