Skip to content

OTA Updates

Daniel Frenkel edited this page Jul 24, 2026 · 1 revision

OTA Updates

Boards can update themselves over Wi-Fi — no computer needed.

The "Update Firmware (GitHub)" button

In the web UI under Diagnostics, pressing Update Firmware (GitHub) makes the board download the newest released firmware for its build directly from GitHub releases and flash itself. The board fetches the version-less latest asset URL, so the button always gets the current release:

https://github.com/<ota_repo>/releases/latest/download/<ota_asset>.ota.bin
  • Generic board builds pull from valar-motion's releases (val3000.ota.bin, val3100.ota.bin, val3101.ota.bin).
  • Product firmwares (Ropener, Glasscalibur) override the repo and asset name so field units pull from their own product repo's releases instead.

The download takes a minute or two for the ~1 MB image; the board reboots into the new firmware when done. Settings (speed, current, direction, schedules) are preserved.

Rollback safety

A freshly OTA'd image boots in a pending-verify state: if the new firmware crashes or boot-loops, the board automatically reverts to the previous image instead of bricking. About a minute after a healthy boot the new image is marked good. Practical upshot: if an update seems to "not stick," check whether the board rolled back — and don't power-cycle repeatedly during the first minute after an update.

Other ways to update

  • Browser + USB-C: flash any *.factory.bin from web.esphome.io — this is also the recovery path if Wi-Fi credentials are lost or you want to switch firmware entirely (e.g. from the factory Ropener image to the generic board build).
  • ESPHome dashboard / CLI: the boards accept standard ESPHome OTA uploads (esphome upload or the dashboard) if you build from source.

For maintainers: asset names are an API

Devices in the field fetch <ota_asset>.ota.bin (plus its .md5) from the latest release forever. Never rename release assetsval3100.ota.bin, Ropener-VAL3100.ota.bin, etc. must stay byte-for-byte stable across releases and repo moves, or shipped units stop updating. CI builds a *.factory.bin (full image, for USB flashing) and a *.ota.bin (OTA image) per board on every tagged release. See docs/MIGRATION.md.

Clone this wiki locally