ГлавнаяАкадемияNode-RED: установка, flows, msg/JSON, отладка → Управление релейными выходами: свет, розетки, клапаны

Управление релейными выходами: свет, розетки, клапаны

Урок 2 · Node-RED: установка, flows, msg/JSON, отладка · 30 мин · theory

Принципы работы релейных выходов контроллеров HI

Релейные выходы являются ключевым элементом для управления силовыми нагрузками в любой системе автоматизации. Они позволяют слаботочной электронике контроллера коммутировать цепи с высоким напряжением и током, такие как освещение, розетки, насосы и клапаны.

> ⚠️ Внимание: Всегда сверяйтесь с технической документацией на конкретную модель контроллера HI, чтобы не превысить максимально допустимый ток коммутации реле. Превышение этого параметра может привести к «залипанию» контактов, их обгоранию и необратимому выходу реле из строя.

Что такое реле и "сухой контакт"

Реле — это электромеханическое устройство, работающее по принципу выключателя, который управляется не рукой человека, а электрическим сигналом. Внутри реле находится электромагнитная катушка и группа механических контактов. Когда контроллер подает небольшой ток на катушку, создаваемое магнитное поле замыкает или размыкает силовые контакты, через которые протекает основной ток нагрузки.

Ключевое понятие, связанное с релейными выходами контроллера, — это "сухой контакт" (Dry Contact). Этот термин означает, что контакты реле (C, NO, NC) гальванически изолированы от внутренней схемы самого контроллера. На них нет никакого напряжения от контроллера. Вы, как инженер, подводите к ним внешнее напряжение, которое необходимо коммутировать. Это обеспечивает гибкость (можно коммутировать как 230В переменного тока, так и 24В постоянного) и безопасность, защищая электронику контроллера от проблем в силовой цепи.

Разница между NO и NC контактами

Большинство реле, используемых в контроллерах HI, имеют три вывода для подключения нагрузки:

| Контакт | Состояние реле ВЫКЛ | Состояние реле ВКЛ | Типовое применение |

| :------ | :------------------ | :----------------- | :--------------------------------------------------------------- |

| NO | Цепь разорвана | Цепь замкнута | Освещение, розетки, стандартные нагреватели (включить при подаче сигнала). |

| NC | Цепь замкнута | Цепь разорвана | Аварийные системы, электромагнитные замки (отключить при подаче сигнала). |

Для большинства задач автоматизации (управление светом, розетками) используется NO контакт.

Типы нагрузок и их влияние на реле

Долговечность реле напрямую зависит от типа нагрузки, которую оно коммутирует.

  • Резистивная нагрузка (Resistive Load): Самый простой тип. Ток и напряжение совпадают по фазе. Примеры: лампы накаливания, ТЭНы, обычные обогреватели. Для таких нагрузок реле может коммутировать максимальный ток, указанный в его характеристиках (например, 16А).
  • Индуктивная нагрузка (Inductive Load): Создает наибольшие проблемы для контактов реле. Примеры: двигатели, насосы, компрессоры, контакторы, дроссели люминесцентных ламп, трансформаторы. В момент отключения индуктивная нагрузка генерирует ЭДС самоиндукции, что приводит к возникновению электрической дуги между размыкающимися контактами. Эта дуга вызывает их обгорание и преждевременный износ.
  • Емкостная нагрузка (Capacitive Load): Характерна для импульсных блоков питания (LED-драйверы, зарядные устройства). В момент включения возникает очень большой, но кратковременный пусковой ток, который может в десятки раз превышать номинальный. Это может привести к свариванию (залипанию) контактов реле.
  • Для индуктивных и емкостных нагрузок производители контроллеров всегда указывают пониженный максимальный ток коммутации. Например, если для резистивной нагрузки указано 16А, то для индуктивной это значение может быть снижено до 8А или даже меньше.

    Технические характеристики релейных выходов на контроллерах HI

    Контроллеры платформы HI оснащены 22 релейными выходами. Типовые характеристики (всегда уточняйте в паспорте на конкретное устройство):

    ---

    Обзор и настройка узла '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]
    

    Панель конфигурации узла

    Двойной клик по узлу открывает панель его настроек. Рассмотрим основные параметры:

  • Controller: Выпадающий список, позволяющий выбрать целевой контроллер. В большинстве случаев здесь будет `Local Controller`, но если ваша система включает несколько сетевых контроллеров HI, вы сможете выбрать, на каком из них исполнять команду.
  • Channel: Выпадающий список для выбора физического номера релейного выхода, от `1` до `22`. Этот номер соответствует маркировке на клеммной колодке контроллера.
  • Name: Текстовое поле для присвоения узлу осмысленного имени. Это одно из самых важных полей для поддержания порядка в проекте. Вместо стандартного `hi-output-do` укажите, чем именно управляет этот выход, например, «Освещение кухни (потолок)» или «Розетка для утюга».
  • Параметр 'Начальное состояние при развертывании' (Initial State on Deploy)

    Этот параметр критически важен для обеспечения предсказуемого и безопасного поведения системы после развертывания (нажатия кнопки Deploy) или после перезагрузки контроллера. Он определяет, в какое состояние должно перейти реле в момент инициализации потока.

    Именование узлов

    Поддержание чистоты и порядка в проекте Node-RED начинается с правильного именования. При работе с десятками релейных выходов хаотичные имена превращают проект в нечитаемый лабиринт.

    Плохо: Хорошо:

    Использование префикса с номером реле `[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"` |

    Практический пример: ручное управление лампой

    Создадим простой поток для тестирования управления релейным выходом №8, к которому подключена настольная лампа.

    ASCII-схема потока:
    [Inject: ON] --------+
    

    |

    [Inject: OFF] -------+---> [hi-output-do: RL-08 Лампа] ---> [Debug: Состояние]

    |

    [Inject: TOGGLE] ----+

    Пошаговая инструкция:
  • Перетащите на поле узел `hi-output-do`. Настройте его:
  • * Channel: `8`

    * Initial State on Deploy: `turn OFF`

    * Name: `[RL-08] Лампа на столе`

  • Добавьте три узла `Inject`.
  • Настройте первый узел `Inject`:
  • * Payload: `boolean` `true`

    * Name: `Включить (true)`

  • Настройте второй узел `Inject`:
  • * Payload: `boolean` `false`

    * Name: `Выключить (false)`

  • Настройте третий узел `Inject`:
  • * Payload: `string` `toggle`

    * Name: `Переключить (toggle)`

  • Добавьте узел `Debug` и назовите его «Состояние реле».
  • Соедините выходы всех трех `Inject` узлов с входом узла `hi-output-do`.
  • Соедините выход узла `hi-output-do` с входом узла `Debug`.
  • Нажмите кнопку Deploy.
  • Теперь при нажатии на квадратик слева от узла «Включить (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`:

    Важность обратной связи

    Получение этой информации критически важно для нескольких задач:

  • Синхронизация с пользовательским интерфейсом (UI): Если пользователь включает свет через мобильное приложение, система должна получить подтверждение, что реле действительно сработало, и только после этого изменить статус иконки в приложении.
  • Логика сложных сценариев: Представьте сценарий «Выключить всё». Система отправляет команды на выключение десяткам реле. Используя обратную связь, можно убедиться, что все команды выполнены успешно.
  • Журналирование и аудит: Сообщения обратной связи идеально подходят для записи в лог или базу данных (например, MySQL на контроллере). Это позволяет впоследствии анализировать, когда и какие устройства включались/выключались, что бесценно при поиске неисправностей или анализе энергопотребления.
  • Пример flow для логирования изменений

    Давайте расширим предыдущий пример, добавив логирование состояния. Мы будем использовать узел `Function` для формирования человекочитаемой строки.

    ASCII-схема:
    [hi-output-do] ---> [Function: Формат лога] ---> [Debug: Лог]
    
    Конфигурация узла `Function`:
        // 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`:

    Построение цепочки

    Мы построим поток, который разделяет логику на два этапа: немедленное включение и отложенное выключение.

    ASCII-схема потока:
                                    +-> [Change: payload=ON] --> [hi-output-do: RL-15]
    

    |

    [Inject: Start Timer] ---+

    |

    +-> [Trigger: 5 min] -> [Change: payload=OFF] -> [hi-output-do: RL-15]

    Пошаговая инструкция:
  • Создайте узел `Inject` и назовите его «Включить обогреватель на 5 мин». Настройки `payload` не важны, он будет служить только для запуска.
  • Добавьте узел `Change`. Настройте его так, чтобы он устанавливал `msg.payload` в `boolean` `true`.
  • * Rules: `Set` `msg.payload` `to` `true` (boolean)

  • Добавьте узел `hi-output-do`, настроенный на канал `15` (`[RL-15] Обогреватель`).
  • Соедините `Inject` -> `Change` -> `hi-output-do`. Эта часть отвечает за немедленное включение.
  • Теперь вторая ветка. Добавьте узел `Trigger`.
  • * Send: `nothing`.

    * then wait for: `5` `minutes`.

    * then send: `string` `OFF`. (Мы отправим команду на выключение прямо из `Trigger`).

  • Соедините выход узла `Inject` с входом `Trigger`.
  • Соедините выход узла `Trigger` с входом того же самого узла `hi-output-do` (канал 15).
  • Нажмите Deploy.
  • Как это работает: JSON-код для импорта потока:
    [
    

    {

    "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`:

    Наиболее надежным и программно-корректным является использование типа boolean (`true`/`false`).

    Рекомендации по настройке узла

    Советы по структурированию flows

    По мере роста проекта вы заметите, что логика управления однотипными устройствами (например, группами света) повторяется. Как мы уже обсуждали в рамках модуля по архитектуре потоков, повторяющуюся логику следует выносить в подпотоки (subflows). Вы можете создать subflow «Управление Светом», который будет содержать узел `hi-output-do`, логику для команды `TOGGLE`, а также узел для записи в лог. Такой подход значительно упростит поддержку и модификацию проекта.

    Что дальше?

    Мы освоили дискретное управление "включено/выключено". Однако многие системы требуют плавного регулирования: яркости света, скорости вентилятора, степени открытия клапана. Для этого используются аналоговые выходы. В следующем уроке мы подробно разберем, как работать с аналоговыми выходами 0-10В на контроллере HI и управлять диммируемыми светильниками и другим оборудованием.