ГлавнаяАкадемияИсполнительные устройства: интерлоки, таймауты → Использование ноды Status для мониторинга состояния

Использование ноды Status для мониторинга состояния

Урок 3 · Исполнительные устройства: интерлоки, таймауты · 30 мин · theory

Введение в ноду Status: что это и зачем она нужна?

В экосистеме Node-RED, ориентированной на обработку потоков данных, критически важно иметь инструменты не только для выполнения логики, но и для наблюдения за состоянием самой системы. Если нода `Catch`, которую мы изучили ранее, является реактивным инструментом для перехвата уже случившихся ошибок выполнения, то нода `Status` — это проактивный инструмент для мониторинга состояний.

> 📋 Ключевые понятия:

> * Нода Status: Специальная нода в Node-RED, которая не обрабатывает основной поток данных, а генерирует сообщение каждый раз, когда отслеживаемая нода изменяет свой внутренний статус.

> * Состояние ноды: Это не результат ее работы, а ее внутреннее состояние. Например: "подключен к серверу", "ожидание данных", "ошибка аутентификации", "буфер заполнен".

Основное назначение ноды `Status` — предоставить инженеру автоматизации возможность "подслушать" внутреннюю жизнь других нод и отреагировать на изменения их состояния. Это позволяет создавать более надежные и интеллектуальные системы, которые могут самостоятельно диагностировать проблемы.

Ключевое отличие от ноды Catch

Крайне важно понимать фундаментальную разницу между `Status` и `Catch`, так как они решают разные, хотя и связанные, задачи.

| Критерий | Нода `Status` | Нода `Catch` |

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

| Триггер | Изменение состояния ноды (например, `connected` -> `disconnected`). | Возникновение ошибки выполнения внутри ноды (например, `node.error()` или исключение JavaScript). |

| Пример сценария | Нода `mqtt in` теряет связь с MQTT-брокером из-за сбоя сети. Статус меняется на "disconnected". | Нода `modbus-read` отправляет запрос, но устройство возвращает код ошибки Modbus (Exception). |

| Тип информации | Предоставляет информацию о текущем состоянии, часто с визуальными атрибутами (цвет, форма иконки). | Предоставляет детальную информацию об ошибке: текст ошибки, стек вызовов и оригинальное сообщение. |

| Основная цель | Проактивный мониторинг работоспособности компонентов и соединений. | Реактивная обработка сбоев в логике и взаимодействии для предотвращения остановки потока. |

Типы отслеживаемых состояний

Нода `Status` универсальна, но наиболее эффективна при мониторинге нод, взаимодействующих с внешним миром. Именно эти ноды имеют наиболее выраженные и важные состояния:

Структура объекта `msg.status`

Когда отслеживаемая нода меняет свое состояние, нода `Status` генерирует новое сообщение. Вся информация о событии помещается в объект `msg.status`. Полная структура `msg` может варьироваться, но `msg.status` является ключевым.

{

"status": {

"fill": "red",

"shape": "ring",

"text": "disconnected",

"source": {

"id": "c7a8b6f2.123456",

"type": "mqtt-broker",

"name": "HI Main Broker"

}

},

"_msgid": "d8b9c7a6.654321"

}

Ключевые поля в `msg.status`:

* `id`: Уникальный ID ноды в Node-RED.

* `type`: Тип ноды (например, `"mqtt in"`, `"modbus-client"`).

* `name`: Имя, которое вы задали ноде в редакторе.

Понимание этой структуры — ключ к эффективному использованию ноды `Status` в ваших проектах автоматизации.

---

Конфигурация ноды Status: таргетинг и анализ сообщения

Правильная настройка ноды `Status` позволяет сфокусировать мониторинг на критически важных частях системы, избегая информационного шума от второстепенных компонентов. Процесс конфигурации состоит из двух шагов: размещение и настройка области действия, а затем анализ выходного сообщения для построения логики.

Размещение и базовая настройка

Ноду `Status` можно найти в палитре "common". Перетащите ее на рабочую область. В отличие от большинства нод, у нее нет входа, только один выход. Это подчеркивает ее роль наблюдателя, а не участника основного потока.

Двойной клик по ноде открывает окно ее настроек.

Ключевой параметр здесь — "Scope" (Область действия). Он определяет, за какими именно нодами будет следить данный экземпляр ноды `Status`.

Концепция 'Scope': таргетинг нод

Параметр "Scope" имеет три варианта:

  • All Nodes: Глобальный мониторинг. Нода будет срабатывать на изменение статуса любой ноды во всех потоках (flows) вашего проекта. Этот режим полезен для создания централизованного логгера состояний, но может генерировать очень много "шума". Его следует использовать с осторожностью.
  • Current Flow: Мониторинг в пределах вкладки. Нода будет отслеживать статусы всех нод, расположенных только на той же вкладке (flow), что и сама нода `Status`. Это хороший компромисс между глобальным и точечным мониторингом.
  • Selected Nodes: Таргетинг (целевой мониторинг). Это наиболее предпочтительный и часто используемый режим. При его выборе появляется кнопка "Pick target nodes", которая позволяет в интерактивном режиме выбрать одну или несколько конкретных нод для отслеживания. Этот режим идеален для создания точной, сфокусированной логики, например, для мониторинга только MQTT-брокера и Modbus-шлюза.
  • > 💡 Подсказка: Для отладки всегда подключайте ноду `Debug` к выходу ноды `Status` и настраивайте её на вывод всего объекта `msg`. Это самый быстрый способ увидеть, какую именно информацию о состоянии отправляет целевая нода.

    Детальный разбор выходного сообщения

    Рассмотрим практический пример. У нас есть нода `mqtt in`, подписанная на топик. Мы хотим отслеживать состояние ее подключения к MQTT-брокеру.

  • Размещаем на холсте ноду `mqtt in` и настраиваем ее.
  • Размещаем ноду `Status`. В ее настройках выбираем "Scope: Selected Nodes" и указываем нашу ноду `mqtt in`.
  • Подключаем к выходу ноды `Status` ноду `Debug` (настроенную на `complete msg object`).
  • Когда Node-RED развертывается, нода `mqtt in` пытается подключиться к брокеру. Если подключение успешно, `Status` немедленно генерирует сообщение.

    {
    

    "status": {

    "fill": "green",

    "shape": "dot",

    "text": "connected",

    "source": {

    "id": "e3f4a5b6.123abc",

    "type": "mqtt in",

    "name": "Датчик протечки"

    }

    },

    "payload": "",

    "topic": "",

    "_msgid": "f1e2d3c4.987xyz"

    }

    Теперь, если мы физически остановим MQTT-брокер или оборвем сетевое соединение, нода `mqtt in` перейдет в состояние переподключения, а затем в "disconnected". Нода `Status` зафиксирует эти изменения и сгенерирует соответствующие сообщения:

    Сообщение при потере связи:
    // msg.status.text будет "connecting" или "disconnected"
    

    // msg.status.fill будет "yellow" или "red"

    {

    "status": {

    "fill": "red",

    "shape": "ring",

    "text": "disconnected",

    "source": {

    "id": "e3f4a5b6.123abc",

    "type": "mqtt in",

    "name": "Датчик протечки"

    }

    },

    // ...

    }

    Обратите внимание на объект `msg.status.source`. Он позволяет точно идентифицировать, какая именно нода сменила статус. Это критически важно, если одна нода `Status` отслеживает несколько источников. Поле `source.name` (`"Датчик протечки"`) делает логгирование и отладку гораздо более наглядными.

    Таким образом, анализируя поле `msg.status.text`, мы можем построить любую логику: отправить уведомление администратору, записать событие в базу данных MySQL или, что самое важное для нашего курса, запустить сценарий перевода системы в безопасное состояние (Safe-State).

    ---

    Пример: Мониторинг Modbus-устройств и переход в Safe-State

    Рассмотрим реалистичный сценарий для промышленного объекта или умного дома: управление климатической установкой (фанкойлом) через Modbus RTU. Потеря связи с Modbus-шлюзом означает, что контроллер больше не может управлять фанкойлом, что может привести к перегреву, переохлаждению или работе впустую. Наша задача — отследить потерю связи и перевести систему в безопасное состояние (например, выключить фанкойл).

    Компоненты потока:

    > ⚠️ Внимание: Не все сторонние (community) ноды корректно и своевременно обновляют свой статус. Перед внедрением в продакшн всегда тестируйте поведение ноды, имитируя сбои: отключайте кабель RS-485, перезагружайте сетевое оборудование, останавливайте MQTT-брокер.

    Построение потока

  • Настройте `modbus-client`: Создайте новую ноду конфигурации Modbus Client, укажите правильный COM-порт (`/dev/ttyUSB0` для адаптера или `/dev/ttyS1` для встроенного порта), скорость (например, `9600`), и другие параметры шины. Дайте ей осмысленное имя, например, "Шина RS485-1 (Климат)".
  • Настройте `Status`:
  • * Добавьте ноду `Status`.

    * В настройках "Scope" выберите "Selected Nodes".

    * Нажмите "Pick target nodes" и выберите вашу ноду конфигурации "Шина RS485-1 (Климат)".

  • Настройте `Switch`:
  • * Подключите выход `Status` ко входу `Switch`.

    * В настройках `Switch` в поле "Property" укажите `msg.status.text`.

    * Добавьте правила для анализа текста статуса. Нода `node-red-contrib-modbus` использует следующие статусы:

    * `connected`

    * `connecting`

    * `disconnected`

    * `error`

    * `timeout`

    * Создайте правило: `contains` `"disconnected"` -> выход 1.

    * Добавьте правило: `contains` `"error"` -> выход 1 (объединяем с первым).

    * Добавьте правило: `contains` `"timeout"` -> выход 1.

    * Добавьте правило: `==` `"connected"` -> выход 2.

    * Остальные статусы (например, "connecting") можно проигнорировать, направив их на последний выход "otherwise".

  • Интеграция с Safe-State:
  • * Подключите первый выход `Switch` (ошибки связи) к вашему субпотоку "Safe-State: Climate". Этот субпоток должен, например, отправить команду на выключение всех реле, управляющих фанкойлом.

    * Подключите второй выход `Switch` (успешное подключение) к ноде, которая может записать в лог, что связь восстановлена, или отправить уведомление.

    Пример JSON-конфигурации потока:

    Вы можете импортировать этот JSON-код в Node-RED (`Import -> Clipboard`), чтобы увидеть готовую структуру потока.

    [
    

    {

    "id": "a1b2c3d4.123456",

    "type": "tab",

    "label": "Modbus Monitoring",

    "disabled": false,

    "info": ""

    },

    {

    "id": "b2c3d4e5.234567",

    "type": "status",

    "z": "a1b2c3d4.123456",

    "name": "Monitor Modbus Client",

    "scope": [

    "c3d4e5f6.345678"

    ],

    "x": 230,

    "y": 140,

    "wires": [

    [

    "d4e5f6a1.456789"

    ]

    ]

    },

    {

    "id": "d4e5f6a1.456789",

    "type": "switch",

    "z": "a1b2c3d4.123456",

    "name": "Check Connection Status",

    "property": "status.text",

    "propertyType": "msg",

    "rules": [

    {

    "t": "stric",

    "v": "disconnected,error,timeout",

    "vt": "str"

    },

    {

    "t": "eq",

    "v": "connected",

    "vt": "str"

    }

    ],

    "checkall": "true",

    "repair": false,

    "outputs": 2,

    "x": 480,

    "y": 140,

    "wires": [

    [

    "e5f6a1b2.56789a"

    ],

    [

    "f6a1b2c3.6789a1"

    ]

    ]

    },

    {

    "id": "e5f6a1b2.56789a",

    "type": "debug",

    "z": "a1b2c3d4.123456",

    "name": "Trigger Safe-State!",

    "active": true,

    "tosidebar": true,

    "console": false,

    "tostatus": false,

    "complete": "{ \"action\": \"SAFE_STATE\", \"reason\": msg.status.text, \"source\": msg.status.source.name }",

    "targetType": "jsonata",

    "x": 750,

    "y": 100,

    "wires": []

    },

    {

    "id": "f6a1b2c3.6789a1",

    "type": "debug",

    "z": "a1b2c3d4.123456",

    "name": "Connection OK",

    "active": true,

    "tosidebar": true,

    "console": false,

    "tostatus": false,

    "complete": "{ \"status\": \"OK\", \"source\": msg.status.source.name }",

    "targetType": "jsonata",

    "x": 730,

    "y": 180,

    "wires": []

    },

    {

    "id": "c3d4e5f6.345678",

    "type": "modbus-client",

    "name": "Шина RS485-1 (Климат)",

    "clienttype": "serial",

    "bufferCommands": true,

    "stateLogEnabled": true,

    "queueLogEnabled": false,

    "tcpHost": "127.0.0.1",

    "tcpPort": "502",

    "tcpType": "DEFAULT",

    "serialPort": "/dev/ttyUSB0",

    "serialType": "RTU-BUFFERD",

    "serialBaudrate": "9600",

    "serialDatabits": "8",

    "serialStopbits": "1",

    "serialParity": "none",

    "serialConnectionDelay": "100",

    "unit_id": "1",

    "commandDelay": "1",

    "clientTimeout": "1000",

    "reconnectOnTimeout": true,

    "reconnectTimeout": "2000"

    }

    ]

    Этот практический пример демонстрирует, как `Status` становится ключевым элементом в создании самодиагностирующейся и отказоустойчивой системы автоматизации.

    ---

    Синергия: Комбинация Status и Catch для максимальной отказоустойчивости

    Использование только ноды `Status` или только ноды `Catch` по отдельности создает пробелы в системе безопасности. `Status` может не заметить ошибку исполнения, а `Catch` не узнает об обрыве связи, если не было попытки отправки данных. Истинная отказоустойчивость достигается только при их синергетическом, совместном использовании.

    Разграничение зон ответственности

    Представим систему как многоуровневую структуру. `Status` и `Catch` работают на разных уровнях:

    🔗 Связанный материал: Для углубленного понимания работы `Catch`, обратитесь к уроку `COURSE-05-M05-L02`, где мы подробно разбирали механику перехвата ошибок.

    Сценарий, требующий обе ноды

    Рассмотрим наш пример с Modbus-устройством.

  • Контроллер HI подключен к шлюзу Modbus TCP/RTU. Нода `Status`, отслеживающая `modbus-client`, показывает уверенный статус `"connected"`. Система считает, что все в порядке.
  • Инженер отправляет поток на чтение регистра температуры с датчика с адресом 5.
  • Однако этот датчик был физически отключен от шины RS-485, которая идет уже после шлюза. Шлюз, получив запрос от контроллера, пытается опросить датчик, не получает ответа и возвращает контроллеру ошибку "Gateway Target Device Failed to Respond" (Modbus Exception Code 11).
  • С точки зрения ноды `Status`, состояние `modbus-client` не изменилось — он все еще подключен к шлюзу. Проблема осталась бы незамеченной.
  • Но нода `modbus-read`, получив ошибку, вызовет `node.error()`. Эту ошибку перехватит нода `Catch`.
  • Только благодаря `Catch` мы узнаем о проблеме на прикладном уровне, даже когда на уровне соединения все выглядит хорошо.

    Архитектурный паттерн: Центральный обработчик ошибок

    Для сложных проектов лучшей практикой является создание выделенного потока (отдельной вкладки в Node-RED), который можно назвать "Monitoring & Safety".

    Структура этого потока:
  • Глобальная нода `Catch`: Одна нода `Catch`, настроенная на `Scope: All Nodes`, перехватывает все ошибки исполнения в проекте.
  • Набор целевых нод `Status`: Несколько нод `Status`, каждая из которых настроена на мониторинг одной критически важной ноды конфигурации (MQTT-брокер, Modbus-клиенты, KNX-шлюзы и т.д.).
  • Узлы `Link Out`: Выходы всех нод `Catch` и `Status` направляются через узлы `Link Out` в единую точку.
  • Центральный обработчик: В этой же вкладке размещается узел `Link In`, который собирает все сообщения о сбоях. За ним следует нода `Function` или субпоток, который выполняет следующие действия:
  • * Нормализация: Приводит сообщения от `Catch` и `Status` к единому формату.

    * Логирование: Записывает стандартизированное сообщение об ошибке в базу данных MySQL на контроллере или в системный лог.

    * Принятие решений: На основе тяжести и источника ошибки, запускает соответствующие сценарии:

    * Отправка уведомления администратору.

    * Попытка автоматического восстановления (например, перезапуск соединения).

    * Активация сценария Safe-State для затронутой подсистемы.

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

    ---

    Итоги и лучшие практики

    Нода `Status` — это не просто еще один инструмент в палитре Node-RED, а фундаментальный компонент для построения профессиональных, отказоустойчивых систем автоматизации на контроллерах HI. Она смещает парадигму инженера от "реагирования на пожар" (когда что-то уже сломалось и было поймано `Catch`) к "установке дымовых датчиков" — проактивному мониторингу здоровья системы.

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

    Лучшая практика №1: Всегда отслеживайте внешние интерфейсы

    Точки интеграции с внешним миром — самые хрупкие и непредсказуемые части любой системы. Сетевые кабели могут быть повреждены, Wi-Fi сигнал может пропасть, стороннее оборудование может "зависнуть".

    * `mqtt-broker`

    * `modbus-client` (как для RTU, так и для TCP)

    * `knx-gateway`

    * `tcp request` (если используется для API-интеграций)

    * Специфичные ноды для Zigbee, Z-Wave, LoRaWAN и других беспроводных протоколов.

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

    Лучшая практика №2: Используйте узкий таргетинг

    Соблазн использовать одну глобальную ноду `Status` (`Scope: All Nodes`) велик, но это плохая практика для производственных систем. Глобальный мониторинг генерирует огромное количество "белого шума" от нод, чьи статусы некритичны (например, нода `Inject` меняет статус при срабатывании).

    Лучшая практика №3: Полноценный Safe-State — это триада

    Для создания действительно надежного механизма Safe-State недостаточно только `Status` и `Catch`. Необходимо добавить третий компонент для обработки "зависших" состояний, когда ошибки нет, но и данные не поступают.

    > ℹ️ Информация: Полноценный механизм отказоустойчивости на контроллерах HI строится на связке трех нод:

    > 1. `Status`: Отслеживает состояние подключения.

    > 2. `Catch`: Перехватывает ошибки исполнения команд.

    > 3. `Trigger` / `Watchdog`: Контролирует таймауты поступления данных. Если от датчика не было данных в течение N минут, `Trigger` отправляет сигнал тревоги, даже если `Status` показывает "connected" и `Catch` молчит.

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

    Что дальше?

    В следующем уроке мы объединим все полученные знания и на практике создадим комплексный сценарий управления приводом с интерлоками, таймаутами и полным циклом обработки ошибок с использованием связки `Status`, `Catch` и `Trigger` для реализации финального, наиболее надежного варианта Safe-State.