github aitjcize/esp32-photoframe v2.20.0

3 hours ago

Added

  • Low battery badge. When the battery is at or below a threshold, a small empty-battery icon is drawn in the top-right corner of every picture, so a frame on the wall says so before it goes dark. It comes from the frame's own reading and is never drawn on USB power, while charging, or when the board has no battery reading; album snapshots stay clean. Settings → Power: on by default, threshold 5–50 % (default 10 %); low_battery_indicator / low_battery_threshold in /api/config, also in the photoframe server's device dialog (≥ v1.18.0). (#160)
  • Sensor readings in URL-mode fetches. Boards with a temperature/humidity sensor send X-Temperature (°C) and X-Humidity (% RH) with every image request, next to X-Battery-Percentage; boards without a sensor send neither. (#157)
  • Rotate and mirror in the upload panel: two quarter-turn buttons and a mirror toggle next to Cover / Fit / Custom, applied before layout so the preview, histogram, thumbnail and upload agree.
  • Config import checks its input: a JSON file that is no config export is refused, settings the frame did not take are named, and a refused import shows the frame's own reason. (@t3ste)

Changed

  • HTTPS image URLs are verified with the built-in CA bundle first, and a certificate is pinned only when the bundle cannot vouch for it (a self-signed or private-CA server). Frames that pinned a Let's Encrypt issuer stopped fetching after a renewal under the other intermediate; they recover on their own after this update. An HTTPS URL to a self-signed or private-CA server needs one "Trust certificate" in Settings → Auto Rotate after upgrading, whether it was pinned before or saved before pinning existed: fetches without a pin were not verified at all until now, and are checked against the bundle from this version on. (#142)
  • The web UI bundles its icons as SVG paths and no longer loads fonts from the internet, so it renders fully on a frame without outbound access (provisioning hotspot, isolated LAN) and no longer waits for those requests to fail first.
  • The file picker asks for image/* instead of listing HEIC, which only Safari decodes; on an iPhone this lets Safari hand over the JPEG it would convert the photo to. A HEIC that fails to decode is named as such.
  • A chosen file the browser cannot read as an image is reported instead of leaving the preview blank with the Upload button armed. (@t3ste)

Fixed

  • OTA found no update on some frames. The release metadata was only read when GitHub sent a Content-Length; a chunked answer failed as "Empty response body". Workaround on v2.19.0: press Check for updates twice within a minute. (#156)
  • Battery read as 0 % on timer wakes (XIAO EE02/EE04, reTerminal E1002): the automatic light sleep during the 10 ms settle delay isolated every GPIO, including the divider's enable pin. The pin is now kept driven through light sleep. (#123, @bilibb)
  • A WiFi network with a 32-character name could not be joined; the SSID was cut to 31 characters at every copy. (@bilibb)
  • A BMP whose read failed halfway (an SD glitch mid-file) was shown as a half-blank picture and logged as a success. It is now a failure, and sequential rotation moves on to the next image while random rotation picks another. (@t3ste)
  • The gallery requested <album>/undefined for an image with no thumbnail (a file copied straight to the SD card): a placeholder with the file name is shown instead, and the image can still be displayed. (@t3ste)
  • The gallery said nothing when the frame refused an album or image action (a name with a slash, an album that already exists); a snackbar now names the failure and the "New album" dialog stays open. (@t3ste)
  • Three settings-store catch blocks logged an undeclared variable, so every failed save threw instead of reporting the failure. (@t3ste)

Installation

Web Flasher (Easiest)

Flash directly from your browser (Chrome/Edge/Opera required):
https://aitjcize.github.io/esp32-photoframe/#flash

Manually

Choose the appropriate merged binary for your board:

  • photoframe-firmware-waveshare_photopainter_73-merged.bin: For Waveshare 7.3" 7-color e-paper
  • photoframe-firmware-seeedstudio_xiao_ee02-merged.bin: For Seeed XIAO EE02
  • photoframe-firmware-seeedstudio_reterminal_e1002-merged.bin: For Seeed reTerminal E1002
  • photoframe-firmware-seeedstudio_xiao_ee04-merged.bin: For Seeed XIAO EE04
  • photoframe-firmware-seeedstudio_reterminal_e1004-merged.bin: For Seeed reTerminal E1004
  • photoframe-firmware-seeedstudio_reterminal_e1003-merged.bin: For Seeed reTerminal E1003 (10.3" grayscale)
  • photoframe-firmware-seeedstudio_xiao_ee03-merged.bin: For Seeed XIAO EE03 (10.3" grayscale)
  • photoframe-firmware-m5stack_m5paper_v11-merged.bin: For M5Stack M5Paper v1.0/v1.1 (4.7" grayscale)
# ESP32-S3 boards (everything except the M5Paper)
esptool.py --chip esp32s3 --port /dev/ttyUSB0 --baud 921600 write_flash 0x0 photoframe-firmware-[board]-merged.bin

# M5Stack M5Paper (ESP32)
esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 921600 write_flash 0x0 photoframe-firmware-m5stack_m5paper_v11-merged.bin

The [board]-[version].elf files are debug symbols for decoding crash reports; they are not needed to install.

Don't miss a new esp32-photoframe release

NewReleases is sending notifications on new releases.