Based off of rdehuyss's MicroPython OTA Updater. This MicroPython Over-The-Air Updater will follow a GitHub branch, checking for updates on boot. Will update if HEAD is not current (other release strategies may be added later).
Note: due to a bug in the SSL library of ESP8266 devices, micropython-ota-updater cannot be used on these devices. See rdehuyss#6 and micropython/micropython#6737
Edit src/env.py
to fill in WiFi credentials, GitHub remote repository / branch and optional GitHub credentials to increase API limits (60 per hour to 5000). Deploy!
For an example implementation check out the my-grow project.
make install
# Install local Python dependencies (rshell & esptool)
make erase
# Erase ESP32
make image
# Install MicroPython on ESP32
make rsync
# Install updater
on ESP32
make repl
# Opens a repl terminal to the ESP32
Power cycle (Ctrl-D) the ESP32, you should see the updater pull down HEAD of the configured branch on boot.
Execution of src/main.py
calls updater.update()
checking .version
file with the SHA of the latest commit. If they are different it will create a new directory and pull down the src
sub-directory. Once complete, the old src
directory is deleted and the new copy is moved in its place. After that it will execute src.main
with the following kargs:
import src.main
src.main.start(env=env, requests=lib.requests, logger=logger, time=t, updater=updater)
Use src/env.py
to store secrets that will be passed to main.start()
so they do not need be stored in the main repository. This file is not updated via OTA and needs to be replaced manually by flashing.
You may want to check for updates a regularly scheduled intervals eg. every hour. Here is an example implementation:
# Reset the device if an update is available
if state['runtime'][runtime.OTA_AUTO_UPDATE_INTERVAL] and time.time() % state['runtime'][runtime.OTA_AUTO_UPDATE_INTERVAL] == 0:
try:
gc.collect()
updater.checkForUpdate()
except Exception as e:
log('Failed to check for OTA update:', e)