ГлавнаяАкадемияМонтаж и пусконаладка контроллера → Создание простого сценария: 'Кнопка-Свет'

Создание простого сценария: 'Кнопка-Свет'

Урок 1 · Монтаж и пусконаладка контроллера · 15 мин · theory

Введение в сценарии Node-RED

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

> 📋 Ключевые понятия:

> * Поток (Flow): В терминологии Node-RED — это отдельная вкладка в редакторе, на которой размещаются и соединяются узлы. Потоки помогают логически группировать сценарии, например, "Освещение_1_Этаж", "Климат_Гостиная", "Безопасность".

> * Сценарий (Scenario): Это конкретная логическая цепочка узлов внутри потока, решающая одну задачу автоматизации. Например, сценарий "включить свет по нажатию кнопки". Один поток может содержать несколько связанных сценариев.

> * Узел (Node): Базовый строительный блок в Node-RED. Каждый узел выполняет определенную функцию: получает сообщение, обрабатывает его и передает дальше.

Роль сценариев в автоматизации очевидна — именно они заставляют систему реагировать на события. Однако на этапе пусконаладочных работ их главная задача — служить инструментом для дымового тестирования (Smoke Test). Создавая простейший сценарий, такой как "Кнопка-Свет", мы проверяем всю цепочку от начала до конца:

  • Физический ввод: Корректно ли подключена и настроена кнопка?
  • Транспорт данных: Отправляет ли кнопка сообщение по протоколу MQTT?
  • Логика контроллера: Получает ли контроллер HI это сообщение и правильно ли его обрабатывает?
  • Управление выходом: Отправляет ли контроллер команду на реле?
  • Исполнение: Срабатывает ли реле и включается ли физическая нагрузка (лампа)?
  • Положительный результат такого теста подтверждает работоспособность всех ключевых компонентов системы.

    Обзор базового интерфейса Node-RED

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

  • Палитра (Palette): Расположена слева. Это библиотека всех доступных вам узлов, сгруппированных по категориям (input, output, function, social и т.д.). Именно отсюда мы будем перетаскивать узлы в рабочее пространство. На контроллере HI палитра уже содержит все необходимые узлы для работы с Modbus, DALI, MQTT и внутренними входами/выходами.
  • Рабочее пространство (Workspace): Центральная, самая большая область с сеткой. Здесь вы создаете потоки, размещая и соединяя узлы. Вы можете создавать новые потоки (вкладки) с помощью кнопки `+` вверху.
  • Боковая панель (Sidebar): Находится справа. У нее есть несколько вкладок:
  • * Информация (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/` |

    | `` | Направление данных: `input` (для датчиков, кнопок) или `output` (для реле, приводов). | `input` |

    | `` | Логическое расположение устройства (транслит). | `living_room/main_wall` |

    | `` | Уникальный идентификатор устройства, согласно логическому именованию (Logical Naming). | `wall_switch_1` или `light_group_ceiling` |

    | `` | Конкретный параметр или команда: `state` (состояние), `set` (команда), `click`. | `click` или `set` |

    Примеры для нашего сценария:
    • Топик кнопки: `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` (он имеет зеленую иконку).

    * Нажмите на него и, удерживая кнопку мыши, перетащите его на ваше рабочее пространство.

    * Аналогичным образом найдите узел `debug` (с иконкой жука) и разместите его на рабочем пространстве правее узла `mqtt in`.

  • ### Настройка узла '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'

  • Удалите связь между `mqtt in` и `debug`.
  • Найдите в палитре (категория `function`) узел `change` и перетащите его на рабочее пространство между узлами `mqtt in` и `debug`.
  • Соедините выход `mqtt in` с входом `change`, а выход `change` — с входом `debug`.
  • Дважды щелкните по узлу `change` для его настройки.
  • Внутри окна настройки вы увидите "Rules" (Правила). Нам нужна одна-единственная правило:
  • * В первом выпадающем списке выберите Set.

    * В поле `to` (рядом с `msg.`) введите `payload`.

    * В поле `from` (или "to the value") выберите тип `JSON` (иконка `{}`).

    * В текстовое поле введите команду, которую ожидает наше реле:

            {

    "state": "TOGGLE"

    }

  • Дайте узлу имя, например, "Сформировать команду TOGGLE".
  • Нажмите "Done".
  • Теперь ваш поток выглядит так: `[mqtt in]` -> `[change]` -> `[debug]`. Снова нажмите "Deploy".

    Теперь, когда вы нажмете физическую кнопку, в панели `debug` вы увидите уже не исходное сообщение от кнопки, а результат работы узла `change`:

    {
    

    "state": "TOGGLE"

    }

    Это именно та команда, которую мы хотим отправить на реле. Мы готовы к последнему шагу.

    ---

    Практика: Настройка 'mqtt out' и управление светом

    Мы успешно получаем сигнал от кнопки и преобразуем его в нужную команду. Осталось отправить эту команду по адресу — нашему реле.

    > ⚠️ Внимание:

    > Всегда проверяйте документацию на конечное устройство (реле, диммер). Отправка `msg.payload` в неверном формате (например, строка `"TOGGLE"` вместо JSON-объекта `{"state": "TOGGLE"}`) — самая частая и трудно диагностируемая причина отказа сценария. Устройство просто проигнорирует команду, не выдав ошибки.

    Добавление и настройка узла 'mqtt out'

  • Удалите связь узла `change` с `debug`. Узел `debug` нам больше не нужен в основной цепи, но его можно оставить в стороне или подключить параллельно для контроля.
  • Найдите в палитре узел `mqtt out` и разместите его справа от узла `change`.
  • Соедините выход узла `change` с входом узла `mqtt out`.
  • Дважды щелкните по `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", чтобы избежать неожиданного поведения.

    Методика дымового тестирования

    Теперь выполните полный цикл проверки:

  • Нажмите на физическую кнопку на стене.
  • Визуально проконтролируйте результат: свет должен включиться (или выключиться, если был включен).
  • Повторите нажатие: свет должен отработать в обратную сторону.
  • (Опционально) Мониторинг: если вы подключили узел `debug` к выходам `mqtt in` и `change`, вы можете в реальном времени видеть, как сообщение проходит по цепочке, что очень помогает в диагностике.
  • Если свет реагирует на кнопку, поздравляем! Вы успешно завершили свой первый дымовой тест. Это значит, что физический монтаж, сетевые настройки и базовая логика работают исправно.

    Что делать, если сценарий не работает?

    Если чуда не произошло, не паникуйте. Следуйте простому алгоритму диагностики:

  • Проблема на входе? Подключите узел `debug` сразу после `mqtt in` и разверните. Нажмите кнопку. Сообщение в панели отладки появляется?
  • * Нет: Проблема до Node-RED. Проверяйте MQTT-топик в настройках узла (опечатки!), настройки самой кнопки, ее питание и подключение к сети.

    * Да: Вход работает. Идем дальше.

  • Проблема в трансформации? Подключите `debug` после узла `change`. Нажмите кнопку. Сообщение на выходе `change` соответствует тому, что вы ожидали (например, `{"state": "TOGGLE"}`)?
  • * Нет: Проблема в настройках узла `change`. Дважды щелкните по нему и проверьте правила. Убедитесь, что вы меняете `msg.payload`, а не что-то другое.

    * Да: Трансформация работает. Идем дальше.

  • Проблема на выходе? На этом этапе, скорее всего, проблема в узле `mqtt out` или в самом реле.
  • * Проверьте MQTT-топик в настройках `mqtt out`. Одна опечатка, и команда улетит "в пустоту".

    * Проверьте формат `msg.payload`. Уверены ли вы, что реле ждет именно `{"state": "TOGGLE"}`? Может, оно ждет `"ON"`/`"OFF"` или `1`/`0`? Загляните в документацию на реле или его прошивку.

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

    Что дальше

    В этом уроке мы создали базовый, но критически важный для пусконаладки сценарий. Мы научились получать данные от устройств, преобразовывать их и отправлять команды исполнительным механизмам с помощью MQTT и узлов `mqtt in`, `change`, `mqtt out`.

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