Автоматизация в Home Assistant: примеры YAML и скрипты

15 минчтения 22разделов Умный домрубрика

Автоматизация в Home Assistant — это правило «если произошло событие и выполнено условие, сделай действие». Именно она заставляет свет включаться самому, а при протечке присылает сообщение на телефон. В статье разберём, из чего собирается автоматизация, как создать её мышью и в YAML, и дадим рабочие примеры автоматизации: свет по движению, закат, влажность, уведомление, утренний сценарий. Отдельно поговорим про скрипты Home Assistant (их ищут почти так же часто, как сами автоматизации), режимы запуска, блюпринты и отладку.

Автоматизация в Home Assistant: примеры YAML и скрипты
Фото: Versatile Techno, CC BY-SA 4.0 / Wikimedia Commons

1Кратко

  • Автоматизация состоит из триггеров (что запускает), условий (стоит ли действовать) и действий (что делать). В актуальных версиях ключи называются triggers, conditions, actions.
  • Создавать можно в визуальном редакторе и в любой момент переключаться на YAML: для большинства задач писать код вручную не нужно.
  • Параметр mode определяет, что будет при повторном запуске, пока предыдущий ещё идёт. По умолчанию это single, и именно он чаще всего объясняет «сработало один раз».
  • Скрипт — именованная последовательность действий без триггера. Автоматизация отвечает на вопрос «когда», скрипт — «что делать».
  • Если автоматизация не сработала, откройте трассировку: она покажет, на каком шаге всё остановилось.

2Из чего состоит автоматизация в Home Assistant

Любая автоматизация в Home Assistant строится из трёх блоков. Их порядок и смысл стоит запомнить, потому что все примеры ниже устроены одинаково.

  • Триггеры (triggers) — события, которые запускают автоматизацию: изменилось состояние датчика, наступило время, зашёл закат, человек пришёл домой. Триггеров может быть несколько, срабатывает любой из них.
  • Условия (conditions) — необязательная проверка «а стоит ли сейчас действовать». Например, включать свет только когда на улице темно. Если условий несколько, по умолчанию должны выполниться все.
  • Действия (actions) — то, что система делает: включить лампу, отправить уведомление, запустить скрипт, подождать, выбрать ветку по условию.

Получается простая схема: «если произошло А, и при этом верно Б, то сделать В».

В актуальных версиях Home Assistant ключи верхнего уровня называются triggers:, conditions: и actions:, а внутри триггера тип задаётся ключом trigger:, например trigger: state. Вызов службы записывается как action: light.turn_on. В более старых версиях вы встретите trigger: и condition: в единственном числе на верхнем уровне, platform: state внутри триггера и service: light.turn_on в действиях. Старый формат продолжает читаться, но во всех новых примерах лучше использовать актуальный. Если вы копируете пример из старого форума, просто замените названия ключей.

Автоматизация в Home Assistant: примеры YAML и скрипты — иллюстрация
Фото: Jiří Sedláček, CC BY-SA 4.0 / Wikimedia Commons

3Какие бывают триггеры

Тип триггера задаётся ключом trigger:. Для бытовых задач хватает нескольких типов.

Тип Когда срабатывает Типичный пример
state Изменилось состояние или атрибут сущности Датчик движения перешёл в on, дверь открыта более пяти минут
numeric_state Число пересекло порог Влажность выше 70 %, заряд батареи ниже 15 %
time и time_pattern Наступило время или прошёл заданный интервал Каждый день в 23:30, каждые 5 минут
sun Восход или закат, можно со сдвигом За полчаса до заката
zone Человек вошёл в зону или вышел из неё Приезд домой
event В системе произошло событие Нажатие кнопки в уведомлении
template Шаблон стал истинным Сложное условие из нескольких датчиков
mqtt и webhook Пришло сообщение из MQTT или запрос по веб-хуку События Zigbee2MQTT, внешние сервисы
homeassistant Система запустилась или останавливается Действие после перезагрузки

Триггеров в одной автоматизации может быть несколько: достаточно сработать любому. Чтобы понять, какой из них запустил сценарий, каждому можно присвоить id (пример ниже).

4Режимы запуска: параметр mode

Что делать, если автоматизация запустилась, а предыдущий запуск ещё не закончился (например, ждёт конца паузы)? Ответ задаёт mode.

Режим Поведение Когда выбирать
single Новый запуск игнорируется (по умолчанию) Короткие действия без ожидания
restart Старый запуск прерывается, новый начинается заново Свет по движению с таймером выключения
queued Запуски выстраиваются в очередь Когда важно выполнить каждый запуск по порядку
parallel Запуски идут одновременно Независимые друг от друга события

Для queued и parallel можно ограничить число одновременных запусков параметром max. Если вы видите в журнале предупреждения о том, что запуск пропущен, причина почти всегда в режиме.

5Что понадобится

  • Работающий Home Assistant с несколькими устройствами или датчиками. Для первых экспериментов подойдут и всегда доступные сущности вроде sun.sun и person.*.
  • Мобильное приложение Home Assistant для примеров с уведомлениями: после входа появляется служба notify.mobile_app_<имя_устройства>.
  • Знание имён ваших сущностей. Идентификаторы вроде light.hallway в примерах условные, найдите свои в «Настройки > Устройства и службы > Сущности».

6Как создать автоматизацию через интерфейс

Для начала стоит сделать автоматизацию мышью, чтобы увидеть, как блоки соотносятся с YAML. Название пунктов меню может немного отличаться в разных версиях, но общая логика одна. Обычно путь такой: «Настройки > Автоматизации и сцены > Создать автоматизацию > Создать новую автоматизацию».

  1. В блоке «Когда» нажмите «Добавить триггер» и выберите тип, например «Состояние» (state). Выберите сущность — датчик движения.
  2. В блоке «И если» при необходимости добавьте условие, например «Состояние» или «Время».
  3. В блоке «Тогда выполнить» добавьте действие — вызов службы light.turn_on для нужной лампы.
  4. Сохраните автоматизацию и дайте ей понятное имя: через полгода по названию «Автоматизация 17» вы уже ничего не поймёте.

Автоматизации, созданные в интерфейсе, хранятся в файле automations.yaml в каталоге конфигурации. Он подключается строкой automation: !include automations.yaml в configuration.yaml; в стандартной установке эта строка уже есть. Если вы правите файл вручную, после изменений нажмите проверку конфигурации и перезагрузите автоматизации в «Инструменты разработчика > YAML». Если же вы редактируете их в интерфейсе, файл обновляется сам, и править его параллельно не стоит: можно потерять комментарии или изменения.

Чтобы увидеть код, откройте меню с тремя точками в правом верхнем углу редактора и выберите режим редактирования в YAML. Именно в таком виде автоматизации и приведены ниже. Вы можете вставлять их туда целиком, заменив идентификаторы сущностей на свои.

7Пример автоматизации: свет по датчику движения

Классический пример: включать свет в коридоре при движении, но только в тёмное время, и выключать его, когда движение прекратилось.

alias: "Коридор: свет по движению"
description: "Включает свет при движении, если темно"
mode: restart
triggers:
  - trigger: state
    entity_id: binary_sensor.hallway_motion
    to: "on"
conditions:
  - condition: sun
    after: sunset
    before: sunrise
actions:
  - action: light.turn_on
    target:
      entity_id: light.hallway
  - wait_for_trigger:
      - trigger: state
        entity_id: binary_sensor.hallway_motion
        to: "off"
        for: "00:02:00"
    timeout: "00:30:00"
    continue_on_timeout: true
  - action: light.turn_off
    target:
      entity_id: light.hallway

Разберём, что здесь происходит. Триггер срабатывает, когда датчик перешёл в состояние on. Условие sun проверяет, что сейчас период между закатом и восходом (граница «после заката и до восхода» понимается через полночь корректно). Действие wait_for_trigger приостанавливает выполнение, пока датчик не будет в состоянии off две минуты подряд. Если этого не произойдёт за 30 минут, автоматизация всё равно пойдёт дальше и выключит свет.

Параметр mode: restart важен: при повторном движении, пока предыдущий запуск ещё ждёт, он будет прерван и запущен заново. Без этого при режиме по умолчанию (single) повторный запуск игнорируется, и свет может погаснуть слишком рано или не погаснуть вовсе.

8Пример: свет на закате и условия по времени

Триггер sun позволяет не привязываться к часам. Пример с небольшим упреждением:

alias: "Гостиная: вечерний свет"
mode: single
triggers:
  - trigger: sun
    event: sunset
    offset: "-00:30:00"
conditions:
  - condition: state
    entity_id: person.ivan
    state: "home"
actions:
  - action: light.turn_on
    target:
      entity_id: light.living_room
    data:
      brightness_pct: 60

Здесь offset со знаком минус сдвигает запуск на полчаса до заката. Условие проверяет, что человек (сущность person.*) находится дома. Параметр data передаёт аргументы вызываемому действию: яркость в процентах.

Для запуска по расписанию применяется триггер time:

triggers:
  - trigger: time
    at: "23:30:00"

А для ограничения по часам — условие time:

conditions:
  - condition: time
    after: "22:00:00"
    before: "06:00:00"

Условие можно дополнить параметром weekday, чтобы действовать только в определённые дни недели.

9Пример: триггер по температуре и влажности

Для датчиков, которые отдают число, есть триггер numeric_state. Он срабатывает в момент пересечения порога, а не постоянно, пока значение выше нормы. Это защищает от лавины повторных запусков.

alias: "Ванная: вытяжка при высокой влажности"
mode: single
triggers:
  - trigger: numeric_state
    entity_id: sensor.bathroom_humidity
    above: 70
    for: "00:01:00"
actions:
  - action: switch.turn_on
    target:
      entity_id: switch.bathroom_fan
  - wait_for_trigger:
      - trigger: numeric_state
        entity_id: sensor.bathroom_humidity
        below: 60
    timeout: "01:00:00"
  - action: switch.turn_off
    target:
      entity_id: switch.bathroom_fan

Две разные границы (включаем при 70, выключаем при 60) дают гистерезис: вытяжка не будет щёлкать туда-сюда, когда влажность колеблется около одного значения. Параметр for отсекает кратковременные всплески.

10Приезд домой и несколько триггеров с id

Триггер zone реагирует на вход человека в зону. Один и тот же сценарий можно запускать несколькими триггерами и по-разному обрабатывать их в действиях: для этого у триггера есть id, а в действиях — условие trigger.

alias: "Дом: приход и уход"
mode: single
triggers:
  - trigger: zone
    entity_id: person.ivan
    zone: zone.home
    event: enter
    id: arrive
  - trigger: zone
    entity_id: person.ivan
    zone: zone.home
    event: leave
    id: leave
actions:
  - choose:
      - conditions:
          - condition: trigger
            id: arrive
        sequence:
          - action: light.turn_on
            target:
              entity_id: light.hallway
      - conditions:
          - condition: trigger
            id: leave
        sequence:
          - action: light.turn_off
            target:
              entity_id:
                - light.hallway
                - light.living_room

Для работы такого сценария у человека должно быть привязанное устройство слежения, например телефон с мобильным приложением и разрешённой геолокацией. Не стоит завязывать на присутствие критичные вещи вроде замков: определение местоположения иногда ошибается.

11Пример: уведомление о протечке на телефон

Автоматизации удобно сочетать с уведомлениями. Если вы установили мобильное приложение, в системе появилась служба вида notify.mobile_app_ваш_телефон. Точное имя посмотрите в «Инструменты разработчика > Действия» (в старых версиях раздел назывался «Службы»), набрав в поиске notify.mobile_app. Пример: предупреждение о протечке.

alias: "Протечка: уведомление"
mode: single
triggers:
  - trigger: state
    entity_id: binary_sensor.kitchen_leak
    to: "on"
actions:
  - action: notify.mobile_app_ivan_phone
    data:
      title: "Протечка на кухне"
      message: "Датчик под раковиной показывает воду."
      data:
        push:
          interruption-level: critical

Блок data.push.interruption-level специфичен для iOS и делает уведомление критическим; на Android для повышения важности используются другие параметры, о которых подробнее рассказано в статье про уведомления Home Assistant. Если оставить только title и message, пример будет работать на обеих платформах.

12Скрипты в Home Assistant: чем отличаются от автоматизаций

Скрипт — это именованная последовательность действий, которую можно запускать вручную, из автоматизаций, с карточки на панели или голосом. У скрипта нет триггеров и условий верхнего уровня: он ждёт, пока его вызовут. Полезно вынести в скрипт то, что повторяется в нескольких местах.

Создать скрипт можно через «Настройки > Автоматизации и сцены > Скрипты» или записать в YAML. Пример скрипта «Ночной режим»:

night_mode:
  alias: "Ночной режим"
  mode: single
  sequence:
    - action: light.turn_off
      target:
        entity_id:
          - light.living_room
          - light.kitchen
          - light.hallway
    - action: lock.lock
      target:
        entity_id: lock.front_door
    - action: notify.mobile_app_ivan_phone
      data:
        message: "Ночной режим включён"

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

actions:
  - action: script.night_mode

Такой вызов дожидается завершения скрипта. Если нужно запустить скрипт и не ждать его окончания, используйте script.turn_on с указанием целевой сущности script.night_mode.

Инструмент Что делает Запускается
Автоматизация Правило «когда и при каком условии» Сама, по триггеру
Скрипт Последовательность действий, можно с ожиданием и ветвлениями Вручную, из автоматизации, с карточки, голосом
Сцена Снимок состояний нескольких устройств, который восстанавливается разом Вызовом сцены

Правило выбора простое: автоматизация отвечает на вопрос «когда», скрипт — на вопрос «что делать». Вынесите «что» в скрипт, и вы сможете запускать его из десятка мест без копирования кода.

13Ветвления в действиях: if и choose

Одна автоматизация способна вести себя по-разному в зависимости от обстоятельств. Для этого внутри действий есть конструкции if/then/else и choose.

actions:
  - if:
      - condition: time
        after: "23:00:00"
        before: "06:00:00"
    then:
      - action: light.turn_on
        target:
          entity_id: light.hallway
        data:
          brightness_pct: 10
    else:
      - action: light.turn_on
        target:
          entity_id: light.hallway
        data:
          brightness_pct: 80

Ночью коридор подсвечивается тускло, днём — ярко. Пример choose с несколькими ветками был выше, в сценарии с триггерами id. Когда вариантов больше двух, используйте choose со списком веток conditions и sequence и необязательной веткой default.

14Повторы и переменные в действиях

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

actions:
  - repeat:
      count: 3
      sequence:
        - action: light.toggle
          target:
            entity_id: light.hallway
        - delay: "00:00:01"

Есть и вариант repeat с условием продолжения (while и until). Значения, которые вы хотите переиспользовать внутри автоматизации, объявляют блоком variables в действиях: ниже их можно подставлять шаблонами. Старайтесь не усложнять: если цепочка перестаёт помещаться на экран, разбейте её на скрипты.

15Шаблоны Jinja2 в автоматизациях

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

message: "Температура в спальне: {{ states('sensor.bedroom_temperature') }} °C"

Функция states() возвращает состояние сущности в виде строки. Проверить шаблон до сохранения можно в «Инструменты разработчика > Шаблон»: там результат пересчитывается по мере набора. Если датчик недоступен, функция вернёт unavailable или unknown, поэтому в серьёзных сценариях полезно добавлять проверку.

16Отладка автоматизации: трассировка и журнал

Автоматизация не сработала — это не повод переписывать её с нуля. В редакторе есть вкладка трассировок (в меню с тремя точками или рядом с названием, расположение зависит от версии). Она показывает, какой триггер запустил автоматизацию, какие условия прошли, а на каком шаге выполнение остановилось. Такая отладка экономит часы.

Дополнительные инструменты:

  • «Настройки > Система > Журналы» — сообщения об ошибках конфигурации и вызовов.
  • Журнал событий сущности в разделе «Логбук», где видно, когда менялось состояние датчика.
  • Кнопка запуска действий вручную в карточке автоматизации: она выполняет только блок действий, без проверки триггеров и условий.

17Готовые шаблоны: блюпринты

Если писать автоматизацию с нуля не хочется, используйте блюпринты (blueprints) — параметризованные шаблоны. Вы выбираете датчик и светильник, а логика уже готова. Раздел находится рядом с автоматизациями: «Настройки > Автоматизации и сцены > Блюпринты». Часть шаблонов идёт в комплекте, остальные можно импортировать по ссылке из сообщества (кнопка импорта на этой же вкладке; точное название зависит от версии).

  1. Откройте вкладку блюпринтов и выберите шаблон, например для света по датчику движения.
  2. Нажмите создание автоматизации из блюпринта.
  3. Заполните поля: сущность датчика, светильник, время ожидания.
  4. Сохраните и дайте автоматизации понятное имя.

Плюс подхода в том, что при исправлении блюпринта обновляются все основанные на нём автоматизации. Минус — меньше свободы: нестандартную логику всё равно придётся писать самому. Импортируйте только шаблоны, которым доверяете, и просматривайте их код перед использованием.

18Типичные ошибки и решения

Проблема Причина Что сделать
Автоматизация не запускается Неверный идентификатор сущности или состояние записано без кавычек Проверьте идентификатор в разделе сущностей, значения вроде "on" и "off" заключайте в кавычки
Сработала один раз, дальше молчит Режим single, а предыдущий запуск ещё ждёт Смените mode на restart или queued, либо пересмотрите ожидание
Ошибка «неизвестное действие» или «служба не найдена» Пример из старой версии или опечатка в домене Проверьте название в «Инструменты разработчика > Действия»
Условие по солнцу не выполняется Неверно задан часовой пояс или координаты дома Проверьте раздел «Настройки > Система > Общие»
Сработала по ложному триггеру Датчик «дребезжит» между состояниями Добавьте параметр for в триггер
Изменения в YAML не применяются Файл правился вручную и не перезагружен В «Инструменты разработчика > YAML» перезагрузите автоматизации или перезапустите систему
Запуск пропущен, в журнале предупреждение о работающей автоматизации Режим single, предыдущий запуск ещё не завершён Выберите подходящий mode и при необходимости задайте max
Шаблон показывает unknown или unavailable Датчик недоступен или ещё не обновился после перезапуска Добавьте проверку состояния или условие доступности датчика

Отдельно про отступы: YAML чувствителен к пробелам, табуляция недопустима. Если редактор подчёркивает строку красным, ищите смещённый пробел или забытое двоеточие. Кавычки вокруг значений со специальными символами, в частности вокруг шаблонов в одну строку, также спасают от лишних ошибок.

19Идеи для первых автоматизаций

  • Свет в коридоре или санузле по движению с выключением через пару минут тишины.
  • Вытяжка в ванной по влажности с разными порогами включения и выключения.
  • Сообщение о протечке или об открытом окне при понижении температуры.
  • Отключение света при выходе последнего человека из дома.
  • Вечерний свет за полчаса до заката.
  • Предупреждение о низком заряде батарей датчиков.
  • Утренний сценарий по будням с прогнозом в уведомлении.

20Как не запутаться: организация и безопасность

  • Давайте автоматизациям имена с префиксом комнаты или темы: «Коридор: свет по движению», «Безопасность: протечка». Заполняйте описание.
  • Одна автоматизация — одна задача. Общие последовательности выносите в скрипты, общие переключатели вроде «Режим отпуска» — во вспомогательные элементы (helpers).
  • Делайте резервную копию перед крупными правками.
  • Не доверяйте критичные действия (отопление, подача воды, замки) одной автоматизации, проверенной на единственной лампе. Сначала проверьте поведение при перезапуске системы и пропадании интернета, а ответственные узлы дублируйте аппаратной защитой.

21Пример: утренний сценарий с проверкой присутствия

Соберём автоматизацию, объединяющую всё изученное. В будний день в 7:00 включается свет на кухне и приходит сообщение с прогнозом, но только если кто-то дома.

alias: "Утро: кухня и сообщение"
mode: single
triggers:
  - trigger: time
    at: "07:00:00"
conditions:
  - condition: time
    weekday:
      - mon
      - tue
      - wed
      - thu
      - fri
  - condition: state
    entity_id: person.ivan
    state: "home"
actions:
  - action: light.turn_on
    target:
      entity_id: light.kitchen
    data:
      brightness_pct: 70
  - action: notify.mobile_app_ivan_phone
    data:
      message: "Доброе утро. На улице {{ states('sensor.outdoor_temperature') }} °C"

Обратите внимание, что условия в списке объединяются по «И»: сработает автоматизация, только если выполнены оба. Если нужна логика «ИЛИ», используйте условие or со вложенным списком условий. Такой подход позволяет описывать довольно сложные сценарии, не уходя в шаблоны.

22Итог

Автоматизация в Home Assistant — это связка «триггер, условие, действие», а скрипт — отдельная именованная последовательность, которую можно вызывать откуда угодно. Начните с одного-двух простых сценариев: свет по движению и уведомление о протечке. Проверьте их через трассировку, научитесь читать YAML, затем добавляйте ветвления и шаблоны. Когда в доме накопится десяток автоматизаций, вы сами увидите, какие повторяющиеся куски стоит вынести в скрипты. Самое важное — двигаться небольшими шагами и проверять результат на каждом из них.

Вопросы и ответы

Чем автоматизация отличается от скрипта в Home Assistant?

Автоматизация запускается сама по триггеру, скрипт ждёт вызова: вручную, из автоматизации, с карточки или голосом. Скрипт удобно использовать для повторяющихся последовательностей действий.

Почему автоматизация сработала один раз и больше не запускается?

Чаще всего предыдущий запуск ещё выполняется (например, ждёт), а режим стоит single. Смените mode на restart или queued либо пересмотрите ожидание.

Нужно ли знать YAML, чтобы создавать автоматизации?

Нет, основные сценарии собираются в визуальном редакторе. YAML полезен для точной настройки, копирования примеров из интернета и сложных сценариев.

Как узнать, почему автоматизация не сработала?

Откройте трассировку в редакторе: она покажет, какой триггер запустил сценарий, какие условия прошли и на каком шаге выполнение остановилось.

Что выбрать: сцену, скрипт или автоматизацию?

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

Старые примеры с platform и service ещё работают?

Старый формат пока читается, но в новых автоматизациях лучше использовать triggers, conditions, actions, trigger: state и action: light.turn_on. При копировании примеров с форумов просто замените названия ключей.

Остались вопросы?

Задайте свой — после модерации он появится на форуме, ответить сможет редакция и другие читатели.

Войдите, чтобы задать вопрос или ответить другим.