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