Skip to content

Releases

v4.28

Choose a tag to compare

@github-actions github-actions released this 05 Nov 21:29

A steadier UART link, CAN mappings you can manage from the page, more capable formula tiles, and bitmask values shown as the flags they are. As before, most of this came from community testing on the forum: thanks again, sperate.

Try it first: the live demo runs this exact UI on a simulated inverter, in your browser.

SD card users: fresh installs no longer probe for an SD card at boot. If you log to an SD card and have never changed that setting, turn it on in Settings → SD Card → Probe for an SD card at boot and reboot. A setting you saved before is kept.

UART link: no more lost sync

  • The CAN Mapping page no longer loses the inverter. libopeninv's terminal can echo a command without its first character after a bare newline, so the ESP didn't recognise the echo. A command that printed nothing (can print with no mappings stored) then looked like a wrong baud rate: the ESP dropped to 115200 while the inverter stayed at 921600, every reply came back empty, and only an inverter reboot recovered. The ESP now recognises the clipped echo and keeps the fast baud.
  • Recovers from a baud mismatch in either direction. When a command gets neither an echo nor a reply, the ESP tries the other baud rate once and settles on 115200 if neither answers, so neither the ESP nor the inverter needs a reboot.
  • save returns both of its lines. "Parameters stored" follows the flash write and used to spill into the next command's reply, so the mapping list failed to reload after saving.

Tested on a ZombieVerter over UART: empty can print, adding, saving and deleting mappings from the page, and recovery from both kinds of baud mismatch.

CAN Mapping

  • Works in UART mode. The page lists the inverter's mappings from its can print output and removes them with can del (the inverter removes all of a parameter's mappings at once, and the page asks first when there's more than one). It says so when the inverter can't list them, and terminal replies such as "Unknown parameter" now count as errors.
  • New mappings have a Bias field (default 0), and it's always sent. Some inverter firmware (5.39) rejects a can tx/can rx line without it.
  • Fits any screen. New mappings and virtual values are labelled fields that wrap to the width available, so phones and narrow windows no longer scroll sideways to reach Length, Gain and Bias. The number fields are wide enough for values like 0.0625 and -128.

Formula tiles

  • New helpers: %, mod(a,b) (always 0…b, also for negative inputs), wrap180(angle) (to −180…180) and sin/cos in degrees. wrap180(angle) shows an angle centred on 0, without the jump from 360 to 0 at the sync position.
  • Checked as you type. A line under the Formula box shows what's wrong (syntax error, unknown value or function, a helper without brackets) or the formula's current result.
  • Numbers like 1e5 and .5 work, and the box takes 120 characters (was 60).
  • Tighter: formulas are parsed token by token, and a . outside a number is refused, so a formula saved in a shared layout can't reach JavaScript properties.

Bitmask values

  • Bitmask enums (status, pinswap, canio and similar) are recognised from their values and show their set flags everywhere: Spot Values, the Dashboard and gauges. A plain enum with an unlisted value shows the number rather than made-up flags.
  • Bitmask parameters show their active flags and edit as one checkbox per bit. Enum labels may contain / (e.g. Encoder/Resolver).
  • In Spot Values, enum and bitmask text spans the sparkline and unit columns, so long status text isn't cut short.

Gauges and Dashboard

  • Line traces move in time. Line tiles and Dashboard sparklines add a point per sample whether or not the value changed, so steady signals keep scrolling, and the time axis no longer stretches while a trace fills or when a value leaves the scale.
  • Peak-hold gauges show the session low and high (▼ min ▲ max) on radial and bar gauges.
  • Values appear sooner, especially over a slow link. The layout loads alongside sign-in, and the regular poll covers the gap until the live stream delivers, so a blocked stream port no longer leaves gauges blank.
  • Tile settings keep what you type: decimals, negative values and multi-digit numbers (Min/Max, Points, Size) can be entered without the field snapping back.

Syncofs tuner (FOC)

  • Works again. Its knobs disappeared with the v4 rewrite and the page failed to load. The knobs are redrawn and can be dragged, scrolled, nudged with the arrow keys or typed into.
  • The manualid knob sets manualid (it used to set syncofs), and both knobs start from the inverter's current values, so the first turn can't jump.
  • The speed axis follows the fastest sample (100 to 1000 rpm), offsets not yet tried stay blank, and the cursor is a dashed amber line.
  • Live speed, id, iq and opmode readout; manualid is set back to 0 when you leave the page.

Users and settings

  • Admins can turn sign-in off again (Settings → Users & Access → Turn off sign-in, confirmed with your password). All accounts are removed and the device returns to open access, as after a BOOT-button reset.
  • Add user opens a dialog instead of a form left open under the user list.
  • Settings → Web Interface → Dashboard is gone: each Status tile sets its own figures in the layout editor. A choice saved with the old picker is still the default for a Status tile with no figures of its own.
  • Unsaved changes show as a slim bar with Save / Restore that folds into a small "N unsaved" pill.
  • Submit parameters posts to the parameter database the way the classic UI did, behind a dialog that explains the forum sign-in and offers the parameter file as a fallback.

Updating

Use the Update page as usual. Device settings and accounts are kept by the ESP, and your layouts and images are restored by the browser after the reboot (with sign-in on, sign back in as an operator or admin). The UART fixes are in the firmware, which the update includes.

For contributors

  • E2E suite at 343 tests, including baud-mismatch and CAN mapping paths, sideways-overflow checks on the CAN Mapping page from 375 to 1440 px, formula parsing and its editor messages, bitmask enums and the syncofs tuner.
  • The mock ESP's UART terminal answers can print/tx/rx/del/clear, and it can add latency per reply and simulate a stream port that never answers.

Full Changelog: v4.27...v4.28

v4.28-dev.5 (dev)

v4.28-dev.5 (dev) Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 05 Nov 21:22

v4.28-dev.4 (dev)

v4.28-dev.4 (dev) Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 03 Nov 09:34

v4.28-dev.3 (dev)

v4.28-dev.3 (dev) Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 02 Nov 09:24

v4.28-dev.2 (dev)

v4.28-dev.2 (dev) Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 31 Oct 21:12

v4.28-dev.1 (dev)

v4.28-dev.1 (dev) Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 31 Oct 20:41

Full Changelog: v4.27...v4.28-dev.1

v4.27

Choose a tag to compare

@github-actions github-actions released this 26 Oct 19:57

A fast plotter again, a proper Files page, and a Start button that's safe on FOC firmware. Most of this came from community testing on the forum: thanks, sperate.

Try it first: the live demo runs this exact UI on a simulated inverter, in your browser.

Plotter: fast again over UART

  • Over UART with up to 10 values, each read is now the inverter's own stream <Burst> <names> command (libopeninv, so stm32-sine and ZombieVerter alike): Burst rows sampled back-to-back and returned in one reply. 100 rows of 3 values take about 60 ms, where get with repeat took about 1.2 s for 100 samples of one value. It's a scope view for fast signals like angle, id and iq.
  • Over CAN (the ESP answers get via SDO), or with more than 10 values, it keeps get with repeat.
  • Burst (Plot → Edit Layout) is samples per read: up to 500 rows over UART, capped at 2,500 values a batch so the ESP doesn't run short of RAM. A batch is a burst of back-to-back samples, so slow signals plot as flat steps at a high Burst. The default for new layouts is 10.

Start inverter: asks first, and works on FOC

  • Start inverter in manual mode now asks for confirmation.
  • On FOC firmware, which has no start command ("Not implemented in FOC variant"), it falls back to the manualstart parameter, which starts the inverter in Run.
  • manualstart can't be left armed. It latches until every interlock passes (no throttle, brake seen, emcystop/mprot, udcsw ≤ udc < udclim). Left set while one blocks, the inverter would start by itself once that clears, so:
    • if it hasn't started within about 3 s, the button clears it again and shows the status flags that held it back;
    • a page closed, reloaded or switched away while a start is pending sends one last clear on its way out;
    • a clear the device doesn't answer (say, inverter EMI on the Wi-Fi) is retried, and if it still fails an alert says manualstart may still be armed;
    • Stop always clears manualstart, whoever set it.

Files page

  • Download beside Delete.
  • Delete asks for confirmation, and says why when it's refused (with sign-in on, the web interface's own files need an admin) instead of silently doing nothing.
  • Files are grouped into Your files and System files. System files are marked Original, Modified (a different size from what the build shipped, e.g. after you uploaded a replacement) or Missing. The build now writes fs-manifest.json (the shipped files and their sizes) into the filesystem image.
  • A tighter list, with sizes.
  • Fixed: a file in a folder (e.g. fonts/) couldn't be deleted. The firmware listed only its base name; /list now gives full paths and sizes.

Fixes and polish

  • Spot values on phones: the Name column no longer changes width as you scroll the list. The multi-column layout measured from the list's position on screen, which moves as a phone scrolls, so it flipped part-way down.
  • App mode: the manifest asks for standalone display (full screen from the home screen, where the browser allows it over plain http).
  • Dark theme dropdowns are readable: Chrome drew them with a light palette (white group headings, a pale highlight behind light text).
  • Fonts ship with their licence beside them (fonts/OFL.txt), and the font notices are corrected.
  • Removed the unused logo.png (22.7 KB of filesystem).

Updating

Use the Update page as usual: device settings and accounts are kept by the ESP, and your layouts and images are restored by the browser after the reboot (with sign-in on, sign back in as an operator or admin).

For contributors

  • E2E suite at 296 tests, including the stream and get plot paths, the FOC start fallback and its latch safety, and the Files page.
  • The mock ESP can act as the FOC build (/__test/foc, optionally with a blocking interlock).

Full Changelog: v4.26...v4.27

v4.26

Choose a tag to compare

@github-actions github-actions released this 23 Oct 16:45

Gauge pages you can make your own: pictures on your layouts, a car-style status view with live lamps and readouts over a photo, and new gauge styles. Plus about 570 KB of the device filesystem freed.

Try it first: the live demo's Vehicle page runs this exact UI on a simulated inverter, in your browser.

The sample Vehicle page: a car photo background with live lamps and temperature badges, and the new Segmented and Zone gauge styles

Images on gauge pages

  • Image tiles (Dashboard widgets → Image): a logo, diagram or photo on any gauge page or the Dashboard. Upload PNG, JPEG, WebP or GIF up to 200 KB from the tile settings, or pick an image already on the device. Fit (whole image or fill), caption, optional link. SVG uploads are refused (a same-origin SVG can run script).
  • Page backgrounds (Edit Layout → page settings → Page background): a picture behind a page's tiles, pinned to the grid's own cells, so a tile placed over a spot stays on it at every width. Size (columns × rows) and position (column, row), fit, alignment, opacity, and Text on it (light or dark text for Clear tiles over a dark or light picture).
  • Uploads are stored as img-<name> and can't be clobbered by shipped assets. An operator can upload; a missing image shows a placeholder instead of breaking the layout.
  • Kept with your layouts: Export settings (backup) includes the images your pages use, and the pre-update browser stash carries them across web-interface updates.

Car status view

  • The sample layout (Gauges → Edit Layout → Load sample layout) gains a Vehicle page: a top-down car photo with lamps on its real head and tail lights, live inverter and motor temperatures on the roof, and drive, battery and temperature gauges around it. Not on the Dashboard; swap in your own car's photo.
  • Lamp only (indicator tiles): just the light, no name or ON/OFF text. Invisible while off and a soft glow while on, so a lamp drawn in the picture lights up.
  • Badge (text tiles): name, value and unit in a small frosted pill, readable over a busy photo in either theme.
  • Clear tiles are now fully borderless (no shadow or blur) for every tile type.

Gauge styles

Chosen per tile under Style, for radial and bar tiles; existing gauges look the same until you change it.

  • Segmented: LED blocks lit up to the value along the fill's hue-offset gradient (or the custom colour's); blocks past Warn take the warn colour, blocks below centre the reverse colour.
  • Zone track / Zone bands: normal, caution (the last 15% of the span below Warn) and danger (from Warn up) bands with a pointer or marker at the value. Set Warn to get the bands.

Filesystem

  • The SPIFFS image no longer carries raw sources that have a .gz twin. The firmware has always served <file>.gz when it exists, so the raw copies were never read; they took about 570 KB of the default ~1.4 MB partition. fs_stage.py stages the image in .pio/fsdata; data/ is unchanged for the demo, mock and tests. Browsers, scripts and older firmware see no difference.

Fixes and polish

  • Dashboard status card fits its tile at every width instead of scrolling; the action buttons tile goes icon-only when its labels would wrap.
  • Header buttons (Record, Full screen, Edit Layout) use proper icons; Record is a dot in a ring, red only while recording.
  • Native dropdowns (e.g. the image file picker) follow the dark theme; the sign-in screen shows the full three-phase logo.
  • Removed a flickering light band along the top of stacked cards (Update, Settings) caused by backdrop blur on in-flow cards.
  • Installer page: the Release label sits above the Stable/Dev picker. Edit mode: an accent resize grip inside the tile corner.

Updating

Use the Update page as usual. Device settings and accounts are kept by the ESP (NVS); layouts and images are saved in the browser just before flashing and put back after the reboot. With sign-in on, the reboot signs everyone out: sign back in as an operator or admin in the same browser and the layouts are restored. Exporting a backup first is still a good idea.

For contributors

  • E2E suite at 279 tests, including image tiles, page backgrounds, gauge styles, and restore-after-update with sign-in on.

Full Changelog: v4.25...v4.26

v4.25

Choose a tag to compare

@github-actions github-actions released this 22 Oct 08:16
ddd1d86

A big one: a new look with a Dashboard you build yourself, optional user accounts, settings that survive updates, a browser installer and a live demo you can try without hardware.

Try it first: the live demo runs this exact UI on a simulated inverter, in your browser.

New look

  • Redesigned UI with dark and light themes. Fonts are bundled on the device, so it looks the same with no internet. Small text meets 4.5:1 contrast in both themes.
  • Sidebar grouped into Monitor / Configure / Device, with a top bar showing where you are (the device name on the Dashboard).
  • Phones: a bottom bar (Home, Gauges, Values, Params, More); More opens the full menu as a drawer. Gauge pages scroll on phones instead of shrinking to fit. Tablets and phones in landscape get a slim icon rail.
  • Parameters: a bar counts changes that are live but not yet saved to flash, with Restore and Save to flash.

Dashboard you can build

  • The Dashboard is now a gauge page: same grid, same editor, saved in the same gauges.json. Any tile can go on the Dashboard or on a gauge page, and move between them.
  • New tile types: status (the old dashboard header), metric with sparkline, inverter messages, command terminal, action buttons and CAN sender.
  • Existing layouts carry over: your gauge pages are kept, and you get a Dashboard rebuilt from the old fixed one.
  • Sample layouts (Gauges → Edit Layout → Load sample layout) are reworked to fill a widescreen.

User accounts (optional, off by default)

  • Viewer / operator / admin roles, enforced on the device for every page, command, file and upload. Viewers can watch but not change anything; operators can drive and change parameters; admins manage the device, firmware and users.
  • Off until you create the first admin (Settings → Users & Access). With no users, the device behaves exactly as before.
  • Passwords are stored salted and hashed in NVS, never in the filesystem. Sign-in is rate limited.
  • Locked out? Hold BOOT for 10 s, or type auth reset on the debug serial port.
  • Details, including what is and isn't protected over plain HTTP: see "Users and access" in the README.

Settings survive updates

  • Device settings are now kept across web-interface updates. settings.json and UI preferences are mirrored into NVS and restored if an update erases them, so the ESP keeps talking to the inverter after updating.
  • Layouts too: just before flashing, the Update page saves your gauges, plots, presets, favourites and virtual values in the browser and puts them back afterwards.
  • New: Settings → Configuration → Reset device settings, for a deliberate factory reset of the device config (users, Wi-Fi and layouts kept).

Install and updates

  • Browser installer: flash a new board from Chrome or Edge at the installer page. Pick Stable or Dev; it detects ESP32 or ESP32-S3 and picks the right image. No third-party site, no tools to install.
  • Stable and Dev update channels (Update tab → Update channel). Dev gets each vX.Y-dev.N preview build, then the stable release that follows. Stable is the default.

Fixes

  • Remote support works again: openinverter.org's remote support page can send commands through the ESP (the inverter.js bridge was lost in the v4 rewrite). With sign-in on, it runs with the opener's role.
  • Data logger no longer floods the ESP with back-to-back requests, which stalled the dashboard and gauges while logging. Samples are paced to at most 20/s.
  • Phones: a drag that starts on a gauge tile scrolls the page.

For contributors

  • CONTRIBUTING.md now asks for features as PRs here rather than forks, and maps each kind of feature to the one place it plugs in.
  • The E2E suite is up to 254 tests, including the permission model; the mock ESP enforces the same route table as the firmware.

Updating from v4.24: use the Update page as usual, but export your settings first (Update page → Export settings (backup)) and re-import them afterwards. v4.24 doesn't keep them yet; from v4.25 on, updates keep them for you.

Full Changelog: v4.24...v4.25

v4.24

Choose a tag to compare

@github-actions github-actions released this 21 Oct 16:31

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 json reply 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_cache marker 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 set ms. Its name check no longer misbehaves on non-ASCII bytes.
  • Pin numbers read from settings.json are 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 audit runs in CI, and Dependabot alerts are on.
  • New branch flow: work lands on dev. Every push to main re-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.