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

Цель и необходимость

После того как запустил сервис по управлению умным домом, настроил координатор по управлению умным домом и добавил первые устройства возникает следующий вопрос: «А как писать автоматизации?»

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

В самом сервисе по управлению умным домом есть функционал для написания автоматизаций, но он имеет ряд неудобств (мое личное субъективное мнение):

  1. Не всегда очевидно какие шаги выполняются и какая их последовательность.

  2. Часто нужно лезть в YAML и что-то там редактировать.

  3. Довольно сложно проводить отладку.

Посмотрел какие решения для создания автоматизаций в умном дому еще существуют и нашел Node-RED и мне оно понравилось. Все существующие автоматихации я перевел в Node-RED, а новые реализую уже там. Вот какая таблица сравнения у меня получилась в итоге:

Критерий/Продукт

Home Assistant (YAML)

Node-RED

Сложность автоматизаций

Средняя (требует знания YAML)

Низкая (визуальный редактор)

Отладка

Через логи

Интерактивная (debug-узлы)

Расширяемость

Ограничена интеграциями HA

Неограниченная (JavaScript, HTTP-запросы)

Поддержка устройств

Зависит от драйверов HA

Любые протоколы через узлы

docker-compose

Создаем файлы и папки:

mkdir config_nodered
touch docker-compose.yml

Вставляем данные через nano docker-compose.yml:

services:
  nodered:
    container_name: nodered
    image: nodered/node-red
    restart: unless-stopped
    ports:
      - "1880:1880/tcp"
    environment:
      - TZ=Europe/Moscow
    volumes:
      - ./config_nodered/data:/data

Если есть ошибки с правами, то выполнить:

sudo chown -R 1000:1000 config_nodered

Зайти в UI Node-RED можно по адресу: http://<your_ip>:1880. При желании данный адрес возможно вынести в отдельную панель Home Assistant (далее HA).

Подключение Node-RED к HA

  1. Через HACS устанавливаем пользовательскую интеграцию Node-RED Companion.

  2. Настройки -> Устройства и службы -> Добавить интеграцию -> Выбираем «Node-RED Companion» -> Подтверждаем создание записи.

  3. Переходим в интерфейс Node-RED -> Нажимаем на правый верхний угол с 3 горизонтальными линями -> Управление палитрой -> Установить -> node-red-contrib-home-assistant-websocket.

  4. Переходим в интерфейс Нomeassistant -> Пользователь -> Безопасность -> Создать токен -> Вводим имя токена -> Копируем токен.

  5. Переходим в интерфейс Node-RED -> Из палитры выбираем любой элемент Homeassistant и добавляем сервер:

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

После создания нескольких автоматизаций становится все очевидно, но первые автоматизации могут вызвать сложности. Для демонстрации будем использовать существующий «Список дел» (или «Список покупок»). Сделаем следующее: при любом изменении этого списка будем отправлять уведомление в HA. Node-RED способен выгружать и загружать автоматизации в формате json:

[
    {
        "id": "ace9581cbc0dbc5a",
        "type": "server-state-changed",
        "z": "f8db406c76f1b564",
        "name": "Список покупок изменился?",
        "server": "34cfe959cfbed267",
        "version": 6,
        "outputs": 1,
        "exposeAsEntityConfig": "",
        "entities": {
            "entity": [
                "todo.shopping_list"
            ],
            "substring": [],
            "regex": []
        },
        "outputInitially": false,
        "stateType": "str",
        "ifState": "",
        "ifStateType": "str",
        "ifStateOperator": "is",
        "outputOnlyOnStateChange": true,
        "for": "0",
        "forType": "num",
        "forUnits": "minutes",
        "ignorePrevStateNull": false,
        "ignorePrevStateUnknown": false,
        "ignorePrevStateUnavailable": false,
        "ignoreCurrentStateUnknown": false,
        "ignoreCurrentStateUnavailable": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "eventData"
            },
            {
                "property": "topic",
                "propertyType": "msg",
                "value": "",
                "valueType": "triggerId"
            }
        ],
        "x": 240,
        "y": 180,
        "wires": [
            [
                "8b3b40ac9bf99d9b",
                "c534d9b4df66eb6c"
            ]
        ]
    },
    {
        "id": "8b3b40ac9bf99d9b",
        "type": "api-call-service",
        "z": "f8db406c76f1b564",
        "name": "Отпрпавляем уведомление в HA",
        "server": "34cfe959cfbed267",
        "version": 7,
        "debugenabled": false,
        "action": "notify.persistent_notification",
        "floorId": [],
        "areaId": [],
        "deviceId": [],
        "entityId": [],
        "labelId": [],
        "data": "{\t    \"message\": \"Список покупок изменился\",\t    \"title\": \"Список покупок изменился\",\t    \"data\": {         \t    \"channel\": $$.payload.channel     \t    } \t}",
        "dataType": "jsonata",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [],
        "queue": "none",
        "blockInputOverrides": true,
        "domain": "notify",
        "service": "persistent_notification",
        "x": 600,
        "y": 180,
        "wires": [
            []
        ]
    },
    {
        "id": "c534d9b4df66eb6c",
        "type": "debug",
        "z": "f8db406c76f1b564",
        "name": "debug 1",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 460,
        "y": 280,
        "wires": []
    },
    {
        "id": "34cfe959cfbed267",
        "type": "server",
        "name": "Home Assistant",
        "version": 5,
        "addon": false,
        "rejectUnauthorizedCerts": true,
        "ha_boolean": "y|yes|true|on|home|open",
        "connectionDelay": true,
        "cacheJson": true,
        "heartbeat": false,
        "heartbeatInterval": 30,
        "areaSelector": "friendlyName",
        "deviceSelector": "friendlyName",
        "entitySelector": "friendlyName",
        "statusSeparator": ": ",
        "statusYear": "hidden",
        "statusMonth": "short",
        "statusDay": "numeric",
        "statusHourCycle": "default",
        "statusTimeFormat": "h:m",
        "enableGlobalContextStore": false
    },
    {
        "id": "07f92e75483a967a",
        "type": "global-config",
        "env": [],
        "modules": {
            "node-red-contrib-home-assistant-websocket": "0.77.2"
        }
    }
]

Код выше необходимо скопировать -> В рабочей области Node-RED нажать правой клавишей мыши -> Войти в контекстное меню -> Выбрать insert -> Импорт -> Вставить код из буфера обмена -> Импорт. Возможно потребуется изменение узлов в части настроек сервера HA, так как Ваши локальные настройки могут отличаться от моих. Далее редактируем «Список дел» и наблюдаем работу автоматизации:

Итог

У нас появилась возможность гибко настраивать автоматизации, отлаживать их и видеть как автоматизации выполняются (связи и последовательность).

Ссылки:

  1. Зачем нужен собственный сервер в 2025?

  2. Как установить Proxmox?

  3. Как установить Docker?

  4. Как запустить сервис по управлению умным домом?

  5. Как подключить координатор для управления IoT устройствами?