Skip to content

Version 2.10 (11.08.2026)

Latest

Choose a tag to compare

@biologist79 biologist79 released this 11 Aug 13:26
  • 11.08.2026: Fix build failing when NEOPIXEL_ENABLE is disabled - LED_BRIGHTNESS_STEP/LED_BRIGHTNESS_MIN were only defined inside the #ifdef NEOPIXEL_ENABLE block in Led.h, but Cmd.cpp references them in the always-compiled CMD_BRIGHTNESS_UP/DOWN handler (the LED functions it calls are already no-op stubs without NEOPIXEL). Both constants are now defined unconditionally, so a build without Neopixels compiles again (#453), thanks to @z3ky for reporting.
  • 08.08.2026: Enable firmware-update-over-web on the ESP32-S3 devkit - the S3 environment never set a partition table, so it silently fell back to the global [env] default (custom_4mb_noota.csv): half of the devkit's 8MB flash was unusable and, with a single factory-app and no otadata/ota_0/ota_1 partitions, an update over the web interface could never work. The env now uses custom_8mb_ota.csv and defines BOARD_HAS_16MB_FLASH_AND_OTA_SUPPORT, like the equally-sized esp32-wrover-devkitc-v4-8mb board, so "Firmware-Update" no longer answers with "OTA not supported". Breaking for existing S3 installs: the partition layout changes, so this build has to be flashed over USB once, and because NVS moves with it the saved settings are reset - back them up via the web interface first.
  • 30.07.2026: Fix folder uploads via the web interface flattening their structure - since the switch to raw per-file uploads (#434) each file was stored under its bare name, dropping any subfolders, so a whole folder got "unpacked" into the target directory. The upload now sends each file's webkitRelativePath (its path within the selected folder) so the subfolder structure is preserved again; plain single-file uploads are unaffected. Thanks to Jonas1 for reporting.
  • 23.07.2026: Add a configurable minimum volume ("Minimal") to the volume settings - the volume can no longer be turned below this floor from any source (rotary, buttons, Bluetooth, web), e.g. so a box can never be accidentally muted entirely. The boot volume (initial or remembered-last) is also raised to the floor if it sits below it. Defaults to 0 (unchanged behaviour); must be lower than both maximum volumes. The runtime clamp already existed but was never wired to a setting; based on the idea in #392, thanks to @lukas227.
  • 23.07.2026: Fix "RFID-Karte wurde entfernt" incorrectly triggering a "Playmode kann nicht verändert werden, wenn keine Playlist aktiv ist" error when a card is removed after the playlist has already finished naturally - pauseIfRfidRemoved's card-removed handler in both RfidMfrc522.cpp and RfidPn5180.cpp now only queues the PAUSEPLAY command while a playlist is actually active/paused.
  • 23.07.2026: RfidMfrc522: deterministic WUPA/HALT presence poll for pauseIfRfidRemoved, replacing the non-deterministic REQA-based removal detection that caused spurious pause/resume flapping on a perfectly stationary card (and, as a result, NVS write wear from repeated position saves and occasional spurious deep-sleep due to desynced play/pause state). Also fixes reassigning a tag via the web UI having no effect until reboot while pauseIfRfidRemoved is active - the reader's last-seen-tag cache is now invalidated on every path that changes what a tag means (assign, mod-card, delete, NVS erase/restore) (#413), thanks to @mgoodfellow.
  • 23.07.2026: PN5180: deterministic re-reads for a resting ISO-14443 card - poll with WUPA instead of REQA and park read cards in HALT so a stationary card answers every poll instead of only from the IDLE state, plus one silent re-init sweep at the debounce boundary to tell a temporarily wedged reader apart from a genuinely removed card before declaring removal. Fixes the same spurious pause/resume flapping and phantom-removal symptoms as the MFRC522 fix above (#444), thanks to @sadilek.
  • 22.07.2026: Fix defensive strncpy call for gPlayProperties.playRfidTag to reserve space for and explicitly write the NUL-terminator, instead of copying into the full buffer size - not currently exploitable (the source is always a fixed-length RFID tag ID), but matches the pattern fixed for a genuinely unterminated case in #443, thanks to @oberbichler for flagging it.
  • 22.07.2026: Fix timer and port-expander ISRs missing IRAM_ATTR on Arduino-ESP32 v3 - if either ISR fired while the flash cache was disabled (e.g. during an NVS/flash write), it would crash; the port-expander ISR was the higher risk since it can fire at any time. Both are now unconditionally kept in IRAM regardless of Arduino-ESP32 version (#442), thanks to @oberbichler.
  • 22.07.2026: Fix missing NUL-termination when copying a track path from NVS - a stored path of ≥255 characters left the buffer unterminated, risking an out-of-bounds read when passed on to the audio player (#443), thanks to @oberbichler.
  • 21.07.2026: Remove compile-time LED/NeoPixel defaults (NUM_INDICATOR_LEDS, NUM_CONTROL_LEDS, CONTROL_LEDS_COLORS, NUM_LEDS_IDLE_DOTS, OFFSET_PAUSE_LEDS, PROGRESS_HUE_START, PROGRESS_HUE_END, ATMO_HUE, ATMO_SATURATION, DIMMABLE_STATES, LED_OFFSET) - all of these were already fully runtime-configurable via the web interface, the macros only fed the pre-first-save NVS default (now hardcoded, same values as before). CHIPSET/COLOR_ORDER are unaffected - those are genuine compile-time FastLED template parameters and can't be runtime-configurable. Breaking for custom builds: a settings-override.h still defining one of the removed macros will silently no longer have any effect - set the value once via the web UI instead.
  • 21.07.2026: Web-UI: give settings sliders live value badges and circular +/- step buttons instead of a bare drag handle, and group related settings across all tabs into rounded cards for a clearer, more compact layout.
  • 20.07.2026: Make the MFRC522 scan interval a web-UI setting ("MFRC522 Scan-Intervall") instead of the compile-time-only RFID_SCAN_INTERVAL - default unchanged at 100ms. A restart is required for a change to take effect, same as the other MFRC522/PN5180-specific settings.
  • 20.07.2026: Fix LEDs staying lit forever in deepsleep after SHUTDOWN_IF_SD_BOOT_FAILS triggers - the LED task was still running its idle animation when esp_deep_sleep_start() was called, and NeoPixels simply hold their last-sent color with no active refresh. Now clears the LEDs before sleeping.
  • 20.07.2026: Remove unused compile-time macro PLAY_MONO_SPEAKER - mono/stereo playback has long been a runtime web-UI setting only (nothing in the codebase ever checked this macro), so it was dead documentation.
  • 20.07.2026: Battery: make automatic shutdown on critical voltage a web-UI toggle instead of the compile-time-only SHUTDOWN_ON_BAT_CRITICAL - off by default, same as before for anyone who didn't compile with the flag. Breaking for custom builds: a settings-override.h still defining SHUTDOWN_ON_BAT_CRITICAL will silently no longer have any effect - enable "Bei kritischer Spannung automatisch abschalten" in the battery settings instead.
  • 20.07.2026: Remove compile-time toggles STATIC_IP_ENABLE, PLAY_LAST_RFID_AFTER_REBOOT, PAUSE_WHEN_RFID_REMOVED, DONT_ACCEPT_SAME_RFID_TWICE, RESUME_ON_SAME_RFID and NEOPIXEL_REVERSE_ROTATION - these were already fully configurable at runtime via the web interface; the macros only controlled the pre-first-save default (true vs false) and are now always initialized to false. Breaking for custom builds: a settings-override.h that still defines one of these macros will silently no longer have any effect - enable the corresponding option in the web UI instead. Static IP itself is unaffected, it has been a fully runtime/per-network web-UI setting for a while; the removed macro only fed a one-time migration for pre-multi-network configs.