Как запустить сервис для создания автоматизаций в умном доме?
Цель и необходимость
После того как запустил сервис по управлению умным домом, настроил координатор по управлению умным домом и добавил первые устройства возникает следующий вопрос: «А как писать автоматизации?»
Автоматизация в умном доме — это программно реализованный процесс, при котором одна или несколько сущностей (устройства, сервисы, сенсоры) инициируют или выполняют действие других сущностей автоматически, без необходимости ручного вмешательства пользователя, на основе заранее заданных правил (триггеров, условий и действий).
В самом сервисе по управлению умным домом есть функционал для написания автоматизаций, но он имеет ряд неудобств (мое личное субъективное мнение):
Не всегда очевидно какие шаги выполняются и какая их последовательность.
Часто нужно лезть в YAML и что-то там редактировать.
Довольно сложно проводить отладку.
Посмотрел какие решения для создания автоматизаций в умном дому еще существуют и нашел 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
Через HACS устанавливаем пользовательскую интеграцию Node-RED Companion.
Настройки -> Устройства и службы -> Добавить интеграцию -> Выбираем «Node-RED Companion» -> Подтверждаем создание записи.
Переходим в интерфейс Node-RED -> Нажимаем на правый верхний угол с 3 горизонтальными линями -> Управление палитрой -> Установить -> node-red-contrib-home-assistant-websocket.
Переходим в интерфейс Нomeassistant -> Пользователь -> Безопасность -> Создать токен -> Вводим имя токена -> Копируем токен.
Переходим в интерфейс 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, так как Ваши локальные настройки могут отличаться от моих. Далее редактируем «Список дел» и наблюдаем работу автоматизации:
Итог
У нас появилась возможность гибко настраивать автоматизации, отлаживать их и видеть как автоматизации выполняются (связи и последовательность).
Ссылки: