ESP32 Emulator: веб-морда контроллера гроубокса поверх MQTT
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 платформы.
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
# ESP32 Emulator
|
||||
|
||||
Веб-морда, которая ведёт себя как настоящий ESP32-контроллер гроубокса для
|
||||
[платформы домашней автоматизации](https://git.cactoz.su/cacto/home_automatization) —
|
||||
отдельный репозиторий, никакого общего кода с основным проектом: единственная
|
||||
связь — 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-брокеру, что слушает платформа):
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
export $(cat .env | xargs)
|
||||
go run ./cmd/emulator
|
||||
```
|
||||
|
||||
Открыть `http://localhost:8091`.
|
||||
|
||||
Через Docker:
|
||||
|
||||
```bash
|
||||
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` | порт веб-морды эмулятора |
|
||||
Reference in New Issue
Block a user