Releases: Ierlandfan/freetoon-lvgl
Release list
v0.9.58 — HA MQTT push
v0.9.58 — Home Assistant MQTT push
New ha_mqtt module pushes the Toon's thermostat + boiler state to Home Assistant over MQTT auto-discovery (broker read from /mnt/data/mqtt.cfg, same as the Itho bridge).
- climate entity — current temp, setpoint, heating action, presets (Comfort/Home/Sleep/Away); controllable from HA
- sensors — boiler flow/return, CH pressure, CH setpoint, modulation, humidity, CO₂, TVOC
- binary sensors — burner, hot water, OpenTherm error
- retained LWT availability → entities go cleanly unavailable when the Toon is off
- replaces the fragile
toon_climate/toon_boilerstatusHTTP-polling integrations
Zero extra config if /mnt/data/mqtt.cfg already exists.
v0.9.57
Fixes the Toon 1 crash-loop in v0.9.56. If you were stuck on the original qt-gui after updating, this is the fix — thanks @guustflater89 and @Michel30 for the reports and the logs, they made this a five-minute diagnosis.
What went wrong
v0.9.56 crash-looped to qt-gui on Toon 1 with:
relocation error: /mnt/data/toonui: symbol , version GLIBC_2.4 not defined in file libc.so.6
Diffing the binaries (not guessing): the v0.9.56 Toon 1 executable imported exactly the v0.9.54 set plus three symbols — strcasecmp, fputc and pthread_attr_destroy@GLIBC_2.4 — that the device's firmware glibc doesn't resolve. The loader aborts on the first one it hits, which is why only one is named. v0.9.54 loads; v0.9.56 didn't; that three-symbol delta was the entire difference. It's the same class of failure as the getifaddrs one back in v0.9.47.
They crept in from ordinary code — one was even fprintf(stderr, "\n"), which the compiler quietly turns into fputc.
The fix, and why it's trustworthy this time
All three symbols are removed (routed through local implementations built into the binary). The result: v0.9.57's imports are now an exact subset of v0.9.54's — a binary you've already run successfully. That's a stronger guarantee than reasoning about what the device's glibc does or doesn't have.
Applied to the Toon 2 build as well. No Toon 2 user reported this, but the v0.9.56 Toon 2 binary carried the same three imports and I couldn't reach a Toon 2 to confirm it's harmless there — so this closes that gap rather than betting on it.
So it can't happen again
The build's ABI check now compares every release against a recorded baseline of v0.9.54's imports and fails the build on any new on-device dependency — I confirmed it flags exactly the three symbols that slipped through into v0.9.56. Previously the check only knew about symbols that had already caused a problem.
Everything from v0.9.56 is still here
The energy work you were trying to reach is unchanged and now actually gets to run: the Zuidwijk / ESPHome P1 source, Home Assistant energy sensors, the solar tile, the HA https fix, the weather fallback, and the DIM tile-sync fix. See the v0.9.56 notes for details.
Verified: v0.9.56 added three @GLIBC_2.4 imports the Toon 1 firmware couldn't resolve; v0.9.54 didn't have them; v0.9.57's import set is now identical to v0.9.54's on both Toon 1 and Toon 2, and the ABI baseline check enforces that going forward. The wrapper code was unit-tested against real libc. Built from a clean v0.9.57 tag.
v0.9.56
Forum-driven release: energy from Home Assistant or a Zuidwijk P1, a solar tile, and the DIM screen finally follows your tile layout.
Everything here came from forum reports by guustflater89 and michel30. Thanks both — several of these were real bugs, not config mistakes.
⚡ Energy: two new sources
The energy source is no longer a Toon-vs-HomeWizard switch. It's now a four-way choice in Settings → Integrations → Energiebron:
| Source | Notes |
|---|---|
| Toon meteradapter | the built-in meter (default, unchanged) |
| HomeWizard P1 | unchanged |
| Zuidwijk / ESPHome P1 | new |
| Home Assistant | new |
- Zuidwijk SlimmeLezer (and any ESPHome
dsmrreader). Set the host in Settings → Integrations. It needs ESPHome'sweb_serveron port 80, which Zuidwijk's stock config ships with. If it can't read the meter, the log now tells you which problem you have — box unreachable vs. sensor names that don't match — instead of guessing. - Home Assistant sensors. Pick your power and gas entities under Settings → Home Assistant → Energie (with the usual entity browser).
☀️ Solar tile (Opbrengst zonnepanelen)
A new Zonnepanelen tile for the stock theme — long-press any tile to swap it in.
It reads an HA production sensor (Settings → Home Assistant → Energie → Zonnepanelen). It deliberately does not derive yield from a P1 meter: a meter only ever sees the surplus that actually leaves the house, never gross production, because your own appliances eat some of the solar first. Calling that "opbrengst" would just be wrong, so the tile asks for a real inverter sensor.
🖥️ DIM screen now follows your tile layout
If you removed the water-pressure tile from the home screen, the standby screen kept showing it anyway — the DIM screen had the block hardcoded and never looked at your layout. Fixed, and it applies immediately when you change a tile (no restart).
🏠 Home Assistant fixes
https://now works. Every HA request was hardcoded tohttp://, so anhttps://host producedhttp://https://ha.example/...and silently failed — entities would never load no matter how correct your URL and token were. The host field now acceptsip:port,http://…orhttps://….- An HTTPS Home Assistant used to show nothing at all. Live updates run over a plaintext WebSocket, and the code only fetched entity state after that connected — so with HTTPS it never connected and never fetched. There's now a REST polling fallback, so the UI stays fed (updates on a 10 s poll instead of instantly).
- Failures are logged with a reason once, instead of failing mute.
🌦️ Weather
- Weather could fail to appear entirely. The city → coordinates lookup uses a second server, which can be blocked or down while the forecast API is perfectly fine — and with no coordinates there was no forecast request at all. It now falls back to De Bilt after a few failures and keeps retrying your real location in the background, and says so in the log.
- The weather tile no longer shows a phantom 0,0° before the first forecast lands.
🧩 Tiles are customisable — and now say so
Several people didn't realise the stock home tiles can be changed at all. Long-press any tile to swap it. Empty slots now say "Tegel toevoegen", and there's a one-line hint on the home screen until you customise your first tile.
🔧 Under the hood
maindid not compile from a clean checkout — the NILM event-log declarations were missing from a committed header. Fixed.- The cross toolchains no longer live in
/tmp(override withTC_ROOT). - Fixed the web-settings endpoint clamping the new energy sources back to HomeWizard.
Known limitation, please read. The two new energy sources and the HTTPS/REST path have been compiled and render-tested, but I don't own a Zuidwijk reader or an HTTPS Home Assistant, so they have not been exercised against real hardware. If something doesn't work, grab the log — the new [ha], [p1esp] and [wx] lines are written to name the actual cause:
/etc/init.d/toonui stop; /mnt/data/toonui 2>&1 | grep -E '\[ha\]|\[p1esp\]|\[wx\]'
Please report back and I'll fix it.
Built from a clean v0.9.56 tag; both binaries pass the glibc-2.21 ABI check.
v0.9.54
freetoon-lvgl v0.9.54
Stock (qt-gui clone) UI polish + a VNC reliability fix.
New
- Outside-weather widget in stock dim mode. The stock-theme dim/standby screen now shows the current outside temperature and a weather icon in the top-right corner, rendered in all-white to match the dim look. Driven by the existing Open-Meteo
weather_statefeed; honours theshow_dim_weathersetting and only appears when the weather feed is connected.
Fixed
toonvnc.shrestart regression. The framebuffer-geometry probe ranset -- $(fbset …), which clobbered the action argument ($1) on any Toon that hasfbset— sorestart/respawnfell through to the usage branch and x11vnc never relaunched (VNC silently dead after a restart). The action is now captured intoCMDbefore the probe. The paged-framebuffer offset auto-detection (visible page at yoffset 600 on double-buffered panels) is retained.
Carried from v0.9.53
- Toon 1 startup fix (no
getifaddrs/GLIBC_2.4), 3-way boot picker (freetoon / stock / qt-gui), 2× PWA canvas, CH-pressure history window remap.
Assets: 17 — Toon 2 + Toon 1 binaries (toonui, toonui-toon1, wastefetch, wastefetch-toon1, fbvnc_input), PWA bundle (index.html/index.js/index.wasm), installer/helper scripts, and x11vnc-bundle.tgz.
v0.9.53
freetoon-lvgl v0.9.53
📱 PWA displayed 2× larger (both Toons)
The web UI (http://<toon>:10081/) now renders the canvas at up to 2048×1200 — twice the 1024×600 framebuffer — on both Toon 1 and Toon 2 (both are served the same bundle). Pinned to the 1024:600 aspect and still bounded by the viewport, so it scales up on a phone/desktop without overflowing or distorting.
📈 Fixed empty CH water-pressure graph ("CV bar")
The pressure graph defaulted to the Hour view, but CH pressure is recorded only once per hour — so a 1-hour window held ≤1 point and the graph looked empty. Pressure is a slow-moving signal, so each period now shows one step wider (Hour → a day of data, Day → a week, etc.). The graph is populated on every tab now. (No data was lost — verified against a real device's 30 hourly samples.)
Everything else is unchanged from v0.9.52.
v0.9.52
freetoon-lvgl v0.9.52
🐛 Critical Toon 1 fix — v0.9.45–v0.9.51 wouldn't start (and the boot picker never appeared)
If you run a Toon 1 (Eneco-001 / qb2) and the releases since v0.9.44 misbehaved — no UI-chooser at boot, the screen flickering briefly then falling back to the original Eneco qt-gui, /mnt/data/ui_choice stuck on freetoon, VNC not working — this release fixes it. v0.9.44 was the last working build; v0.9.52 restores Toon 1.
Root cause: the "Web Access" URL helper added in v0.9.45 (commit baf9837) called getifaddrs(). That's an optional/weak glibc symbol the Toon 1's firmware glibc does not export, so the dynamic linker aborted the entire toonui-toon1 binary at load:
relocation error: ./toonui: symbol , version GLIBC_2.4 not defined in file libc.so.6
Because the binary couldn't even load, the boot picker never ran → the launcher fell back to the stock qt-gui, which is exactly the "no GUI select / brief garbled image / boots to original" behaviour testers saw. All of v0.9.45, v0.9.46 and v0.9.47 import the same dead symbol.
Fix: the LAN-IP lookup now uses a portable socket method (getsockname() on a UDP socket + inet_ntoa()) that relies only on core glibc symbols present on every Toon. The Toon 1 abi-check now also denylists getifaddrs/freeifaddrs, so this class of breakage fails the build instead of reaching a device.
⚠️ Please do a clean/full install of v0.9.52 (the self-installer auto-pickstoonui-toon1on Toon 1). Running a mix of v0.9.44 + a newer release is what causes the leftover "Toon 1/Toon 2 mix-up" and VNC oddness.
✨ New — three-way boot picker
The boot chooser now offers three options instead of two:
| freetoon-lvgl | Stock theme | Stock qt-gui |
|---|---|---|
| Dark dashboard (default) | freetoon with the qt-gui-style light tile home (home_theme=1) |
Original Eneco UI |
The new middle option boots the same freetoon binary, just with the stock-look home enabled. The default is unchanged (freetoon dark) on both Toon 1 and Toon 2; a timeout leaves your saved theme untouched. Layout verified at both 800×480 (Toon 1) and 1024×600 (Toon 2).
Everything else is identical to v0.9.51. Toon 2 binaries are rebuilt at v0.9.52 (functionally unchanged apart from the new picker option).
v0.9.51
Beta / prerelease.
Highlights
- In-app version history. The About modal now shows a scrollable changelog of the recent releases (newest first), not just the latest release's notes — handy for testers to see what changed across versions without leaving the device. Reachable on the dark theme (tap the freetoon logo / update banner) and on the stock theme via Settings → "status & diagnose" → Version history.
- Under the hood: the update poll fetches the 10 newest releases; the fetch buffer was enlarged (256 KB → 512 KB) and its timeout raised (8 s → 20 s) so the larger listing isn't truncated.
v0.9.50
Beta / prerelease. Builds on v0.9.49's exact-point weather.
Highlights
- Radar map fixed. The precipitation radar on the weather-detail screen now renders. buienradar's
RadarMapNLGIF has no global color table; the patch for that was sitting in a copy of the decoder the build never compiled, solv_giffailed to load it and the tile was blank. Ported the no-GCT fix into the compiled lvgl decoder and persisted it as a build-applied patch so a fresh clone can't silently re-break it. - Dim standby: live watts number under the energy bar (reads 0 W where no energy source is configured).
v0.9.49
Beta / prerelease.
Highlights
- Exact-point weather. Current temperature + 5-day + hourly now come from Open-Meteo at your location's exact lat/lon (KNMI HARMONIE 2 km model over NL) instead of the nearest fixed KNMI station — your city's actual temperature, not one 15 km away. WMO codes → our icons, wind in Beaufort, direction in Dutch compass. buienradar is kept only for the radar map + the NL weather-report text.
- Water-pressure tile fix. Seeds the CH pressure from the live
happ_thermstatpublisher (learned dynamic UUID) — fixes the tile sitting at "-- bar" after a restart. (connection:0+otCommError:0is a healthy OpenTherm link, not a fault.) - Stock theme. Big readout = indoor temperature (toggle in Settings → Display); no false "te laag" water alarm; full "Luchtvochtigheid" label; customizable carousel tiles via long-press picker; long-press no longer opens a detail screen in the background; swipe-vs-tap fix; stock-qt-gui-style dim/standby; single weather tile; tap-through to detail/graph screens.
- Wind arrow now points where the wind blows to.
- Update modal shows the Install buttons as soon as the check finds a release.
v0.9.48
freetoon-lvgl v0.9.48
New: optional "stock theme" home
A pixel-faithful clone of the classic Toon light tile-carousel home, rebuilt in LVGL.
- Toggle in Settings → Display → "Thema startscherm" and via a "Thema" button in the layout editor. Switches live, no restart.
- Open Sans fonts, native-drawn humidity-house + eco-sprout icons, segmented power gauge.
- 5-page carousel (home / boiler temps / weather / air+vent / agenda); top bar + thermostat panel stay fixed.
- apps-grid opens Settings so the stock home is fully navigable. Wordmark reads "Freetoon".
Dim screen
- Branded with a "Freetoon" wordmark (top-left), which also covers any boot-splash "TOON" residue.
Default home theme is unchanged (freetoon dark dashboard); the stock theme is opt-in.
Install/update: curl -fsSL https://raw.githubusercontent.com/Ierlandfan/freetoon-lvgl/main/scripts/toon-selfinstall.sh | sh