blog.vyoralek.cz

Automatizace pro chytrou domácnost – 3. část – HomeAssistant novinky

V dnešní třetí části pokračování miniseriálu k možnostem definice automatizací pro chytrou domácnost se podíváme na novinky pro HA ve verzi 0.113.

Režimy automatizace

První zásadní novinkou, která je v HomeAssistantovi dostupná od verze 0.113 jsou nové režimy automatizace – automation modes, která nám pomáhají definovat co se má stát pokud je automatizace vyvolána pomocí spouštěče, ale stále ještě běží akce z předchozího spuštění automatizace.

Můžeme definovat následující čtyři různá chování:

  1. jediné volání (single) – jedná se o výchozí chování, dokud nedoběhne akce z předchozího volání automatizace nová akce není spuštěna a zaloguje se pouze varování

    příklad v logu:
    2020-07-26 17:12:48 WARNING (MainThread) [homeassistant.components.automation] Automation single: Already running
  2. restart – způsobí ukončení i ještě nedokončeného volání automatizace v případě, že je automatizace zavolána znovu
  3. fronta (queued) – nové volání automatizace je umístěno do fronty a spuštěno až jakmile je předchozí volání automatizace dokončeno
  4. paralelní (parallel) – určuje že mohou běžet dvě stejné automatizace paralelně, tj. v případě že již jedno volání automatizace běží a je zavoláno znovu tak bude stávající volání pokračovat k dokončení a zároveň je spuštěno o volání druhé

V případě možnosti fronta a paralelní máme navíc možnost nastavit maximální počet spuštění zařazených do fronty, resp. spuštěných paralelně. Výchozí hodnotou je 10.

Režim automatizace je možné kompletně nastavovat i přes UI:

UI pro režimy automatizace

V aktuální verzi obsahuje drobnou chybku – výchozím nastavením režimu by měla být hodnota Jediný a ne Paralelní – tento problém je pouze v překladu a už je pro budoucí verzi opravený.

Možnosti opakování – repeats

Tato funkcionalita bohužel zatím není dostupná v UI, takže pokud ji chcete nyní použít tak musíte použít YAML.

Možnost opakování obecně slouží k zavolání akce nebo její části vícekrát na základě počtu nebo podmínky.

1. s definovaným počtem opakování

Následující automatizace vyvolá celkem 5x spuštění služby light.toggle (přepnutí stavu světla on/off) a mezi jednotlivými opakováními bude prodleva (delay) 2 sekundy.

automation:
  - trigger:
    ...
    condition:
    ...
    action:
      repeat:
        count: 5
        sequence:
          - delay: 2
          - entity_id: light.philips_hue_1
            service: light.toggle

Blok můžeme nastavit i přes UI, ale prostřednictvím YAML bloku, který bude svítit jako nepodporovaná akce, ale funguje to.

2. while loop

Spuštění a opakování akce je definováno podmínkou, tj. v případě nesplnění podmínky není akce vůbec zavolána.

Následující automatizace způsobí přepínání stavu světla hue1 s prodlevou 2 sekundy pokud a pouze pokud bude v době zavolání automatizace svítit světlo hue2.

repeat:
  sequence:
    - delay: 2
    - entity_id: light.philips_hue_1
      service: light.toggle
  while:
    - condition: state
      entity_id: light.philips_hue_2
      state: 'on'

3. repeat until

Spuštění akce minimálně jednou a opakování jen v případě splnění podmínky tak dlouho dokud je podmínky splněna.

Pokud bychom použili velice podobnou automatizaci jako výše pro while loop tak jediným rozdílem je spuštění akce i v případě, že světlo hue2 nebude svítit. Ostatní chování zůstává stejné.

repeat:
  sequence:
    - delay: 2
    - entity_id: light.philips_hue_1
      service: light.toggle
  until:
    - condition: state
      entity_id: light.philips_hue_2
      state: 'on'

Jiná akce na základě podmínky – chooser

Velmi užitečnou novinkou, která je bohužel také přítomná pouze pomocí YAML, tj. nejde nastavit přímo v UI je chooser, který nám umožňuje spouštět různé akce na základě podmínek

První úspěšně vyhodnocená podmínka způsobí spuštění příslušné akce a další podmínky se pak už nevyhodnocují. V případě, že není splněna ani jedna podmínka můžeme definovat sekci default, která je v tomto případě zavolána.

Následující příklad je tak trochu spíše učebnicový – šel by vyřešit elegantněji. V případě pokud světlo Philips Hue 1 svítí pak je vypnuto, pokud je vypnuto tak je zapnuto a pokud stav není ani on/off pak je poslána notifikace, že světlo není dostupné.

automation:
  - alias: "Chooser"
    trigger:
      - platform: event
        event_type: deconz_event
        event_data:
          event: 1002
          id: xiaomi_switch_1

    action:
      - choose:
        - conditions:
            - condition: state
              entity_id: light.philips_hue_1
              state: "on"
          sequence:
            - service: light.turn_on
              entity_id: light.philips_hue_1
        - conditions:
            - condition: state
              entity_id: light.philips_hue_1
              state: "off"
          sequence:
            - service: light.turn_off
              entity_id: light.philips_hue_1
        default:
          - service: notify.iphone
            data:
              message: Philips Hue neni dostupne

Delay s definici jednotky

Poslední novinkou, která už není tak významná, ale může být užitečná je možnost nastavit jednotku v případě použití delay – čekání.

Např. použití milisekund namísto výchozích sekund:

- delay:
    milliseconds: 500

Jak vidíte s novou verzí se zase možnosti automatizací přímo v HomeAssistentovi o kus posunuli, nicméně stále je bohužel spousta změn dodávána pouze do YAML verze a definice přes UI je tak trochu stále na druhé koleji.

Já tak zatím zejména na složitější automatizace preferuji NodeRed. A jak jste na tom vy? Který způsob automatizací používáte nejčastěji a který vám nejvíce vyhovuje?


Kompletní minisérie o vytvoření domácí automatizace obsahuje následující články:

  • 1. část – Teoretický úvod do automatizace – spouštěč -> podmínky -> akce
  • 2. část – Vytváření automatizací přes UI HomeAssistanta
  • 3. část – Novinky pro HomeAssistenta představené ve verzi 0.113

2 komentáře

Leave a Reply

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..

%d bloggers like this: