Gå til indhold

Automationer

Automationer til Home Assistant, klar til at kopiere

Korte udgaver af automationerne fra bloggen. Entitets-ID’erne er pladsholdere, så skift dem ud med dine egne. Hele historien, også det der gik galt undervejs, står i indlægget, der er linket til.

Sæt TV’et på pause, når telefonen ringer

TV’et går på pause, så snart telefonen ringer, og fortsætter to sekunder efter, at samtalen er slut. Men kun hvis det var automationen, der satte det på pause.

Trigger
Telefonens tilstandssensor fra Companion-appen skifter til ringing, in_call eller offhook.
Betingelser
TV’et er tændt, og hjælperen input_boolean.tv_was_playing er slået fra.
Handlinger
Slå hjælperen til, send pause, vent på idle (højst to timer), vent to sekunder, send play, slå hjælperen fra.
Kræver
Home Assistant Companion-appen på telefonen, Android TV-integrationen og én input_boolean-hjælper.

Automation

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

Hele historien: TV'et går automatisk på pause ved almindelige opkald og Messenger

Varmen slukker, når vinduet åbnes (blueprint)

Radiatoren slukker, når vinduet har stået åbent i et minut, og får præcis sin tidligere tilstand tilbage, når vinduet lukkes. Lavet som blueprint, så næste rum tager omkring 30 sekunder.

Trigger
Vinduet har været åbent i det valgte antal minutter, eller vinduet lukkes.
Betingelser
Ingen. En hurtig udluftning udløser den aldrig, fordi triggeren venter på forsinkelsen.
Handlinger
Ved åbning: gem radiatorens tilstand i en scene, og sluk den. Ved lukning: gendan scenen.
Kræver
En vinduessensor med device_class window og en klima-entitet. Testet med Mill-radiatorer af første 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

Én instans pr. rum

- 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

Hele historien: Et Home Assistant-blueprint der stopper varmen når vinduet åbnes

Udendørslys tænder ved solnedgang og slukker ved midnat

Udendørslyset tænder et kvarter efter solnedgang og slukker ved midnat hele året. Der er ikke noget timerur, der skal stilles om efter årstiden.

Trigger
Solnedgang plus 15 minutter for at tænde, og midnat for at slukke.
Betingelser
Ingen.
Handlinger
Tænd udendørslyset på fuld styrke, og sluk det igen ved midnat.
Kræver
Hvilke som helst lamper i Home Assistant. Hos mig er det Govee og LEDVANCE.

To automationer

- 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

Hele historien: Govee- og LEDVANCE-udelys på en solnedgangs-tidsplan i Home Assistant

Døgnrytmelys styret af solens højde

Hver halve time, og hver gang en lampe tændes, følger farvetemperaturen solen: koldt lys midt på dagen og varmt i skumringen. Slukkede lamper bliver ikke rørt.

Trigger
Hver halve time, eller når en lampe har været tændt i fem sekunder.
Betingelser
Ingen i triggeren. I løkken bliver kun lamper, der allerede er tændt, ændret.
Handlinger
Omsæt solens højde til 2200–6500 K, og sæt den farvetemperatur på hver tændt lampe.
Kræver
Lamper med justerbar farvetemperatur (hos mig WiZ) og den indbyggede sol-entitet.

Automation

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 }}"

Hele historien: Circadian belysning med WiZ der følger solens farvetemperatur

Varmen går ned på 17 grader, når alle er ude

Alle Tado-zoner går ned på 17 grader, når den sidste forlader huset, og Tados eget skema overtager igen, når den første kommer hjem. Tilstedeværelsen kommer fra din egen opsætning og ikke fra Tados geofencing.

Trigger
Husstandsgruppen skifter til not_home eller tilbage til home.
Betingelser
Ingen.
Handlinger
Ude: sæt alle zoner til 17 grader. Hjemme: sæt alle zoner tilbage til auto.
Kræver
Tado-integrationen, én klima-entitet pr. zone og en gruppe eller person-entitet, der viser, hvem der er hjemme.

To automationer

- 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

Hele historien: Et Tado-varmedashboard med card_mod, der faktisk er værd at se på

Besked, når et vindue står åbent, og varmen kører

Du får en push, når et vindue har stået åbent i tyve minutter, og zonen stadig varmer. Den fanger vinduet, ingen fik lukket, og koster ingenting at have kørende.

Trigger
En vinduessensor har været tændt i tyve minutter.
Betingelser
Den tilhørende klima-entitet melder hvac_action heating.
Handlinger
Send en push med rummets navn, hentet fra entitets-ID’et.
Kræver
Tado-vinduessensorer med navne som binary_sensor.zone_<rum>_window, tilsvarende climate.zone_<rum>-entiteter og en notify-tjeneste.

Automation

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.

Hele historien: Et Tado-varmedashboard med card_mod, der faktisk er værd at se på

Støvsugeren kører, når du går, og er hjemme, når du kommer

Robotten starter fem minutter efter, du er gået, og kører tilbage til dokken, når du kommer hjem. De fem minutter fanger GPS-hop, så den ikke starter, bare fordi telefonen mistede signalet et øjeblik.

Trigger
Person-entiteten har været not_home i fem minutter, eller skifter til home.
Betingelser
Start: mellem kl. 09.00 og 18.00, og støvsugeren står i dokken. Dok: støvsugeren er i gang.
Handlinger
Start støvsugeren, eller send den tilbage til dokken.
Kræver
En vilkårlig støvsuger-entitet (hos mig en Roborock) og Companion-appen til tilstedeværelse.

To automationer

- 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

Hele historien: Det, der faktisk er nyttigt ved Roborock-kortet i Home Assistant

Push, når postkassen åbnes

Alle telefoner får en besked, når lugen i postkassen går op. En reed-kontakt kender kun åben eller lukket, så der kommer aldrig falske alarmer.

Trigger
Postkassesensoren skifter fra off til on.
Betingelser
Ingen.
Handlinger
Send en besked til notify-gruppen.
Kræver
En LoRa-sensor til postkassen (hos mig en MailBoxGuard) og en notify-gruppe med jeres telefoner.

Automation

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."

Hele historien: MailBoxGuard: LoRa-sensor i postkassen 200 meter fra huset

Stuelyset følger TV’et

Når filmen starter, slukker loftlamperne, og hjørnelamperne går ned på 15 procent. Sæt den på pause eller sluk, så er der fuld lys igen. Ingen sceneknap og ingen stemmekommando.

Trigger
TV’ets media player skifter til playing, paused eller idle/off.
Betingelser
Klokken er over 18.00.
Handlinger
Playing: loftlamper slukket, hjørnelamper på 15 procent og 2200 K. Paused eller slukket: alle lamper på 100 procent og 4000 K.
Kræver
En media player-entitet til TV’et (hos mig Android TV-integrationen) og lamper med farvetemperatur. Mode restart sørger for, at en hurtig pause og play ikke giver et lysglimt.

Automation

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

Hele historien: WiZ-lys, der reagerer på TV'et, uden en knap til biograftilstand

Opvaskemaskinen kører i den billigste time

Ét script finder den billigste time, der er tilbage i dagens spotpriser, sætter sluttidspunktet og starter maskinen. På en almindelig hverdag i Danmark er det en eller to kroner pr. vask.

Trigger
Ingen. Du starter scriptet fra en knap på dashboardet, når maskinen er fyldt.
Betingelser
Ingen. Kun timer fra nu og frem bliver talt med.
Handlinger
Hent dagens priser, vælg den billigste time, læg programmets varighed til, sæt sluttidspunktet og tryk start.
Kræver
Energi Data Service (HACS) og en tilsluttet opvaskemaskine med en select til sluttidspunkt og en startknap. Fjernstart skal være slået til på selve maskinen.

Script, startet fra en dashboard-knap

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

Hele historien: Sådan planlægger jeg Bosch-opvaskemaskinen i Home Assistant efter elprisen

Indkøbslisten som push, når du når butikken

Når en telefon kommer ind i en butikszone, læser automationen indkøbslisten og sender varerne til netop den butik. Er der intet på listen, der hører til, sker der ingenting.

Trigger
En telefon kommer ind i en af butikszonerne.
Betingelser
Mindst én åben vare på listen har en beskrivelse, der starter med butikkens navn.
Handlinger
Slå butiksnavnet op, hent de åbne varer, filtrér på butik og send en push med listen.
Kræver
eTilbudsavis-integrationen med den rettede todo.py fra indlægget, én zone pr. butik og Companion-appen. Enhver todo-liste duer, hvis butiksnavnet står i beskrivelsen.

Automation, to butikker vist

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') }}"

Hele historien: eTilbudsavis i Home Assistant: sorteret efter butik og med besked, når du ankommer

Morgenbriefing, der bliver læst højt kl. 06.00

Højttaleren i køkkenet læser vejret, dagens kalender, affaldsafhentning og elprisen op. Den her er en forkortet udgave. Min egen læser også trafikken og bilens ladestatus op.

Trigger
Klokken er 06.00.
Betingelser
Ingen. Tilføj en ugedagsbetingelse, hvis weekenderne skal være stille.
Handlinger
Hent dagens aftaler, byg teksten i en skabelon og læs den op med tts.speak.
Kræver
En kalender, en vejr-entitet, en TTS-motor og en media player. Affalds- og prissensorerne er valgfri, så fjern de linjer, hvis du ikke har dem.

Automation, forkortet udgave

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.

Hele historien: En talt morgenbriefing i Home Assistant: kalender, vejr og elpris