Чтение состояния геркона: отслеживание открытия двери/окна
Принцип работы геркона и его роль в системах автоматизации
Геркон (сокращение от «герметизированный контакт») — это электромеханическое коммутационное устройство, представляющее собой два ферромагнитных контакта, запаянных в инертной среде внутри небольшой стеклянной колбы. Принцип его работы основан на свойстве этих контактов изменять свое положение под воздействием внешнего магнитного поля. Когда к геркону подносят постоянный магнит, его поле заставляет контакты внутри колбы либо замыкаться, либо размыкаться.Это простое, но чрезвычайно надежное устройство нашло широкое применение в системах автоматизации и безопасности благодаря отсутствию механического износа (так как нет прямого трения деталей), герметичности (защита от пыли и влаги) и высокой скорости срабатывания. Чаще всего герконы используются в качестве датчиков открытия дверей и окон. В этом случае одна часть (геркон) устанавливается на неподвижной раме, а вторая (магнит) — на подвижной створке.
В зависимости от исходного состояния контактов без воздействия магнитного поля, герконы делятся на два основных типа, которые мы рассматривали в предыдущем уроке: нормально-открытые (NO) и нормально-закрытые (NC). Понимание их различий критически важно для правильного проектирования системы.
| Характеристика | Нормально-открытый (NO) | Нормально-закрытый (NC) |
| ----------------------------- | ------------------------------------------------------ | --------------------------------------------------------- |
| Состояние без магнита | Контакты разомкнуты (цепь разорвана) | Контакты замкнуты (цепь замкнута) |
| Состояние при поднесении магнита | Контакты замыкаются (цепь замыкается) | Контакты размыкаются (цепь разрывается) |
| Состояние двери/окна | Дверь/окно открыто = контакты разомкнуты (`false`) | Дверь/окно открыто = контакты разомкнуты (`false`) |
| | Дверь/окно закрыто = контакты замкнуты (`true`) | Дверь/окно закрыто = контакты замкнуты (`true`) |
| Логика для контроллера | Замкнутая цепь означает "Закрыто" | Замкнутая цепь означает "Закрыто" |
| Типовое использование | Мониторинг состояния (например, для управления светом) | Системы безопасности, охранные контуры |
| Надежность при обрыве | Обрыв провода будет интерпретирован как "Дверь открыта" | Обрыв провода будет интерпретирован как "Тревога" (аналогично открытию) |
> 💡 Подсказка: Для охранных систем предпочтительнее использовать NC-герконы. В этом случае обрыв провода или выход датчика из строя будет немедленно зафиксирован как тревога (размыкание цепи), что повышает надежность системы. Система не сможет быть "ослеплена" простым перерезанием кабеля, так как любое нарушение целостности контура приведет к срабатыванию.
Особенности физического монтажа
Правильный монтаж — залог стабильной работы датчика.
---
Физическое подключение геркона к дискретному входу контроллера HI
Подключение датчика типа "сухой контакт", такого как геркон, к контроллеру HI — одна из самых простых и базовых операций. Она не требует пайки или сложных внешних схем, так как необходимая логика уже встроена в модуль универсальных входов.
Геркон, по своей сути, является простым выключателем. Он либо замыкает цепь, либо размыкает ее. Дискретный вход контроллера HI предназначен именно для того, чтобы детектировать эти два состояния.
Схема подключения
Для подключения геркона к контроллеру HI нам понадобятся два провода и два свободных терминала на модуле входов:
- Один терминал дискретного входа, который в документации и на корпусе может быть обозначен как `DI` (Digital Input) или `UI` (Universal Input).
- Один терминал общей земли (`GND`).
Схема подключения предельно проста:
Ниже приведена типовая ASCII-схема подключения `WIRING-SENS-011`, которую следует включать в проектную документацию.
//========= WIRING-SENS-011: Front Door Reed Switch =========
// Контроллер HI Датчик открытия (Геркон)
// Модуль входов (SENS:REED:FrontDoor-01)
//
// +---------+ +-----------+
// | UI-05 |-----------------| Contact 1 |
// | | | |
// | GND |-----------------| Contact 2 |
// +---------+ +-----------+
Полярность подключения для "сухого контакта" не имеет значения, так как это пассивный компонент. Вы можете подключать провода к клеммам геркона в любом порядке.
Роль внутреннего подтягивающего резистора (Pull-Up)
Почему схема так проста? Потому что универсальные входы контроллера HI, сконфигурированные для работы с "сухими контактами", используют внутренний подтягивающий резистор (pull-up resistor).
- Когда геркон разомкнут (дверь открыта для NO-типа или закрыта для NC-типа, но мы будем говорить о физическом состоянии контактов), цепь между входом `UI-05` и `GND` разорвана. Внутренний подтягивающий резистор "подтягивает" напряжение на входе к логической единице (например, +3.3V). Контроллер считывает это как `false` (для инвертированного входа) или высокое состояние.
- Когда геркон замкнут (дверь закрыта для NO-типа), он создает прямое соединение между входом `UI-05` и `GND`. Ток начинает течь через подтягивающий резистор на землю. Напряжение на входе падает практически до нуля. Контроллер считывает это как `true` или низкое состояние.
Благодаря этому механизму, вам не нужно устанавливать внешние резисторы, что значительно упрощает монтаж и повышает надежность системы.
> ⚠️ Внимание: Категорически запрещается подавать на дискретный вход любое внешнее напряжение при подключении "сухого контакта". Вход рассчитан на замыкание на `GND`, а не на получение внешнего сигнала. Подача напряжения от стороннего блока питания может привести к необратимому повреждению порта или всего модуля входов контроллера.
---
Настройка узла 'DI' в Node-RED для чтения состояния
После того как геркон физически подключен к контроллеру, необходимо настроить программную часть — создать в среде Node-RED поток (flow), который будет считывать его состояние. Для этого используется специальный узел из палитры HI, который мы назовем `HI-DI`.
Пошаговая настройка узла
* Server / Controller: Выберите из выпадающего списка ваш контроллер. Если он один, он будет выбран по умолчанию.
* Input / Channel: Укажите номер дискретного входа, к которому вы подключили геркон. Если вы использовали клемму `UI-05`, введите `5`.
* Poll Interval (ms): Это частота опроса в миллисекундах. Этот параметр определяет, как часто Node-RED будет запрашивать у контроллера состояние входа.
* Для датчиков открытия дверей, где важна быстрая реакция (например, для включения света), рекомендуется значение в диапазоне `100` - `250` мс.
* Для менее критичных датчиков (например, окно в редко используемой комнате) можно установить значение `500` - `1000` мс, чтобы снизить нагрузку на процессор контроллера.
* Name: Дайте узлу осмысленное имя, например, "Датчик входной двери". Это поможет легко ориентироваться в потоке.
* Сохраните настройки узла, нажав кнопку "Done".
* Из палитры перетащите узел `Debug` и соедините его с выходом узла `HI-DI`.
* Разверните изменения, нажав красную кнопку "Deploy" в правом верхнем углу.
* Перейдите на вкладку "Debug messages" (иконка жука) в правой панели.
Теперь, при открытии и закрытии двери, вы будете видеть в окне отладки сообщения.
> ℹ️ Информация: По умолчанию узел `HI-DI` выдает булево значение (boolean): `true` при замкнутом контакте и `false` при разомкнутом.
При замкнутом герконе (дверь закрыта) вы будете видеть сообщения:
// msg.payload
true
При разомкнутом (дверь открыта):
// msg.payload
false
Обратите внимание, что без дополнительной обработки эти сообщения будут появляться с частотой, заданной в `Poll Interval`, даже если состояние не меняется. В следующем разделе мы это исправим.
---
Нормализация сигнала и обработка изменений
На данном этапе наш поток генерирует избыточное количество данных: он шлет `true` или `false` каждые 100 мс. Для большинства задач автоматизации нам нужно знать не текущее состояние, а момент его изменения. Кроме того, булевы значения `true`/`false` неудобны для отображения в интерфейсах и для ведения логов. Наша задача — нормализовать этот сигнал.
Для этого мы используем два стандартных узла Node-RED: `rbe` и `change`.
1. Фильтрация дубликатов с помощью узла `rbe`
Узел `rbe` (Report by Exception) — это мощный фильтр, который пропускает сообщение дальше по потоку только в том случае, если его значение отличается от предыдущего.
- Добавьте узел `rbe` после вашего узла `HI-DI`. Соедините их.
- Теперь выход `rbe` подключите к узлу `debug`.
- Разверните (Deploy) поток.
Теперь, когда вы будете открывать или закрывать дверь, в окне отладки появится только одно сообщение в момент смены состояния. В статичном положении (дверь постоянно открыта или закрыта) новых сообщений не будет. Это кардинально снижает нагрузку на систему и упрощает дальнейшую логику.
2. Преобразование данных с помощью узла `change`
Теперь преобразуем `true`/`false` в понятные строковые значения, например, "closed" и "open". Это делает логику более читаемой и готовит данные для отправки в системы верхнего уровня.
- Добавьте узел `change` после узла `rbe`.
- Откройте его настройки.
- Наша задача — настроить правила для замены `msg.payload`. Предположим, мы используем NC-геркон, где замкнутый контакт (`true`) означает, что дверь закрыта.
* `Set`: `msg.payload`
* `to the value`: `closed` (строка)
* `if`: `msg.payload` `is true` (булево)
* Правило 2 (добавляется нажатием кнопки `+add`):
* `Set`: `msg.payload`
* `to the value`: `open` (строка)
* `if`: `msg.payload` `is false` (булево)
Сохраните настройки и разверните поток. Теперь в окне отладки вы будете видеть:
- `"closed"` — когда дверь закрывается.
- `"open"` — когда дверь открывается.
Пример итогового потока
Вот как выглядит наш финальный поток для обработки сигнала с геркона:
ASCII-схема потока:[HI-DI: Дверь] -> [rbe: Фильтр] -> [change: Формат] -> [debug: Результат]
Пример прохождения сообщения `msg` через поток (для NC-геркона):
* `[HI-DI]` генерирует `msg` с `payload: true`.
* `[rbe]` пропускает `msg`, так как предыдущее значение было `false`.
* `[change]` применяет правило №1 и изменяет `msg.payload` на `"closed"`.
* `[debug]` выводит:
{
"payload": "closed",
"_msgid": "..."
}
* `[HI-DI]` генерирует `msg` с `payload: false`.
* `[rbe]` пропускает `msg`, так как предыдущее значение было `true`.
* `[change]` применяет правило №2 и изменяет `msg.payload` на `"open"`.
* `[debug]` выводит:
{
"payload": "open",
"_msgid": "..."
}
Этот простой, но эффективный поток является стандартным паттерном для обработки любых дискретных входов.
---
Публикация состояния в MQTT
Теперь, когда у нас есть чистое, нормализованное состояние датчика, его необходимо сделать доступным для других систем: панелей визуализации, мобильных приложений, голосовых ассистентов или других контроллеров. Стандартным протоколом для такого взаимодействия в IoT является MQTT.
Наша задача — отправлять состояние `"open"` или `"closed"` в определенный MQTT топик.
Настройка узла `mqtt out`
* Server: Выберите из выпадающего списка ваш MQTT-брокер. Если он еще не настроен, нажмите на иконку карандаша и укажите IP-адрес/хост контроллера (так как на нем запущен MQTT-брокер, обычно это `localhost` или `127.0.0.1`) и порт (`1883` по умолчанию).
* Topic: Это самое важное поле. Здесь задается "адрес", по которому будет опубликовано состояние. Крайне важно придерживаться иерархической структуры топиков для порядка в системе. Рекомендуемый формат:
`{project}/{location}/{sub-location}/{device-class}/{device-name}/state`
Например: `hi/floor1/livingroom/window1/state`
Для нашей входной двери это может быть: `hi/groundfloor/hall/maindoor/state`
* QoS (Quality of Service): Установите `1` или `2` для гарантированной доставки сообщения. Для состояний датчиков QoS `1` (`At least once`) является хорошим выбором.
* Retain: Установите галочку напротив `true`.
> ⚠️ Внимание: Всегда устанавливайте флаг `retain=true` для сообщений, передающих состояние (state). Это гарантирует, что при перезагрузке систем визуализации или логики они получат последнее известное состояние, а не будут ждать следующего изменения. MQTT-брокер сохранит последнее сообщение с этим флагом и немедленно отправит его любому новому клиенту, подписавшемуся на этот топик.
Сохраните настройки и разверните поток. Теперь состояние вашей двери публикуется в общую шину данных и доступно всей системе автоматизации. Вы можете использовать любой MQTT-клиент (например, MQTT Explorer), чтобы подписаться на топик `hi/groundfloor/hall/maindoor/state` и в реальном времени видеть, как приходят сообщения `"open"` и `"closed"`.
Итоговый поток (полный цикл):[HI-DI] -> [rbe] -> [change] -> [mqtt out]
Этот поток реализует всю цепочку от физического мира до цифрового представления, готового к использованию в сценариях.
---
Резюме и практическое применение
В этом уроке мы прошли полный цикл работы с одним из самых распространенных датчиков в автоматизации — герконом. Мы научились:
Теперь, когда состояние двери представлено в системе в виде четких сообщений в стандартном топике, открываются безграничные возможности для создания сценариев автоматизации. На основе полученных данных `"open"`/`"closed"` можно легко реализовать:
- Управление освещением: Автоматическое включение света в прихожей на 2 минуты при открытии входной двери в темное время суток.
- Систему уведомлений: Отправку push-уведомления на ваш смартфон, если окно в детской осталось открытым, а на улице начинается дождь или падает температура.
- Логику безопасности: Запрет постановки дома на охрану, если хотя бы одна дверь или окно остались открытыми. Система может указать, какой именно датчик мешает активации.
- Управление климатом: Автоматическое отключение кондиционера или радиатора отопления в комнате, если в ней открыто окно для проветривания, для экономии энергии.
Эти практические сценарии мы начнем подробно разбирать в следующих модулях. Вы освоили фундаментальный навык, который является кирпичиком для построения по-настоящему интеллектуальной системы.
🔗 Связанный материал: Повторите принципы работы с узлами отладки (`debug`, `status`, `catch`), рассмотренные в курсе `COURSE-01-M03`, для диагностики возможных проблем в ваших потоках.
Что дальше
В следующем уроке мы рассмотрим работу с другим популярным типом дискретных датчиков — датчиком движения (PIR). Мы изучим его особенности, такие как время "остывания" и защита от ложных срабатываний, и создадим на его основе сценарий автоматического управления освещением.