Wiederverwendbare Skripte in Home Assistant

Hier findest du den Original-Beitrag: https://smarterkram.de/10886/

Skripte gehören zu den am meisten unterschätzten Werkzeugen in Home Assistant. Richtig eingesetzt, schreibst du eine Logik nur ein einziges Mal und rufst sie danach überall mit unterschiedlichen Werten auf. In diesem Beitrag zeige ich dir Schritt für Schritt, wie du das mit Feldern und Variablen umsetzt – inklusive aller Code-Beispiele aus dem Video zum…

Vielen Dank für dieses tolle Thema @olli :+1: … es ist nur komisch, dass ich gerade dabei bin, mein Smarthome mit Skripten zu optimieren (aktuell sind es 35 Skripte) und jetzt kommst Du damit auch um die Ecke :rofl:

Ich finde es z.B. auch sehr praktisch, wenn ich in den Skripten „fields“ definiere, dann sind diese auch z.B. direkt in den Automationen beim Skriptaufruf vorhanden und somit kann das Verhalten vom Skript ganz einfach gesteuert werden.

der {{ ausloeser }} ist in einer anderen Aktion vom Typ " Variablen definieren" davor definiert worden:

variables:
  ausloeser: |
    {% if trigger is defined
          and trigger.event is defined
          and trigger.event.data is defined %}
      {{ trigger.event.data.trigger_id | default('unbekannt') }}
    {% else %}
      manueller Test
    {% endif %}

So werte ich hier den Trigger der Automation aus, um zu erfahren, welcher Trigger es war.

Ich finde Skripte richtig gut und hilfreich :grinning_face: und würde einfach mal anfangen die Funktionen und Möglichkeiten zu testen und der Rest kommt dann wie meist von selbst :grinning_face:

Ich stelle z.B. gerade vieles von SONOS auf Skripte um (Radio abspielen, Durchsagen, Ansagen,… ), um die Automationen schlank/übersichtlich zu halten und Änderungen im System mit nur einer Änderung im Skript zu aktivieren.

VG und viel Spaß beim „skripten“ Micha

Ein sehr schönes Thema, das perfekt zu meinem Vorhaben passt, Home Assistant etwas aufzuräumen.

Die Idee, wiederkehrende Abläufe in einem zentralen Skript zusammenzufassen und nur noch die benötigten Werte zu übergeben, ist wirklich genial. Gerade bei meinen Sprachbenachrichtigungen spart mir das einiges an Arbeit: Aus bisher etwa 15 einzelnen Skripten werden jetzt gerade einmal zwei.

Chapeau für diesen hilfreichen Beitrag! Ich habe das Ganze direkt einmal für meine Echo-Durchsagen umgesetzt:

alias: Benachrichtigung auf den Echo
fields:
  titel:
    description: Überschrift der Nachricht
    example: Waschmaschine
    selector:
      text:
  nachricht:
    description: Inhalt der Nachricht
    example: ist fertig!
    selector:
      text:

sequence:
  - action: notify.send_message
    target:
      entity_id: notify.wohnen_echo_wohnzimmer_durchsagen
    data:
      title: "{{ titel | default('Hinweis') }}"
      message: "{{ nachricht | default('(keine Nachricht übergeben)') }}"

Das funktioniert wunderbar und macht die einzelnen Automationen deutlich übersichtlicher.

Das hat mich endlich dazu gebracht mein noch nicht so optimales Skript endlich mal zu überarbeiten. Ich habe das Skript aus dem Video als Grundlage genommen und mit Hilfe von Claude noch zwei (für mich) wesentliche Angaben ergänzt.

1. Die Auswahl an welches Smartphone die Nachricht gehen soll. Manche Nachrichten sind nur für mich, manche für meinen Mann und manche für uns beide.

2. Die Möglichkeit zusätzlich noch ein Bild zu übergeben (z.B. von der Türklingel, wenn es klingelt).

Vielleicht hilft es dem ein oder anderen.

alias: Benachrichtigung aufs Handy
fields:
  titel:
    description: Überschrift der Nachricht
    selector:
      text: null
  nachricht:
    description: Inhalt der Nachricht
    selector:
      text: null
  wichtig:
    description: Als kritische Nachricht senden?
    default: false
    selector:
      boolean: null
  bild:
    description: >
      Optional: Pfad zu einem Bild, das mitgeschickt werden soll (z. B.
      /media/local/snapshot/doorbell_snapshot.jpg)
    selector:
      text: null
  empfaenger:
    description: Auf welches Smartphone (oder welche) soll gesendet werden?
    default:
      - pixel_8
    selector:
      select:
        multiple: true
        mode: list
        options:
          - label: Mein Handy 
            value: pixel_8
          - label: Anderes Handy 
            value: sm_a715f
sequence:
  - repeat:
      for_each: "{{ empfaenger | default(['pixel_8']) }}"
      sequence:
        - action: notify.mobile_app_{{ repeat.item }}
          data:
            title: "{{ titel | default('Hinweis') }}"
            message: "{{ nachricht | default('(keine Nachricht übergeben)') }}"
            data: >
              {{ ({'ttl': 0, 'priority': 'high'} if wichtig | default(false)
              else {})
                 | combine({'image': bild} if bild | default('') != '' else {}) }}

Hallo Yina,

vielen Dank für Dein Script :+1:t2: leider kann es so nicht abgespeichert werden.

Aktuell:

- action: notify.mobile_app_{{ repeat.item }}

Der Wert von action: darf keine Vorlage (Template) enthalten. Deshalb kann das Skript nicht gespeichert werden.

Stattdessen musst du einen Dienst mit Template so aufrufen:

- service: "notify.mobile_app_{{ repeat.item }}"

also mit " … "

VG Micha