""" boot.py — runs before main.py on every ESP32 boot Connects WiFi, runs OTA update, then hands off to main.py. Keep this file as simple as possible — it is never OTA-updated itself (it lives outside the repo folder) so bugs here require USB to fix. """ import network import utime import sys import ota ota.load_config() WIFI_SSID, WIFI_PASSWORD = ota.WIFI_SSID, ota.WIFI_PASSWORD def _connect_wifi(timeout_s=20): sta = network.WLAN(network.STA_IF) sta.active(True) sta.config(txpower=15) if sta.isconnected(): return True sta.connect(WIFI_SSID, WIFI_PASSWORD) deadline = utime.time() + timeout_s while not sta.isconnected(): if utime.time() > deadline: return False utime.sleep_ms(300) return True if WIFI_SSID is None: print("[boot] No WiFi credentials — cannot connect, skipping OTA") elif _connect_wifi(): ip = network.WLAN(network.STA_IF).ifconfig()[0] print(f"[boot] WiFi connected — {ip}") try: ota.update() except Exception as e: print(f"[boot] OTA error: {e} — continuing with existing files") sys.print_exception(e) else: print("[boot] WiFi failed — skipping OTA, booting with existing files") # main.py runs automatically after boot.py