transform-origin: center у SVG-группы лопастей считался от bounding box,
а не от геометрического центра ступицы (0,0) — вентилятор вращался вокруг
смещённой точки. Зафиксировано в 0 0.
Датчик больше не подписан как «DHT22» (сбивало с толку при добавлении
дискретных сигналов вроде door_open) — просто «Датчик», а сами сигналы
в карточке визуально разбиты на группы «Аналоговые»/«Дискретные».
Абстрактные кружки заменены на схему ESP32 DevKit с подписанными
GPIO-пинами и проводами к каждому периферийному устройству — видно,
что куда подключено. Датчик больше не ограничен фиксированными
температурой/влажностью: можно добавить любой именованный сигнал
(аналоговый слайдер или дискретный тумблер вкл/выкл) — бэкенд уже
принимал произвольный sensor_type, не хватало только формы.
Главный фикс: значения теперь публикуются в MQTT автоматически
(debounce ~350мс после слайдера, мгновенно для тумблера), а не только
по кнопке — раньше несохранённые локальные правки терялись при любом
переподключении SSE (сервер присылает эталон при каждом новом
сабскрайбе), из-за чего казалось, что слайдеры ни на что не влияют.
Плата и подписи обновляются локально сразу при вводе, без ожидания
ответа сервера.
Go-сервис без внешних фронтенд-зависимостей: embedded HTML-страница
с SVG-изображением платы (датчик + вентилятор + свет + помпа) и
Server-Sent Events для live-обновления. Слушает devices/+/commands
и реально отвечает ack'ом, публикует devices/{id}/telemetry —
протокол зеркалит ingest-service/device-control-service основного
репозитория, общего кода между репозиториями нет. Дефолтные
external_id (sensor-1/fan-1/light-1/pump-1) совпадают с
DemoGrowboxSeeder платформы.