Repository navigation
v4.24
A responsiveness and reliability release: much faster serial replies, a fix for boards that hung at boot with no SD card, and a far bigger automated test suite.
Faster UART (inverter serial) link
- Parameters and dashboard refresh several times faster. Each serial reply used to wait a fixed 100 ms after it had finished. Now the ESP waits up to 100 ms for a reply to start, then stops reading after 10 ms of silence (
UART_IDLE_TIMEOUT, tunable at build time). - Plotter with Burst > 1 is several times faster. The 100 ms wait applied to every sample, so Burst 10 took about 1 s per update.
- Release builds no longer echo every reply to the debug serial port. Printing a full
jsonreply at 115200 baud blocked the web server (and the gauges' live stream) for about 2.5 s per refresh. Debug builds still echo.
SD card / boot hang (#5)
- Boards with no SD card fitted (e.g. Wemos D1 Mini ESP32) no longer hang at boot. The SD probe task used to be killed from
setup()on timeout, either while it was still inside the SD driver or through a handle it had already freed. It now finishes on its own, and a card that's slow to come up is still detected. - New SD Card toggle (Settings → Device & Connection, classic ESP32 builds only; ESP32-S3 builds have SD compiled out). Turns off probing for an SD card at boot, for boards with nothing on the SDIO pins. It's on by default, so boards with an SD slot behave as before.
Fixes
- Deleting files from the Files tab works again: the firmware now accepts names without a leading
/. - Plotter: the x-axis stays on a fixed window instead of jumping as samples arrive, and changing Burst while plotting now takes effect.
- CAN mode: the internal
can_cachemarker no longer shows up as a spot value. - Parameters: typing a second value straight after pressing Enter no longer gets silently dropped.
- WiFi: if the device rejects a save (e.g. an AP passphrase shorter than 8 characters), the UI now shows the reason instead of "saved".
Hardening
- The live stream's query parsing now matches whole parameter names only, so
xms=can no longer setms. Its name check no longer misbehaves on non-ASCII bytes. - Pin numbers read from
settings.jsonare range-checked at boot, the same way the Settings page already checked them, so a corrupt file can't configure a nonexistent GPIO.
Testing and CI
- The E2E suite grew from 128 to 191 tests: a mock ESP that's much closer to the real firmware, CAN mode, the SSE live stream with polling fallback, plotter bursts, phone-sized screens, files and WiFi.
- New firmware unit tests run on the host (
pio test -e native). They cover the input parsing and validation, the OTA header and the UART reply handling, and include fuzz loops. CI also runs them under AddressSanitizer + UBSan. - CI compiles all four PlatformIO environments and the SPIFFS image on every PR.
- CodeQL scans the firmware (C/C++), the web UI and the workflows.
npm auditruns in CI, and Dependabot alerts are on. - New branch flow: work lands on
dev. Every push tomainre-runs the full suite and, if it passes, publishes the next release automatically.
Thanks to @sperate for the detailed latency measurements and patches on the OpenInverter forum (and the fork at sperate/esp32-web-interface-mod), and to @damienmaguire for the clear boot-hang report.
Updating: use the Update page. The combined OTA image replaces the filesystem, so export your settings first and re-import them afterwards.