6655dd3d7a
MQTT топики, REST API, поведение устройства, маппинг датчиков. Mermaid диаграммы: flow подключения, обработка сообщений, FSM устройства.
3.6 KiB
3.6 KiB
Device Behavior
Конечный автомат устройства
stateDiagram-v2
[*] --> Booting: Включение питания
Booting --> WiFiConnect: Инициализация
WiFiConnect --> MQTTConnect: WiFi OK
WiFiConnect --> WiFiConnect: Retry (30s)
MQTTConnect --> Connected: MQTT OK
MQTTConnect --> MQTTConnect: Retry (10s)
Connected --> Publishing: Таймер сбора данных
Publishing --> Connected: Данные отправлены
Connected --> ExecutingCmd: Получена команда
ExecutingCmd --> Connected: Команда выполнена
Connected --> Disconnected: Потеря связи
Disconnected --> MQTTConnect: Reconnect
Connected --> [*]: Команда reboot / WDT reset
Последовательность запуска
- Boot — инициализация I2C, SPI, OneWire периферии
- WiFi — подключение, получение IP
- MQTT connect — handshake с брокером
- Publish
{UID}/status = "connected"— уведомление сервера - Получить preferences — сервер отвечает
{UID}/set/preferences/all - Применить калибровку — записать коэффициенты в память
- Запуск основного цикла — периодический сбор и публикация данных
Периодичность публикации данных
| Датчик | Интервал |
|---|---|
| pH, EC, Temp | ~10 сек |
| AirTemp, AirHum | ~30 сек |
| RSSI, uptime | ~60 сек |
| MixerWeight | ~5 сек (если mixer_enabled) |
| readGPIO | при изменении |
Обработка команд
Все команды fire-and-forget — ответ не отправляется.
cmd/reboot
- Завершить активные операции помп (стоп)
ESP.restart()
cmd/gpio/{pin}
- Проверить pin ∈ [0, 15]
- MCP23017 → setPin(pin, state)
set/pump/{id}/run
- Проверить id ∈ [1, 8], time ∈ [1, 60000]
- Включить помпу
- Запустить таймер
- По истечении времени — выключить
set/pump/{id}/dispense
- Проверить id ∈ [1, 8], grams ∈ [0.1, 1000]
- Рассчитать время через
ml/secкалибровку помпы - Включить → таймер → выключить
- Обновить счётчик
total_dispensed
cmd/pump/{id}/stop
- Немедленно выключить помпу
- Сбросить таймер
set/preferences/all
- Разобрать JSON
- Обновить только пришедшие поля в NVS / RAM
- Применить новые коэффициенты калибровки без перезагрузки
Reconnect логика
- WiFi: авто-реконнект встроенный в ESP-IDF
- MQTT: переподключение каждые 10 секунд
- При восстановлении MQTT: снова публикует
{UID}/status = "connected" - Сервер снова отправляет preferences (идемпотентно)
OTA обновления
URL прошивки: preferences.updateUrl
По умолчанию: https://ponics.online/static/wegabox/esp32-local/firmware.bin
Триггер обновления: команда (TBD) или автоматически при запуске если новая версия.