Як створювати автоматизації в Home Assistant
Повна версія
Як створювати автоматизації в Home Assistant
Підписуйтеся наTelegram-канал «DOU #tech», щоб не пропустити нові технічні статті.
Привіт усім! У цій статі покажу на прикладах як створювати автоматизації в Home Assistant. Російський військовий корабель, пішов нах***!
Home Assistant (HA) — це гарна, сучасна та потужна операційна система з частими оновленнями та крутою спільнотою в Україні. Перша річ, за яку я обожнюю його, — він об’єднує та керує пристроями різних виробників з одного додатку, навіть без інтернету. Друга — автоматизації, що дозволяє цим пристроям автоматично реагувати на події, що відбуваються.
На перший погляд, автоматизації можуть здатись складними, але опанувати їх досить просто. У своїй основі це конфігураційний YAML файл. Проте для зниження рівня входу автоматизації можна створювати з графічного інтерфейсу та на основі існуючих проєктів, які дуже легко імпортуються.
При створенні автоматизації я спочатку використовую графічний інтерфейс, він підказує можливі типи тригерів, умов, дій та пристроїв, а потім редагую YAML. Перед тим як розглянути приклади, пропоную ознайомитись з основними термінами.
Сутність (entities) — «цеглинка» Home Assistant. Я уявляю сутності для себе так. Якщо в домі є пристрій, він має бути розділений на функції, щоб я або Home Assistant зміг до них звернутися.
Наприклад, датчик температури може показувати температуру, вологість, тиск, рівень заряду, силу сигналу. Сутностями можуть бути:
- віртуальні події: оновлення, перезавантаження,
- інформація: кількість кроків, прибрана площа,
- стани: стан резервного копіювання, наявність живлення.
Зазвичай автоматизація складається з трьох складових:
Тригер (trigger) — це те, що запускає автоматизацію. Коли будь-який з тригерів спрацьовує, Home Assistant перевіряє умови, якщо такі є, і викликає дію. Тригером може бути увімкнення сутності, повернення людини додому, точний час або схід сонця. Існує багато тригерів, проте найчастіше використовується тип пристрій.
Умова (condition) — не обов’язкова частина автоматизації. Вона використовується для виконання дії лише за певної умови. Наприклад робота лише у вихідні або увімкнення світла лише після заходу сонця. Більше про умови тут.
Дія (action) — те, що виконується при запуску автоматизації. Дією може бути завдання для конкретного пристрою, виклик служби, очікування спливання часу та ін.
Приклад роботи автоматизації
Корисні поради
Перед початком створення автоматизації рекомендую активувати розширений режим.
Для цього потрібно перейти в профіль (homeassistant.local:8123/profile) та активувати перемикач. Це надасть змогу перезавантажувати окремий компонент, не перезавантажуючи весь Home Assistant. Перезавантажити автоматизації, скрипти, сцени можна тут homeassistant.local:8123/developer-tools/yaml
Для зручності редагування автоматизацій встановіть додаток File Editor. Редактор доступний з магазину офіційних додатків, підтримує підсвічування синтаксису YAML, списки з доступними сутностями, тригерами, подіями, умовами та послугами, перезавантаження автоматизацій прямо в редакторі.
Щоб автоматизація з наведених прикладів працювала у вас, замініть назви сутностей на свої. Усі сутності можна знайти за адресою homeassistant.local:8123/config/entities
Мова конфігурацій YAML чутлива до табуляції (відступів), тому при редагуванні автоматизацій, скриптів та сцен звертайте увагу на правильність відступів та тире.
Сповіщення про відкриття дверей
Усі автоматизації можна знайти в меню конфігурацій >> Автоматизації та сцени, або за адресою homeassistant.local:8123/config/automation/dashboard. Самі ж конфігурації зберігаються в файлі /config/automation.yaml.
Перейдіть до автоматизацій та натисніть кнопку «Додати автоматизацію».
Для створення автоматизації завжди потрібна умова спрацьовування (тригер). Для цього я використовую датчик відкриття дверей Xiaomi. Автоматизація виглядатиме так: якщо двері відчиняються, на телефон надходить сповіщення.
Для цього створюю довільну назву автоматизації, як тригер обираю пристрій, у полі пристрою обираю датчик відкриття дверей.
Обираю тригер. Оскільки я хочу, щоб сповіщення приходило, коли двері відкриті, то обираю двері відчинені. Якщо забути обрати цей тригер, автоматизація не спрацьовуватиме.
Тип дії обираємо виклик служби. Серед служби обираємо — notify.mobile_app_*** де *** ім’я користувача. Або можна обрати notify.notify, тоді сповіщення надходитимуть на усі пристрої.
Служба (services) керує сутностями. Відповідає на питання: що зробити, ввімкнути, озвучити, сповістити.
Примітка. Щоб можна було обрати користувача, потрібно встановити мобільний додаток Home Assistant перед тим. Вписуємо message та за бажанням вказуємо title. Дуже круто, що Home Assistant підтримує emoji.
Тепер подивимось, що у нас вийшло в режимі YAML. В цьому випадку немає додаткової умови (condition), тому на її місці стоять пусті квадратні дужки.
alias: door_open
description: door open
trigger:
- type: opened
platform: device
device_id: ad40afb8f9bcdd3b8d35adb03cacc825
entity_id: binary_sensor.0x00158d00040389e6_contact_2
domain: binary_sensor
condition: []
action:
- service: notify.mobile_app_bogdan
data:
message: Двері відчинені 🚪
- service: notify.mobile_app_iphone
data:
message: Двері відчинені 🚪
mode: single
Сповіщення про повітряну тривогу в Home Assistant
Перейдіть за посиланням або знайдіть та встановіть інтеграцію Ukraine Alarm. Інтеграція повідомляє про повітряну тривогу, вуличні бої та артилерійські обстріли та швидко працює. При першому налаштуванні оберіть своє місто.
Створіть нову автоматизацію. Назвемо її «повітряна тривога». Тип тригера — пристрій. В моєму випадку пристрій називається «м. Київ». Тригер м. Київ Air реєструє безпеку
Дія — виклик служби notify.mobile_app_bogdan. Також вкажу повідомлення «Повітряна тривога»
У режимі YAML це виглядає так:
alias: Повітряна тривога
description: ""
trigger:
- type: unsafe
platform: device
device_id: 762ca6f458ef8b00bbbac0c400800740
entity_id: binary_sensor.m_kiyiv_air
domain: binary_sensor
condition: []
action:
- service: notify.mobile_app_bogdan
data:
message: 🔴 Повітряна тривога
mode: single
За аналогією можна створити сповіщення про відбій повітряної тривоги. Єдина відмінність — тригер м. «Київ Air» реєструє безпеку. Якщо Home Assistant з якоїсь причини буде перезавантажено, сповіщення про відбій тривоги прийде повторно, бо спрацює тригер «м. Київ Air» реєструє безпеку.
alias: Відміна
description: ""
trigger:
- type: unsafe
platform: device
device_id: 762ca6f458ef8b00bbbac0c400800740
entity_id: binary_sensor.m_kiyiv_air
domain: binary_sensor
condition: []
action:
- service: notify.mobile_app_bogdan
data:
message: 🟢 Відміна тривоги
mode: single
За власним досвідом сповіщення надходять навіть раніше, ніж в «Київ цифровий».
Нагадування
Можна створити постійні важливі нагадування, передати показники електроенергії/ води/ газу, нагадати про день народження дружини тощо.
Ось приклад нагадування кожного першого числа опівдні.
alias: Показники
description: ""
trigger:
- platform: time
at: "12:00:00"
condition:
- condition: template
value_template: "{{ now().day == 1 }}"
action:
- service: notify.notify
data:
message: Подати показники електроенергії ⚡️
mode: single
В автоматизації використаний тригер часу, який активується, якщо виконується умова шаблону, тобто настає перше число місяця.
Шаблон — це потужна функція, що дозволяє контролювати інформацію, яка надходить у систему та виходить з неї.
Шаблонування в Home Assistant працює на основі механізму шаблонів Jinja2. Інтерфейс Home Assistant має влаштований редактор шаблонів, що знаходиться в пункті меню інструменти для розробників >> Шаблони, або за адресою
homeassistant.local:8123/developer-tools/template
Клікабельні сповіщення
Android
Ви можете включити масив actions у вашому сервісному виклику. Android дозволяє додавати лише 3 дії, iOS дозволяє близько 10 дій.
service: notify.mobile_app_bogdan
data:
message: "Вдома щось сталось!"
data:
actions:
- action: "ALARM" # Ключ, який ви надсилаєте для події
title: "Звукове сповіщення" # Заголовок кнопки
- action: "URI" # Встановіть URI
title: "Відкрити посилання"
uri: "https://google.com" # URL-адреса, яка відкривається, коли вибрано дію, також може бути посиланням на Lovelace.
iOS
Клікабельні сповіщення на IOS не відрізняються від звичайних. Це потрібно запам’ятати, або підписувати сповіщення. Щоб вони стали клікабельні, їх необхідно довго затиснути.
Діями (action) в клікабельних сповіщеннях може бути:
— існуюча служба (те саме, що і сервіс),
— посилання на елементи інтерфейсу користувача lovelace,
— самостійно створена дія.
Для піктограм використовується пакет sfsymbols від apple, по аналогії з mdi. Назви піктограм:
alias: Клікабельне сповіщення
description: door open
trigger:
- type: opened
platform: device
device_id: ad40afb8f9bcdd3b8d35adb03cacc825
entity_id: binary_sensor.0x00158d00040389e6_contact_2
domain: binary_sensor
condition: []
action:
- service: notify.mobile_app_bogdan
data:
message: Двері відчинено!
data:
actions:
- action: ALARM
title: Увімкнути сигналізацію
icon: sfsymbols:bell
- action: SILENCE
title: Вимкнути сигналізацію
icon: sfsymbols:bell.slash
title: "Натисни "
Перезавантаження Home Assistant
Якщо ви спостерігаєте проблему зі стабільністю Home Assistant, можна скористатись корисною автоматизацією. Вона перезавантажує Home Assistant о 00:00 щодня.
В даній автоматизації тригером є час — настання півночі.
Також присутня умова часу — виконуватись в усі дні тижня.
Дією є перезапуск операційної системи.
alias: HA restart
description: ""
trigger:
- platform: time
at: "00:00:00"
condition:
- condition: time
weekday:
- mon
- tue
- wed
- thu
- fri
- sat
- sun
action:
- service: homeassistant.restart
data: {}
mode: parallel
Ping
Ping це мережева утиліта, що періодично надсилає ICMP пакети. В Home Assistant вона моніторить доступність пристроїв (binary_sensor) або відстежує, чи користувачі вдома (device_tracker). Для її використання рекомендую встановити статичну адресу на роутері. За допомогою утиліти можна дізнатись, чи прийшов якийсь користувач додому, чи працює телевізор та ін.
Ви можете додати будь-який блок конфігурації в кінець файлу configuration.yaml, не забудьте змінити ip адресу на свою.
Бінарний сенсор з інтервалом 10 секунд надсилає чотири пакети на пристрій. Ви можете контролювати час спрацьовування за допомогою команди scan_interval.
count — кількість відправлених icmp-пакетів,
scan_interval — інтервал між відправленням icmp-пакетів.
binary_sensor:
- platform: ping
host: 192.168.1.108
name: "phone"
count: 4
scan_interval: 10
Відстеження пристроїв (device_tracker) змінює статус з «вдома» на «не вдома». Статус вдома встановлюється приблизно за 10 секунд після підключення до wi-fi. Статус з «вдома» на «не вдома» змінюється приблизно за 3 хвилини. Якщо вам необхідна швидша зміна статусу, використовуйте бінарний датчик:
device_tracker:
- platform: ping
hosts:
iphone_bogdan: 192.168.1.108
На основі статусу ping можна створювати автоматизації. Наприклад, увімкнути світло в коридорі по приходу:
alias: bog_home
description: ""
trigger:
- platform: state
entity_id:
- binary_sensor.phone_bogdan
from: "off"
to: "on"
condition:
- condition: sun
after: sunset
- condition: time
before: "22:00:00"
action:
- type: turn_on
device_id: 870147a7a596b0b3eabe20dcaae947df
entity_id: switch.0x54ef4410004db2fa_left
domain: switch
mode: single
Взагалі придумати можна будь-що, це не обов’язково має бути світло після заходу сонця.
Увімкнення вентиляції, при збільшенні рівня вологості
Автоматизація вмикає (switch.turn_on) вентилятор (switch.bathroom_fan), коли датчик вологості (sensor.0×00124b002513498b_humidity) фіксує рівень вологості вище (above) 71%:
- alias: turn_bathroom_fan_on
trigger:
platform: numeric_state
entity_id: sensor.0x00124b002513498b_humidity
above: 71
action:
service: switch.turn_on
entity_id: switch.bathroom_fan
Для вимкнення використаємо подібну автоматизацію, яка буде вимикати (switch.turn_off) вентилятор, коли рівень вологості буде нижче (below) 50%:
- alias: turn_bathroom_fan_off
trigger:
platform: numeric_state
entity_id: sensor.0x00124b002513498b_humidity
below: 50
action:
service: switch.turn_off
entity_id: switch.bathroom_fan
Ось ще один приклад. Автоматизація запускається при досягненні 71% вологості, працює 50 хв, а потім вимикається на 20 хв. Якщо за цей час вологість впаде нижче 71%, тригер не зможе спрацювати повторно.
alias: turn_bathroom_fan
trigger:
- platform: numeric_state
entity_id: sensor.0x00124b002513498b_humidity
above: "71"
action:
- service: switch.turn_on
data: {}
target:
device_id: f746090a2a47d7b7b4cb6420f67b0eef
- delay:
hours: 0
minutes: 50
seconds: 0
milliseconds: 0
- service: switch.turn_off
data: {}
target:
device_id: f746090a2a47d7b7b4cb6420f67b0eef
- delay:
hours: 0
minutes: 20
seconds: 0
milliseconds: 0
if - else
Проєкти
Проєкти (Blueprints) це спільні шаблони автоматизації, які будь-хто може створити, поділитися та застосувати у власних налаштуваннях Home Assistant. Люди можуть придумати креативні та складні засоби автоматизації, які вони перевірили та впровадили самі, а потім поділитися ними зі спільнотою.
Home Assistant надає можливість додати проєкти з форуму спільноти або GitHub, просто вставивши посилання на них.
Після додавання проєкту, можна створити автоматизацію або скрипт на його основі.
Пропоную розглянути приклади найпопулярніших проєктів.
Сповіщення про розряд акумулятора
Цей проєкт регулярно перевіряє всі датчики батареї та сповіщає, якщо порогове значення перевищено. Див. тут.
Сповіщення про знімок камери під час руху
Надсилає сповіщення на телефон, коли камера виявляє рух. Див. тут.
Увімкнення світла на основі руху та низького рівня освітлення
На основі виявлення руху та (необов’язково) низького рівня освітлення, увімкніть світло, вимикач, сцену або сценарій. Див. тут.
Сповіщення про закриття дверей або вікна через задану кількість хвилин
Надсилає два сповіщення на мобільний пристрій про необхідність закрити вікно чи двері після їх відкриття, якщо температура на вулиці нижче певного градуса. Див. тут.
Більше про найпопулярніші проєкти можна прочитати тут.
Скрипти
Скрипт, або сценарій — це виконувана послідовність дій. Скрипти та автоматизації настільки схожі, що їх важко відрізнити. Відмінність в тому, що для автоматизації обов’язково потрібен тригер, для скрипта — ні. Також на відміну від автоматизації скрипт можна зупинити. Це може бути корисно, коли між декількома діями потрібно встановити великі затримки.
У скрипті можна створити набір з кількох дій, а потім викликати скрипт в автоматизації, в секції дії як службу. Усі скрипти можна знайти за адресою
homeassistant.local:8123/config/script/dashboard в графічному інтерфейсі, або в файлі scripts.yaml
Home Assistant підтримує три види скриптів:
— Скрипти Home Assistant,
— Python-скрипти,
— Зовнішні скрипти, що запускаються з командного рядка.
Скрипти Home Assistant
Перетворити автоматизацію на скрипт досить легко. Їх синтаксис майже ідентичний, лише видаляється тригер та action міняється на sequence:
<strike>- id: morning_bedroom</strike>
<strong>morning_bedroom:</strong>
alias: "Morning Lights On"
<strike> trigger:</strike>
<strike>platform: state</strike>
<strike>entity_id: input_boolean.morning_light_automation</strike>
<strike>action:</strike>
<strong>sequence:</strong>
- service: light.turn_on
data:
entity_id: light.kyles_lamp
brightness_pct: 100
color_temp: 250
transition: 30
- service: light.turn_on
data:
entity_id: light.mels_lamp
brightness_pct: 100
color_temp: 250
transition: 30
- delay: 00:00:30
- service: switch.turn_on
data:
entity_id: switch.master_bedroom_switch
Час до сну
Цей скрипт спочатку вмикає синє світло на світлодіодній стрічці та головному освітленні, чекає 30 секунд, вимикає телевізор, світлодіодну стрічку та головне світло. Коли і чому це буде відбуватись, можна придумати самому в автоматизаціях.
bedtime:
alias: Time for bed
description: 'Вимикає світло та телевізор у вітальні перед сном'
sequence:
- alias: LED Strip turn blue
service: light.turn_on
data:
entity_id: light.living_room_leds
rgb_color: [0,0,255]
- alias: Main Light turn blue
service: light.turn_on
data:
entity_id: light.lohasone
rgb_color: [0,0,255]
- delay:
seconds: 30
- alias: Turn TV off
service: media_player.turn_off
data:
entity_id: media_player.massive_sony
- alias: Tree Lamp off
service: light.turn_off
data:
entity_id: light.treelamp
- alias: LED Strip off
service: light.turn_off
data:
entity_id: light.living_room_leds
- delay:
minutes: 2
- alias: Turn Main Light Off
service: light.turn_off
data:
entity_id: light.lohasone
Також можна виконувати цей скрипт вручну. Для цього потрібно створити кнопку в інтерфейс lovelace:
Більше цікавих скриптів home assistant можна знайти на форумі.
Python-скрипти
Скрипти Python в Home Assistant представлені за допомогою інтеграції Python Scripts. Інтеграція має обмеження не можна використовувати import.
Для того, щоб скористатись Python скриптами необхідно активувати їх використання, додавши рядок python_script: в кінці файлу configuration.yaml:
та створити директорію python_scripts в корені (config). Після «Перезавантажити Home Assistant».
Для побудови python-скрипта можна використовувати наступні змінні:
Ім’я
|
опис
---|---
hass
|
Об’єкт «Home Assistant». Його можна використовувати лише для виклику служб, встановлення станів і запуску подій. Посилання на API
data
|
Дані передаються як корисне навантаження під час виклику служби проєкції самого сценарію.
logger
|
Home Assistant: logger.info(), logger.warning(), logger.error(). Посилання на API
Пробний скрипт
name = data.get("name", "world")
logger.info("Hello %s", name)
hass.bus.fire(name, {"wow": "from a Python script!"})
Якщо все виконано успішно в службах (homeassistant.local:8123/developer- tools/service) з’явиться нова сутність python_script.hello_world
Попередження про низький рівень заряду
Перші два рядки генерують дві змінні:
- перше — значення поточного заряду телефону,
- друге — значення вхідних даних, створених для встановлення обмеження.
Ці змінні порівнюються, і якщо рівень заряду акумулятора нижче встановленого ліміту, здійснюється виклик служби persistent_notification для створення сповіщення в Home Assistant. Також викликається служба text to speech (tts) та озвучує повідомлення.
Змініть значення sensor.oneplus_battery_level на назву сутності рівня заряду батареї вашого телефону. Знайти його можна в об’єктах інтеграції mobile app або за адресою:
http://homeassistant.local:8123/config/entities
Також змініть media_player.gh_bureau на назву сутності вашого динаміка, знайти його можна за тією ж адресою. Детальніше тут.
levelBatteryPhone =
hass.states.get("sensor.oneplus_battery_level")
levelLimitBattery =
hass.states.get("input_number.limit_battery_before_notification").state
if float(levelBatteryPhone) < float(levelLimitBattery):
hass.services.call(
"persistent_notification", "create",
{
"title": "Телефон відключено",
"message": "Недостатній рівень заряду. Повторно підключіть телефон!"
}
)
hass.services.call(
"tts", "cloud_say",
{
"entity_id": "media_player.gh_bureau",
"message": "Телефон було від’єднано від мережі, а заряд акумулятора низький"
}
)
У наступному прикладі пояснюється, як написати скрипт з двома вхідними змінними: entity_id (обов’язково) і rgb_color (необов’язково). Скрипт, викликаний через відповідну службу, вмикає світло, вказане за допомогою entity_id, встановлюючи будь-який колір rgb, переданий за допомогою rgb_color, а також встановлює максимальну яскравість (255):
entity_id = data.get('entity_id')
rgb_color = data.get('rgb_color', [255, 255, 255])
if entity_id is not None:
service_data = {'entity_id': entity_id, 'rgb_color': rgb_color, 'brightness': 255 }
hass.services.call('light', 'turn_on', service_data, False)
Не забудьте замінити entity_id та rgb_color після двокрапки. Наприклад, на
{"entity_id": "light.camera", "rgb_color": [255, 0, 0] }
Скрипти AppDaemon на основі HACS
Ви можете скористатись готовими скриптами, що надає HACS. Такий підхід дозволяє в графічному режимі встановлювати та користуватись python скриптами інших користувачів (щось на кшталт blueprints) Детальніше тут.
Сцени
Сцени запам’ятовують встановлений стан пристрою, та відновлюють його при її активації. Наприклад, сцена може під час перегляду фільму вимкнути основне світло, зашторити вікна, встановити підсвічування. Усі сцени знаходяться в файлі /config/scenes.yaml
Редактор сцен дозволяє створювати сцени лише в графічному режимі. Мені цього вистачає.
Створіть нову сцену, дайте їй назву, оберіть область і піктограму. Оберіть пристрій та оберіть стан пристрою, натиснувши на нього, збережіть сцену — готово!
До прикладу, я змінив колір лампи на синій, зменшив яскравість і зберіг. Кожен раз, коли ця сцена активується, лампа буде світити синім зі зменшеною яскравістю. Можна додавати декілька пристроїв, або сутності, які не належать пристроям (я так контролюю положення сервомотора) та зберігати їх стан. І це круто!
Сцену можна активувати, натиснувши на сцену, або натиснувши кнопку Activate.
Сцену можна використовувати в автоматизації в секції дії, для цього потрібно обрати дію, активувати сцену та обрати сцену з запропонованих.
Куточок читача
Хочу порадити україномовний сайт, присвячений налаштуванню HA та огляду обладнання — Smart Ninja та їх YouTube-канал. А якщо ви, найкращі читачі, знаєте про якісний контент та спільноти українською на тему розумного будинку, порадьте його в коментарях.
Висновок
Інструменти автоматизації Home Assistant — гнучкі та водночас потужні. Важко описати усі можливості в одній статті. Тому якщо я пропустив щось важливе або сказав щось не так, доповніть, будь ласка.
Також буде чудово, якщо ви поділитесь своїми автоматизаціями, сценами та скриптами в коментарях. Це допоможе розвитку україномовної спільноти «розумного будинку».
Сподобалась стаття? Подякуй донатом у фонд «Повернись живим».
Сподобалась стаття? Натискай «Подобається» внизу. Це допоможе автору виграти подарунок у програмі #ПишуНаDOU