Tutorial 05 · программируем логику

Нода — это вычислительное устройство

Создадим программу для виртуальной машины: нажатие BOOT на ESP32-S3 HW747 включит встроенный красный LED.

Нода не ограничивается датчиком или реле

Оборудование даёт ноде физические входы и выходы, но решение о том, что с ними делать, принимает виртуальная машина (VM) внутри ноды. VM исполняет скомпилированный пакет .fsmb с квантом 100 ms. Поэтому одна и та же плата может быть индикатором, контроллером, фильтром сигнала или частью распределённой логики — это определяется программой, а не только проводами.

FSM — основа этой программы. Она описывает, какие значения читать, что вычислять и в каком состоянии находится логика. В этом уроке мы создадим и развернём FSM из Frontend Node IDE.

Важно: Node IDE использует текстовый редактор .fsmc, а не графический редактор блоков. Визуально результат наблюдается в Execution Tree, DebugPanel и Infrastructure Live.

Сервисы — сигналы вычислительной среды

Сервис имеет имя, тип, направление и транспорт. FSM читает и записывает сервисы по имени, не привязываясь к GPIO или пакету ESP-NOW. Так логика остаётся одинаковой при локальной и сетевой работе.

УровеньГде объявленПример HW747
HW.hw; физический драйвер платыBootButton — вход GPIO0; RgbR/G/B — выход WS2812 GPIO48
NETin_services / out_services в .fsmcCmdR принимает удалённую команду; Btn1 может отправить событие другой ноде
commoncommon_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 тика.

Создайте проект для HW747

  1. Закончите Tutorial 04: API, Frontend и Management bridge должны быть доступны. Нода HW747 должна быть зарегистрирована, online и находиться в mode normal.
  2. Откройте Frontend и выберите область Node. В меню File → New откроется мастер проекта.
  3. Выберите папку проекта, аппаратный шаблон ESP32-S3-HW747 и профиль FSM. Не выбирайте Stateless: мастер создаёт мост HW↔NET, а нам нужна собственная логика со состоянием.
  4. Во вкладке HardwareConfig проверьте профиль и порты: BootButton, RgbR, RgbG, RgbB.

Напишите простейшую 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: в следующем уроке можно добавить другое состояние, таймер или переход.

Скомпилируйте, проверьте и разверните

  1. Сохраните файл и нажмите Compile или F7. Статус должен показать compile OK; получатся .fsmb и .fsmpdb. Если есть ошибка, откройте Diagnostics и перейдите к строке.
  2. Для локальной проверки откройте DebugPanel: во вкладке Inputs измените BootButton, нажмите Run cycle или F5 и посмотрите RgbR/G/B в Outputs. Execution Tree показывает скомпилированную структуру FSM.
  3. Перейдите в Infrastructure → Live, найдите зарегистрированную HW747 и выберите Edit FSM. После успешной компиляции нажмите Deploy, либо откройте вкладку Deploy и разверните пакет оттуда.
  4. Дождитесь результата Deploy и обновления каталога. Нажмите физическую кнопку BOOT: LED должен стать красным. В Live можно наблюдать значения HW OUT RgbR/G/B.
Deploy — не прошивка: он обновляет только пакет логики .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.