Skip to content

Прошивка (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 проекта. Под капотом облако:

  1. Шлёт command {type: "ota_update", payload: {firmware_id}}.
  2. Плата принимает команду на heartbeat'е.
  3. Плата делает GET к облачному эндпоинту, скачивает .bin, заливает в OTA-партицию.
  4. Перезагружается.

Полезно если плат много — не надо каждую обновлять руками.

Резервная партиция (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.