Home Assistant ~ inteligentná domácnosť

12 July

Automatizované svetlo pri pohybe

- Home Assistant

Image: Automatizované svetlo pri pohybe

Keď je všade tma, ale dokážete si pomôcť, pretože máte home assistant, ktorý kontroluje všetko, čo doma máte. Alebo aj o tom, ako automatizácia môže uľahčiť váš život.

Smart zariadenia nie sú v dnešnej dobe už nič nové a veľmi veľa ľudí už našlo krásu v tom, ako sa veci dokážu samostatne rozhodovať a riešiť tak množstvo vecí bez toho, aby človek musel niekde niečo zapínať, či vypínať. Diaľkové ovládače sme odložili a všetko sa nám presunulo do jediného zariadenia, ktoré máme stále pri sebe - do mobilu.

Čo však, ak mobil pri sebe nemáme, alebo sa nám nechce pre jednú vec zapínať mobil? 

V komunite, ktorá sa venuje Home Assistentu, bola otázka na to, ako vyriešiť automatizáciu osvetlenia, pokiaľ je indikovaný pohyb. Teda, či by bolo možné "dočasne" zvýšiť intenzitu svetla, pokiaľ je večer (noc) a človek sa pohne, pričom následne sa opäť vráti intenzita na asi 5%. Tu mi však napadlo hneď niekoľko vecí, na ktoré možno autor danej otázky nemyslel, pretože určil len dve podmienky - čas (noc) a pohyb.

To znamená, že pri tomto nastavení pri každom pohybe sa spustí automatizácia, čo dvihne úroveň osvetlenia na 50% a zníži sa na 5%. Čo ak však niekde medzi daným časom sám upraví intenzitu napríklad na 25%? Pohyb a následná spätná neaktivita mu túto úroveň zníži o 20% späť na 5%, takže jeho predošlé nastavenie bude ignorované. Mimo iného, táto činnosť bude vykonávaná celú dobu, pokiaľ je splnená jediná podmienka a je teda noc. Ako však určuje, či je alebo nie je noc? Je to určené nejakou template value, časovým rozhraním, alebo implementáciou sun.sun ?

Možné riešenia

V prvom rade, pre naše riešenie budeme potrebovať 2 pomocníkov. Jeden bude prepínač (switch) a jeden bude numerický vstup (input_number).

Pomocníci na uľahčenie automatizácie

Prepínač si nazveme disable_dimming a môžme mu dať ikonku mdi:alarm-light-off (vznikne nám tak entita input_boolean.disable_dimming). Budeme ju používať na overridnutie automatizácie a toho, aby sa nevykonávala, keď chceme sami nastaviť úroveň svetla.

Numerický vstup si pomenujme Default Dimm, čo samozrejme aj evokuje, na čo bude daná hodnota použitá, však? Takže vznikne entita input_number.default_dimm. Tu môžete určiť, že ide o slider a krok môžete nastaviť na 5, čím budú úrovne nastavovateľné po 5 percentách, teda 0, 5, 10 ... 100.

V neposlednom rade, keďže som si nie istý, ako má určenú "noc" užívateľ, čo položil túto otázku, vytvorme si pomocníka cez Time of day, ktorý si nazveme Noc a určíme mu, že je to čas medzi 22:00 a 4:00 ráno. Takže dostaneme binary_sensor.noc

Automatizácie

1. pre zapnutie svetla na vyšší jas.

Možností, ako to riešiť je niekoľko, v každom prípade, otázka bola na to, ako to vyriešiť pomocou automatizácie, tak sa na to pozrime. Máme tu entitu s pohybovým senzorom. Dajme tomu si ju nazvymi binary_sensor.motion_livingroom. Takže si vytvoríme novú automatizáciu, kde spúšťačom bude práve zmena stavu v tomto senzore a to zo stavu OFF do stavu ON.

Následne si zvolíme podmienku, kde určíme, že stav input_boolean.disable_dimming musí byť off, pridáme ďalšiu podmienku, ktorú ale uzatvoríme do podmienky AND, čím vytvoríme závislosť na to, že musia byť splnené všetky podmienky. V tejto podpodmienke určíme, že binary_sensor.noc musí byť on. To znamená, že sa preruší automatizácia, pokiaľ nie je stanovený časový rámec medzi 22:00 a 4:00.

V poslednej časti si potom vyberieme, čo chceme, aby sa stalo, teda si nájdeme entitu s osvetlením, ktoré chceme riadiť a zavoláme službu light.turn_on, ktorá nám povoľuje určiť brightness_pct teda jas určený v percentách. Tu určíme staticky 50, prípadne môžete použiť tiež nejakú konfigurovateľnú hodnotu z nejakého helperu, to nechám na vás. 

2. pre zníženie úrovne na pôvodnú hodnotu, prípadne definovanú sliderom

Keďže máme niečo, čo je riadené pohybom, treba urobiť aj protiakciu, teda nastaviť trigger na to, keď sa binary_sensor.motion_livingroom zmení z ON na OFF a tento stav je dlhší ako 30 sekúnd. Zvyčajne samotný senzor tento údaj pošle s nejakým oneskorením, tak je to na vás, či zvolíte, že musí táto vec trvať 30 sekúnd, alebo ju necháte tak. Ja som neurčoval žiaden čas trvania a všetko bolo OK.

Následne do podmienok dáme v podstate tie isté podmienky ako pri zapínaní, čím zabezpečíme, že sa svetlo zníži, avšak, pozor, pribudne ešte jedna podmienka, že daná entita svetla musí už byť v stave "ON". Zabezpečíte tým to, že ak sa rozhodnete, že nechcete aby svetlo svietilo, tak sa nebude samé zapínať pri žiadnom pohybe. Aj keď by sa tak nemalo stať, prevencie nie je nikdy dosť.

V akcii si potom navolíme to isté ako pri zapínaní, pretože ideme meniť intenzitu, takže nie je to ani toggle ani turn_off. Jediný rozdiel tu je v tom, že vám GUI neumožní vložiť tam hodnotu z pomocníku, preto sa v tomto prípade musíte prepnúť do režimu editovania v YAML. V tomto prípade by ste mali použiť nasledovný kód.

service: light.turn_on 
data: 
  brightness_pct: "{{ states('input_number.default_dimm')|int }}" 
target: 
  entity_id: light.__________

S týmto setupom by sa malo vami určené svetlo zmeniť na úroveň svetelnosti, ktorú určuje pomocník default_dimm. Ten je nastavený ako slider, takže si vyberiete úroveň, akú chcete manuálne, alebo môžete ešte vytvoriť jednu automatizáciu, ktorá bude kontrolovať zmenu jasu na danom svetle, ale to už je na ďalšiu časť tutoriálov. Čo poviete?

Zdrojové kódy k dispozícii

https://github.com/snipiba/home-assistant/tree/master/Automations/Dimm%20lights%20by%20motion