ГлавнаяАкадемияNode-RED: установка, flows, msg/JSON, отладка → Нода `Inject`: ручной запуск и запуск по расписанию

Нода `Inject`: ручной запуск и запуск по расписанию

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

Введение в ноду Inject: главный инициатор потоков

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

Основное назначение ноды `Inject` — генерировать и "вбрасывать" (инъецировать) объект сообщения `msg` в поток. Этот процесс может быть инициирован тремя основными способами:

  • Вручную: Путем нажатия на кнопку непосредственно на самой ноде в редакторе. Это основной инструмент для отладки потоков (debugging) и тестирования логики.
  • Автоматически через интервал: Нода может быть настроена на генерацию сообщений через равные промежутки времени (например, каждые 10 секунд, 5 минут или 1 раз в час).
  • Автоматически по расписанию: Используя гибкий синтаксис Cron-выражений, можно задать точное время и дату запуска (например, каждый будний день в 9:00 утра или в первое число каждого месяца).
  • Визуально нода `Inject` представляет собой прямоугольник с кнопкой слева и индикатором состояния справа. Кнопка служит для ручного запуска, а индикатор отображает информацию о последнем запуске или предстоящем, если настроено расписание.

    > ℹ️ Информация: Хотя `Inject` является основным инициатором, потоки также могут запускаться внешними событиями, обрабатываемыми другими нодами, такими как `mqtt in`, `http in` или `modbus-read`. Однако даже в этих случаях `Inject` незаменим для тестирования, позволяя эмулировать входящие данные без реального оборудования.

    Понимание и уверенное владение всеми режимами работы ноды `Inject` является критически важным навыком для любого инженера по автоматизации, поскольку она используется на всех этапах жизненного цикла проекта: от первоначального проектирования и тестирования до эксплуатации и мониторинга готовых систем.

    ---

    Ручной запуск и основы отладки

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

    Использование кнопки для немедленной инъекции

    Чтобы запустить поток вручную, достаточно один раз нажать на физическую кнопку, расположенную в левой части ноды `Inject`. Сразу после нажатия нода сгенерирует сконфигурированный `msg` объект и отправит его на свой единственный выход. Этот процесс не требует развертывания (Deploy), если изменения в конфигурацию самой ноды не вносились.

    Практический пример: Проверка связи с нодой `Debug`
  • Перетащите на рабочую область ноду `Inject` и ноду `Debug` из палитры слева.
  • Соедините выход ноды `Inject` со входом ноды `Debug`.
  • Нажмите кнопку "Deploy" (Развернуть) в правом верхнем углу интерфейса, чтобы сохранить поток.
  • Перейдите на вкладку "Debug messages" (Отладочные сообщения) на боковой панели справа.
  • Нажмите на кнопку на ноде `Inject`.
  • В панели отладки вы мгновенно увидите новое сообщение. По умолчанию нода `Inject` отправляет в `msg.payload` текущую временную метку (timestamp).

    Инициализация при старте

    Крайне полезной является опция "Inject once after ... seconds on start". При активации этого чекбокса нода автоматически сработает один раз после развертывания потока или после перезагрузки контроллера. Это позволяет:

    Конфигурация простого `msg.payload`

    Для отладки часто требуется отправлять не просто временную метку, а конкретные тестовые данные. Это легко настраивается в окне конфигурации ноды `Inject`.

  • Дважды щелкните по ноде `Inject`, чтобы открыть ее настройки.
  • В поле `Payload` выберите из выпадающего списка тип данных, например, `string` (строка) или `number` (число).
  • В поле рядом введите ваше тестовое значение. Например, строку `"ON"` или число `25.5`.
  • Нажмите "Done", а затем "Deploy".
  • Теперь при каждом ручном запуске нода будет отправлять именно это значение, что позволяет эмулировать команды или показания датчиков.

    > 💡 Подсказка: Для быстрой проверки логики работы нескольких нод создайте несколько нод `Inject` с разными `msg.payload` и соедините их с одной и той же точкой в потоке. Это позволит вам эмулировать разные сценарии без реального оборудования. Например, одна нода `Inject` отправляет `{"command": "open"}`, а вторая — `{"command": "close"}`, обе подключены к одному и тому же субпотоку управления приводом.

    ---

    Конфигурация Payload и Topic: формируем исходящее сообщение

    онфигурация Payload и Topic: формируем исходящее сообщение

    Как мы уже знаем из предыдущих уроков, объект `msg` является основой передачи данных в Node-RED. Нода `Inject` предоставляет мощный и гибкий интерфейс для формирования этого объекта, задавая значения для его двух самых важных свойств: `msg.payload` и `msg.topic`.

    Типы данных в `msg.payload`

    Полезная нагрузка (`payload`) — это основное содержимое сообщения. Нода `Inject` позволяет отправлять данные различных типов:

    Работа с JSON и JSONata

    Использование типа данных `JSON` в `Inject` позволяет создавать структурированные сообщения. Однако, если вам нужно, чтобы данные менялись при каждом нажатии (например, содержали актуальную дату в читаемом виде), используйте JSONata.

    Пример 1: Эмуляция сообщения от датчика (статичный JSON)

    В настройках `payload` выберите тип `JSON` и вставьте объект:

    {
    

    "value": 23.5,

    "unit": "°C",

    "source": "sensor-temp-room101",

    "meta": { "location": "Office", "type": "DS18B20" }

    }

    Пример 2: Формирование динамических данных (JSONata)

    Выберите тип `J: Expression` для `payload`. Это позволит вычислять значения «на лету»:

  • Создание ISO-даты:
  • `{"original_ts": $now(), "formatted": $fromMillis($millis(), '[Y0001]-[M01]-[D01] [H01]:[m01]')}`

    Результат: объект с текущим временем в удобном для чтения формате.

  • Генерация случайного значения (симуляция датчика):
  • `{"sensor": "LivingRoom", "humidity": $floor($random() * 100)}`

    Результат: при каждом нажатии в `payload.humidity` будет новое число от 0 до 99.

    Назначение `msg.topic`

    Свойство `msg.topic` используется для семантической маршрутизации сообщений. Представьте себе `topic` как "тему" или "адрес" сообщения. Он не несет самих данных, но описывает их назначение. Это свойство активно используется другими нодами, в первую очередь `Switch` и `mqtt out`.

    В ноде `Inject` вы можете задать `msg.topic` в соответствующем поле.

    Пример использования `msg.topic` для маршрутизации:

    Предположим, у вас есть две ноды `Inject`:

  • Нода 1:
  • * `msg.payload` (string): `"ON"`

    * `msg.topic` (string): `"control/light/living_room/main"`

  • Нода 2:
  • * `msg.payload` (string): `"ON"`

    * `msg.topic` (string): `"control/light/kitchen/spot"`

    Обе ноды могут быть подключены к одному и тому же узлу `Switch`, который будет анализировать `msg.topic` и направлять команду на управление нужной группой света.

    > 💡 Совет: Использование JSONata в поле `topic` также возможно. Например, выражение `$topic & "/" & $now()` позволит добавить метку времени к адресу сообщения.

    > 🔗 Связанный материал: Принцип использования топиков для маршрутизации аналогичен работе протокола MQTT, который мы подробно рассматривали ранее. В Node-RED эта концепция расширена для внутренней логики потоков.

    Запуск по интервалу: периодические задачи

    Помимо ручного запуска для отладки, нода `Inject` является ключевым инструментом для создания автоматизированных периодических задач. Этот режим, называемый интервальным запуском, позволяет потоку выполняться через строго определенные промежутки времени. Это основная модель для организации поллинга — регулярного опроса устройств и сервисов.

    Настройка режима "repeat" -> "interval"

    Чтобы настроить периодический запуск, необходимо выполнить следующие шаги в окне конфигурации ноды `Inject`:

  • Найдите секцию "Repeat" (Повтор) в нижней части окна.
  • В выпадающем списке выберите опцию `interval` (интервал).
  • Установите числовое значение для интервала (например, `5`).
  • Выберите единицы измерения из списка справа: `seconds` (секунды), `minutes` (минуты) или `hours` (часы).
  • После развертывания такого потока нода `Inject` будет автоматически генерировать сообщение с заданной периодичностью.

    > ⚠️ Внимание: Избегайте установки слишком коротких интервалов (менее 5-10 секунд) для задач, опрашивающих оборудование по медленным шинам (например, Modbus RTU по RS-485). Это может привести к перегрузке шины, конфликтам доступа и нестабильной работе устройств, которые не успевают отвечать на частые запросы. Частота опроса должна соответствовать инертности измеряемого процесса.

    Практический пример: Опрос датчика температуры

    Представим задачу: необходимо каждые 15 секунд считывать показания с датчика температуры, подключенного по шине Modbus.

  • Нода `Inject`:
  • * `Payload`: `timestamp` (или пустая строка, т.к. `Modbus-Getter` не требует `payload`).

    * `Repeat`: `interval`

    * `every`: `15` `seconds`

  • Нода `Modbus-Getter`:
  • * Настраивается на опрос нужного регистра датчика (как мы рассматривали в модуле по протоколам).

  • Нода `Function`:
  • * Принимает ответ от Modbus, преобразует его в градусы Цельсия и формирует объект `msg.payload` согласно "Контракту сообщения".

  • Нода `Debug`:
  • * Выводит отформатированный результат в панель отладки.

    После развертывания этого потока вы увидите, что в панели отладки каждые 15 секунд появляется новое сообщение с актуальной температурой.

    Комбинация с "Inject once at start"

    При настройке интервального запуска очень полезна опция "Inject once at start". Если она активна, поток будет выполнен немедленно после развертывания, а затем начнет работать по интервальному расписанию. Это гарантирует, что система получит первые данные сразу, не дожидаясь окончания первого интервала. Это особенно важно для панелей визуализации и систем мониторинга, которые должны отображать состояние сразу после запуска.

    Например, при интервале в 1 час, без этой опции, первое значение температуры появилось бы только через час после старта контроллера. С активированной опцией — сразу же.

    ---

    Продвинутое планирование с Cron

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

    Cron — это классический планировщик задач из мира UNIX/Linux, синтаксис которого стал стандартом для описания сложных расписаний. Он позволяет с невероятной гибкостью указать, когда именно должен быть запущен поток.

    Синтаксис Cron

    Cron-выражение состоит из пяти (иногда шести) полей, разделенных пробелами. Каждое поле представляет собой единицу времени.

    | Поле | Допустимые значения | Символы |

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

    | 1. Минуты | `0-59` | `*` (любое значение), `,` (перечисление), `-` (диапазон), `/` (шаг) |

    | 2. Часы | `0-23` | `*`, `,`, `-`, `/` |

    | 3. День месяца | `1-31` | `*`, `,`, `-`, `/` |

    | 4. Месяц | `1-12` | `*`, `,`, `-`, `/` (или `JAN`, `FEB`, `MAR`...) |

    | 5. День недели | `0-7` (0 и 7 - Вс) | `*`, `,`, `-`, `/` (или `SUN`, `MON`, `TUE`...) |

    | (6. Секунды) | `0-59` | В некоторых реализациях, включая Node-RED `Inject`, есть опциональное шестое поле для секунд, которое ставится в начале. |

    Примеры Cron-выражений: `0 8 ` — Запускать каждый день ровно в 8:00 утра. `/15 ` — Запускать каждые 15 минут (в :00, :15, :30, :45). `0 22 * 1-5` — Запускать в 22:00 каждый будний день (с понедельника по пятницу). `0 0 1 *` — Запускать в полночь первого числа каждого месяца. (с секундами) `0 /30 ` - Запускать каждые 30 секунд.

    > 💡 Подсказка: Синтаксис Cron может показаться сложным. Используйте онлайн-валидаторы, такие как `crontab.guru`, чтобы проверить правильность своих выражений и увидеть их текстовое описание.

    Практический пример: Ежедневный отчет

    Задача: Каждый день в 7:00 утра инициировать поток, который собирает статистику за прошедшие сутки и отправляет отчет по MQTT.
  • Откройте настройки ноды `Inject`.
  • В секции "Repeat" выберите `at a specific time` (в определенное время).
  • В поле "At" введите Cron-выражение: `0 7 *`.
  • В поле `Payload` можно задать команду, например, в формате JSON:
  • {
    

    "command": "generate_daily_report",

    "period": "last_24h"

    }

  • Подключите эту ноду к потоку, который реализует логику сбора и отправки отчета.
  • Теперь ровно в 7:00 утра `Inject` отправит управляющее сообщение, которое запустит всю цепочку действий. Это идеальный способ для реализации задач обслуживания, таких как создание резервных копий, очистка логов или формирование аналитических сводок.

    ---

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

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

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

    Краткий обзор режимов:

    Использование динамических данных через JSONata (J:)

    Хотя `Inject` чаще всего отправляет статические значения, вы можете использовать встроенный язык выражений JSONata (выбрав тип данных `J:` в выпадающем списке), чтобы сформировать динамический payload еще на этапе запуска.

    Примеры динамического формирования payload:
  • Генерация ISO-даты: Вместо обычного числа (Timestamp) вы можете отправить строку в формате ISO:
  • `$now()` → результат: `"2023-10-27T10:00:00.000Z"`

  • Формирование сложного объекта: Создание структуры данных для тестирования API:
  • `{"deviceId": "sensor-01", "active": true, "startup": $millis()}`

    > 💡 Эти примеры позволяют имитировать реальные данные от устройств без написания JavaScript-кода в ноде `Function`.

    Рекомендации и паттерны использования

  • Выбирайте режим по задаче:
  • * Нужно опрашивать датчик? — `interval`.

    * Нужно включить ночной режим ровно в 23:00? — `Cron`.

    * Нужно проверить, как ваш `function` узел обработает некорректные данные? — ручной запуск с настроенным `payload`.

  • Используйте `Inject` для создания "Heartbeat"-потоков:
  • Настройте ноду `Inject` на срабатывание раз в минуту и отправку сообщения о статусе контроллера (`{"status": "alive", "timestamp": ...}`) в специальный MQTT топик. В комбинации с функцией LWT (Last Will and Testament) брокера MQTT, это позволяет системе мониторинга верхнего уровня надежно отслеживать, находится ли контроллер в сети и функционирует ли Node-RED.

  • Не усложняйте ноду `Inject`:
  • > ⚠️ Анти-паттерн: Часто возникает соблазн встроить слишком сложную логику форматирования данных прямо в ноду `Inject`. Этого следует избегать. Нода `Inject` должна выполнять свою главную функцию — инициировать поток. Если расчет данных занимает больше одной строки JSONata-выражения, лучше вынести эту логику в специализированные ноды, такие как `Change` или `Function`. Это делает потоки более читаемыми и простыми в поддержке.

    Что дальше?

    Освоив "запуск" потока, на следующем уроке мы перейдем к его "обработке". Мы подробно изучим ноду `Change`, которая является ключевым инструментом для манипулирования свойствами объекта `msg` без написания кода, и продолжим знакомство с языком JSONata для выполнения сложных трансформаций данных.