Zum Inhalt springen

Automatisierungen

Home-Assistant-Automatisierungen zum Kopieren

Kurzfassungen der Automatisierungen aus dem Blog. Die Entity-IDs sind Platzhalter, also tausch sie gegen deine eigenen. Die ganze Geschichte, auch was unterwegs schiefging, steht im verlinkten Beitrag.

Fernseher pausieren, wenn das Handy klingelt

Der Fernseher pausiert, sobald ein Handy klingelt, und läuft zwei Sekunden nach dem Gespräch weiter. Aber nur, wenn die Automatisierung ihn auch angehalten hat.

Auslöser
Der Telefonstatus-Sensor der Companion-App wechselt auf ringing, in_call oder offhook.
Bedingungen
Der Fernseher ist an, und der Helfer input_boolean.tv_was_playing steht auf aus.
Aktionen
Helfer einschalten, Pause senden, auf idle warten (höchstens zwei Stunden), zwei Sekunden warten, Play senden, Helfer ausschalten.
Voraussetzungen
Home Assistant Companion-App auf dem Handy, die Android-TV-Integration und ein input_boolean-Helfer.

Automatisierung

alias: TV — Pause on phone call
trigger:
  - platform: state
    entity_id: sensor.your_phone_phone_state
    to: [ringing, in_call, offhook]
condition:
  - condition: state
    entity_id: remote.living_room_tv
    state: "on"
  - condition: state
    entity_id: input_boolean.tv_was_playing
    state: "off"
action:
  - action: input_boolean.turn_on
    target:
      entity_id: input_boolean.tv_was_playing
  - action: remote.send_command
    target:
      entity_id: remote.living_room_tv
    data:
      command: MEDIA_PAUSE
  - wait_for_trigger:
      - platform: state
        entity_id: sensor.your_phone_phone_state
        to: idle
    timeout: "02:00:00"
    continue_on_timeout: true
  - delay:
      seconds: 2
  - condition: state
    entity_id: input_boolean.tv_was_playing
    state: "on"
  - action: remote.send_command
    target:
      entity_id: remote.living_room_tv
    data:
      command: MEDIA_PLAY
  - action: input_boolean.turn_off
    target:
      entity_id: input_boolean.tv_was_playing

Die ganze Geschichte: Der Fernseher pausiert automatisch bei normalen Anrufen und Messenger

Heizung aus bei offenem Fenster (Blueprint)

Der Heizkörper geht aus, wenn das Fenster eine Minute offen ist, und bekommt beim Schließen genau seinen vorherigen Zustand zurück. Als Blueprint gebaut, der nächste Raum dauert etwa 30 Sekunden.

Auslöser
Das Fenster ist die eingestellte Zahl an Minuten offen, oder das Fenster wird geschlossen.
Bedingungen
Keine. Kurzes Lüften löst nichts aus, weil der Auslöser die Verzögerung abwartet.
Aktionen
Beim Öffnen: Zustand des Heizkörpers in einer Szene sichern und ausschalten. Beim Schließen: Szene wiederherstellen.
Voraussetzungen
Ein Fenstersensor mit device_class window und eine Klima-Entität. Getestet mit Mill-Heizkörpern der ersten Generation.

Blueprint: /config/blueprints/automation/homeassistant/window_heating_control.yaml

blueprint:
  name: "Window → Heating off"
  domain: automation
  input:
    window_sensor:
      selector:
        entity:
          domain: binary_sensor
          device_class: window
    climate_entity:
      selector:
        entity:
          domain: climate
    delay_minutes:
      default: 1
      selector:
        number:
          min: 0
          max: 10
          unit_of_measurement: min

mode: restart

trigger:
  - platform: state
    entity_id: !input window_sensor
    to: "on"
    for:
      minutes: !input delay_minutes
    id: opened
  - platform: state
    entity_id: !input window_sensor
    to: "off"
    id: closed

action:
  - choose:
      - conditions:
          - condition: trigger
            id: opened
        sequence:
          - action: scene.create
            data:
              scene_id: "{{ this.entity_id | replace('automation.', '') }}"
              snapshot_entities:
                - !input climate_entity
          - action: climate.set_hvac_mode
            target:
              entity_id: !input climate_entity
            data:
              hvac_mode: "off"
      - conditions:
          - condition: trigger
            id: closed
        sequence:
          - action: scene.turn_on
            target:
              entity_id: "scene.{{ this.entity_id | replace('automation.', '') }}"
            continue_on_error: true

Eine Instanz pro Raum

- alias: "Window → Heating: bedroom"
  use_blueprint:
    path: homeassistant/window_heating_control.yaml
    input:
      window_sensor: binary_sensor.bedroom_window
      climate_entity: climate.bedroom
      delay_minutes: 1

Die ganze Geschichte: Ein Home-Assistant-Blueprint, das die Heizung stoppt, wenn das Fenster öffnet

Außenlicht an bei Sonnenuntergang, aus um Mitternacht

Das Außenlicht geht eine Viertelstunde nach Sonnenuntergang an und um Mitternacht aus, das ganze Jahr, ohne dass eine Zeitschaltuhr umgestellt werden muss.

Auslöser
Sonnenuntergang plus 15 Minuten zum Einschalten, 0 Uhr zum Ausschalten.
Bedingungen
Keine.
Aktionen
Außenlicht mit voller Helligkeit einschalten und um Mitternacht wieder aus.
Voraussetzungen
Beliebige Leuchten in Home Assistant. Bei mir sind es Govee und LEDVANCE.

Zwei Automatisierungen

- alias: Outdoor lights — Sunset on
  trigger:
    - platform: sun
      event: sunset
      offset: "+00:15:00"
  action:
    - action: light.turn_on
      target:
        entity_id:
          - light.outdoor_1
          - light.outdoor_2
      data:
        brightness_pct: 100

- alias: Outdoor lights — Midnight off
  trigger:
    - platform: time
      at: "00:00:00"
  action:
    - action: light.turn_off
      target:
        entity_id:
          - light.outdoor_1
          - light.outdoor_2

Die ganze Geschichte: Govee- und LEDVANCE-Außenbeleuchtung nach Sonnenuntergangs-Zeitplan in Home Assistant

Zirkadianes Licht nach dem Sonnenstand

Alle 30 Minuten und jedes Mal, wenn eine Lampe angeht, folgt die Farbtemperatur der Sonne: kühl am Mittag, warm in der Dämmerung. Ausgeschaltete Lampen bleiben aus.

Auslöser
Alle 30 Minuten, oder eine Lampe ist seit fünf Sekunden an.
Bedingungen
Keine im Auslöser. In der Schleife werden nur Lampen angefasst, die schon an sind.
Aktionen
Sonnenstand in 2200 bis 6500 K umrechnen und diese Farbtemperatur an jeder eingeschalteten Lampe setzen.
Voraussetzungen
Lampen mit einstellbarer Farbtemperatur (bei mir WiZ) und die eingebaute Sonnen-Entität.

Automatisierung

alias: Circadian lighting
trigger:
  - platform: time_pattern
    minutes: "/30"
  - platform: state
    entity_id:
      - light.lamp_1
      - light.lamp_2
      - light.lamp_3
      - light.lamp_4
    to: "on"
    for: "00:00:05"
variables:
  elevation: "{{ state_attr('sun.sun', 'elevation') | float(0) }}"
  color_temp_k: >
    {{ [[5000 if elevation > 45
         else ((3500 + (elevation - 15) / 30 * 1500) | int) if elevation > 15
         else ((2700 + elevation / 15 * 800) | int) if elevation > 0
         else 2200,
        2200] | max,
       6500] | min }}
action:
  - repeat:
      for_each:
        - light.lamp_1
        - light.lamp_2
        - light.lamp_3
        - light.lamp_4
      sequence:
        - if:
            - condition: template
              value_template: "{{ is_state(repeat.item, 'on') }}"
          then:
            - action: light.turn_on
              target:
                entity_id: "{{ repeat.item }}"
              data:
                color_temp_kelvin: "{{ color_temp_k }}"

Die ganze Geschichte: Zirkadianes Licht mit WiZ, das der Farbtemperatur der Sonne folgt

Heizung auf 17 °C, wenn niemand zu Hause ist

Sobald die letzte Person geht, fallen alle Tado-Zonen auf 17 °C. Kommt die erste zurück, gilt wieder Tados eigener Zeitplan. Die Anwesenheit kommt aus deiner eigenen Logik, nicht aus dem Tado-Geofencing.

Auslöser
Die Haushaltsgruppe wechselt auf not_home oder zurück auf home.
Bedingungen
Keine.
Aktionen
Außer Haus: alle Zonen auf 17 °C. Zurück: alle Zonen wieder auf auto.
Voraussetzungen
Die Tado-Integration, eine Klima-Entität pro Zone und eine Gruppe oder Person-Entität, die zeigt, wer zu Hause ist.

Zwei Automatisierungen

- alias: Tado — Away setback
  trigger:
    - platform: state
      entity_id: group.household_members
      to: not_home
  action:
    - action: climate.set_temperature
      target:
        entity_id:
          - climate.zone_living_room
          - climate.zone_bedroom
          - climate.zone_office
      data:
        temperature: 17

- alias: Tado — Restore on return
  trigger:
    - platform: state
      entity_id: group.household_members
      to: home
  action:
    - action: climate.set_hvac_mode
      target:
        entity_id:
          - climate.zone_living_room
          - climate.zone_bedroom
          - climate.zone_office
      data:
        hvac_mode: auto

Die ganze Geschichte: Ein Tado-Heizungs-Dashboard mit card_mod, das wirklich einen Blick wert ist

Warnung bei offenem Fenster und laufender Heizung

Du bekommst eine Push-Nachricht, wenn ein Fenster seit zwanzig Minuten offen steht und die Zone noch heizt. So fällt das Fenster auf, das keiner zugemacht hat. Laufende Kosten: keine.

Auslöser
Ein Fenstersensor ist seit zwanzig Minuten an.
Bedingungen
Die passende Klima-Entität meldet hvac_action heating.
Aktionen
Push mit dem Raumnamen senden, abgeleitet aus der Entity-ID.
Voraussetzungen
Tado-Fenstersensoren mit Namen wie binary_sensor.zone_<raum>_window, passende climate.zone_<raum>-Entitäten und ein Notify-Dienst.

Automatisierung

alias: Tado — Open window alert
trigger:
  - platform: state
    entity_id:
      - binary_sensor.zone_living_room_window
      - binary_sensor.zone_bathroom_window
    to: "on"
    for:
      minutes: 20
condition:
  - condition: template
    value_template: >
      {{ state_attr(trigger.entity_id | replace('binary_sensor.', 'climate.') | replace('_window', ''), 'hvac_action') == 'heating' }}
action:
  - action: notify.all_devices
    data:
      title: "Window open — heating running"
      message: >
        {{ trigger.entity_id
           | replace('binary_sensor.zone_', '')
           | replace('_window', '')
           | replace('_', ' ')
           | title }} has been open for 20 minutes.

Die ganze Geschichte: Ein Tado-Heizungs-Dashboard mit card_mod, das wirklich einen Blick wert ist

Saugroboter startet beim Gehen und dockt beim Heimkommen an

Der Roboter fährt fünf Minuten nach deinem Weggang los und kehrt zur Station zurück, sobald du wieder da bist. Die fünf Minuten fangen GPS-Aussetzer ab, damit er nicht losfährt, nur weil das Handy kurz kein Signal hatte.

Auslöser
Die Person-Entität ist fünf Minuten lang not_home, oder sie wechselt auf home.
Bedingungen
Start: zwischen 9 und 18 Uhr, und der Roboter steht in der Station. Andocken: der Roboter saugt gerade.
Aktionen
Roboter starten, oder zurück zur Station schicken.
Voraussetzungen
Eine beliebige Staubsauger-Entität (bei mir ein Roborock) und die Companion-App für die Anwesenheit.

Zwei Automatisierungen

- alias: Vacuum — Clean on departure
  trigger:
    - platform: state
      entity_id: person.your_name
      to: not_home
      for:
        minutes: 5
  condition:
    - condition: time
      after: "09:00:00"
      before: "18:00:00"
    - condition: state
      entity_id: vacuum.your_vacuum
      state: docked
  action:
    - action: vacuum.start
      target:
        entity_id: vacuum.your_vacuum

- alias: Vacuum — Dock on return
  trigger:
    - platform: state
      entity_id: person.your_name
      to: home
  condition:
    - condition: state
      entity_id: vacuum.your_vacuum
      state: cleaning
  action:
    - action: vacuum.return_to_base
      target:
        entity_id: vacuum.your_vacuum

Die ganze Geschichte: Was an der Roborock-Karte in Home Assistant wirklich nützlich ist

Push-Nachricht, wenn der Briefkasten aufgeht

Alle Handys bekommen eine Nachricht, sobald die Briefkastenklappe aufgeht. Ein Reedkontakt kennt nur offen oder zu, Fehlalarme gibt es deshalb nicht.

Auslöser
Der Briefkastensensor wechselt von off auf on.
Bedingungen
Keine.
Aktionen
Eine Benachrichtigung an die Notify-Gruppe schicken.
Voraussetzungen
Ein LoRa-Briefkastensensor (bei mir ein MailBoxGuard) und eine Notify-Gruppe für eure Handys.

Automatisierung

alias: Mailbox — Notify on delivery
trigger:
  - platform: state
    entity_id: binary_sensor.mailboxguard
    from: "off"
    to: "on"
action:
  - action: notify.all_devices
    data:
      title: "Mail in the mailbox"
      message: "Something was delivered."

Die ganze Geschichte: MailBoxGuard: LoRa-Briefkastensensor 200 Meter vom Haus

Wohnzimmerlicht folgt dem Fernseher

Beginnt ein Film, gehen die Deckenlampen aus, und die Akzentlampen fallen auf 15 Prozent. Bei Pause oder Aus kommt das volle Licht zurück. Kein Szenenknopf, kein Sprachbefehl.

Auslöser
Der Media Player des Fernsehers wechselt auf playing, paused oder idle/off.
Bedingungen
Es ist nach 18 Uhr.
Aktionen
Playing: Deckenlampen aus, Akzentlampen auf 15 Prozent und 2200 K. Pause oder aus: alle Lampen auf 100 Prozent und 4000 K.
Voraussetzungen
Eine Media-Player-Entität für den Fernseher (bei mir die Android-TV-Integration) und Lampen mit Farbtemperatur. Mode restart verhindert ein Aufblitzen bei kurzem Pause und Play.

Automatisierung

alias: Living room lights follow the TV
mode: restart
trigger:
  - platform: state
    entity_id: media_player.living_room_tv
    to: playing
    id: playing
  - platform: state
    entity_id: media_player.living_room_tv
    to: paused
    id: paused
  - platform: state
    entity_id: media_player.living_room_tv
    to: [idle, "off"]
    id: stopped
condition:
  - condition: time
    after: "18:00:00"
action:
  - choose:
      - conditions:
          - condition: trigger
            id: playing
        sequence:
          - action: light.turn_off
            target:
              entity_id:
                - light.ceiling_1
                - light.ceiling_2
          - action: light.turn_on
            target:
              entity_id:
                - light.accent_1
                - light.accent_2
            data:
              brightness_pct: 15
              color_temp_kelvin: 2200
      - conditions:
          - condition: trigger
            id: [paused, stopped]
        sequence:
          - action: light.turn_on
            target:
              entity_id:
                - light.ceiling_1
                - light.ceiling_2
                - light.accent_1
                - light.accent_2
            data:
              brightness_pct: 100
              color_temp_kelvin: 4000

Die ganze Geschichte: WiZ-Lampen, die ohne Kinomodus-Taste auf den Fernseher reagieren

Geschirrspüler läuft in der günstigsten Stunde

Ein Skript sucht die günstigste verbleibende Stunde in den heutigen Spotpreisen, stellt die Endzeit passend ein und startet die Maschine. An einem normalen dänischen Werktag sind das ein bis zwei Kronen pro Spülgang.

Auslöser
Keiner. Du startest das Skript über eine Schaltfläche im Dashboard, sobald die Maschine voll ist.
Bedingungen
Keine. Berücksichtigt werden nur Stunden ab jetzt.
Aktionen
Heutige Preise lesen, günstigste Stunde wählen, Programmdauer addieren, Endzeit setzen und Start drücken.
Voraussetzungen
Energi Data Service (HACS) und ein vernetzter Geschirrspüler mit Endzeit-Auswahl und Startknopf. Der Fernstart muss an der Maschine selbst aktiviert sein.

Skript, gestartet über eine Dashboard-Schaltfläche

alias: Dishwasher — Schedule cheapest hour
sequence:
  - variables:
      prices: "{{ state_attr('sensor.energi_data_service', 'raw_today') | default([]) }}"
      now_h: "{{ now().hour }}"
      duration_h: 2
      best_hour: >
        {% set ns = namespace(hour=none, price=999) %}
        {% for h in prices %}
          {% if as_datetime(h.hour).hour >= now_h | int and h.price < ns.price %}
            {% set ns.price = h.price %}
            {% set ns.hour = h.hour %}
          {% endif %}
        {% endfor %}
        {{ ns.hour }}
  - action: select.select_option
    target:
      entity_id: select.dishwasher_finish_at
    data:
      option: >
        {{ (as_datetime(best_hour) + timedelta(hours=duration_h)).strftime('%H:%M') }}
  - action: button.press
    target:
      entity_id: button.dishwasher_start

Die ganze Geschichte: Den Bosch-Geschirrspüler in Home Assistant nach Strompreis einplanen

Einkaufsliste als Push, sobald du im Geschäft bist

Betritt ein Handy eine Geschäftszone, liest die Automatisierung die Einkaufsliste und schickt dir die Artikel für genau dieses Geschäft. Gehört nichts auf der Liste dorthin, bleibt es still.

Auslöser
Ein Handy betritt eine der Geschäftszonen.
Bedingungen
Mindestens ein offener Eintrag hat eine Beschreibung, die mit dem Geschäftsnamen beginnt.
Aktionen
Geschäftsnamen nachschlagen, offene Einträge holen, nach Geschäft filtern und die Liste als Push senden.
Voraussetzungen
Die eTilbudsavis-Integration mit der angepassten todo.py aus dem Beitrag, eine Zone pro Geschäft und die Companion-App. Jede To-do-Liste funktioniert, wenn der Geschäftsname in der Beschreibung steht.

Automatisierung, zwei Geschäfte gezeigt

alias: Shopping list — Push at the store
trigger:
  - platform: zone
    entity_id:
      - device_tracker.phone_1
      - device_tracker.phone_2
    zone: zone.supermarket_a
    event: enter
  - platform: zone
    entity_id:
      - device_tracker.phone_1
      - device_tracker.phone_2
    zone: zone.supermarket_b
    event: enter
variables:
  store_lookup:
    zone.supermarket_a: "Supermarket A"
    zone.supermarket_b: "Supermarket B"
  store_name: "{{ store_lookup[trigger.zone.entity_id] | default('') }}"
action:
  - action: todo.get_items
    target:
      entity_id: todo.shopping_list
    data:
      status: needs_action
    response_variable: todo_result
  - variables:
      found: >
        {% set ns = namespace(items=[]) %}
        {% for item in todo_result['todo.shopping_list']['items'] | default([]) %}
          {% if store_name != '' and item.description | default('') | regex_match(store_name) %}
            {% set ns.items = ns.items + [item.summary] %}
          {% endif %}
        {% endfor %}
        {{ ns.items }}
  - condition: template
    value_template: "{{ found | count > 0 }}"
  - action: notify.all_devices
    data:
      title: "{{ store_name }}: {{ found | count }} item(s) on the list"
      message: "{{ found | join('\n') }}"

Die ganze Geschichte: eTilbudsavis in Home Assistant: Nach Geschäft sortiert mit Benachrichtigung beim Betreten

Gesprochenes Morgenbriefing um 6 Uhr

Der Lautsprecher in der Küche liest Wetter, Tageskalender, Müllabfuhr und Strompreis vor. Das ist eine gekürzte Fassung meiner eigenen, die zusätzlich den Verkehr und das Auto ansagt.

Auslöser
Es ist 6 Uhr.
Bedingungen
Keine. Mit einer Wochentag-Bedingung bleiben die Wochenenden ruhig.
Aktionen
Heutige Termine holen, den Text in einem Template bauen und mit tts.speak vorlesen.
Voraussetzungen
Ein Kalender, eine Wetter-Entität, eine TTS-Engine und ein Media Player. Müll- und Preissensor sind optional, streich die Zeilen, wenn du sie nicht hast.

Automatisierung, gekürzte Fassung

alias: Morning briefing — spoken at 06:00
mode: single
trigger:
  - platform: time
    at: "06:00:00"
action:
  - action: calendar.get_events
    target:
      entity_id: calendar.family
    data:
      start_date_time: "{{ today_at('00:00') }}"
      end_date_time: "{{ today_at('23:59') }}"
    response_variable: calendar_result
  - action: tts.speak
    target:
      entity_id: tts.your_tts_engine
    data:
      media_player_entity_id: media_player.kitchen_speaker
      language: en-US   # change language and message text to your own
      message: >-
        {% set events = calendar_result['calendar.family']['events'] %}
        {% set temp = state_attr('weather.forecast_home', 'temperature') %}
        {% set waste_days = states('sensor.next_waste_collection') | int(99) %}
        {% set price = states('sensor.energi_data_service') | float(0) | round(2) %}
        Good morning. It is {{ now().strftime('%A') }}.
        The temperature outside is {{ temp }} degrees.
        {% if events | length > 0 %}
        You have {{ events | length }} appointment(s) today:
        {% for event in events %}{{ event.summary }}{% if not loop.last %}, {% endif %}{% endfor %}.
        {% else %}Nothing in the calendar today.
        {% endif %}
        {% if waste_days <= 1 %}The bins are collected today.
        {% elif waste_days == 2 %}The bins are collected tomorrow.
        {% endif %}
        The electricity price is {{ price }} kroner per kilowatt hour.

Die ganze Geschichte: Ein gesprochenes Morgen-Briefing in Home Assistant: Kalender, Wetter und Strompreis