Практика: Управление тестовой лампой в Node-RED
Подготовка рабочего места и техника безопасности
> ⚠️ Внимание: Работы с напряжением ~230В смертельно опасны. Всегда отключайте вводной автомат и лично проверяйте отсутствие напряжения на всех задействованных клеммах и проводах перед началом монтажа. Не полагайтесь на то, что кто-то другой отключил питание.
Цель этого урока — объединить теоретические знания по электротехнике, полученные в предыдущих занятиях, с практическими навыками программирования в среде Node-RED. Мы пройдем полный путь от физического подключения тестовой нагрузки до создания интерактивного элемента управления в веб-интерфейсе. В качестве нагрузки будет выступать обычная лампа накаливания или светодиодная лампа на 230В, а в роли коммутирующего устройства — релейный выход контроллера.
Обзор схемы подключения
Прежде чем приступить к работе, рассмотрим, как именно наша тестовая лампа будет подключена к контроллеру. Как мы помним из урока Типы контактов реле: NO, NC, COM, реле по своей сути является управляемым выключателем. Мы будем использовать его для разрыва фазного провода, идущего к лампе.
- COM (Common): Общий контакт реле. Сюда мы подведем фазный провод (~230В) от автоматического выключателя из распределительного щита.
- NO (Normally Open): Нормально разомкнутый контакт. Этот контакт по умолчанию не соединен с COM. Он замкнется, когда на реле поступит команда "ВКЛ". От этого контакта провод пойдет к одному из контактов нашей лампы.
- NC (Normally Closed): Нормально замкнутый контакт. Мы его использовать не будем, но помним, что он, наоборот, размыкается при включении реле.
Второй контакт лампы подключается напрямую к нейтральной (N) шине. Таким образом, реле контроллера физически ставится в разрыв цепи питания лампы, управляя подачей фазы.
Принципиальная схема подключения://========= Схема подключения тестовой лампы =========
[Автоматический выключатель] [Контроллер: Релейный выход] <Тестовая лампа 230V>
(в щите) (например, K1)
ФАЗА (L) -----------------------------------> COM
NO ---------------------------> Контакт 1 (Лампа)
НЕЙТРАЛЬ (N) -------------------------------------------------------------> Контакт 2 (Лампа)
Протокол безопасности
Соблюдение техники безопасности — это не формальность, а необходимое условие сохранения вашего здоровья и жизни. Перед началом любых монтажных работ с напряжением 230В необходимо выполнить следующую последовательность действий в обязательном порядке:
Только после выполнения всех этих шагов можно быть уверенным в безопасности предстоящих работ.
---
Адресация в автоматизации: MQTT-топики реле
Если представить систему автоматизации как живой организм, то протокол MQTT (Message Queuing Telemetry Transport) будет его нервной системой. Каждое устройство, каждый датчик, каждое реле и его свойство имеют в этой системе свой уникальный адрес, который называется топик (topic). Контроллер HI (и родственные ему платформы, такие как Wirenboard) активно использует MQTT для внутреннего и внешнего взаимодействия.
Для управления реле нам важны два типа топиков: топик для отправки команды и топик для получения информации о текущем состоянии. Эта архитектура обеспечивает надежную обратную связь.
Структура MQTT-топиков контроллера
Контроллер публикует все подключенные устройства и их параметры в четко структурированном дереве топиков. Рассмотрим на примере релейного модуля `wb-mr6c` с адресом `34`:
- Устройство: `/devices/wb-mr6c_34/` — корневой топик, описывающий само устройство.
- Элемент управления (Control): `/devices/wb-mr6c_34/controls/K1` — топик, описывающий конкретное реле (первое, K1).
- Команда на управление: `/devices/wb-mr6c_34/controls/K1/on` — это специальный служебный топик. Именно сюда мы будем отправлять команду, чтобы изменить состояние реле.
Разница между топиком команды и топиком состояния
Ключевое отличие, которое необходимо понять — это направление потока данных.
| Параметр | Топик команды (`.../on`) | Топик состояния (`...`) |
| -------------------- | --------------------------------------------------------------- | ---------------------------------------------------------------------- |
| Назначение | Задать желаемое состояние (управление) | Сообщить о фактическом состоянии (мониторинг) |
| Направление | Публикация в топик (Write). Мы отправляем сообщение в него. | Подписка на топик (Read). Мы получаем сообщения из него. |
| Формат сообщения | `1` (включить), `0` (выключить) | `1` (включено), `0` (выключено) |
| Пример использования | Node-RED отправляет `1` в `.../K1/on` для включения света. | Node-RED подписывается на `.../K1` и получает `1`, когда свет включился. |
Такое разделение позволяет системе знать реальное положение дел. Например, если реле было включено не из Node-RED, а с помощью физического выключателя, подключенного к входу контроллера, топик состояния `/devices/wb-mr6c_34/controls/K1` все равно изменит свое значение на `1`, и все подписанные на него системы (включая наш интерфейс) немедленно обновят свой статус.
Данные, которые передаются в топике, называются payload (полезная нагрузка). В нашем случае, для управления реле, `msg.payload` будет содержать строковое значение `"1"` или `"0"`.
---
Практика: Создание первого потока управления в Node-RED
Теперь перейдем к самому интересному — созданию программной логики. Мы создадим простейший поток (flow), который позволит нам вручную включать и выключать нашу тестовую лампу.
> 💡 Подсказка: Всегда подключайте узел `debug` к выходам узлов, поведение которых вы хотите проверить. Настройте `debug` на отображение полного объекта `msg`, чтобы видеть не только `payload`, но и другие параметры, например, `topic`. Это — ваш главный инструмент отладки.
Необходимые узлы
Для нашей первой задачи понадобятся всего два базовых узла из левой палитры Node-RED:
- `inject`: Позволяет вручную инициировать поток, отправляя сообщение по нажатию кнопки на самом узле. Идеален для тестирования.
- `mqtt out`: Отправляет (публикует) входящее в него сообщение в указанный MQTT-топик.
Пошаговая инструкция
* Перетащите два узла `inject` на рабочее поле.
* Дважды кликните по первому. В поле `Payload` установите тип `string` (строка) и введите значение `1`. В поле `Name` напишите "Включить лампу". Нажмите "Done".
* Дважды кликните по второму узлу `inject`. Аналогично установите `Payload` в `string` со значением `0`. В поле `Name` напишите "Выключить лампу". Нажмите "Done".
* Перетащите узел `mqtt out` на рабочее поле.
* Дважды кликните по нему. В поле `Server` выберите (или настройте, если это первый раз) подключение к вашему MQTT-брокеру. Обычно это `localhost:1883` или IP-адрес контроллера.
* В поле `Topic` введите полный путь к топику команды нашего реле. Для нашего примера это: `/devices/wb-mr6c_34/controls/K1/on`.
* В поле `Name` можно задать осмысленное имя, например, "Управление лампой на кухне". Нажмите "Done".
* Соедините выход каждого из узлов `inject` со входом узла `mqtt out`. Теперь при нажатии на любой из `inject`, его `msg.payload` (`1` или `0`) будет отправлен в `mqtt out`, который, в свою очередь, опубликует это значение в заданный топик.
Визуально ваш поток должен выглядеть так: [inject: "Включить лампу" (payload: "1")] --+
|--> [mqtt out: "/devices/.../K1/on"]
[inject: "Выключить лампу" (payload: "0")] --+
* Нажмите красную кнопку `Deploy` в правом верхнем углу редактора. Это сохранит и активирует ваши изменения.
* Теперь физически подайте питание на ваш стенд.
* Нажмите на кнопку слева от узла "Включить лампу". Если все сделано правильно, вы должны услышать щелчок реле, и ваша тестовая лампа загорится!
* Нажмите на кнопку узла "Выключить лампу". Лампа должна погаснуть.
Поздравляем! Вы только что создали свою первую программу автоматизации, управляющую реальным физическим устройством.
---
Обратная связь: получение актуального состояния реле
Наш текущий поток отлично справляется с отправкой команд, но он "слеп". Он не знает, действительно ли включилась лампа. Возможно, сработал автомат защиты, лампа перегорела или команда по какой-то причине не дошла. Чтобы построить надежную систему, нам необходима обратная связь. Мы должны не только отправлять команды, но и слушать (подписываться на) сообщения о реальном состоянии устройства.
Для этого нам понадобится новый узел:
- `mqtt in`: Подписывается на указанный MQTT-топик и создает новое сообщение в Node-RED каждый раз, когда в этот топик приходит новое значение.
Принцип работы обратной связи
Когда контроллер физически меняет состояние реле (неважно, по нашей команде из Node-RED или по какой-то другой причине), он немедленно публикует новое состояние (`1` или `0`) в топик состояния. В нашем примере это `/devices/wb-mr6c_34/controls/K1`.
Узел `mqtt in`, подписанный на этот топик, мгновенно получает это сообщение от MQTT-брокера и передает его дальше в наш поток. Это позволяет нам реагировать на фактические изменения, а не на наши предположения.
Практическая проверка
Давайте увидим это в действии.
* Перетащите узел `mqtt in` на рабочее поле.
* Дважды кликните по нему. Укажите тот же сервер MQTT, что и в `mqtt out`.
* В поле `Topic` введите полный путь к топику состояния: `/devices/wb-mr6c_34/controls/K1`.
* Установите `Output` в `a parsed JSON object`, если предполагаете, что могут приходить сложные данные. Для нашего случая `auto-detect` или `a string` также подойдет.
* В поле `Name` напишите "Состояние лампы". Нажмите "Done".
* Перетащите узел `debug` на поле.
* Соедините выход узла `mqtt in` ("Состояние лампы") со входом узла `debug`.
* Нажмите `Deploy`.
* Откройте панель отладки (справа, иконка с жуком).
* Теперь снова воспользуйтесь кнопками `inject` из предыдущего шага, чтобы включить и выключить лампу.
Каждый раз, когда лампа меняет свое состояние, вы будете видеть в панели отладки новое сообщение. Если вы включили лампу, придет сообщение с `payload: "1"`. Если выключили — `payload: "0"`. Это и есть обратная связь в действии. Вы видите не то, что вы отправили, а то, что реально произошло на контроллере.
---
Пример: Создание пользовательского интерфейса (Dashboard)
Командная строка и узлы `inject` хороши для отладки, но конечному пользователю нужен простой и понятный интерфейс. Для этого в Node-RED существует замечательное дополнение — `node-red-dashboard`. Оно позволяет за считанные минуты создавать интерактивные панели управления, доступные через веб-браузер.
Мы создадим простой переключатель (тумблер), который будет и управлять лампой, и показывать ее актуальное состояние.
Необходимый узел
- `ui_switch`: Графический элемент "переключатель", который можно добавить на панель дашборда.
Создание двусторонней связи
Самая важная особенность узлов из `node-red-dashboard` — их двусторонняя природа.
- Когда пользователь в интерфейсе щелкает по переключателю, узел `ui_switch` генерирует сообщение на своем выходе. Мы можем использовать это сообщение для отправки команды.
- Когда на вход узла `ui_switch` приходит сообщение, узел меняет свое визуальное состояние (положение "Вкл" или "Выкл") в соответствии с `payload` этого сообщения.
Эта механика позволяет нам создать идеальный замкнутый контур управления и обратной связи.
Пошаговая инструкция
* Перетащите узел `ui_switch` (из секции `dashboard` в палитре) на рабочее поле.
* Дважды кликните по нему.
* Group: Настройте группу и вкладку, где будет отображаться элемент. Например, `[Default] Home`.
* On Payload: Установите `string` и значение `1`. Это то, что узел будет отправлять при включении.
* Off Payload: Установите `string` и значение `0`. Это то, что узел будет отправлять при выключении.
* Pass through `msg` if payload matches state: Уберите эту галочку, чтобы избежать зацикливания команд.
* Indicator: Можно выбрать, чтобы индикатор (`1`/ `0`) отображался рядом с переключателем.
* Label: Напишите "Свет на кухне". Нажмите "Done".
* Теперь у нас есть все компоненты:
* `ui_switch`: наш пользовательский интерфейс.
* `mqtt out`: отправщик команд.
* `mqtt in`: получатель состояния.
* Цепь управления (вперед): Соедините выход узла `ui_switch` со входом узла `mqtt out` (`/devices/.../K1/on`).
* Цепь обратной связи (назад): Соедините выход узла `mqtt in` (`/devices/.../K1`) со входом узла `ui_switch`.
Итоговая схема потока: +--------------------------------------+
| |
(Отправка команды) v |
[ui_switch] --------> [mqtt out: ".../on"] ---> (MQTT Брокер) ---+ | (Отображение состояния)
| |
v |
(Получение состояния) <--------------------- [mqtt in: "..."] <--+ |
|
|
// Физический мир |
(MQTT Брокер) ---> [Драйвер контроллера] -> [Реле K1] -> <Лампа> --------+ (Изменение состояния)
* Нажмите `Deploy`.
* Откройте интерфейс дашборда. Обычно он доступен по адресу `http://
* Вы увидите ваш переключатель. Попробуйте нажать на него. Лампа должна включиться, а сам переключатель останется в положении "Вкл". Нажмите еще раз — лампа погаснет.
* Для проверки обратной связи: используйте узел `inject` из шага 3, чтобы включить лампу. Вы увидите, как переключатель в дашборде сам перейдет в положение "Вкл", отражая реальное состояние дел.
---
Итоги и дальнейшие шаги
> 🔗 Связанный материал: В следующем уроке, `COURSE-06-M02-L01`, мы рассмотрим, как управлять не только дискретными, но и аналоговыми сигналами на примере диммирования светодиодной ленты.
В рамках этого урока мы проделали огромную практическую работу:
Вы закрепили такие ключевые понятия, как MQTT-топик, payload, обратная связь и освоили базовые узлы Node-RED, которые являются строительными блоками для подавляющего большинства проектов автоматизации.
Ограничения текущей схемы
Несмотря на работоспособность, наша схема имеет некоторые ограничения, которые важно понимать:
- Управление только Вкл/Выкл: Мы не можем регулировать яркость лампы, так как реле — это дискретное устройство.
- Отсутствие сохранения состояния: Что произойдет со светом, если контроллер перезагрузится? В текущей реализации реле, скорее всего, вернется в состояние по умолчанию (выключено), даже если свет был включен. Наша логика не запоминает последнее состояние.
- Простая логика: Мы реализовали только прямое ручное управление. В реальных проектах требуется более сложная логика: включение света по датчику движения, работа по расписанию, астрономическому таймеру и т.д.
Все эти вопросы станут темами наших следующих, более продвинутых уроков. Вы заложили прочный фундамент, на котором мы будем строить сложные и интеллектуальные системы автоматизации.