Skip to content

v0.9.0

Choose a tag to compare

@github-actions github-actions released this 05 Sep 10:45
· 2 commits to main since this release
56b4afa

This release makes the prebuilt packages actually installable on ordinary Linux distributions, and fixes two problems reported from the field.

Prebuilt binaries could not start on any non-Nix system

Release artifacts are built with Nix, and every binary carried a /nix/store path as its ELF interpreter. On a normal distro that path does not exist, so the kernel refused to start the process and the shell reported:

/usr/bin/ht32paneld: cannot execute: required file not found

This affected the deb, the rpm, the AppImage and the tarball — every prebuilt artifact since packaging was introduced. The interpreter is now the standard /lib64/ld-linux-x86-64.so.2, and the build fails outright if a store path ever slips back in.

The packages also now declare the libraries they need — libusb-1.0 for the daemon and CLI, libdbus-1 for the tray applet — so a missing library is caught at install time instead of first start.

Requires glibc 2.39 or newer (Ubuntu 24.04+, Debian 13+, Fedora 40+). Build from source on older systems.

Fixes #1.

heartbeat and refresh_interval had no effect

The shipped config.toml.example listed both keys underneath the [web] header. TOML scopes a bare key to the section above it, so both were read as web settings and then discarded — editing heartbeat in the example file, the natural thing to do, changed a value the daemon never looked at, and the panel silently kept the 1000 ms default.

Both keys have moved above the first section header. The daemon now logs a warning naming any key it had to ignore, so a misplaced setting says so instead of failing quietly:

WARN Config: `heartbeat` is set under [web] and is being IGNORED: it is a
     top-level setting, so it must appear ABOVE the first [section] header

Existing config files keep working — this warns, it does not reject.

If you previously edited heartbeat or refresh_interval and saw no change, move them above [web] and the value will now take effect.

A failing panel no longer floods the journal

A panel dropping in and out logged a warning every few seconds despite the throttle being set to a minute, because a successful write reset the throttle and made the next failure look like the first. The throttle is now strictly time-based: one line per interval, whatever the device does in between.

The message itself was also unhelpful — hidapi error: hid_error is not implemented yet is a placeholder from hidapi's libusb backend, not a diagnosis. It now describes what actually went wrong.

LCD self-healing

The daemon recovers on its own when the panel stops accepting writes — a USB drop, a re-enumeration, or the device being claimed elsewhere. After a run of consecutive failures it drops the handle and reopens the device in-process; if the panel stays dark long enough it exits for systemd to relaunch it. Tunable via lcd_failure_threshold, lcd_reconnect_interval_ms, lcd_exit_after_ms and lcd_error_log_interval_ms — see the configuration guide.

Previously the panel reverted to its built-in default screen after any write failure and stayed there until the service was restarted by hand.

Headless installs work out of the box

The deb and rpm now ship the D-Bus system policy the daemon needs to own org.ht32panel.Daemon on the system bus. Without it a fresh headless install could not register its bus name — and ht32panelctl and the web UI could not reach it — until an admin wrote the policy by hand.

Thanks to @tekgnosis-net for the LCD self-healing and D-Bus packaging work, and to everyone who reported these.