Проверка входов в Node-RED
Введение: от «железа» к «софту»
На предыдущих уроках этого модуля мы подробно рассмотрели физический аспект подключения различных устройств к универсальным входам контроллера HI: от простых выключателей до сложных аналоговых датчиков. Мы meticulously следовали стандартам схем подключения, использовали правильную цветовую кодировку и обеспечивали надежность каждого контакта. Однако корректный монтаж — это лишь половина дела. Физически подключенное устройство остается «немым» для системы до тех пор, пока мы не научимся «слышать» его сигналы на программном уровне.
Этот урок — мост между миром физических проводов и миром программной логики. Наша основная задача — убедиться, что каждый сигнал, приходящий на клеммы контроллера, корректно считывается, оцифровывается и становится доступным для дальнейшей обработки. Мы переходим от мультиметра и отвертки к нашему главному инструменту пусконаладки и диагностики — среде Node-RED.
Node-RED позволяет в реальном времени визуализировать данные, поступающие со всех входов. Это дает нам возможность мгновенно проверить результат нашей монтажной работы:- Нажатие на кнопку должно изменить состояние входа с `false` на `true`.
- Повышение температуры в помещении должно отразиться в виде растущего числового значения от датчика 1-Wire.
- Изменение освещенности должно повлечь за собой пропорциональное изменение сигнала от аналогового датчика.
---
Узел `hi-input`: чтение данных с входов
Для взаимодействия с физическими входами контроллера в среде Node-RED существует два основных подхода. Первый, и наиболее предпочтительный для инсталляторов, — использование специализированных узлов из палитры `node-red-contrib-hi`. Второй, более универсальный, — работа с системными MQTT-топиками.
Специализированный узел `hi-input`
Этот узел разработан специально для упрощения работы с аппаратными возможностями контроллера HI. Он инкапсулирует всю сложность взаимодействия с драйверами и предоставляет простой графический интерфейс для настройки.
Ключевые особенности узла `hi-input`:При двойном клике на узел `hi-input` открывается окно его свойств, где необходимо настроить следующие параметры:
- Name: Понятное имя узла, отражающее его функцию (например, "Датчик движения в коридоре").
- Input: Номер физического входа (UI) контроллера, к которому подключено устройство.
- Signal Type: Тип сигнала, который вы ожидаете получить. Это критически важный параметр, определяющий режим работы входа. Возможные значения:
* `1-Wire Sensor` — для датчиков температуры DS18B20. Потребуется указать уникальный адрес датчика на шине.
* `Analog 0-10V` — для датчиков с аналоговым выходом 0-10В.
- Polling Interval: Частота опроса (для аналоговых и 1-Wire датчиков), определяющая, как часто узел будет считывать новые данные.
Альтернативный метод: узел `mqtt in`
Под капотом архитектуры контроллера HI лежит MQTT-брокер, который служит центральной шиной обмена сообщениями между всеми системными сервисами. Драйверы, отвечающие за работу с физическими входами, публикуют их состояния в строго определенные MQTT-топики. Это позволяет получить доступ к данным с любого входа, просто подписавшись на нужный топик.
Стандартная структура MQTT-топика для состояния входа выглядит так:
`hi/
Где:
- `
`: Уникальный серийный номер вашего контроллера (например, `SN-ABCDEF123456`). - `
`: Тип входа (`discrete`, `1wire`, `analog`). - `
`: Порядковый номер входа (например, `1`, `2`, ... `22`).
- `hi/SN-ABCDEF123456/inputs/discrete/5/state` — состояние дискретного входа №5.
- `hi/SN-ABCDEF123456/inputs/1wire/9_28-01234567abcd/state` — состояние датчика 1-Wire на входе №9 с адресом `28-01234567abcd`.
> 💡 Подсказка: Используйте wildcard `+` в MQTT-подписке, чтобы сразу отлаживать все входы одного типа. Например, подписка на топик `hi/SN-ABCDEF123456/inputs/discrete/+/state` в узле `mqtt in` позволит вам получать сообщения от всех дискретных входов одновременно. Это невероятно удобно на этапе пусконаладки для быстрой проверки целой группы устройств.
| Критерий | Узел `hi-input` | Узел `mqtt in` |
| :--- | :--- | :--- |
| Простота | Высокая (графический интерфейс) | Средняя (нужно знать структуру топиков) |
| Гибкость | Средняя | Высокая (можно использовать wildcards `+` и `#`) |
| Наглядность | Высокая (узел четко привязан к входу) | Низкая (один узел может получать данные из разных источников) |
| Рекомендация | Для инсталляторов и типовых задач | Для интеграторов и сложных сценариев отладки |
Для целей этого курса мы будем использовать преимущественно узел `hi-input` как более простой и наглядный инструмент.
---
Практика: проверка дискретных входов
Это первая и самая простая проверка. Мы создадим поток, который будет выводить в панель отладки состояние дискретного входа, к которому, как мы рассмотрели в уроке [COURSE-03-M05-L02], подключен выключатель или датчик движения.
Пошаговая инструкция:
* Name: Введите "Проверка выключателя Гостиная".
* Input: Выберите из списка номер входа, к которому вы физически подключили выключатель (например, `UI-1`).
* Signal Type: Установите `Discrete (Dry Contact)`.
* Нажмите Done.
[hi-input: "Проверка выключателя Гостиная"] -> [debug]
Анализ результата
Теперь сымитируйте событие. Нажмите на подключенный выключатель или помашите рукой перед датчиком движения.
В панели отладки вы увидите новое сообщение. Изначально оно может быть свернуто. Кликните на него, чтобы развернуть и увидеть полную структуру объекта `msg`. Нас интересует свойство `msg.payload`.
При замыкании "сухого контакта" (нажатии кнопки):Вы увидите сообщение, в котором `payload` будет иметь булево значение `true`.
{
"payload": true,
"topic": "hi/SN-ABCDEF123456/inputs/discrete/1/state",
"_msgid": "a1b2c3d4.e5f678"
}
При размыкании "сухого контакта" (отпускании кнопки):
Появится новое сообщение со значением `payload`, равным `false`.
{
"payload": false,
"topic": "hi/SN-ABCDEF123456/inputs/discrete/1/state",
"_msgid": "f9e8d7c6.b5a432"
}
> ℹ️ Информация: Обратите внимание, что узел `hi-input` также формирует `msg.topic`, соответствующий системному MQTT-топику для данного входа. Это полезно для дальнейшей маршрутизации и логирования.
Если вы видите, что `msg.payload` изменяется с `false` на `true` и обратно в точном соответствии с вашими действиями, тест пройден успешно. Это означает, что кабель проложен правильно, контакты надежны, а вход контроллера сконфигурирован корректно. Если состояние не меняется, вернитесь к этапу физической проверки соединений.
---
Практика: проверка датчиков температуры (1-Wire)
Теперь проверим работу датчиков температуры, подключенных к шине 1-Wire, как было описано в уроке [COURSE-03-M05-L03]. Процесс схож с проверкой дискретного входа, но есть свои нюансы.
Инструкция по созданию потока:
* Name: "Температура в спальне".
* Input: Выберите номер входа, к которому подключена шина 1-Wire (например, `UI-5`).
* Signal Type: Установите `1-Wire Sensor`.
* Address: Это самое важное поле. Система автоматически сканирует шину. Вы должны увидеть выпадающий список с уникальными 64-битными адресами всех найденных на шине датчиков (например, `28-01234567abcd`). Выберите адрес того датчика, который вы хотите опрашивать.
* Polling Interval: Установите интервал опроса, например, `10` секунд. Не стоит ставить слишком маленькое значение, чтобы не перегружать шину.
* Нажмите Done.
Анализ результата в панели отладки
Каждые 10 секунд в панели отладки будет появляться новое сообщение. В отличие от дискретного входа, здесь `msg.payload` будет содержать числовое значение — измеренную температуру в градусах Цельсия.
{
"payload": 24.5,
"topic": "hi/SN-ABCDEF123456/inputs/1wire/5_28-01234567abcd/state",
"_msgid": "1a2b3c4d.5e6f78"
}
Чтобы убедиться, что датчик работает корректно, проведите простой эксперимент: сожмите его корпус в руке на 20-30 секунд. Вы должны увидеть, как значение в `msg.payload` плавно увеличивается, отражая температуру вашего тела.
> ⚠️ Внимание: Если узел для датчика 1-Wire постоянно выдает значение `85.0` °C, это стандартный код ошибки при инициализации. Датчик DS18B20 возвращает это значение сразу после подачи питания, до того как он выполнил первое успешное измерение. Если вы видите `85.0` постоянно, это означает, что контроллер видит датчик на шине, но не может получить от него корректные данные о температуре. Наиболее частые причины:
> * Плохой контакт на линии данных (DQ).
> * Нестабильное питание (если используется "паразитная" схема).
> * Слишком длинная или некачественная шина, вызывающая искажение сигнала.
> Проверьте правильность подключения линии данных (DQ), питания (Vdd) и земли (GND) в соответствии со стандартом схемы.
Если вы видите адекватное значение температуры, которое реагирует на внешнее воздействие, тест пройден успешно.
---
Практика: проверка аналоговых входов (0-10В)
Последний практический блок посвящен проверке аналоговых входов, настроенных на прием сигнала 0-10В, как мы это делали в уроке [COURSE-03-M05-L04]. Этот тип входов используется для датчиков с плавно изменяющимся выходным сигналом, например, датчиков освещенности, влажности или давления.
Создание потока для аналогового входа
* Name: "Датчик освещенности Офис".
* Input: Выберите номер входа, сконфигурированного для работы с сигналом 0-10В (например, `UI-17`).
* Signal Type: Установите `Analog 0-10V`.
* Polling Interval: Установите интервал, например, `5` секунд.
* Нажмите Done.
Анализ сырых данных
В панели отладки вы начнете получать сообщения. `msg.payload` может содержать либо уже преобразованное значение в вольтах, либо "сырое" значение от АЦП (аналого-цифрового преобразователя). На контроллере HI это обычно целое число в диапазоне от 0 до 4095, где 0 соответствует 0В, а 4095 — 10В.
Пример `msg.payload` с сырыми данными:
{
"payload": 1850,
"topic": "hi/SN-ABCDEF123456/inputs/analog/17/state",
"_msgid": "a1b9c8d7.e6f543"
}
Работать с такими значениями неудобно. Нам нужно преобразовать их в понятные единицы, например, в проценты (0-100%). Для этого в Node-RED есть стандартный узел `range`.
Масштабирование значений с помощью узла `range`
[hi-input] -> [range] -> [debug]
* Action: `Map`
* Input range: установите `0` и `4095`.
* Output range: установите `0` и `100`.
* Action: выберите `Scale and limit to target range`.
* Нажмите Done и разверните поток.
Теперь в панели отладки вы будете видеть тот же сигнал, но уже отмасштабированный в проценты. Например, сырое значение `1850` превратится примерно в `45.17`.
Пример `msg.payload` после узла `range`:
{
"payload": 45.17704517704518,
"topic": "hi/SN-ABCDEF123456/inputs/analog/17/state",
"_msgid": "a1b9c8d7.e6f543"
}
Проведите тест: если у вас датчик освещенности, закройте его рукой. Значение в `msg.payload` должно упасть практически до нуля. Затем посветите на него фонариком — значение должно стремиться к 100. Если это происходит, тест аналогового входа пройден успешно.
---
Итоги и следующие шаги
В этом уроке мы сделали важнейший шаг — соединили физический мир устройств с программной средой Node-RED. Мы научились считывать, визуализировать и верифицировать сигналы от трех основных типов входов: дискретных, температурных (1-Wire) и аналоговых (0-10В).
Ключевая формула отладки, которую вы должны запомнить и использовать на каждом объекте, предельно проста:
`Узел чтения входа (`hi-input` или `mqtt in`) + Узел отладки (`debug`)`
Эта связка является вашим «программным мультиметром», который позволяет мгновенно оценить работоспособность любого подключенного датчика, кнопки или выключателя.
Мы также убедились в важности понимания структуры сообщения `msg` и, в частности, его полезной нагрузки `msg.payload`. Теперь вы знаете, какой тип данных ожидать от каждого входа:
- Дискретный вход: `boolean` (`true` / `false`)
- Датчик температуры: `number` (число, например, `23.7`)
- Аналоговый вход: `number` (число, представляющее сырое значение или отмасштабированную величину)
Успешное завершение проверок, описанных в этом уроке, означает, что этап пусконаладки аппаратной части можно считать завершенным. Контроллер корректно «видит» и «ощущает» окружающий мир. Теперь мы готовы перейти к самому интересному — использованию этих данных для создания интеллектуальных сценариев автоматизации.
> 🔗 Связанный материал: Данные, полученные в этом уроке, являются основой для создания логики управления. Подробное изучение того, как использовать эти `true`/`false` и числовые значения для управления реле, светом и климатом, мы начнем в следующем курсе. Смотрите модуль COURSE-04-M01: Основы автоматизации в Node-RED.
В следующем модуле мы закончим работу с физическими подключениями, рассмотрев управление исполнительными устройствами через выходы контроллера.