feature/esp32-board-and-signals
transform-origin: center у SVG-группы лопастей считался от bounding box, а не от геометрического центра ступицы (0,0) — вентилятор вращался вокруг смещённой точки. Зафиксировано в 0 0. Датчик больше не подписан как «DHT22» (сбивало с толку при добавлении дискретных сигналов вроде door_open) — просто «Датчик», а сами сигналы в карточке визуально разбиты на группы «Аналоговые»/«Дискретные».
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 |
порт веб-морды эмулятора |
Languages
HTML
61.1%
Go
38.3%
Dockerfile
0.6%