Практика: Создание первого Flow 'Hello, World'
Введение: Цель нашего первого Flow
Добро пожаловать в первую практическую работу в нашей академии! Сегодня мы создадим с нуля свой первый, самый базовый, но от этого не менее важный сценарий автоматизации. В программировании и разработке существует давняя традиция: при освоении новой системы первой программой всегда становится "Hello, World!". Её задача — не выполнить сложную бизнес-логику, а проверить, что вся среда разработки функционирует корректно.
Наша цель — создать в интерфейсе Node-RED простейший поток (Flow), который по ручному запуску сгенерирует сообщение (Message) с текстом "Hello, World!" и выведет его в панель отладки.
> 🔗 Связанный материал: Мы подробно разобрали теоретические основы в предыдущем уроке. Если вам нужно освежить знания, вернитесь к уроку «Ключевые понятия: Node, Message, Flow».
Выполнение этой задачи подтвердит, что:
По сути, наш сегодняшний Flow будет состоять всего из двух узлов, соединенных одной связью. Первый узел будет инициировать процесс, а второй — отображать результат. Это простое действие является тем самым «атомом», из которого в дальнейшем будут строиться все сложные системы автоматизации на объектах, будь то умный дом или небольшой промышленный цех.
---
Необходимые узлы (Nodes): Inject и Debug
Для создания нашего первого потока мы воспользуемся двумя самыми фундаментальными узлами из стандартной палитры Node-RED. Они служат отправной точкой и главным инструментом диагностики для любого инженера автоматизации.
Узел `Inject` (Инициировать)
Этот узел — наша «кнопка запуска». Он позволяет вручную или автоматически инициировать поток, создавая и отправляя на свой выход первое сообщение `msg`. Это основной способ запустить выполнение сценария по требованию, для теста или по расписанию.
> 📋 Ключевые понятия:
> * Инициатор потока: `Inject` почти всегда является первым узлом в тестовых или демонстрационных потоках.
> * Генератор данных: Он не просто запускает поток, но и формирует начальный объект `msg`, помещая в его свойство `msg.payload` указанные вами данные.
> * Планировщик: `Inject` может работать как простейший CRON, запуская поток через заданные интервалы времени (каждую секунду, раз в час, в определенное время суток).
При двойном клике на узел открывается окно его настроек. Рассмотрим ключевые параметры:
| Параметр | Назначение | Пример для нашего урока |
| :------------- | :-------------------------------------------------------------------------------------------------------------------------------------- | :------------------------- |
| Payload | "Полезная нагрузка". Это основное содержимое, которое узел поместит в `msg.payload`. Может быть строкой, числом, JSON-объектом и др. | `string`: "Hello, World" |
| Topic | "Тема сообщения". Это свойство `msg.topic`, которое используется для маршрутизации и фильтрации сообщений, как мы увидим в будущих уроках. | Оставим пустым |
| Repeat | Настройка для автоматического запуска. Позволяет запускать поток по интервалу, в определенное время или дни недели. | `none` (нет повторений) |
| Name | Имя узла, которое отображается в редакторе. Всегда давайте узлам осмысленные имена для повышения читаемости схемы. | "Запустить тест" |
Узел `Debug` (Отладка)
Если `Inject` — это кнопка «Старт», то `Debug` — это наш «монитор» или «индикаторная панель». Его единственная задача — перехватить проходящее через него сообщение `msg` и вывести его содержимое на боковую панель отладки. Это бесценный инструмент для понимания того, какие данные циркулируют в вашей системе на любом этапе.
> 💡 Подсказка: Панель Debug — ваш главный инструмент при разработке и отладке. Не стесняйтесь «обвешивать» ими свой Flow, чтобы отслеживать состояние объекта `msg` на каждом этапе, особенно до и после узлов, преобразующих данные.
Основные настройки узла `Debug`:
Output (Вывод): Определяет, что именно* будет показано в панели отладки.* `msg.payload`: Вариант по умолчанию. Показывает только полезную нагрузку сообщения. Идеально для быстрой проверки основного значения.
* `complete msg object`: Показывает весь объект `msg` целиком, включая `payload`, `topic`, внутренний идентификатор `_msgid` и любые другие свойства, которые могли быть добавлены предыдущими узлами. Этот режим критически важен для комплексной отладки.
To (Назначение): Определяет, куда* будет направлен вывод.* `debug window`: Стандартный вариант, выводит сообщение на боковую панель в интерфейсе Node-RED.
* `system console`: Выводит сообщение в системную консоль, где был запущен Node-RED. Полезно для отладки на уровне операционной системы контроллера.
Для нашей первой задачи мы оставим настройки по умолчанию, чтобы увидеть в панели отладки только `msg.payload`.
---
Пошаговая сборка Flow 'Hello, World'
Теперь, когда мы знакомы с нашими инструментами, перейдем к практике. Мы соберем наш поток шаг за шагом прямо в веб-интерфейсе контроллера.
Шаг 1: Добавление узлов на рабочее пространство
> ℹ️ Информация: Старайтесь располагать узлы аккуратно и логично, слева направо в порядке выполнения. Это значительно повышает читаемость схем. Для сложных потоков используйте группировку и комментарии, но для нашего простого случая достаточно ровного расположения.
Шаг 2: Соединение узлов
Теперь нам нужно создать связь (wire), по которой сообщение `msg` потечет от `Inject` к `Debug`.
На данном этапе ваш экран должен выглядеть примерно так:
(Изображение для иллюстрации: два узла, соединенные линией)Мы собрали "скелет" нашего потока. Однако он еще ничего не делает, так как мы не настроили, что именно `Inject` должен отправлять. Этим мы займемся в следующей секции.
---
Настройка узлов и развертывание (Deploy)
Сборка схемы — это только полдела. Теперь нам нужно сконфигурировать узлы и, что самое важное, "загрузить" наш новый сценарий в память контроллера, чтобы он начал выполняться. Этот процесс называется развертыванием (Deploy).
> ⚠️ Внимание: Любые изменения в потоках — добавление узла, изменение его настроек, создание новой связи — вступают в силу только после нажатия кнопки 'Deploy'. Если ваш Flow не работает, как ожидалось, первое, что нужно проверить — не забыли ли вы развернуть изменения. Маленький синий кружок над измененным узлом как раз сигнализирует о наличии несохраненных правок.
Шаг 1: Конфигурация узла `Inject`
Шаг 2: Конфигурация узла `Debug`
Шаг 3: Развертывание (Deploy)
Теперь, когда оба узла настроены и у них появились синие точки (индикаторы изменений), пришло время развернуть наш Flow.
С этого момента наш поток является "живым". Он будет выполняться на контроллере HI даже после того, как вы закроете браузер.
Для лучшего понимания, вот как будет выглядеть объект `msg`, который сгенерирует наш узел `Inject` после нажатия:
{
"payload": "Hello, World",
"topic": "",
"_msgid": "90d3463.1c9b3b8"
}
- `payload`: Содержит строку, которую мы задали.
- `topic`: Пустой, так как мы его не настраивали.
- `_msgid`: Уникальный идентификатор, который Node-RED присваивает каждому новому сообщению для внутреннего отслеживания.
Мы готовы к главному — тестированию.
---
Тестирование и анализ результата
Наш Flow собран, настроен и развернут. Пришло время проверить его в действии и убедиться, что мы получили ожидаемый результат.
Шаг 1: Запуск потока
В момент нажатия узел `Inject` создал объект `msg` (как в примере выше), отправил его по связи, и этот объект `msg` поступил на вход узла `Debug`.
Шаг 2: Просмотр результата в панели отладки
Теперь нам нужно увидеть результат работы узла `Debug`.
Поздравляем! Вы только что успешно создали, развернули и протестировали свой первый рабочий сценарий автоматизации.
Шаг 3: Анализ отладочного сообщения
Давайте внимательно рассмотрим строку, которая появилась в панели отладки. Она содержит больше, чем просто наш текст:
- Timestamp: Слева указано точное время, когда сообщение было получено (например, `10/26/2023, 3:30:00 PM`). Это помогает отслеживать последовательность и время событий.
- Topic (опционально): Если бы мы задали тему в узле `Inject`, она была бы указана здесь.
- Node: Правее указано имя или ID узла `Debug`, который сгенерировал это сообщение. Это крайне полезно, когда у вас на схеме несколько отладочных узлов — вы всегда знаете, какой из них сработал.
- Payload: Основное содержимое. Поскольку мы настроили узел `Debug` на вывод `msg.payload`, мы видим здесь нашу строку `Hello, World`. Тип данных (в данном случае `string`) также указан рядом.
Этот простой вывод дает нам всю необходимую информацию для подтверждения, что поток работает так, как мы его спроектировали.
---
Итоги и дальнейшие шаги
В этом уроке мы проделали фундаментальную работу, которая является основой для всех будущих, более сложных проектов. Давайте подведем итоги тому, чему мы научились:
- Создавать потоки: Мы научились находить узлы в палитре, размещать их на рабочем поле и соединять их связями для определения направления потока данных.
- Использовать базовые узлы: Мы освоили два краеугольных узла — `Inject` для инициации потоков и `Debug` для их отладки.
- Применять жизненный цикл разработки: Мы на практике прошли полный цикл: создание потока -> настройка узлов -> развертывание (Deploy) -> тестирование. Этот цикл вы будете повторять сотни раз при работе с платформой HI.
- Анализировать результаты: Мы научились открывать панель отладки и интерпретировать выводимую в ней информацию, отделяя полезную нагрузку от служебных данных.
> ℹ️ Информация: Не бойтесь экспериментировать! Вернитесь к узлу `Inject` и попробуйте изменить его настройки. Вместо строки (`string`) выберите `number` и отправьте число. Или выберите `JSON` и отправьте простой объект, например `{"status": "on", "brightness": 80}`. Посмотрите, как изменится вывод в панели `Debug`. Это лучший способ закрепить материал на практике.
Каждый, даже самый сложный проект по автоматизации гостиницы или умного дома, в своей основе состоит из таких же простых блоков и связей. Понимание того, как данные в виде объекта `msg` путешествуют от узла к узлу, преобразуясь на каждом шаге, — это ключ к успешному проектированию надежных систем.
Что дальше
Мы научились отправлять в систему статичные, заранее заданные данные. В следующем уроке мы сделаем огромный шаг вперед: научимся получать динамические данные с реального оборудования, подключенного к контроллеру. Мы создадим Flow, который будет считывать состояние физического входа, например, "сухого контакта" от настенного выключателя, и выводить его состояние в панель отладки. Это приблизит нас к созданию сценариев, реагирующих на реальные события в окружающем мире.