Создание простого сценария: 'Кнопка-Свет'
Введение в сценарии Node-RED
После завершения монтажа и базовой настройки контроллера HI мы переходим к самому интересному — созданию логики, которая превратит набор "умных" устройств в единую автоматизированную систему. В экосистеме HI сердцем этой логики является Node-RED. В этом уроке мы создадим наш первый, но очень важный сценарий, который послужит основой для дымового тестирования объекта.
> 📋 Ключевые понятия:
> * Поток (Flow): В терминологии Node-RED — это отдельная вкладка в редакторе, на которой размещаются и соединяются узлы. Потоки помогают логически группировать сценарии, например, "Освещение_1_Этаж", "Климат_Гостиная", "Безопасность".
> * Сценарий (Scenario): Это конкретная логическая цепочка узлов внутри потока, решающая одну задачу автоматизации. Например, сценарий "включить свет по нажатию кнопки". Один поток может содержать несколько связанных сценариев.
> * Узел (Node): Базовый строительный блок в Node-RED. Каждый узел выполняет определенную функцию: получает сообщение, обрабатывает его и передает дальше.
Роль сценариев в автоматизации очевидна — именно они заставляют систему реагировать на события. Однако на этапе пусконаладочных работ их главная задача — служить инструментом для дымового тестирования (Smoke Test). Создавая простейший сценарий, такой как "Кнопка-Свет", мы проверяем всю цепочку от начала до конца:
Положительный результат такого теста подтверждает работоспособность всех ключевых компонентов системы.
Обзор базового интерфейса Node-RED
Прежде чем начать, быстро ознакомимся с тремя основными областями интерфейса Node-RED, который доступен через веб-браузер по адресу вашего контроллера:
* Информация (Information): Показывает описание и документацию по выбранному узлу. Очень полезно при изучении новых узлов.
* Отладка (Debug): Самая важная вкладка на этапе ПНР. Сюда выводятся сообщения от узла `debug`, что позволяет "видеть" данные, которые проходят через ваш сценарий.
* Конфигурация (Configuration Nodes): Показывает глобальные узлы конфигурации, такие как подключения к MQTT-брокерам или Modbus-устройствам.
Теперь, когда мы знакомы с интерфейсом, перейдем к выбору инструментов для нашего первого сценария.
---
Основные узлы (nodes) для сценария 'Кнопка-Свет'
В основе большинства сценариев на платформе HI лежит протокол MQTT. Это легковесный протокол обмена сообщениями, который идеально подходит для устройств интернета вещей. Он работает по принципу "издатель-подписчик": устройства (например, кнопки) публикуют свои состояния в определенные "каналы" (топики), а другие устройства или контроллер подписываются на эти топики, чтобы получать сообщения.
> 🔗 Связанный материал:
> Подробное описание структуры MQTT-топиков и принципов работы с ними рассматривалось в курсе "Проектирование систем автоматизации" (COURSE-02), модуль "Сетевые протоколы и интеграция" (COURSE-02-M04). Настоятельно рекомендуется повторить материал перед выполнением практической части.
Для реализации сценария "Кнопка-Свет" нам потребуются два ключевых узла из категории `network`.
Назначение узла 'mqtt in'
Узел `mqtt in` — это "ухо" вашей системы в мире MQTT. Его основная задача — подписаться на указанный MQTT-топик и слушать сообщения, появляющиеся в нем. Как только сообщение приходит, узел "ловит" его и вставляет в ваш поток Node-RED для дальнейшей обработки.
В нашем сценарии мы используем `mqtt in` для получения события от физической настенной кнопки. Когда вы нажимаете кнопку, ее прошивка формирует MQTT-сообщение (например, о типе нажатия: "одиночное", "двойное", "удержание") и отправляет его в свой уникальный топик. Наш узел `mqtt in`, подписанный на этот топик, немедленно это сообщение получит.
Назначение узла 'mqtt out'
Узел `mqtt out` — это, соответственно, "рот" вашей системы. Он берет сообщение, которое пришло к нему на вход внутри потока Node-RED, и публикует его в указанный MQTT-топик.
Исполнительные устройства, такие как релейные модули, управляющие светом, постоянно подписаны на свои командные топики. Как только узел `mqtt out` публикует в такой топик команду (например, "включить" или "переключить состояние"), реле получает ее и немедленно выполняет — замыкает или размыкает цепь, включая или выключая свет.
Структура MQTT-топиков в экосистеме HI
Для обеспечения порядка и масштабируемости, в нашей академии принят строгий стандарт именования MQTT-топиков. Это помогает избежать путаницы и упрощает отладку.
Формат топика: `hi/| Компонент | Описание | Пример |
| :------------- | :------------------------------------------------------------------------ | :---------------------------------------- |
| `hi/` | Префикс, идентифицирующий все устройства нашей экосистемы. | `hi/` |
| `
| `
| `
| `
- Топик кнопки: `hi/input/office/wall_panel_1/click` — Сюда кнопка из офиса будет публиковать события о нажатиях.
- Топик реле: `hi/output/office/ceiling_light/set` — Сюда контроллер будет отправлять команды для управления потолочным светом в офисе.
Понимание этой структуры критически важно для правильной настройки узлов.
---
Практика: Создание потока и настройка 'mqtt in'
Перейдем от теории к практике. Наша задача — создать поток, который будет слушать нашу физическую кнопку.
* В верхней части рабочего пространства Node-RED нажмите на кнопку с иконкой `+`. Появится новая вкладка с названием "Flow 1".
* Дважды щелкните по названию этой вкладки. В открывшемся окне "Edit flow" измените `Name` на что-то осмысленное, например, "Smoke Test: Освещение в офисе". Добавьте описание, если необходимо, и нажмите "Done".
* В палитре слева найдите узел `mqtt in` (он имеет зеленую иконку).
* Нажмите на него и, удерживая кнопку мыши, перетащите его на ваше рабочее пространство.
* Аналогичным образом найдите узел `debug` (с иконкой жука) и разместите его на рабочем пространстве правее узла `mqtt in`.
* Дважды щелкните по узлу `mqtt in`, чтобы открыть его панель настроек.
* Server: В поле "Server" (или "Брокер") нужно выбрать MQTT-брокер, к которому будет подключаться узел. На контроллере HI он обычно уже преднастроен. Выберите из выпадающего списка опцию вида `mqtt://localhost:1883` или с IP-адресом вашего контроллера. Если список пуст, его нужно настроить, нажав на иконку карандаша (этот процесс был рассмотрен в предыдущих модулях).
* Topic: Это самое важное поле. Здесь нужно указать полный топик, который публикует ваша кнопка. Согласно нашему стандарту, это будет что-то вроде `hi/input/office/wall_panel_1/click`. Этот топик должен точно соответствовать тому, что зашито в конфигурацию кнопки. Используйте вашу карту вводов/выводов (I/O Map) для проверки.
* QoS: Установите `1`. Это означает, что сообщение будет гарантированно доставлено как минимум один раз.
* Output: Установите `a parsed JSON object`. Это заставит Node-RED автоматически преобразовать входящую строку JSON в объект JavaScript, с которым удобнее работать.
* Name: Дайте узлу понятное имя, например, "Кнопка на стене в офисе".
* Нажмите "Done".
* Теперь соедините узлы. Наведите курсор на серый квадратик (порт вывода) на правой стороне узла `mqtt in`. Курсор превратится в карандаш. Нажмите, удерживайте и протяните линию к порту ввода на левой стороне узла `debug`.
* Нажмите большую красную кнопку "Deploy" в правом верхнем углу экрана, чтобы развернуть ваши изменения.
* Перейдите на боковую панель справа и выберите вкладку `debug` (с иконкой жука).
* Теперь подойдите к физической кнопке в офисе и нажмите ее один раз.
В панели `debug` вы должны увидеть новое сообщение. Оно будет выглядеть примерно так:
{
"action": "single",
"ts": 1678886400000
}
Это `msg.payload` — полезная нагрузка сообщения. Увидев это, вы можете быть уверены: кнопка, ее подключение и MQTT-связь с контроллером работают корректно. Это первая большая победа в дымовом тесте.
---
Обработка и трансформация сообщения
Итак, мы получили сообщение от кнопки. Но можем ли мы отправить его напрямую на реле? Скорее всего, нет. Релейный модуль, управляющий светом, ожидает команду в своем формате, например, команду переключить свое текущее состояние. Наша задача — преобразовать сообщение от кнопки в команду для реле.
Для этого можно использовать узел `function`, где пишется код на JavaScript. Но для простых преобразований существует более удобный и наглядный инструмент — узел `change`.
> 💡 Подсказка:
> Для простых сценариев "включить/выключить" узел `change` является более производительным и наглядным решением, чем узел `function`. Он не требует написания кода, его логика видна сразу на схеме, и он выполняется быстрее. Используйте `function` только для сложной логики, требующей проверок условий, циклов или вычислений.
Использование узла 'change' для трансформации
Узел `change` позволяет выполнять различные манипуляции с объектом `msg`. Его основная функция — устанавливать (`set`), изменять (`change`), перемещать (`move`) или удалять (`delete`) свойства сообщения.
Для нашего сценария нам нужно полностью заменить `msg.payload` от кнопки на новый `msg.payload` с командой для реле. Предположим, наше реле понимает команду `TOGGLE` (переключить) в виде JSON-объекта `{"state": "TOGGLE"}`.
Практика: Настройка узла 'change'
* В первом выпадающем списке выберите Set.
* В поле `to` (рядом с `msg.`) введите `payload`.
* В поле `from` (или "to the value") выберите тип `JSON` (иконка `{}`).
* В текстовое поле введите команду, которую ожидает наше реле:
{
"state": "TOGGLE"
}
Теперь ваш поток выглядит так: `[mqtt in]` -> `[change]` -> `[debug]`. Снова нажмите "Deploy".
Теперь, когда вы нажмете физическую кнопку, в панели `debug` вы увидите уже не исходное сообщение от кнопки, а результат работы узла `change`:
{
"state": "TOGGLE"
}
Это именно та команда, которую мы хотим отправить на реле. Мы готовы к последнему шагу.
---
Практика: Настройка 'mqtt out' и управление светом
Мы успешно получаем сигнал от кнопки и преобразуем его в нужную команду. Осталось отправить эту команду по адресу — нашему реле.
> ⚠️ Внимание:
> Всегда проверяйте документацию на конечное устройство (реле, диммер). Отправка `msg.payload` в неверном формате (например, строка `"TOGGLE"` вместо JSON-объекта `{"state": "TOGGLE"}`) — самая частая и трудно диагностируемая причина отказа сценария. Устройство просто проигнорирует команду, не выдав ошибки.
Добавление и настройка узла 'mqtt out'
* Server: Выберите тот же MQTT-брокер, что и в узле `mqtt in`.
* Topic: Укажите командный топик реле. Согласно нашему стандарту, это будет `hi/output/office/ceiling_light/set`. Снова сверьтесь с вашей I/O-картой.
* QoS: `1` — хороший выбор для команд управления светом.
* Retain: Установите `false`. Флаг `retain` заставляет брокер хранить последнее сообщение в топике. Если вы отправите команду `"ON"` с `retain=true`, то при каждой перезагрузке реле оно будет получать эту команду и включаться, даже если не нужно. Для командных `/set` топиков `retain` почти всегда должен быть выключен.
* Name: Дайте узлу имя, например, "Команда на реле света в офисе".
* Нажмите "Done".
Ваш финальный, рабочий сценарий "Кнопка-Свет" готов и выглядит так:
`[mqtt in: Кнопка]` -> `[change: Команда TOGGLE]` -> `[mqtt out: Реле света]`
---
Развертывание и дымовое тестирование (Smoke Test)
Финальный и самый ответственный момент. Мы разворачиваем сценарий и проверяем его в действии.
Развертывание сценария
Нажмите большую красную кнопку "Deploy" в правом верхнем углу. Node-RED отправит конфигурацию вашего потока на серверную часть, и контроллер HI немедленно начнет его исполнять.
> ℹ️ Информация:
> Кнопка "Deploy" имеет выпадающее меню. "Full" разворачивает все потоки заново. "Modified Flows" разворачивает только те вкладки, где были изменения. "Modified Nodes" — только измененные узлы. На начальном этапе рекомендуется использовать "Full" или "Modified Flows", чтобы избежать неожиданного поведения.
Методика дымового тестирования
Теперь выполните полный цикл проверки:
Если свет реагирует на кнопку, поздравляем! Вы успешно завершили свой первый дымовой тест. Это значит, что физический монтаж, сетевые настройки и базовая логика работают исправно.
Что делать, если сценарий не работает?
Если чуда не произошло, не паникуйте. Следуйте простому алгоритму диагностики:
* Нет: Проблема до Node-RED. Проверяйте MQTT-топик в настройках узла (опечатки!), настройки самой кнопки, ее питание и подключение к сети.
* Да: Вход работает. Идем дальше.
* Нет: Проблема в настройках узла `change`. Дважды щелкните по нему и проверьте правила. Убедитесь, что вы меняете `msg.payload`, а не что-то другое.
* Да: Трансформация работает. Идем дальше.
* Проверьте MQTT-топик в настройках `mqtt out`. Одна опечатка, и команда улетит "в пустоту".
* Проверьте формат `msg.payload`. Уверены ли вы, что реле ждет именно `{"state": "TOGGLE"}`? Может, оно ждет `"ON"`/`"OFF"` или `1`/`0`? Загляните в документацию на реле или его прошивку.
* Проверьте физическое подключение самого реле и световой группы, как мы рассматривали в модулях по монтажу.
Что дальше
В этом уроке мы создали базовый, но критически важный для пусконаладки сценарий. Мы научились получать данные от устройств, преобразовывать их и отправлять команды исполнительным механизмам с помощью MQTT и узлов `mqtt in`, `change`, `mqtt out`.
В следующем уроке мы усложним задачу: научимся работать с диммированием (плавным управлением яркостью) и добавим в наши сценарии таймеры и задержки для реализации более продвинутой логики автоматизации.