Управление релейными выходами: свет, розетки, клапаны
Принципы работы релейных выходов контроллеров HI
Релейные выходы являются ключевым элементом для управления силовыми нагрузками в любой системе автоматизации. Они позволяют слаботочной электронике контроллера коммутировать цепи с высоким напряжением и током, такие как освещение, розетки, насосы и клапаны.
> ⚠️ Внимание: Всегда сверяйтесь с технической документацией на конкретную модель контроллера HI, чтобы не превысить максимально допустимый ток коммутации реле. Превышение этого параметра может привести к «залипанию» контактов, их обгоранию и необратимому выходу реле из строя.
Что такое реле и "сухой контакт"
Реле — это электромеханическое устройство, работающее по принципу выключателя, который управляется не рукой человека, а электрическим сигналом. Внутри реле находится электромагнитная катушка и группа механических контактов. Когда контроллер подает небольшой ток на катушку, создаваемое магнитное поле замыкает или размыкает силовые контакты, через которые протекает основной ток нагрузки.Ключевое понятие, связанное с релейными выходами контроллера, — это "сухой контакт" (Dry Contact). Этот термин означает, что контакты реле (C, NO, NC) гальванически изолированы от внутренней схемы самого контроллера. На них нет никакого напряжения от контроллера. Вы, как инженер, подводите к ним внешнее напряжение, которое необходимо коммутировать. Это обеспечивает гибкость (можно коммутировать как 230В переменного тока, так и 24В постоянного) и безопасность, защищая электронику контроллера от проблем в силовой цепи.
Разница между NO и NC контактами
Большинство реле, используемых в контроллерах HI, имеют три вывода для подключения нагрузки:
- C (Common) — Общий контакт. На него обычно подается входящая фаза (L) или "+".
- NO (Normally Open) — Нормально-открытый контакт. В обесточенном состоянии реле (когда с контроллера не подан сигнал) этот контакт разомкнут с контактом C. Цепь разорвана, нагрузка выключена. При подаче сигнала реле срабатывает, и контакты C и NO замыкаются.
- NC (Normally Closed) — Нормально-закрытый контакт. В обесточенном состоянии реле этот контакт, наоборот, замкнут с контактом C. Цепь замкнута, нагрузка включена. При срабатывании реле контакты C и NC размыкаются.
| Контакт | Состояние реле ВЫКЛ | Состояние реле ВКЛ | Типовое применение |
| :------ | :------------------ | :----------------- | :--------------------------------------------------------------- |
| NO | Цепь разорвана | Цепь замкнута | Освещение, розетки, стандартные нагреватели (включить при подаче сигнала). |
| NC | Цепь замкнута | Цепь разорвана | Аварийные системы, электромагнитные замки (отключить при подаче сигнала). |
Для большинства задач автоматизации (управление светом, розетками) используется NO контакт.
Типы нагрузок и их влияние на реле
Долговечность реле напрямую зависит от типа нагрузки, которую оно коммутирует.
Для индуктивных и емкостных нагрузок производители контроллеров всегда указывают пониженный максимальный ток коммутации. Например, если для резистивной нагрузки указано 16А, то для индуктивной это значение может быть снижено до 8А или даже меньше.
Технические характеристики релейных выходов на контроллерах HI
Контроллеры платформы HI оснащены 22 релейными выходами. Типовые характеристики (всегда уточняйте в паспорте на конкретное устройство):
- Коммутируемое напряжение: до 250V AC / 30V DC
- Максимальный ток (резистивная нагрузка): 16А
- Максимальный ток (индуктивная нагрузка, cos φ = 0.4): 8А
- Ресурс: > 100 000 срабатываний при номинальной нагрузке.
- Тип контактов: 1-полюсный, с выводами C и NO.
---
Обзор и настройка узла 'hi-output-do'
бзор и настройка узла 'hi-output-do'
Для управления физическими релейными выходами контроллера в среде Node-RED используется специализированный узел `hi-output-do` из палитры `node-red-contrib-hi-platform`. Этот узел является мостом между вашими логическими потоками (flows) и реальным оборудованием.
> ⚠️ Важно: Если вы не видите узлов в секции "HI Platform", убедитесь, что в системе установлена библиотека `node-red-contrib-hi-platform`. Установка производится через Menu -> Manage palette -> Install, где в поиске нужно ввести название пакета. Без этого специфические узлы контроллера будут недоступны.
> 💡 Подсказка: Для проектов с несколькими контроллерами или сложной топологией используйте префиксы в именах узлов для быстрой идентификации. Например, `1F_Living_Light` для света в гостиной на первом этаже, а `Basement_Pump` для насоса в подвале. Это значительно упрощает навигацию и отладку.
Добавление узла на палитру Node-RED
Узел `hi-output-do` находится в левой панели редактора Node-RED, в секции "HI Platform". Чтобы использовать его, просто перетащите узел на рабочее поле. Он имеет один вход для приема команд и один выход для обратной связи о состоянии.
[Input] ---- (hi-output-do) ---- [Output]
Панель конфигурации узла
Двойной клик по узлу открывает панель его настроек. Рассмотрим основные параметры:
Параметр 'Начальное состояние при развертывании' (Initial State on Deploy)
Этот параметр критически важен для обеспечения предсказуемого и безопасного поведения системы после развертывания (нажатия кнопки Deploy) или после перезагрузки контроллера. Он определяет, в какое состояние должно перейти реле в момент инициализации потока.
- `leave current state` (оставить текущее состояние): Узел не будет изменять состояние реле при развертывании. Это полезно, если вы не хотите, чтобы свет мигал при обновлении логики. Однако это может привести к рассинхронизации, если вы не используете механизмы сохранения состояния (State Persistence).
- `turn ON` (включить): При каждом развертывании узел отправит команду на включение реле. Используется редко, в основном для оборудования, которое должно быть гарантированно включено (например, система вентиляции).
- `turn OFF` (выключить): При каждом развертывании узел отправит команду на выключение реле. Это наиболее безопасный и рекомендуемый выбор для большинства применений (свет, розетки). Он гарантирует, что после обновления логики или перезапуска контроллера все управляемые нагрузки перейдут в безопасное выключенное состояние, предотвращая лишний расход энергии или потенциально опасные ситуации.
Именование узлов
Поддержание чистоты и порядка в проекте Node-RED начинается с правильного именования. При работе с десятками релейных выходов хаотичные имена превращают проект в нечитаемый лабиринт.
Плохо:- `hi-output-do`
- `реле`
- `выход 5`
- `[RL-05] Свет: Гостиная (основной)`
- `[RL-12] Розетки: Кухня (рабочая зона)`
- `[RL-21] Клапан: Полив (зона 1)`
Использование префикса с номером реле `[RL-XX]` позволяет быстро сопоставить узел в Node-RED с физической клеммой на контроллере во время монтажа или диагностики.
Базовое управление: команды ON, OFF, TOGGLE
азовое управление: команды ON, OFF, TOGGLE
Узел `hi-output-do` принимает управляющие команды через входящий объект `msg`. Основным свойством для передачи команд является `msg.payload`. Узел разработан так, чтобы понимать команды в нескольких удобных форматах.
> ⚠️ Важно: Если в вашей палитре Node-RED отсутствуют узлы серии `hi-`, установите их через меню Manage palette* (поиск по названию `node-red-contrib-hi-controller`) или следуйте инструкциям по установке зависимостей в Вводном уроке курса.
| Тип данных `msg.payload` | Значение для ВКЛЮЧЕНИЯ | Значение для ВЫКЛЮЧЕНИЯ | Специальная команда |
| :----------------------- | :--------------------- | :---------------------- | :------------------ |
| Boolean | `true` | `false` | - |
| Number | `1` | `0` | - |
| String | `"ON"`, `"on"` | `"OFF"`, `"off"` | `"TOGGLE"`, `"toggle"` |
- Boolean (`true`/`false`): Наиболее предпочтительный и "чистый" программный способ. Он однозначен и не зависит от регистра букв.
- Number (`1`/`0`): Удобен при интеграции с системами, которые используют числовые значения для представления состояний.
- String (`"ON"`/`"OFF"`): Часто используется для читаемости или при получении команд из текстовых протоколов, например, MQTT.
- Команда `"TOGGLE"`: Это очень полезная команда, которая инвертирует текущее состояние реле. Если реле было включено, `TOGGLE` его выключит. Если было выключено — включит. Это идеально подходит для логики работы с настенными кнопочными выключателями без фиксации, где каждое нажатие должно менять состояние света.
Практический пример: ручное управление лампой
Создадим простой поток для тестирования управления релейным выходом №8, к которому подключена настольная лампа.
ASCII-схема потока:[Inject: ON] --------+
|
[Inject: OFF] -------+---> [hi-output-do: RL-08 Лампа] ---> [Debug: Состояние]
|
[Inject: TOGGLE] ----+
Пошаговая инструкция:
* Channel: `8`
* Initial State on Deploy: `turn OFF`
* Name: `[RL-08] Лампа на столе`
* Payload: `boolean` `true`
* Name: `Включить (true)`
* Payload: `boolean` `false`
* Name: `Выключить (false)`
* Payload: `string` `toggle`
* Name: `Переключить (toggle)`
Теперь при нажатии на квадратик слева от узла «Включить (true)» реле №8 щелкнет, и лампа загорится. Нажатие на «Выключить (false)» ее погасит. Каждое нажатие на «Переключить (toggle)» будет изменять состояние лампы на противоположное. В панели Debug вы будете видеть сообщения об изменении состояния.
JSON-код для импорта потока:[
{
"id": "a1b2c3d4.e5f6g7",
"type": "hi-output-do",
"z": "YOUR_FLOW_ID",
"name": "[RL-08] Лампа на столе",
"controller": "local",
"channel": "8",
"initialState": "off",
"x": 450,
"y": 200,
"wires": [
[
"h8i9j0k1.l2m3n4"
]
]
},
{
"id": "b2c3d4e5.f6g7h8",
"type": "inject",
"z": "YOUR_FLOW_ID",
"name": "Включить (true)",
"props": [
{
"p": "payload"
}
],
"payload": "true",
"payloadType": "bool",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"x": 220,
"y": 160,
"wires": [
[
"a1b2c3d4.e5f6g7"
]
]
},
{
"id": "c3d4e5f6.g7h8i9",
"type": "inject",
"z": "YOUR_FLOW_ID",
"name": "Выключить (false)",
"props": [
{
"p": "payload"
}
],
"payload": "false",
"payloadType": "bool",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"x": 220,
"y": 200,
"wires": [
[
"a1b2c3d4.e5f6g7"
]
]
},
{
"id": "d4e5f6g7.h8i9j0",
"type": "inject",
"z": "YOUR_FLOW_ID",
"name": "Переключить (toggle)",
"props": [
{
"p": "payload"
}
],
"payload": "toggle",
"payloadType": "str",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"x": 230,
"y": 240,
"wires": [
[
"a1b2c3d4.e5f6g7"
]
]
},
{
"id": "h8i9j0k1.l2m3n4",
"type": "debug",
"z": "YOUR_FLOW_ID",
"name": "Состояние реле",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 700,
"y": 200,
"wires": []
}
]
Получение обратной связи и синхронизация состояния
Надежная система автоматизации никогда не работает «вслепую». Она всегда должна знать реальное состояние управляемых устройств. Узел `hi-output-do` реализует этот принцип, отправляя на свой выход сообщение с актуальным статусом реле после каждой успешной коммутации.
> 🔗 Связанный материал: Принципы работы со структурой объекта `msg`, его свойствами `payload`, `topic` и другими, подробно разбирались в уроке `COURSE-06-M03-L02: Структура объекта msg и работа с JSON`.
Структура исходящего сообщения от узла 'hi-output-do'
После того как узел `hi-output-do` выполнил команду, он формирует новый объект `msg` и отправляет его на свой выход. Это сообщение содержит информацию о том, что произошло.
Контракт сообщения обратной связи:{
"payload": {
"channel": 8,
"state": true,
"timestamp": 1678886400000
},
"topic": "hi-output-do/8/state",
"_msgid": "..."
}
Разберем `msg.payload`:
- `channel` (Number): Номер физического канала реле, которым управлял узел. Например, `8`.
- `state` (Boolean): Итоговое состояние реле после выполнения команды. `true` — включено, `false` — выключено.
- `timestamp` (Number): Временная метка в формате Unix epoch (ms), когда произошло изменение.
Важность обратной связи
Получение этой информации критически важно для нескольких задач:
Пример flow для логирования изменений
Давайте расширим предыдущий пример, добавив логирование состояния. Мы будем использовать узел `Function` для формирования человекочитаемой строки.
ASCII-схема:[hi-output-do] ---> [Function: Формат лога] ---> [Debug: Лог]
Конфигурация узла `Function`:
- Name: `Формат лога`
- Код:
// msg.payload от узла hi-output-do:
// { channel: 8, state: true, timestamp: ... }
let channel = msg.payload.channel;
let state = msg.payload.state;
let statusText = state ? "ВКЛЮЧЕНО" : "ВЫКЛЮЧЕНО";
let logMessage = `Реле №${channel} переведено в состояние: ${statusText}`;
// Заменяем payload на нашу строку для вывода в Debug
msg.payload = logMessage;
// В реальном проекте здесь мог бы быть код для записи в MySQL
// или отправки сообщения в системный лог.
return msg;
Теперь, при каждом изменении состояния реле, в панели Debug вы будете видеть не просто объект `{...}`, а понятное сообщение: `Реле №8 переведено в состояние: ВКЛЮЧЕНО`.
---
Практический пример: управление розеткой по таймеру
Одна из самых частых задач в автоматизации — включить какое-либо устройство на определенное время. Например, включить обогреватель в холодной комнате на 30 минут или активировать насос для полива газона на 1 час. Эту логику легко реализовать с помощью узла `Trigger`.
Постановка задачи
Необходимо создать поток, который по нажатию кнопки включает нагрузку, подключенную к розетке (реле №15), ровно на 5 минут, после чего автоматически ее выключает.
Использование узла 'Trigger' для создания задержки
Узел `Trigger` — мощный инструмент для создания временных последовательностей. Он может отправлять одно сообщение, ждать указанное время, а затем отправлять другое.
Основные настройки `Trigger`:- Send: Что отправить сразу после получения входящего сообщения.
- then wait for: Сколько времени ждать.
- then send: Что отправить по истечении времени ожидания.
Построение цепочки
Мы построим поток, который разделяет логику на два этапа: немедленное включение и отложенное выключение.
ASCII-схема потока: +-> [Change: payload=ON] --> [hi-output-do: RL-15]
|
[Inject: Start Timer] ---+
|
+-> [Trigger: 5 min] -> [Change: payload=OFF] -> [hi-output-do: RL-15]
Пошаговая инструкция:
* Rules: `Set` `msg.payload` `to` `true` (boolean)
* Send: `nothing`.
* then wait for: `5` `minutes`.
* then send: `string` `OFF`. (Мы отправим команду на выключение прямо из `Trigger`).
- Нажатие на `Inject` отправляет сообщение одновременно по двум путям.
- Верхний путь: `msg` немедленно проходит через `Change` (где `payload` становится `true`) и включает реле. Обогреватель начинает работать.
- Нижний путь: `msg` попадает в `Trigger`. Узел ничего не отправляет сразу, а просто запускает свой внутренний таймер на 5 минут.
- Через 5 минут `Trigger` "просыпается" и отправляет новое сообщение с `payload`, равным `"OFF"`. Это сообщение приходит на вход `hi-output-do` и выключает реле.
[
{
"id": "e1f2g3h4.i5j6k7",
"type": "inject",
"z": "YOUR_FLOW_ID",
"name": "Включить обогреватель на 5 мин",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"payload": "",
"payloadType": "date",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"x": 190,
"y": 420,
"wires": [
[
"f2g3h4i5.j6k7l8",
"h4i5j6k7.l8m9n0"
]
]
},
{
"id": "g3h4i5j6.k7l8m9",
"type": "hi-output-do",
"z": "YOUR_FLOW_ID",
"name": "[RL-15] Обогреватель",
"controller": "local",
"channel": "15",
"initialState": "off",
"x": 640,
"y": 460,
"wires": [
[]
]
},
{
"id": "f2g3h4i5.j6k7l8",
"type": "change",
"z": "YOUR_FLOW_ID",
"name": "payload = ON",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "true",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 420,
"y": 380,
"wires": [
[
"g3h4i5j6.k7l8m9"
]
]
},
{
"id": "h4i5j6k7.l8m9n0",
"type": "trigger",
"z": "YOUR_FLOW_ID",
"name": "Ждать 5 минут",
"op1": "",
"op2": "OFF",
"op1type": "nul",
"op2type": "str",
"duration": "5",
"extend": false,
"overrideDelay": false,
"units": "min",
"reset": "",
"bytopic": "all",
"topic": "topic",
"outputs": 1,
"x": 430,
"y": 460,
"wires": [
[
"g3h4i5j6.k7l8m9"
]
]
}
]
---
Итоги и лучшие практики
В этом уроке мы рассмотрели основы управления физическими релейными выходами контроллера HI с помощью Node-RED. Вы научились не только отправлять команды, но и получать обратную связь, а также строить простые, но полезные сценарии автоматизации.
Краткий обзор форматов команд
Для управления узлом `hi-output-do` используйте `msg.payload`:
- Включение: `true` (boolean), `1` (number), `"ON"` (string).
- Выключение: `false` (boolean), `0` (number), `"OFF"` (string).
- Инвертирование: `"TOGGLE"` (string).
Наиболее надежным и программно-корректным является использование типа boolean (`true`/`false`).
Рекомендации по настройке узла
- Именование: Всегда давайте узлам осмысленные имена, включающие номер канала и назначение, например, `[RL-01] Свет: Коридор`.
- Начальное состояние: В 99% случаев устанавливайте `Initial State on Deploy` в положение `turn OFF`. Это самый безопасный вариант, который предотвращает нежелательную активацию нагрузок при перезапуске системы.
Советы по структурированию flows
По мере роста проекта вы заметите, что логика управления однотипными устройствами (например, группами света) повторяется. Как мы уже обсуждали в рамках модуля по архитектуре потоков, повторяющуюся логику следует выносить в подпотоки (subflows). Вы можете создать subflow «Управление Светом», который будет содержать узел `hi-output-do`, логику для команды `TOGGLE`, а также узел для записи в лог. Такой подход значительно упростит поддержку и модификацию проекта.
Что дальше?
Мы освоили дискретное управление "включено/выключено". Однако многие системы требуют плавного регулирования: яркости света, скорости вентилятора, степени открытия клапана. Для этого используются аналоговые выходы. В следующем уроке мы подробно разберем, как работать с аналоговыми выходами 0-10В на контроллере HI и управлять диммируемыми светильниками и другим оборудованием.