cacto 073577e8d9 Реалистичная плата ESP32 с распиновкой + произвольные входные сигналы
Абстрактные кружки заменены на схему ESP32 DevKit с подписанными
GPIO-пинами и проводами к каждому периферийному устройству — видно,
что куда подключено. Датчик больше не ограничен фиксированными
температурой/влажностью: можно добавить любой именованный сигнал
(аналоговый слайдер или дискретный тумблер вкл/выкл) — бэкенд уже
принимал произвольный sensor_type, не хватало только формы.

Главный фикс: значения теперь публикуются в MQTT автоматически
(debounce ~350мс после слайдера, мгновенно для тумблера), а не только
по кнопке — раньше несохранённые локальные правки терялись при любом
переподключении SSE (сервер присылает эталон при каждом новом
сабскрайбе), из-за чего казалось, что слайдеры ни на что не влияют.
Плата и подписи обновляются локально сразу при вводе, без ожидания
ответа сервера.
2026-08-13 11:54:47 +05:00

ESP32 Emulator

Веб-морда, которая ведёт себя как настоящий ESP32-контроллер гроубокса для платформы домашней автоматизации — отдельный репозиторий, никакого общего кода с основным проектом: единственная связь — MQTT-протокол, которому оба конца следуют одинаково.

Один Go-бинарник: HTTP-сервер отдаёт единственную HTML-страницу с изображением платы (датчик + вентилятор + свет + помпа) и сам говорит по MQTT с брокером платформы. Браузер никогда не подключается к MQTT напрямую — только к этому серверу (JSON + Server-Sent Events).

Что показывает страница

  • Датчик — слайдеры температуры/влажности + кнопка "Опубликовать показания" (публикует devices/{external_id}/telemetry, по одному сообщению на sensor_type, как и положено по формату ingest-service)
  • Вентилятор / Свет / Помпа — живой статус (вкл/выкл, уровень), который меняется САМ, когда платформа реально присылает команду через devices/{external_id}/commands; ручного переключения в UI нет осознанно — эмулятор демонстрирует "устройство слушается платформы", а не пульт дистанционного управления
  • external_id/zone_id каждого слота редактируемые — по умолчанию sensor-1/fan-1/light-1/pump-1, zone_id=1, чтобы сразу совпадать с DemoGrowboxSeeder основного репозитория

Протокол (см. основной репозиторий, это не источник истины, а зеркало)

Топик Кто публикует Payload
devices/{id}/telemetry эмулятор {"device_id","zone_id","sensor_type","value","timestamp"}
devices/{id}/commands платформа {"action":"turn_on"|"turn_off"|"set_level","level"?}
devices/{id}/ack эмулятор {"state":{"power":"on"|"off"}} или {"state":{"level":N}}

Запуск

Локально (нужен доступ к тому же MQTT-брокеру, что слушает платформа):

cp .env.example .env
export $(cat .env | xargs)
go run ./cmd/emulator

Открыть http://localhost:8091.

Через Docker:

docker build -t esp32-emulator .
docker run --rm -p 8091:8091 -e MQTT_BROKER_URL=tcp://host.docker.internal:1883 esp32-emulator

Переменные окружения

Переменная По умолчанию Назначение
MQTT_BROKER_URL tcp://localhost:1883 адрес брокера основной платформы
HTTP_PORT 8091 порт веб-морды эмулятора
S
Description
No description provided
Readme
87 KiB
Languages
HTML 61.1%
Go 38.3%
Dockerfile 0.6%