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

Чтение дискретных входов: датчики протечки, открытия, кнопки

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

Типы дискретных сигналов и их физическое подключение

В основе автоматизации лежит способность контроллера получать информацию от внешнего мира. Один из самых базовых, но критически важных типов информации — это дискретный сигнал. В отличие от аналогового, который может принимать любое значение в заданном диапазоне (например, температура от 0 до 100°C), дискретный сигнал имеет всего два состояния: «включено»/«выключено», «замкнуто»/«разомкнуто», «истина»/«ложь» (1/0).

Основные типы дискретных сигналов

Для подключения к контроллеру HI используются два основных типа беспотенциальных сигналов:

  • Сухой контакт (Dry Contact): Это самый распространенный тип. Представляет собой пару контактов (переключатель, реле, геркон), которые физически замыкаются или размыкаются, не подавая при этом никакого собственного напряжения. Контроллер сам подает на один из контактов своего входа небольшое напряжение (pull-up) и отслеживает, когда оно "притягивается" к земле (GND) через замкнувшийся внешний контакт.
  • Открытый коллектор (Open Collector): Этот тип сигнала часто встречается в электронных датчиках (например, в некоторых PIR-датчиках движения). Выход датчика представляет собой транзистор, который в активном состоянии соединяет сигнальную линию с землей. Для работы такого датчика требуется внешний "подтягивающий" резистор к питанию, который, как правило, уже встроен в универсальные входы контроллера HI.
  • > ⚠️ Внимание: Входы контроллера, настроенные на прием дискретных сигналов, рассчитаны на беспотенциальные контакты. Подача на них внешнего напряжения (например, 12V или 230V) приведет к необратимому повреждению порта.

    Типовые датчики и устройства с дискретным выходом

    На объектах автоматизации вы столкнетесь со следующим оборудованием:

    Схемы подключения

    Подключение всех этих устройств к универсальным входам (UI) контроллера HI принципиально одинаково. Один контакт устройства подключается к сигнальной клемме входа (например, `UI-05`), а второй — к общей земле (`GND`).

    //======== WIRING-SENS-007: Main Door Contact Sensor ========
    

    // Используется кабель 2x0.5 мм²

    (SENS:Door:Main-Door) [CTRL:HI-Core]

    Контакт 1 --------- UI-05

    Контакт 2 --------- GND

    //======== WIRING-SENS-011: Bathroom Leak Sensor ========
    

    // Датчик устанавливается на полу в потенциальном месте утечки

    (SENS:Leak:Bathroom) [CTRL:HI-Core]

    Электрод 1 --------- UI-06

    Электрод 2 --------- GND

    Нормально-разомкнутый (NO) vs. Нормально-замкнутый (NC)

    Ключевой характеристикой любого дискретного датчика является тип его контактов в «нормальном», неактивном состоянии.

    | Тип контакта | Описание | Логика работы | Преимущества и недостатки |

    | ------------------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |

    | Нормально-разомкнутый (NO) | Normally Open. Контакты разомкнуты, когда датчик не активен. Цепь замыкается при срабатывании. | Дверь закрыта -> контакт разомкнут. Дверь открыта -> контакт замкнут. | Простота: Логика интуитивно понятна. Недостаток: Обрыв кабеля не будет зафиксирован и будет воспринят как нормальное состояние. Идеально для кнопок. |

    | Нормально-замкнутый (NC) | Normally Closed. Контакты замкнуты, когда датчик не активен. Цепь размыкается при срабатывании. | Дверь закрыта -> контакт замкнут. Дверь открыта -> контакт разомкнут. | Безопасность: Обрыв кабеля или неисправность датчика приведут к размыканию цепи и будут немедленно зафиксированы как тревога. Стандарт для охранных систем. |

    | Переключающий контакт (COM/NO/NC) | Имеет три вывода: общий (COM), NO и NC. Позволяет выбрать нужную логику при подключении. | Позволяет реализовать любую из вышеописанных логик. | Универсальность: Один датчик подходит для разных задач. Используется в большинстве профессиональных датчиков движения и других модулей. |

    > 💡 Подсказка: Для систем безопасности (датчики открытия, движения, пожарные извещатели) всегда используйте NC (нормально-замкнутую) логику. Это гарантирует, что система обнаружит не только вторжение, но и попытку саботажа (перерезание провода).

    ---

    Настройка входов и чтение состояния в Node-RED

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

    > 🔗 Связанный материал: Конфигурация универсальных входов и детальное описание их режимов работы подробно рассмотрены в уроке `COURSE-06-M07-L01`.

    Конфигурация входа

    Первым шагом является перевод универсального входа из режима по умолчанию в режим «Дискретный вход» (Digital Input, DI). Это делается через веб-интерфейс контроллера или специальный узел конфигурации в Node-RED. В этом режиме вход активирует внутренний подтягивающий резистор (`pull-up`) и начинает отслеживать замыкание на `GND`.

    Использование ноды `hi-input`

    Для получения данных с физических портов в нашей платформе используется специализированный узел `hi-input` из палитры `node-red-contrib-hi`.

  • Перетащите узел `hi-input` на рабочую область.
  • Откройте его настройки.
  • В поле `Pin` выберите номер входа, к которому подключен датчик (например, `UI-05`).
  • В поле `Mode` убедитесь, что выбран `Digital Input`.
  • Подключите к выходу узла `hi-input` узел `debug` для наблюдения за его работой.
  • Теперь, при изменении состояния датчика (например, при открытии двери с герконом), узел `hi-input` будет генерировать новое сообщение.

    Структура сообщения и обработка логики

    Узел `hi-input` формирует сообщение со стандартной структурой, где `msg.payload` содержит булево значение:

    Рассмотрим, как это соотносится с NO и NC логикой:

    | Тип датчика | Состояние объекта | Состояние контакта | `msg.payload` | Интерпретация |

    |-------------|-------------------|--------------------|---------------|---------------------------------------------|

    | NO | Дверь закрыта | Разомкнут | `false` | Нормальное состояние |

    | NO | Дверь открыта | Замкнут | `true` | Тревога |

    | NC | Дверь закрыта | Замкнут | `true` | Нормальное состояние |

    | NC | Дверь открыта | Разомкнут | `false` | Тревога |

    Как видно из таблицы, логика NC-датчика является инвертированной: `false` означает тревогу, а `true` — норму. Для удобства дальнейшей обработки эту логику следует привести к стандартному виду, где `true` всегда означает тревогу или активное состояние.

    Пример: Инвертирование логики для NC-датчика протечки

    Задача: Датчик протечки с NC-контактом подключен к `UI-06`. При возникновении протечки контакт размыкается, и `hi-input` выдает `false`. Необходимо преобразовать этот сигнал в сообщение о тревоге. Поток (Flow):
    [hi-input: UI-06] -> [change: Invert Logic] -> [switch: Is Alarm?] -> ...
    
    Настройка узла `change` "Invert Logic":

    Этот узел будет инвертировать входящий `payload`.

    Более элегантный и семантически верный подход — не просто инвертировать значение, а сразу формировать осмысленное сообщение.

    Код для узла `function` "Format Alarm":
    // Вход: msg.payload от NC-датчика (true = норма, false = тревога)
    
    

    if (msg.payload === false) {

    // Тревога! Контакт разомкнулся.

    node.status({ fill: "red", shape: "dot", text: "ALARM: Leak Detected!" });

    // Формируем сообщение по "Контракту сообщения"

    msg.payload = {

    value: true, // Сигнал тревоги

    source: "leak-sensor-bathroom",

    ts: Date.now(),

    meta: {

    description: "Обнаружена протечка в ванной комнате"

    }

    };

    msg.topic = "alarms/water_leak/bathroom";

    return msg;

    } else {

    // Нормальное состояние. Можно остановить поток или отправить сообщение "ОК".

    node.status({ fill: "green", shape: "dot", text: "OK: No leaks" });

    // Для снижения нагрузки на систему, сообщение о нормальном состоянии

    // можно не отправлять дальше или отправлять по другой ветке.

    return null; // Останавливаем поток, если нас интересуют только тревоги.

    }

    Этот подход преобразует простое `true`/`false` в богатое информацией событие, готовое для отправки в систему уведомлений, записи в лог или активации исполнительных механизмов (например, закрытия клапана).

    ---

    Фильтрация дребезга и обработка событий от кнопок

    ильтрация дребезга и обработка событий от кнопок

    При работе с механическими контактами, особенно кнопками, возникает проблема дребезга контактов (contact bounce). В момент нажатия или отпускания кнопки ее контакты вибрируют, создавая не одно, а целую серию очень быстрых замыканий и размыканий в течение нескольких миллисекунд. Для контроллера это выглядит как множество событий `true`/`false`, что может привести к непредсказуемому поведению логики (например, свет будет быстро включаться и выключаться).

    > 💡 Подсказка: Комбинация нод `rbe` и `trigger` — стандартный и самый надежный способ обработки нажатий кнопок в Node-RED для избежания ложных срабатываний и реализации сложной логики (короткое/длинное нажатие).

    Фильтрация дубликатов с помощью узла `rbe`

    Узел `rbe` (Report-by-Exception) служит входным фильтром, который отсекает "шум" дребезга. Он пропускает сообщение дальше только в том случае, если его `msg.payload` изменился по сравнению с предыдущим.

    Подробная теория настройки паттернов фильтрации и использования узла `rbe` для очистки данных разобрана в уроке M05-L02 («Фильтрация данных и Debounce»).

    В контексте физической кнопки `rbe` критически важен: он гарантирует, что на каждое физическое действие (нажатие или отпускание) система получит ровно один логический сигнал `true` или `false`, игнорируя микро-колебания контактов в момент замыкания.

    Реализация логики кнопки: короткое и длинное нажатие

    Стандартная задача для умного дома — реализовать разное поведение на короткое и длинное нажатие кнопки. Например, короткое нажатие включает/выключает свет, а длинное — запускает сценарий "Я ухожу". Это реализуется с помощью узла `trigger`.

    Поток для обработки кнопки:

    `[hi-input: Button] -> [rbe] -> [switch: Pressed/Released?] -> [trigger] -> ...`

  • `hi-input: Button`: Читает состояние кнопки. `true` при нажатии (контакт замкнут).
  • `rbe`: Устраняет дребезг. Пропускает только первый `true` и первый `false`.
  • `switch: Pressed/Released?`: Направляет поток в разные ветки в зависимости от `msg.payload`.
  • * Если `msg.payload` === `true`, сообщение идет на вход узла `trigger`.

    Если `msg.payload` === `false`, сообщение идет на сброс* узла `trigger`.

  • `trigger: Short/Long Press`: Настраивается следующим образом:
  • * `Send`: `{"payload": "short"}` (отправить это немедленно).

    * `then wait for`: `1 second` (подождать 1 секунду).

    * `then send`: `{"payload": "long"}` (затем отправить это).

    * `Handle "reset" message`: `reset the trigger` (если придет сообщение о сбросе, отменить ожидание).

    Как это работает: 1. Вы нажимаете кнопку. `hi-input` -> `rbe` отправляет `true`.

    2. `switch` направляет `true` на вход `trigger`.

    3. `trigger` немедленно отправляет сообщение `{"payload": "short"}`.

    4. Вы отпускаете кнопку (< 1 сек). `hi-input` -> `rbe` отправляет `false`.

    5. `switch` направляет `false` на вход сброса `trigger`.

    6. `trigger` сбрасывается и отменяет отправку "long" сообщения.

    7. Результат: на выходе только одно сообщение — `"short"`.

    1. Вы нажимаете и удерживаете кнопку. `hi-input` -> `rbe` отправляет `true`.

    2. `switch` направляет `true` на вход `trigger`.

    3. `trigger` немедленно отправляет `"short"`.

    4. Вы продолжаете удерживать кнопку > 1 сек.

    5. По истечении 1 секунды `trigger` отправляет второе сообщение `{"payload": "long"}`.

    6. Вы отпускаете кнопку. `trigger` получает сброс, но это уже не имеет значения.

    7. Результат: на выходе два сообщения — сначала `"short"`, затем `"long"`.

    Дальнейшая логика строится на обработке этих сообщений с помощью еще одного узла `switch`.

    > ℹ️ Информация: Чтобы избежать реакции на короткое нажатие при длинном, можно использовать более сложную конфигурацию `trigger` или добавить узел `gate` (рассмотрен в уроке M05-L04), который будет блокировать сообщение "short", если за ним следует "long".

    Итоги: от физического сенсора к надежной автоматизации

    Мы прошли полный путь от физического подключения датчика до создания надежной и функциональной логики в Node-RED. Этот процесс можно разбить на четыре ключевых этапа, каждый из которых критически важен для конечного результата.

  • Физическое подключение и выбор логики (NO/NC). Основа всего. Ошибка на этом этапе (неправильное подключение, неверный выбор типа контакта) сделает всю последующую программную логику бесполезной. Для систем безопасности выбор NC-контактов является отраслевым стандартом, обеспечивающим отказоустойчивость.
  • Конфигурация входа контроллера. Контроллер должен "знать", какой тип сигнала он ожидает. Перевод универсального входа в режим `Digital Input` является обязательным шагом, активирующим необходимую внутреннюю схемотехнику порта.
  • Программная обработка и фильтрация. Необработанный сигнал с физического входа часто "шумный" (дребезг) и требует подготовки. Использование узлов `rbe` для фильтрации дубликатов и, при необходимости, инвертирование логики для NC-датчиков — это гигиенический минимум для любого профессионального потока.
  • Преобразование состояний в события. Самая важная часть. Система автоматизации оперирует не бинарными `true`/`false`, а осмысленными событиями: "тревога протечки", "открыто окно в спальне", "короткое нажатие на кнопку в гостиной". Задача инженера — преобразовать низкоуровневые состояния в эти высокоуровневые, информативные события, которые уже запускают сценарии, отправляют уведомления и управляют оборудованием.
  • > ⚠️ Внимание: Никогда не подавайте внешнее напряжение на входы, сконфигурированные как "сухой контакт". Это может привести к выходу из строя порта контроллера. Используйте только беспотенциальные контакты — выходы реле, контакты кнопок, герконов и т.д.

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

    Что дальше

    В следующем уроке мы перейдем от простых дискретных сигналов к более сложным — аналоговым. Вы узнаете, как подключать и считывать данные с датчиков, которые передают информацию в виде изменяющегося напряжения (0-10V) или тока (4-20mA), и как калибровать их показания в Node-RED для получения точных физических величин, таких как уровень CO2, освещенность или давление.