Автоматизации в Home Assistant

Home Assistant — это совершенно отличная штука чтобы делать "Умный дом". Можно подключить в HA разные устройства и создать удобный интерфейс для управления всеми этими устройствами.

Но кроме ручного управления устройствами Home Assistant позволяет создавать "Автоматизации" — действия выполняются автоматически при выполнении определенных условий.

Несколько примеров что можно сделать с помощью автоматизаций в Home Assistant:

Все устройства, которые подключены к Home Assistant могут выполнять свои действия по команде из автоматизаций.

Создание автоматизации

Существует два способа как можно создать или изменить автоматизацию:

Большинство людей, которых я знаю, пишут автоматизации в текстовых файлах и не используют веб интерфейс редактирования автоматизаций. Но вы сами смотрите, какой вариант вам будет удобнее. В итоге оба эти способа делают одно и то же. В этом тексте я буду показывать автоматизации с помощью редактирования текстовых файлов.

В Home Assistant есть главный файл с настройками системы — файл /config/configuration.yaml Вполне возможно записывать все настройки HA только в этот файл и не использовать другие файлы. Но файл configuration.yaml который создается при первом запуске Home Assistant предлагает создавать автоматизации в отдельном файле. В файле /config/configuration.yaml есть вот такой фрагмент:

group: !include groups.yaml
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml

Этот кусок конфига говорит что автоматизации нужно брать из файла /config/automations.yaml

И для начала это прекрасное решение. В рамках этого текста мы будет редактировать только один файл — /config/automations.yaml

(Вообще есть несколько разных способов как удобно разбивать конфигурационный файл на разные файлы, но этот текст не об этом, а про автоматизации)

Включение "Advanced Mode"

Перед тем как продолжать, нужно выполнить одну настройку.

Нужно зайти на страницу http://hassio.local:8123/profile и установить там галку "Advanced Mode":

Эта галка влияет на то что отображается на странице http://hassio.local:8123/config/server_control

Если галки нет (состояние по умолчанию), то на странице есть только кнопки перезапустить и остановить:

Но если поставить галку, то на странице появятся дополнительные действия, которые упростят и ускорят работу:

Первая автоматизация

Вот пример самый простой автоматизации. В файл /config/automations.yaml нужно записать:

- alias: first
  trigger:
  condition:
  action:

После того как файл отредактирован нужно сказать HA чтобы он заново прочитал свои конфигурационные файлы и сделал все то что в них описано.

Для этого нужно зайти на страницу http://hassio.local:8123/config/server_control и нажать на кнопку "Check Configuration". Должен появиться текст "Configuration valid!":

А после этого нужно нажать на кнопку "Reload automations":

(если на этой странице вы не видите кнопок "Check Configuration" и "Reload automations", то нужно включить "Advanced Mode" как описано в предыдущем разделе)

Поздравляю! Вы создали свою первую автоматизацию. Это исключительно простая автоматизация. И она очень скучная: она ничего не делает, но это настоящая автоматизация в HA.

Каждый раз после изменения yaml файлов в которых описаны автоматизации нужно заходить на эту страницу и нажимать кнопки "Check Configuration" и "Reload automations".

Исследование автоматизации

То что добавили мы в конфиг создало автоматизацию "automation.first". Можно добавить ее в интерфейс:

Переключался влияет на то включена ли эта автоматизация или выключена. Если ее выключить, то она не будет выполнять свои действия. Иногда бывает удобно вынести некоторые автоматизации в интерфейс, чтобы можно было управлять, работают ли они или нет.

Если кликнуть по названию, то становятся видно когда эта автоматизация последний раз запускалась (в нашем случае она еще ни разу не запускалась), плюс появляется кнопка Execute с помощью которой можно руками запустить эту автоматизацию (это бывает нужно достаточно редко):

На странице Developer Tools -> States http://hassio.local:8123/developer-tools/state можно посмотреть на внутреннее представление этой сущности:

Проблемы при создании автоматизации

Прямо сейчас у нас есть одна корректная автоматизаци. Давайте попробуем отредактировать эту автоматизацию, написать неправильно и посмотреть что будет. Удаляем все что есть в файле /config/automations.yaml и записываем в него только одну строчку:

- alias: first

Заходим на страницу http://hassio.local:8123/config/server_control и нажимаем на кнопку "Check Configuration". Появляется ошибка:

Configuration invalid
Invalid config for [automation]:
required key not provided @ data['action']. Got None
required key not provided @ data['trigger']. Got None.
(See /config/configuration.yaml, line 13).

Т.е. проверка конфигурации говорит нам что мы неправильно описали автоматизацию. Если внимательно прочитать текст ошибки, то видно что система ругается на две вещи:

Эта два элемента "trigger" и "action" являются обязательными. Их всегда нужно записывать в автоматизации. Но мы когда создали автоматизаци еще указывали "condition".

Возвращаем обратно правильный вариант автоматизации, нажимаем кнопки "Check Configuration" и "Reload automations".

Структура автоматизации

Автоматизация состоит из трех элементов:

Чуть подробнее:

Очень часто автоматизация состоит из trigger и action. Происходит какое-то событие на которое настроен trigger и выполняется то что написано в action. Раздел "condition" тоже часто используется, но есть не всегда.

Редко, но бывают но бывают автоматизации которые состоят только из одного action (trigger и condition пустые). Автоматизация только из action бывает нужна чтобы сделать кнопку в интерфейсе по нажатию на которое выполняется все действия из автоматизации.

Дальше мы рассмотрим все эти элементы автоматизации подробно, но в другом порядке.

Action

То что описывается в разделе "action" — это самое главное зачем вообще создается автоматизация. В этом разделе записывается какое действие нужно выполнить.

Например, это может быть:

Давайте создадим новые автоматизации, которые управляют светом.

У меня в Home Assistant заведена настолько лампа Xiaomi. В HA она называется light.lamp.

Добавляем в файл /config/automations.yaml

- alias: light_bright
  trigger:
  condition:
  action:
    - service: light.turn_on
      data:
        entity_id: light.lamp
        brightness: 100

- alias: light_dim
  trigger:
  condition:
  action:
    - service: light.turn_on
      data:
        entity_id: light.lamp
        brightness: 1

Добавляем автоматизации в интерфейс:

Заходим в автоматизацию automation.light_bright и нажимаем на кнопку Execute:

Результат — свет включился на полную яркость. Заходим в автоматизацию automation.light_dim, нажимаем кнопку Execute — яркость света стала минимальная.

В веб интерфейсе Home Assistant есть инструмент Developer Tools -> Services http://hassio.local:8123/developer-tools/service.

Очень удобно сначала отработать то что хочется запустить сначала в этом инструменте, а потом перенести получившиеся настройки в конфигурационный файл с автоматизациями. То что выбрано в интерфейсе в ниспадающем списке Services нужно записать после "services:", а то что находится в "Service Data" нужно разместить после "data:". (то что записано в поле Entity никуда переносить не нужно, так как это же информация содержится в поле "Service Data").

Иногда хочется выполнить несколько действий в одной автоматизации. Вот пример. При выполнении этой автоматизации сначала включается лампа light.lamp, а после нее тут же включается light.led:

- alias: light_bright
  trigger:
  condition:
  action:
    - service: light.turn_on
      data:
        entity_id: light.lamp
        brightness: 100
    - service: light.turn_on
      data:
        entity_id: light.led
        brightness: 100

Можно указать более чем два действия.

Но иногда хочется сделать несколько действий, но с паузой между ними. Вот пример:

- alias: light_bright
  trigger:
  condition:
  action:
    - service: light.turn_on
      data:
        entity_id: light.lamp
        brightness: 100
    - delay: 00:00:05
    - service: light.turn_on
      data:
        entity_id: light.led
        brightness: 100

При выполнении этой автоматизации сначала включается light.lamp, а через 5 секунд включается light.led.

"- delay: 00:00:05" говорит HA что нужно сделать паузу в 5 секунд. (Текст с рассказом про разные форматы времени в HA).

Значение action можно записывать в двух форматах. Полная форма, указывается service, а все данные указываются в data:

  action:
    - service: light.turn_on
      data:
        entity_id: light.lamp

Но когда в data есть только entity_id, то удобнее использовать сокращенную форму. В этом случае data не нужна, entity_id указывается на том же уровне что и service:

  action:
    - service: light.turn_on
      entity_id: light.lamp

И в том случае если в action выполняется только одно действие, можно записывать без использования массива:

  action:
    service: light.turn_on
    entity_id: light.lamp

Trigger

В разделе trigger описывается что должно произойти что чтобы запустилась автоматизация.

Несколько примеров что может являться триггером:

Вот пример автоматизации которая включает свет по нажатии кнопку (свет включен — нажатие кнопки его выключит, свет выключен — включает):

- alias: turn_light_on_on_button_press
  trigger:
    platform: state
    entity_id: sensor.0x000d6ffffe02333d_action
    to: 'toggle'
  action:
    service: light.toggle
    entity_id: light.0x086bd7fffe03d84e_light

А вот как включить вентилятор в ванной когда влажность стала больше 50%:

- alias: turn_bathroom_fan_on
  trigger:
    platform: numeric_state
    entity_id: sensor.0x00158d0002f3cd3c_humidity
    above: 50
  action:
    service: switch.turn_on
    entity_id: switch.bathroom_fan

Это автоматизация включит вентилятор, но если оставить только одну эту автоматизацию, то вентилятор никогда не выключится. Нужно создать еще одну автоматизацию в пару к этой:

- alias: turn_bathroom_fan_off
  trigger:
    platform: numeric_state
    entity_id: sensor.0x00158d0002f3cd3c_humidity
    below: 40
  action:
    service: switch.turn_off
    entity_id: switch.bathroom_fan

В trigger обязательно указывается platform. В зависимости от того какая платформа указана триггер запускает автоматизацию на разные действия. В предыдущих примерах мы использовали две разные platform:

Есть еще много других platform, вот некоторые их них

Вот пример как можно автоматически включать свет когда зашло солнце:

- alias: turn_light_on_sunset
  trigger:
    platform: state
    entity_id: sun.sun
    to: below_horizon
  action:
    service: light.turn_on
    entity_id: light.lamp

В данной автоматизации в триггере используется платформа state. Свет включается когда статус сущности "sun.sun" стал "below_horizon". Можно сделать автоматизацию которая делает то же самое с помощью платформы "sun":

- alias: turn_light_on_sunset
  trigger:
    platform: sun
    event: sunset
  action:
    service: light.turn_on
    entity_id: light.lamp

А можно просто сказать Home Assistant чтобы он включал свет в 7 часов вечера:

- alias: turn_light
  trigger:
    platform: time
    at: "19:00:00"
  action:
    service: light.turn_on
    entity_id: light.lamp

Лучше привязывать включение света не к определенному времени, а к положению солнца, так как в разные дни темно становится в разное время. Платформе sun можно указать что нужно запускать автоматизацию за какое-то количество минут до заката. Вот как включать свет за 10 минут до заката:

- alias: turn_light
  trigger:
    platform: sun
    event: sunset
    offset: "-00:10:00"
  action:
    service: light.turn_on
    entity_id: light.lamp

Но еще лучше установить специальный датчик освещенности и включать свет по данным с него.

В разделе trigger можно указать несколько разных триггеров. Автоматизация запустится при выполнении любого из них. Вот автоматизация которая всегда включает вентилятор в ванной комнате ночью или если влажность в ванной комнате больше 50%:

- alias: turn_bathroom_fan_on
  trigger:
    - platform: numeric_state
      entity_id: sensor.0x00158d0002f3cd3c_humidity
      above: 50
    - platform: time
      at: "03:00:00"
  action:
    service: switch.turn_on
    entity_id: switch.bathroom_fan

condition

В разделе condition записываются дополнительные условия которые необходимы для запуска автоматизации.

Возникает резонный вопрос. А зачем это? Разве недостаточно одного триггера? Оказывается, в некоторых ситуациях только одним триггером не обойтись.

Вот пример автоматизации уличного света на даче. Нужно чтобы уличный свет включался когда кто-то есть на даче и на улице темно. Вот как это сделано у меня:

- alias: turn_outdoor_lights_on
  trigger:
    - platform: state
      entity_id: binary_sensor.somebody_at_dacha
      to: 'on'
    - platform: time_pattern
      minutes: "/5"
  condition:
    - condition: template
      value_template: '{{ state_attr("sun.sun", "elevation") < 3 }}'
    - condition: state
      entity_id: switch.outdoor_lights
      state: 'off'
  action:
    service: switch.turn_on
    entity_id: switch.outdoor_lights

Эта автоматизация запускается когда кто-то приехал на дачу (сенсор binary_sensor.somebody_at_dacha переходит в статус 'on'), плюс эта автоматизация запускается каждые 5 минут.

В condition проверяем что уличный свет выключен и что солнце низко. Только если оба эти условия совпадают, то включается уличный свет.

Иван Бессарабов
ivan@bessarabov.ru

22 апреля 2020

Кстати, у меня есть телеграм канал про Home Assistant: https://t.me/bessarabov_ha