You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.