ГлавнаяАкадемияСценарии умного дома: режимы, состояния, приоритеты → SCN-SAFETY-001: Защита от протечки (перекрытие воды, оповещение)

SCN-SAFETY-001: Защита от протечки (перекрытие воды, оповещение)

Урок · Сценарии умного дома: режимы, состояния, приоритеты · 30 мин · theory

Введение: Архитектура системы защиты от протечек

ведение: Архитектура системы защиты от протечек

Сценарий автоматической защиты от протечек (ID: SCN-SAFETY-001) является одним из самых критически важных в любой системе автоматизации. Его основная задача — минимизировать или полностью предотвратить ущерб имуществу, который может быть вызван прорывом труб, неисправностью сантехники или бытовой техники. Финансовые и моральные издержки от затопления несопоставимо выше стоимости внедрения надежной системы предотвращения. Данный урок посвящен проектированию и реализации такого сценария на базе платформы HI.

В основе надежной системы лежит простая и эффективная трехуровневая архитектура:

  • Сенсорный уровень (Обнаружение): На этом уровне находятся датчики протечки, единственная задача которых — как можно быстрее зафиксировать наличие воды в нештатном месте.
  • Логический уровень (Решение): Сердцем системы является контроллер HI, который принимает сигналы от датчиков, анализирует их и принимает решение о дальнейших действиях. Важно: Логика учитывает текущее состояние системы (State Machine) — режимы Home, Away или Vacation.
  • Исполнительный уровень (Действие): На этом уровне находятся шаровые краны с электроприводом, которые по команде от контроллера физически перекрывают подачу холодной и горячей воды.
  • > 💡 Подсказка: Совет по размещению датчиков: устанавливайте их в самых низких точках, где вероятно скопление воды — под раковиной, ванной, рядом со стиральной и посудомоечной машиной, а также в коллекторном узле.

    Типы компонентов системы

    Датчики протечки: Исполнительные устройства:

    Основным исполнительным устройством являются шаровые краны с электроприводом.

    | Параметр | Вариант 1: 220В AC | Вариант 2: 12/24В DC |

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

    | Питание | Требуется подведение силовой линии 220В. | Питаются от низковольтного БП. Более безопасны. |

    | Логика управления | Обычно 3-проводное (фаза на откр./закр.). | Обычно 2-проводное (смена полярности). |

    | Интеграция с HI | Напрямую через релейные выходы контроллера. | Требуют БП. Управляются через реле. |

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

    Интеграция с режимами (State Machine)

    В продвинутых системах на базе HI логика отработки протечки адаптируется под текущий режим дома:

    Связующим звеном выступает протокол MQTT. Он служит универсальной шиной данных, по которой датчики сообщают о состоянии (`вода обнаружена`), а контроллер отправляет команды (`закрыть кран`). Событийная природа MQTT обеспечивает мгновенную реакцию системы.

    Интеграция аппаратных компонентов через Modbus RTU

    Для промышленных и крупных жилых объектов, где требуется большое количество входов и выходов, стандартных портов контроллера HI может быть недостаточно. В этом случае для расширения системы используются внешние модули ввода-вывода, работающие по протоколу Modbus RTU на шине RS-485. Этот подход обеспечивает высокую надежность и масштабируемость.

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

    Подключение компонентов

  • Подключение датчиков протечки: Проводной датчик протечки (по сути, "сухой контакт", который замыкается водой) подключается к дискретному входу (DI) Modbus-модуля, например, `HI-M08-DI`. Один провод от датчика подключается к клемме входа (`DI-1`, `DI-2`...), второй — к общей клемме (`GND`).
  • Настройка Modbus-модуля: На самом модуле с помощью DIP-переключателей или программно необходимо выставить уникальный в пределах шины RS-485 Slave ID (например, `10`) и параметры связи (скорость `9600`, `8N1`), которые должны совпадать с настройками на контроллере.
  • Подключение шарового крана: Кран с электроприводом подключается к релейному выходу Modbus-модуля, например, `HI-M04-RO`. Схема подключения зависит от типа крана. Для типового NC-крана на 220В схема выглядит так:
  • * Фаза (L) от автомата защиты подается на общий контакт реле (`C`).

    * Нормально-открытый контакт реле (`NO`) подключается к управляющему проводу крана (открытие).

    * Нейтраль (N) и защитное заземление (PE) подключаются к крану напрямую.

    В нормальном состоянии реле разомкнуто, кран обесточен и закрыт. Для открытия воды контроллер замыкает реле, подавая фазу на кран. При сигнале о протечке контроллер размыкает реле, питание с крана снимается, и он автоматически закрывается.

    Конфигурация в Node-RED

    Интеграция Modbus-устройств в Node-RED сводится к настройке опроса регистров. Как мы уже рассматривали в предыдущих уроках, для этого используется палитра `node-red-contrib-modbus`.

    1. Создается узел `Modbus-Getter`.

    2. В нем настраивается периодический опрос (например, каждые 500 мс).

    3. Указываются параметры: `Unit-ID` модуля (`10`), функция `FC 2: Read Discrete Inputs`, адрес первого входа (`0` для `DI-1`) и количество входов для чтения.

    4. Выход узла `Modbus-Getter` будет выдавать массив `[true, false, ...]` со состояниями всех входов. Этот массив далее разбирается в узле `Function` для публикации в индивидуальные MQTT-топики.

    1. Создается узел `Modbus-Write`.

    2. На вход узла подается сообщение с `msg.payload`, равным `true` (замкнуть реле, открыть кран) или `false` (разомкнуть реле, закрыть кран).

    3. В настройках узла указываются: `Unit-ID` модуля (`11`), функция `FC 5: Force Single Coil`, и адрес реле (`0` для `DO-1`).

    Таким образом, физическое оборудование полностью абстрагируется за Modbus-интерфейсом, а вся дальнейшая логика работает исключительно с MQTT-сообщениями.

    ---

    Проектирование MQTT-топиков и структуры данных

    Грамотно спроектированная структура MQTT-топиков — залог масштабируемой и понятной системы автоматизации. Для сценариев безопасности требуется особенно строгий и семантически верный подход.

    Иерархия топиков

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

    Формат топиков для датчиков: `hi///leak/`
    • `hi/groundfloor/bathroom/leak/state`: Топик для публикации состояния датчика в санузле на первом этаже. `payload` будет `true` при обнаружении воды.
    • `hi/kitchen/sink/leak/state`: Топик для датчика под кухонной раковиной.
    Формат топиков для исполнительных устройств (кранов): `hi//water_valve/`
    • `hi/main_pipe/water_valve/set`: Командный топик. Отправка сюда `CLOSE` или `OPEN` инициирует действие.
    • `hi/main_pipe/water_valve/state`: Статусный топик. Сюда кран (или логика управления им) сообщает свое текущее состояние (`CLOSED`, `OPEN`, `TRANSITIONING`).

    Контракт сообщения (Payload)

    Для всех сообщений в системе должен использоваться единый JSON-формат (контракт сообщения), что упрощает отладку и логирование.

    Пример `msg.payload` от датчика протечки:
    {
    

    "value": true,

    "ts": 1678886400321,

    "sensor_id": "leak_sensor_bathroom_01",

    "location": "Санузел, 1 этаж"

    }

    • `value`: Основное значение, `true` для протечки.
    • `ts`: Временная метка в формате Unix epoch (ms) для точного определения времени события.
    • `sensor_id`: Уникальный идентификатор датчика.
    • `location`: Человекочитаемое описание места установки.

    Использование флага Retain и QoS

    • Retain Flag (Флаг удержания):
    * Применять: Для топиков состояния исполнительных устройств (например, `.../water_valve/state`). Это гарантирует, что любой компонент системы (например, пользовательский интерфейс), подписавшись на этот топик, немедленно получит последнее известное состояние крана, даже если оно не менялось несколько часов.

    * Не применять: Для топиков событий, таких как `.../leak/state`. Если сообщение о протечке будет "удержанным", то после перезагрузки контроллера система может ложно сработать на старое событие. Событие "протечка" должно обрабатываться только в реальном времени.

    • Quality of Service (Качество обслуживания):
    * QoS 1 или 2: Необходимо использовать для командных топиков (`.../water_valve/set`). Это гарантирует, что команда на закрытие крана будет доставлена до MQTT-брокера как минимум один раз (QoS 1) или ровно один раз (QoS 2). Для критичных команд это обязательно.

    * QoS 0 или 1: Может использоваться для телеметрии от датчиков. Потеря одного сообщения о состоянии `false` (нет протечки) не является критичной.

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

    ---

    Практикум: Создание потока автоматизации в Node-RED

    Теперь, когда аппаратная часть подключена и MQTT-архитектура спроектирована, мы можем приступить к созданию потока (flow) в Node-RED, который реализует логику сценария SCN-SAFETY-001.

    > 🔗 Связанный материал: Логика опроса Modbus-устройств и публикации их состояний в MQTT подробно рассмотрена в модуле по протоколам. В данном уроке мы предполагаем, что данные с датчиков уже поступают в нужные MQTT-топики.

    Цель потока: При получении сообщения о протечке от любого датчика немедленно отправить команду на закрытие главного водяного крана и послать стандартизированное аварийное уведомление в централизованный обработчик оповещений. Схема потока (ASCII):
                    // Входной сигнал от любого датчика протечки
    

    [MQTT In] --+-->[RBE]--+-->[Function: Формирование команд]--+-->[MQTT Out: Закрыть кран]

    hi/+/+/leak/state | (только при изменении) |

    | +-->[Link Out: На унив. оповещатель]

    |

    +-->[Debug] (для отладки)

    Пошаговая реализация

  • Узел `MQTT In` (Подписка на события):
  • * Server: Выберите ваш MQTT-брокер.

    * Topic: Укажите `hi/+/+/leak/state`. Использование wildcards (`+`) позволяет этому узлу слушать все датчики протечки в системе, независимо от их расположения.

    * QoS: `1`.

    * Output: `a parsed JSON object`.

  • Узел `RBE` (Report-by-Exception):
  • * Этот узел пропускает сообщение только в том случае, если его `msg.payload.value` отличается от предыдущего. Это ключевой элемент для предотвращения "дребезга" (flapping) и отправки десятков команд, если датчик остается мокрым.

    * Mode: `block if value is the same`.

    * Property: `msg.payload.value`.

    * Подключите его сразу после `MQTT In`. Он будет пропускать только первое сообщение с `{"value": true}` и первое последующее сообщение с `{"value": false}`.

  • Узел `Function` (Основная логика):
  • * Этот узел — мозг сценария. Он получает сообщение о протечке и генерирует команду для закрытия воды, а также стандартизированное сообщение для системы оповещений. Узел будет иметь два выхода.

    * Name: `Авария! Закрыть воду и оповестить`.

    * Outputs: `2`.

    * Код:

        // Получаем входящее сообщение от датчика

    const leak_msg = msg.payload;

    // Проверяем, что это действительно событие протечки

    if (leak_msg.value === true) {

    // --- Выход 1: Команда на закрытие крана ---

    const valve_command = {

    topic: "hi/main_pipe/water_valve/set",

    payload: "CLOSE", // Команда, понятная логике управления краном

    qos: 2,

    retain: false

    };

    // --- Выход 2: Сообщение для универсального логгера/оповещателя (урок M08) ---

    const alert_msg = {

    payload: {

    level: "CRITICAL", // Уровень тревоги для системы оповещений

    event_id: "SCN-SAFETY-001-LEAK",

    message: `ПРОТЕЧКА! Место: ${leak_msg.location || 'Неизвестно'}. Датчик: ${leak_msg.sensor_id}. Вода перекрыта.`,

    context: { // Дополнительные данные для логов

    sensor_id: leak_msg.sensor_id,

    location: leak_msg.location,

    timestamp: leak_msg.ts

    }

    }

    };

    // Выдаем два независимых сообщения на разные выходы

    return [valve_command, alert_msg];

    }

    // Если пришло сообщение {"value": false}, ничего не делаем

    return null;

  • Узел `MQTT Out` (Отправка команды):
  • * Подключите к первому выходу узла `Function`.

    * Этот узел получит уже полностью сформированное сообщение (с `topic`, `payload`, `qos`) и просто отправит его брокеру. Настройки в самом узле не требуются.

  • Узел `Link Out` (Отправка на оповещение):
  • * Подключите ко второму выходу узла `Function`.

    * В его настройках укажите ссылку на узел `Link In` вашего универсального потока логирования и оповещений (см. урок M08). Это позволяет не дублировать логику отправки уведомлений в каждом сценарии, а использовать единый, централизованный компонент. Он сам решит, как и куда отправить `CRITICAL` оповещение — в Telegram, по email или включить сирену.

    После развертывания этого потока система готова к работе. Любое срабатывание датчика приведет к мгновенному закрытию воды и отправке уведомления через централизованную систему.

    ---

    Итоги и расширение функционала

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

  • Определили архитектуру: Датчик -> Контроллер -> Кран.
  • Интегрировали оборудование: Подключили датчики и краны через Modbus-модули.
  • Создали информационную модель: Разработали структуру MQTT-топиков и контракты сообщений.
  • Реализовали логику: Написали поток в Node-RED, который автоматически перекрывает воду и отправляет push-уведомление.
  • Ключевым аспектом эксплуатации систем безопасности является их регулярное тестирование. Не реже одного раза в квартал проводите учебную тревогу: имитируйте протечку (например, влажной тканью на контактах датчика) и убедитесь, что вся цепочка — от обнаружения до закрытия крана и получения уведомления — отрабатывает корректно.

    Идеи для расширения функционала

    Базовый сценарий можно и нужно развивать для повышения удобства и надежности:

    • Ручное управление: Добавьте на объекте физическую кнопку "Перекрыть всю воду" и "Открыть воду". Её нажатие будет публиковать соответствующую команду в MQTT-топик `.../water_valve/set`.
    • Звуковое оповещение: Параллельно с push-уведомлением активируйте сирену, подключенную к одному из реле контроллера, для привлечения внимания людей, находящихся на объекте.
    • Автоматическое открытие: Создайте логику, позволяющую автоматически открыть краны после устранения аварии. Например, после того как все датчики протечки в течение 10 минут показывают состояние `false`, можно отправить команду `OPEN`.
    • Интеграция с режимами: Свяжите сценарий с глобальными режимами объекта. Например, при активации режима "Отпуск", система может принудительно перекрывать воду, даже без сигнала о протечке, для превентивной защиты. При возвращении из отпуска вода будет автоматически подана.

    Что дальше

    В следующем уроке мы рассмотрим еще один критически важный сценарий безопасности — имитацию присутствия для защиты от вторжений, тесно связанный с режимами "Отпуск" и "Никого нет дома".