Splash: resources/splash/splash.gif built into the binary, played once by
SplashOverlay over a black cover present from the first frame (no UI
flash), then fades into the UI; hides icons loading. GIF, so no
QtMultimedia/gstreamer. Toggle: splash.enabled.
Banner (InfoBanner): metro-style band that fades/slides in with a hold
pictogram; text that does not fit runs as a seamless ticker for two
rounds. Never takes touches; hidden during splash and settings. Config
section banner (enabled, text, intervalSec, showSec, position,
accentColor), editable in the web UI and on-device settings; shown once
after saving.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Any login, password = web/settings password (or master password). 401
carries WWW-Authenticate so browsers/Postman prompt. X-Api-Key still
works for existing integrations. Docs warn that over plain HTTP the
password travels in every request.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
BlueZ fills Device1.RSSI only while scanning; sensors connect to us, so
the field stayed empty. MGMT_OP_GET_CONN_INFO (like btmgmt conn-info)
returns the link RSSI; polled per connected sensor and after each write.
Needs CAP_NET_ADMIN (AmbientCapabilities in the collector unit).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
bt-update runs as root and installs helpers, sudoers, systemd units and
config; none of it is rolled back. Documents the order of stage steps, the
'old bt-update runs the OTA' pitfall and how to add a system change.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On PoE sites the MIPI-DSI panel can lose its init on a supply dip while the
RK3566 keeps running; the UI may also hang or exit. Three layers:
- hardware watchdog: systemd RuntimeWatchdogSec=20s (system.conf.d)
- GUI: SdWatchdog pings systemd per swapped frame (WATCHDOG_USEC=30s, enabled
by the binary so older versions run under the same unit) and writes
run/qt.frame; buttontask.service gets Restart=always, NotifyAccess=main,
TimeoutAbortSec=10s
- bt-displaywatch (root, buttontask-displaywatch.service): kernel DRM/DSI
timeouts, eth link down->up (PoE dip hint), stale UI frames, restart storms
-> panel re-init (stop UI, fb0 blank 4->0, start UI), repeated -> reboot
(max 3/day, never during OTA); incident log in /var/log/buttontask/
Manual recovery: hold one finger 10 s in the bottom-left corner (panels are
single-touch). Delivered by OTA via bt-update sync_system; the web service
runs `bt-update sync-system` at start for devices updated by an older
bt-update.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- every BlueZ call runs off the asyncio thread with a timeout; if bluetoothd
stays unresponsive for 30 s the collector restarts bluetooth.service and
exits for a clean re-registration
- Type=notify + WatchdogSec for buttontask-collector, never give up restarting
- bluetooth.service drop-in: Restart=always (BlueZ 5.55 crashes on assert/SEGV),
installed by device-install.sh and OTA (bt-update)
- bt-service: bluez-restart action for the collector
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>