Repository navigation
Version 3.2 (07.11.2026)
-
07.11.2026: MQTT:
ambient_lightandsleepnow report their state (ON/OFF) as announced,lock_controlsreportsON/OFFright after connecting instead of1/0, and ESPuino registers a last will: if it drops off without a clean shutdown (power cut, crash, out of WiFi range), the broker itself publishesOfflineonstateafter about 90 seconds (keepalive is now 60 s). -
07.11.2026: Seek preview: pressing and releasing a button that has the seek preview assigned to it no longer seeks when the rotary encoder wasn't turned. A short press on Next with the seek preview on the same button used to jump to the new track and then try to seek it to the old position, which failed and made the LEDs flash red. Holding such a button without turning no longer seeks after the idle delay either. #476
-
01.11.2026: Player: track commands and playback from the file browser are handed to the main loop via queues, and the player flags are no longer bitfields shared between tasks, so quick presses and flags no longer get lost. This also fixes two overflows: "sleep after five tracks" no longer switches itself off from track 59 on, and playlists with more than 511 tracks no longer wrap around to track 0. Pressing "play" in the file browser no longer builds the playlist in the webserver task, which could corrupt memory together with a card applied at the same time and tripped the webserver's watchdog for big folders. #472
-
30.10.2026: LEDs: FastLED is replaced by a small built-in driver for WS2812-type LEDs. Colors, brightness and animations stay the same, but the LED task needs about a fifth of the CPU time it used to: an unchanged picture is no longer sent to the LEDs again (only once a second as a refresh), and sending no longer makes the task wait. As before, the LEDs are driven via SPI with SD-MMC and via RMT with an SD card in SPI mode. Supported chipsets are
WS2812,WS2812B,WS2813,WS2815,SK6812andNEOPIXEL; asettings-override.hwith any otherCHIPSETno longer builds. #474 -
30.10.2026: Library update: pioarduino platform 55.03.312-1 (Arduino 3.3.12), ESP32-audioI2S 4.0.1 (upstream again instead of the 16-bit fork), ESP32Encoder 5.0.0, ESPAsyncWebServer 3.12.1, arduino-audio-tools 1.2.6. The new platform needs PlatformIO Core 6.2.0 or newer - update it if the build fails. With the new audio library, mono playback no longer corrupts memory, which made the box crash when shutting down (forum #4902). In Bluetooth mode the audio DMA buffer is smaller (12 instead of 32 KB) to leave more internal RAM for Bluetooth. #473
-
24.10.2026: Web: CORS headers are only sent when built with
-DENABLE_CORS_FOR_DEBUG, so other web pages in the network can no longer use the REST API from the browser. -
24.10.2026: Web: fix crashes, leaks and hangs in some request handlers (missing query parameters, unterminated WebSocket messages, large or unreadable folders, unchecked allocations).
-
24.10.2026: Passwords are no longer handed out. The log no longer prints the MQTT and FTP passwords, and
/settings,/wificonfigand the settings sent over the websocket only say whether an MQTT, FTP or access-point password is stored (passwordSet,apPasswordSet). In the web interface these fields stay empty, and leaving one empty keeps the stored password; a switch removes the MQTT or access-point password. A stored MQTT password only stays with the server and user it was entered for: anyone on the network could otherwise point the box at a broker of their own and read the password at the next connect./wificonfignow keeps every field a request leaves out, which also lets the access-point setup page save the hostname - it used to be rejected there. Reported in #466. -
17.10.2026: MQTT and FTP: user, password and MQTT server may now be up to 64 characters instead of 15, 15, 31 and - for FTP - 9 and 14. The old limits only ever existed in the web interface; the firmware stores all of them as strings and never had a buffer to overflow, so a long broker password was silently cut off while typing. The FTP password field was additionally capped at 9 instead of its intended 14 characters by a copy-paste slip. On top of that, no input field drops characters quietly any more: pasting more than fits turns the field red and names the number of characters that were cut off, and a field filled to its limit says so. That applies to every field with a length limit, the ESPuino name (hostname, 32 characters) now among them - a too-long name used to be refused with the browser's unhelpful "please match the requested format". Reported in #465.
-
17.10.2026: MediaHub: a hub that didn't answer is no longer left out until the next restart. A hub only learns of a new card through that very request, so a single failed contact used to keep every later card from reaching it for the rest of the session. The price is up to two seconds per unreachable hub before the "card unknown" error. Discussion: forum #4779.
-
15.10.2026: MediaHub: a card built from a folder now plays that folder, not whichever one the ESPuino could infer from the file paths. The hub says which folder was picked, so "random subfolder" finally works on a folder that holds nothing but subfolders - picking it used to come back empty, and a folder holding a single subfolder played nothing at all. Update the hub alongside the firmware; without it the ESPuino falls back to the old guess, which is also what happens for selections assembled file by file. Idea and discussion: forum #4779.
-
06.10.2026: MediaHub: a changed card no longer re-downloads everything. The ESPuino compares the hub's per-file checksums against the ones from its last sync and fetches only what actually changed - adding one track to a 150 MB audiobook now moves that one track instead of all of it, and a transfer interrupted halfway resumes instead of starting over. "Force refresh" still replaces the card completely, which is what it is for; the hub publishes its force counter in the manifest so the device can tell the two apart, so update the hub along with the firmware. Playback of the old version is stopped before the transfer starts instead of competing with it for the SD card, and the new version plays as soon as the sync is done - the extra tap that used to be needed is gone. Idea and discussion: forum #4607.
-
26.09.2026: MediaHub: a card unknown to this ESPuino is now offered to the registered hubs before it's rejected - if one of them already has it assigned, it's adopted and played right away, so a card taught on one device no longer has to be assigned by hand on every other one. Off by default (MediaHub tab). The assignment list also shows what a MediaHub card actually plays now (name, real play mode, sync state, hub by its registered name), and the hidden
/.mediahubfolder can optionally be made visible in the file browser to see what got synced. Idea and discussion: forum #4779. -
26.09.2026: Fix the RFID assignment list staying in the fallback language: the locale files arrive after the page has loaded, and unlike everything carrying
data-i18n, the list is built from plain text nodes that the re-translation can't reach - so on a fresh load it stayed English while the rest of the page was German. Also hides dot-entries in subfolders of the file browser, which the hidden-file filter always meant to do but only ever managed at the top level (a.DS_Storeinside a folder was listed).