6655dd3d7a
MQTT топики, REST API, поведение устройства, маппинг датчиков. Mermaid диаграммы: flow подключения, обработка сообщений, FSM устройства.
102 lines
3.6 KiB
Markdown
102 lines
3.6 KiB
Markdown
# Device Behavior
|
|
|
|
## Конечный автомат устройства
|
|
|
|
```mermaid
|
|
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
|
|
```
|
|
|
|
---
|
|
|
|
## Последовательность запуска
|
|
|
|
1. **Boot** — инициализация I2C, SPI, OneWire периферии
|
|
2. **WiFi** — подключение, получение IP
|
|
3. **MQTT connect** — handshake с брокером
|
|
4. **Publish `{UID}/status = "connected"`** — уведомление сервера
|
|
5. **Получить preferences** — сервер отвечает `{UID}/set/preferences/all`
|
|
6. **Применить калибровку** — записать коэффициенты в память
|
|
7. **Запуск основного цикла** — периодический сбор и публикация данных
|
|
|
|
---
|
|
|
|
## Периодичность публикации данных
|
|
|
|
| Датчик | Интервал |
|
|
|--------|----------|
|
|
| pH, EC, Temp | ~10 сек |
|
|
| AirTemp, AirHum | ~30 сек |
|
|
| RSSI, uptime | ~60 сек |
|
|
| MixerWeight | ~5 сек (если mixer_enabled) |
|
|
| readGPIO | при изменении |
|
|
|
|
---
|
|
|
|
## Обработка команд
|
|
|
|
Все команды **fire-and-forget** — ответ не отправляется.
|
|
|
|
### `cmd/reboot`
|
|
1. Завершить активные операции помп (стоп)
|
|
2. `ESP.restart()`
|
|
|
|
### `cmd/gpio/{pin}`
|
|
1. Проверить pin ∈ [0, 15]
|
|
2. MCP23017 → setPin(pin, state)
|
|
|
|
### `set/pump/{id}/run`
|
|
1. Проверить id ∈ [1, 8], time ∈ [1, 60000]
|
|
2. Включить помпу
|
|
3. Запустить таймер
|
|
4. По истечении времени — выключить
|
|
|
|
### `set/pump/{id}/dispense`
|
|
1. Проверить id ∈ [1, 8], grams ∈ [0.1, 1000]
|
|
2. Рассчитать время через `ml/sec` калибровку помпы
|
|
3. Включить → таймер → выключить
|
|
4. Обновить счётчик `total_dispensed`
|
|
|
|
### `cmd/pump/{id}/stop`
|
|
1. Немедленно выключить помпу
|
|
2. Сбросить таймер
|
|
|
|
### `set/preferences/all`
|
|
1. Разобрать JSON
|
|
2. Обновить только пришедшие поля в NVS / RAM
|
|
3. Применить новые коэффициенты калибровки без перезагрузки
|
|
|
|
---
|
|
|
|
## 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) или автоматически при запуске если новая версия.
|