Идея
Нода не ограничивается датчиком или реле
Оборудование даёт ноде физические входы и выходы, но решение о том, что с ними делать, принимает виртуальная машина (VM) внутри ноды. VM исполняет скомпилированный пакет .fsmb с квантом 100 ms. Поэтому одна и та же плата может быть индикатором, контроллером, фильтром сигнала или частью распределённой логики — это определяется программой, а не только проводами.
FSM — основа этой программы. Она описывает, какие значения читать, что вычислять и в каком состоянии находится логика. В этом уроке мы создадим и развернём FSM из Frontend Node IDE.
.fsmc, а не графический редактор блоков. Визуально результат наблюдается в Execution Tree, DebugPanel и Infrastructure Live.Абстракция
Сервисы — сигналы вычислительной среды
Сервис имеет имя, тип, направление и транспорт. FSM читает и записывает сервисы по имени, не привязываясь к GPIO или пакету ESP-NOW. Так логика остаётся одинаковой при локальной и сетевой работе.
| Уровень | Где объявлен | Пример HW747 |
|---|---|---|
| HW | .hw; физический драйвер платы | BootButton — вход GPIO0; RgbR/G/B — выход WS2812 GPIO48 |
| NET | in_services / out_services в .fsmc | CmdR принимает удалённую команду; Btn1 может отправить событие другой ноде |
| common | common_services в .fsmc | Общее значение, доступное нескольким частям программы |
in — значение приходит в логику; out — логика публикует значение. Типы задают допустимые данные: bool — логическое true/false, bit — битовый флаг, целочисленные int8, int16, int32 — числа. Для HW747 RgbR, RgbG и RgbB имеют тип int8 и диапазон 0…127, а не 0…255.
Два уровня сложности
Stateless или FSM со состояниями
stateless — простейшая реактивная логика без состояний: она получает актуальные значения и сразу вычисляет выходы. Это удобно для моста NET → HW, например CmdR → RgbR. В stateless нельзя использовать STATE, await, waitfor или sleep.
fsm подходит, когда программе важна история: начальное состояние, ожидание события, таймер, последовательность действий. Внутри fsm есть initial state и другие state; переходы меняют поведение без внешней переменной «режим».
Реактивность
Условие пересчёта VM
У VM нет отдельной кнопки «запустить логику». Она работает тиками, но нужные блоки пересчитываются реактивно. Список после имени блока — trigger-list — указывает входы, по изменению которых логика должна выполниться: fsm Main : BootButton. Если список не задан, блок пересчитывается на каждом раунде стабилизации.
У состояния можно задать watch-list; он определяет, какие значения повторно выполняют тело текущего состояния. Для первого примера достаточно trigger BootButton: новое значение кнопки приводит к новому значению LED. Выходы становятся видимыми после завершения цикла VM — обычно не позднее следующего 100 ms тика.
Практика · шаг 1
Создайте проект для HW747
- Закончите Tutorial 04: API, Frontend и Management bridge должны быть доступны. Нода HW747 должна быть зарегистрирована, online и находиться в
mode normal. - Откройте Frontend и выберите область Node. В меню File → New откроется мастер проекта.
- Выберите папку проекта, аппаратный шаблон
ESP32-S3-HW747и профиль FSM. Не выбирайте Stateless: мастер создаёт мост HW↔NET, а нам нужна собственная логика со состоянием. - Во вкладке HardwareConfig проверьте профиль и порты:
BootButton,RgbR,RgbG,RgbB.
Практика · шаг 2
Напишите простейшую FSM
Откройте вкладку Code и замените содержимое .fsmc этой программой:
codename ButtonRgb;
#include <ESP32-S3-HW747.hw>
init {
RgbR = 0;
RgbG = 0;
RgbB = 0;
}
fsm Main : BootButton {
initial state Idle : BootButton {
if (BootButton) {
RgbR = 127;
RgbG = 0;
RgbB = 0;
} else {
RgbR = 0;
RgbG = 0;
RgbB = 0;
}
}
}
BootButton — HW IN. Программа читает его при изменении и задаёт три HW OUT. Пока BOOT удерживается, WS2812 горит красным; после отпускания выключается. Состояние Idle здесь одно, но оно показывает структуру полноценной FSM: в следующем уроке можно добавить другое состояние, таймер или переход.
Практика · шаг 3
Скомпилируйте, проверьте и разверните
- Сохраните файл и нажмите Compile или F7. Статус должен показать
compile OK; получатся.fsmbи.fsmpdb. Если есть ошибка, откройте Diagnostics и перейдите к строке. - Для локальной проверки откройте DebugPanel: во вкладке Inputs измените
BootButton, нажмите Run cycle или F5 и посмотритеRgbR/G/Bв Outputs. Execution Tree показывает скомпилированную структуру FSM. - Перейдите в Infrastructure → Live, найдите зарегистрированную HW747 и выберите Edit FSM. После успешной компиляции нажмите Deploy, либо откройте вкладку Deploy и разверните пакет оттуда.
- Дождитесь результата Deploy и обновления каталога. Нажмите физическую кнопку BOOT: LED должен стать красным. В Live можно наблюдать значения HW OUT
RgbR/G/B.
.fsmb. Плата должна уже иметь совместимую Work RGB firmware. Не переключайте ноду в mode local: это прямой режим HW и Deploy в нём недоступен.Если результат не появился
- Проверьте совпадение
#hardware_profile ESP32-S3-HW747с firmware: несовпадение HW-портов отклоняет Deploy. - Проверьте в Tutorial 04 API/Mgmt, online-статус ноды и system id.
- Не ищите
BootButtonсреди NET IN: это физический HW IN, его нельзя установить виджетом сетевой команды. - Для удалённого управления добавьте отдельные NET IN сервисы и свяжите их с
Rgb*; готовая WorkRgb логика используетCmdR/G/B.
