Нода `Inject`: ручной запуск и запуск по расписанию
Введение в ноду Inject: главный инициатор потоков
В основе любого процесса автоматизации лежит событие-инициатор, или триггер потока. В экосистеме Node-RED роль этого фундаментального элемента выполняет нода `Inject`. Это один из самых важных и часто используемых узлов, который служит отправной точкой для подавляющего большинства потоков (flows), которые вы будете создавать.
Основное назначение ноды `Inject` — генерировать и "вбрасывать" (инъецировать) объект сообщения `msg` в поток. Этот процесс может быть инициирован тремя основными способами:
Визуально нода `Inject` представляет собой прямоугольник с кнопкой слева и индикатором состояния справа. Кнопка служит для ручного запуска, а индикатор отображает информацию о последнем запуске или предстоящем, если настроено расписание.
> ℹ️ Информация: Хотя `Inject` является основным инициатором, потоки также могут запускаться внешними событиями, обрабатываемыми другими нодами, такими как `mqtt in`, `http in` или `modbus-read`. Однако даже в этих случаях `Inject` незаменим для тестирования, позволяя эмулировать входящие данные без реального оборудования.
Понимание и уверенное владение всеми режимами работы ноды `Inject` является критически важным навыком для любого инженера по автоматизации, поскольку она используется на всех этапах жизненного цикла проекта: от первоначального проектирования и тестирования до эксплуатации и мониторинга готовых систем.
---
Ручной запуск и основы отладки
Самый простой и интуитивно понятный режим работы ноды `Inject` — это ручной запуск (manual trigger). Он позволяет инженеру мгновенно отправить тестовое сообщение в поток, чтобы проверить реакцию следующих за ним узлов. Это фундаментальный механизм для пошаговой отладки и проверки работоспособности отдельных сегментов логики.
Использование кнопки для немедленной инъекции
Чтобы запустить поток вручную, достаточно один раз нажать на физическую кнопку, расположенную в левой части ноды `Inject`. Сразу после нажатия нода сгенерирует сконфигурированный `msg` объект и отправит его на свой единственный выход. Этот процесс не требует развертывания (Deploy), если изменения в конфигурацию самой ноды не вносились.
Практический пример: Проверка связи с нодой `Debug`В панели отладки вы мгновенно увидите новое сообщение. По умолчанию нода `Inject` отправляет в `msg.payload` текущую временную метку (timestamp).
Инициализация при старте
Крайне полезной является опция "Inject once after ... seconds on start". При активации этого чекбокса нода автоматически сработает один раз после развертывания потока или после перезагрузки контроллера. Это позволяет:
- Инициализировать переменные: Установить начальные значения для переменных потока или глобальных переменных.
- Запросить начальное состояние: Сделать первоначальный запрос к оборудованию (например, к датчикам или реле), чтобы система сразу после старта имела актуальные данные.
- Проверить работоспособность: Отправить тестовое сообщение в систему мониторинга, подтверждая, что контроллер успешно запустился.
Конфигурация простого `msg.payload`
Для отладки часто требуется отправлять не просто временную метку, а конкретные тестовые данные. Это легко настраивается в окне конфигурации ноды `Inject`.
Теперь при каждом ручном запуске нода будет отправлять именно это значение, что позволяет эмулировать команды или показания датчиков.
> 💡 Подсказка: Для быстрой проверки логики работы нескольких нод создайте несколько нод `Inject` с разными `msg.payload` и соедините их с одной и той же точкой в потоке. Это позволит вам эмулировать разные сценарии без реального оборудования. Например, одна нода `Inject` отправляет `{"command": "open"}`, а вторая — `{"command": "close"}`, обе подключены к одному и тому же субпотоку управления приводом.
---
Конфигурация Payload и Topic: формируем исходящее сообщение
онфигурация Payload и Topic: формируем исходящее сообщение
Как мы уже знаем из предыдущих уроков, объект `msg` является основой передачи данных в Node-RED. Нода `Inject` предоставляет мощный и гибкий интерфейс для формирования этого объекта, задавая значения для его двух самых важных свойств: `msg.payload` и `msg.topic`.
Типы данных в `msg.payload`
Полезная нагрузка (`payload`) — это основное содержимое сообщения. Нода `Inject` позволяет отправлять данные различных типов:- `timestamp` (временная метка): Режим по умолчанию. Отправляет текущее время в формате Unix Epoch (миллисекунды). Полезно для измерения времени выполнения участков потока.
- `string` (строка): Текстовые данные. Используется для отправки команд (`"ON"`, `"OFF"`), статусов или текстовой информации.
- `number` (число): Числовые данные. Используется для эмуляции показаний аналоговых датчиков (температура, влажность, давление) или для отправки числовых уставок.
- `boolean` (булево): Логические значения `true` или `false`. Идеально подходит для представления состояний "включено/выключено", "открыто/закрыто".
- `JSON`: Наиболее гибкий и мощный формат. Позволяет создавать сложные вложенные объекты. Это основа для реализации "Контракта сообщения".
- `J: Expression` (JSONata): Язык выражений, позволяющий формировать данные динамически прямо в момент инъекции.
Работа с 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`. Это позволит вычислять значения «на лету»:
`{"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`:
* `msg.payload` (string): `"ON"`
* `msg.topic` (string): `"control/light/living_room/main"`
* `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`:
После развертывания такого потока нода `Inject` будет автоматически генерировать сообщение с заданной периодичностью.
> ⚠️ Внимание: Избегайте установки слишком коротких интервалов (менее 5-10 секунд) для задач, опрашивающих оборудование по медленным шинам (например, Modbus RTU по RS-485). Это может привести к перегрузке шины, конфликтам доступа и нестабильной работе устройств, которые не успевают отвечать на частые запросы. Частота опроса должна соответствовать инертности измеряемого процесса.
Практический пример: Опрос датчика температуры
Представим задачу: необходимо каждые 15 секунд считывать показания с датчика температуры, подключенного по шине Modbus.
* `Payload`: `timestamp` (или пустая строка, т.к. `Modbus-Getter` не требует `payload`).
* `Repeat`: `interval`
* `every`: `15` `seconds`
* Настраивается на опрос нужного регистра датчика (как мы рассматривали в модуле по протоколам).
* Принимает ответ от Modbus, преобразует его в градусы Цельсия и формирует объект `msg.payload` согласно "Контракту сообщения".
* Выводит отформатированный результат в панель отладки.
После развертывания этого потока вы увидите, что в панели отладки каждые 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.{
"command": "generate_daily_report",
"period": "last_24h"
}
Теперь ровно в 7:00 утра `Inject` отправит управляющее сообщение, которое запустит всю цепочку действий. Это идеальный способ для реализации задач обслуживания, таких как создание резервных копий, очистка логов или формирование аналитических сводок.
---
Итоги и лучшие практики
тоги и лучшие практики
Нода `Inject` — это швейцарский нож для запуска потоков в Node-RED. Мы рассмотрели все три ее основных режима работы, каждый из которых предназначен для своего круга задач.
Краткий обзор режимов:- Ручной запуск: Ваш главный инструмент для тестирования, отладки и пошаговой проверки логики. Незаменим на этапе разработки.
- Интервальный запуск: Основа для задач поллинга и периодического мониторинга. Идеально подходит для регулярного сбора данных с датчиков или проверки статуса устройств.
- Запуск по расписанию (Cron): Мощный инструмент для выполнения задач в строго заданное время. Используется для отложенных действий, ночных сценариев, генерации отчетов и задач системного обслуживания.
Использование динамических данных через JSONata (J:)
Хотя `Inject` чаще всего отправляет статические значения, вы можете использовать встроенный язык выражений JSONata (выбрав тип данных `J:` в выпадающем списке), чтобы сформировать динамический payload еще на этапе запуска.
Примеры динамического формирования payload:`$now()` → результат: `"2023-10-27T10:00:00.000Z"`
`{"deviceId": "sensor-01", "active": true, "startup": $millis()}`
> 💡 Эти примеры позволяют имитировать реальные данные от устройств без написания JavaScript-кода в ноде `Function`.
Рекомендации и паттерны использования
* Нужно опрашивать датчик? — `interval`.
* Нужно включить ночной режим ровно в 23:00? — `Cron`.
* Нужно проверить, как ваш `function` узел обработает некорректные данные? — ручной запуск с настроенным `payload`.
Настройте ноду `Inject` на срабатывание раз в минуту и отправку сообщения о статусе контроллера (`{"status": "alive", "timestamp": ...}`) в специальный MQTT топик. В комбинации с функцией LWT (Last Will and Testament) брокера MQTT, это позволяет системе мониторинга верхнего уровня надежно отслеживать, находится ли контроллер в сети и функционирует ли Node-RED.
> ⚠️ Анти-паттерн: Часто возникает соблазн встроить слишком сложную логику форматирования данных прямо в ноду `Inject`. Этого следует избегать. Нода `Inject` должна выполнять свою главную функцию — инициировать поток. Если расчет данных занимает больше одной строки JSONata-выражения, лучше вынести эту логику в специализированные ноды, такие как `Change` или `Function`. Это делает потоки более читаемыми и простыми в поддержке.
Что дальше?
Освоив "запуск" потока, на следующем уроке мы перейдем к его "обработке". Мы подробно изучим ноду `Change`, которая является ключевым инструментом для манипулирования свойствами объекта `msg` без написания кода, и продолжим знакомство с языком JSONata для выполнения сложных трансформаций данных.