A modern web interface for OpenInverter systems — over UART or CAN bus.
Works with the OpenInverter family of firmware: stm32-sine / FOC · ZombieVerter VCU · stm32-charger · stm32-island · BMS · and more.
Modern single-page UI (Preact + HTM, no build step)
- Dark-first glass design with full light mode and a customisable accent colour
- Dashboard hero card: live state pill, error chips, battery voltage & temperature with sparklines
- Installable to your phone's home screen (PWA manifest, iOS standalone)
Two inverter transports
- UART — the classic serial connection, with fast-mode streaming and pin-swap setting
- CAN bus — full SDO support: device scanning, multi-node management with a boot-default node, parameter database download, live values, error log, and firmware updates over CAN
Telemetry
- Gauges — radial and line gauges in four sizes, per-gauge colours (hue-matched gradients), enum fields show their mode text, drag-to-reorder layout
- Plot — multi-chart plotting with left/right axes and burst sampling (UART)
- Spot Values — searchable table with favourites, ~10 Hz fast mode, and optional per-row sparklines
- Data Logger — log any fields to a downloadable file
Configuration
- Parameters — searchable, categorised, favourites, inline editing, flash save/restore, file download/upload, and openinverter.org parameter-database submit/subscribe
- CAN Mapping — view, add and remove the device's TX/RX CAN mappings (decimal or
0xhex IDs) - Settings export/import — favourites, gauge & plot layouts and UI preferences as a single JSON file
Updates
- OpenInverter board firmware updates over UART or CAN with live progress (CAN requires the CAN bootloader on the device)
- Web interface OTA updates for the ESP32 firmware and individual files
Pre-built flash-at-0x0 combined images for both supported boards:
| Source | What you get |
|---|---|
| Latest release | Version-stamped raw .bin files: full-flash *-0x000.bin and OTA *-ota.bin, per board (e.g. esp32_wemos_v4.1-0x000.bin) |
| CI builds | Every push, as run artifacts (zipped) |
Flash the image at offset 0x0 with ESP Web Tools or esptool.py:
esptool.py --chip esp32 write_flash 0x0 esp32_wemos_v4.1-0x000.bin # classic ESP32 / Wemos
esptool.py --chip esp32s3 write_flash 0x0 esp32_t2can_v4.1-0x000.bin # LILYGO T-2Can- Join the board's WiFi access point (default name
ESP-xxxxx) and browse to http://192.168.4.1/, or - configure it to join your network (Settings → WiFi) and browse to http://inverter.local/ (mDNS).
In Settings → Interface: choose UART (default) or CAN Bus → Save → Scan for devices. The first node found becomes the boot default; mark any other node as default from the device list.
| Board | Notes |
|---|---|
| ESP32-WROOM-32E (and most dev boards) | UART to the inverter on pin 16 (RX ← inverter TX) and pin 17 (TX → inverter RX) |
| LILYGO T-2Can (ESP32-S3) | Built-in CAN transceiver — default CAN pins RX 6 / TX 7 (esp32_t2can build target) |
Optional peripherals (classic ESP32):
- SD card in SDIO mode for data logging — CLK pin 14, CMD pin 15, D0 pin 2, D1 pin 4, D2 pin 12, D3 pin 13
- RTC (PCF8523 as standard, anything RTClib supports with a sketch change) — SCL pin 22, SDA pin 21
CAN speed (125k/250k/500k) and pins are configurable in Settings on any board.
Once a board is running you can update it over WiFi from the Update tab — no cables, no toolchain. Updates use a combined *-ota.bin image that flashes the ESP32 firmware and the web interface together, so the two can never drift out of sync. The bootloader and partition table are left untouched, so a bad image stays recoverable over USB. The device reboots and the page reloads automatically when the flash completes.
From the web interface — Update → Web Interface:
- Get releases → choose a release. The image matching your board (
esp32_wemosoresp32_t2can, marked (this board)) is pre-selected. The repository field defaults to the repo this build came from, but you can point it at any fork. Then Download & install. - Install OTA image from file — upload an
*-ota.binyou already have (e.g. a release asset). - Upload single file — replace one file in the filesystem without a full update.
For development (PlatformIO over the network) — the envs use upload_protocol = espota in platformio-local-override.ini:
pio run -e esp32_wemos -t upload # flash firmware (use esp32_t2can for the T-2Can)
pio run -e esp32_wemos -t uploadfs # flash the web interface filesystemFor a new or fully-erased board, connect a 3.3V USB/serial adapter:
| Pin# | ESP32 board function | USB/serial adapter |
|---|---|---|
| 1 | +3.3V input | 3.3V output (if available) |
| 2 | GND | GND |
| 3 | RXD input | TXD output |
| 4 | TXD output | RXD input |
Various openinverter boards (SDU, LDU, Leaf) use a different wiring scheme for initial programming. Flash the ESP32 before the STM32 — otherwise the UART pins collide. If the STM32 is already flashed, erase it or hold it in reset while flashing the ESP32.
| Pin# | ESP32 board function | USB/serial adapter |
|---|---|---|
| 1 | TXD output | RXD input |
| 2 | RXD input | TXD output |
| 3 | +5V input | 5V output (if available) |
| 4 | GND | GND |
| 5 | GND | GND |
| 6 | GPIO0 | Connect to GND (pin 5) for programming mode, then power up |
Flash subsequent updates via OTA.
The Update tab flashes OpenInverter board firmware (stm32_*.bin) through the ESP32:
- UART mode — works with the standard OpenInverter bootloader
- CAN mode — the transfer runs gap-free in the background with live progress; the device must run the CAN bootloader. A power-cycle prompt allows recovery of a board whose application no longer boots.
Built with the Arduino framework. Versioning comes from git tags (git describe) and is shown in the UI and /version.
- PlatformIO (recommended) — setup · day-to-day usage · flashing walkthrough (VS Code) · building a combined binary
- Arduino IDE — setup · usage
- CI — every push builds both targets and publishes combined images (workflow); pushing a
v*tag creates a release with version-stamped binaries
Build targets: esp32_wemos / esp32_wemos_debug (classic ESP32 / Wemos), esp32_t2can / esp32_t2can_debug (LILYGO T-2Can, ESP32-S3).
Web UI sources live in data/ — plain Preact + HTM with no build step; gzip the changed files and upload via uploadfs or the Update tab.
This is a fork of jsphuebner/esp32-web-interface with a rewritten frontend and a CAN bus backend. Thanks to Johannes Huebner and the OpenInverter community.
Bundled third-party libraries and their licenses are listed in THIRD_PARTY_NOTICES.md.