Прошивка (OTA)¶
http://<ip-платы>/firmware.html — admin-only. Заливка новой прошивки и файловой системы по воздуху.
Что можно залить¶
Платформа собирает два образа:
firmware.bin— собственно код.littlefs.bin(с расширением.littlefs.bin) — образ файловой системы: HTML/JS/CSS + дефолты конфигов.
OTA-эндпоинт POST /api/v1/ota принимает оба — тип определяется по суффиксу имени файла.
Форма¶
| Поле | Назначение |
|---|---|
| Файл прошивки | Один или два файла. Если только firmware.bin — обновится код, FS останется как есть. Если ещё и littlefs.bin — обновится UI и дефолты конфигов. |
Прогресс-бар показывает реальный upload-progress через XMLHttpRequest.upload.onprogress. После того как бэк ответил 200 OK — плата перезагружается. UI ждёт ~12 секунд и перезагружает страницу.
Что сохраняется при OTA¶
Модуль fs_ota ловит upload-эвент и до записи нового образа FS сохраняет в RAM:
| Файл | Что в нём |
|---|---|
/config/secrets.json |
token_secret, password_salt |
/config/device.json |
UUID, имя, geo, broadcast_ip, static_ip |
/config/settings.json |
Wi-Fi сети |
/config/users.json |
Пользователи |
/config/auth_settings.json |
require_auth toggle |
/config/devices.json |
Список устройств |
/config/tasks.json |
Задачи |
/config/network.json |
UDP параметры |
/config/network_secret.json |
mesh-ключ |
/config/cloud.json |
URL + API-key облака |
После записи нового FS-образа эти файлы восстанавливаются. То есть OTA сохраняет onboarding-данные между обновлениями автоматически.
uploadfs из PlatformIO — это НЕ OTA
pio run -t uploadfs (через USB) затирает всё FS, включая secrets.json и device.json. После него UUID сгенерируется новый, пароль admin вернётся к 1234, придётся пере-логиниться, заново подключать к облаку.
Используйте /firmware.html для штатных обновлений. uploadfs — только когда плату прошиваете с нуля.
Откуда брать .bin¶
Свои сборки¶
cd ctrl-board
pio run -e esp8266 -t buildfs # firmware + littlefs для ESP8266
ls .pio/build/esp8266/
# firmware.bin, littlefs.bin
Для ESP32: pio run -e esp32dev -t buildfs.
Готовые сборки из облака¶
Если плата привязана к проекту на cloud.kavlev.ru/ — облако само скачает и применит OTA одной кнопкой из UI проекта. Под капотом облако:
- Шлёт
command{type: "ota_update", payload: {firmware_id}}. - Плата принимает команду на heartbeat'е.
- Плата делает
GETк облачному эндпоинту, скачивает.bin, заливает в OTA-партицию. - Перезагружается.
Полезно если плат много — не надо каждую обновлять руками.
Резервная партиция (ESP32)¶
ESP32-сборка использует partitions_huge.csv — две app-партиции одинакового размера. После OTA новая версия пишется в противоположную партицию (текущая остаётся нетронутой). На reboot bootloader проверяет boot-флаги и выбирает партицию.
Если новая прошивка падает с panic'ом ≥ 3 раз подряд — bootloader откатывается на резервную партицию. Это встроенная защита от плохого билда.
ESP8266 такой защиты не имеет — там просто firmware.bin пишется поверх. Кирпич возможен — будьте аккуратны с самосборными прошивками.
Что НЕ обновляется через OTA¶
- Bootloader — нужен USB и
esptool.py. На практике не нужен — bootloader стабилен. - Partition table — то же. Если изменилась — придётся прошить через USB.
- Конфиги — они сохраняются (см. выше). Если в новой версии добавилось поле — оно подхватит дефолт при чтении.
Что делать если OTA сломал плату¶
| Симптом | Что делать |
|---|---|
| Не загружается | USB-кабель, pio run -t upload (с другой версией), pio run -t uploadfs |
| Загружается, но UI не открывается | pio run -t uploadfs — образ FS, видимо, повреждён |
| Не подключается к Wi-Fi | Тройной ребут через RST с интервалом <three_reset_window_sec (см. Настройки → Deep sleep) → сброс конфигов |
| Логин не работает | Если только что был uploadfs — нормально, пароль вернулся в 1234 |
API за этой страницей¶
См. API → OTA.