Releases: iwismer/rusty-timer
Server v0.13.1
What's Changed
SBC / Cloud-Init Fixes
- SPI & I2C enabled via cloud-init bootcmd — All cloud-init templates (YAML, Python generator, TypeScript generator) now add
dtparam=spi=onanddtparam=i2c_arm=onin abootcmdblock, so both interfaces are ready after the initial reboot without needingrt-setup.sh(#206) - Fixed I2C config path on Bookworm+ —
setup_ups()inrt-setup.shnow uses the/boot/firmware/config.txtfallback path (Bookworm moved it from/boot/config.txt), fixing silent I2C enable failures (#206) - PiSugar soft shutdown enabled by default (#204)
- PiSugar RTC auto-sync for offline timekeeping (#198)
- Headless PiSugar install — Pre-seed debconf to avoid interactive prompts (#200)
- First-boot apt upgrade — Run
apt update && apt upgradeon initial boot (#201) - Official PiSugar installer — Switched to upstream install script (#197)
- UPS setup fixes — Fixed failures and config issues in
rt-setup.sh(#195)
Full Changelog: server-v0.13.0...server-v0.13.1
server v0.13.0
What's New
PiSugar 3 Plus UPS Support (#192)
The server now receives and surfaces UPS battery telemetry from forwarders equipped with PiSugar 3 Plus HATs.
- Caches UPS state per-forwarder in memory for instant delivery to new receiver connections
- Logs power-plug transitions (plugged/unplugged) to the
forwarder_ups_eventsPostgres table - Streams UPS status updates to the dashboard via SSE and to receivers via WebSocket fanout
- Sends initial UPS snapshots to newly connected receivers
- Dashboard UI displays battery percent, voltage, charging state, and temperature per forwarder
- SBC setup page updated with
pisugar-serverinstall and I2C configuration instructions
Full Changelog: server-v0.12.0...server-v0.13.0
Full Changelog: forwarder-v0.9.0...server-v0.13.0
Receiver v0.17.0
What's New
PiSugar 3 Plus UPS Display (#192)
The receiver desktop app now displays UPS battery status for forwarders equipped with PiSugar 3 Plus HATs.
- Battery component in the Tauri UI showing percent, voltage, charging indicator, and temperature
- UPS state updates arrive via sentinel ReadEvents from the server WebSocket connection
- Automatic state pruning when a forwarder disconnects (clears stale battery info)
- Store-updater logic for managing per-forwarder UPS state lifecycle
Full Changelog: receiver-v0.16.0...receiver-v0.17.0
forwarder v0.9.0
What's New
PiSugar 3 Plus UPS Monitoring (#192)
Added optional UPS monitoring support for PiSugar 3 Plus battery HATs on Raspberry Pi forwarders. When enabled, the forwarder polls the pisugar-server TCP daemon and reports battery telemetry (percent, voltage, charging state, power plugged, temperature) to connected servers and receivers.
- New
[ups]TOML config section to enable and configure UPS polling - UPS status editing in the forwarder local web UI
- Integer-based telemetry (millivolts, centi-degrees) with change-detection to minimize noise
- Three-state availability model: unavailable → available → stale
- Transition-only warning logs for power-plug state changes
Bug Fixes
- fix: increase UPS test timeout for Windows CI (#194)
- fix: fix Windows CI failures in UPS tests (#193)
Full Changelog: forwarder-v0.8.4...forwarder-v0.9.0
What's Changed
- chore: remove package-lock.json registry URL stripping from pre-commit hook by @iwismer in #190
- feat: PiSugar 3 Plus UPS support across full stack by @iwismer in #192
- fix(forwarder): fix Windows CI failures in UPS tests by @iwismer in #193
- fix(forwarder): increase UPS test timeout for Windows CI by @iwismer in #194
Full Changelog: receiver-v0.16.0...forwarder-v0.9.0
Forwarder v0.11.1
What's Changed
E-ink Display Improvements
- "Powered Off" message on shutdown — After the forwarder shuts down, a centered "Powered Off" message is rendered on the e-ink display with a full refresh before the display sleeps. Since e-ink retains its last image without power, this text remains visible while the device is off. (#207)
- Landscape orientation fix — Display rotated 90° CCW for correct landscape orientation (#205)
- GPIO access fix — Allow gpiochip0 access in container permissions and improved SPI configuration hint (#203)
Full Changelog: forwarder-v0.11.0...forwarder-v0.11.1
forwarder v0.11.0
What's New
E-Ink Display Support
- New: Waveshare 2.13" e-ink display module — shows forwarder status (connection state, reader info, chip read counts) directly on the SBC hardware via SPI/GPIO (#191)
- Fixed
rppalHAL feature flag for embedded-hal 1.0 compatibility (#196) - Improved e-ink logging for easier debugging of display failures (#202)
SBC Deployment Improvements
- Enable SPI in boot config automatically for e-ink display (#199)
- Enable PiSugar RTC auto-sync for reliable offline timekeeping (#198)
- Run
apt update && upgradeon first boot for security patches (#201) - Pre-seed debconf for fully headless PiSugar install (#200)
- Use official PiSugar installer script for UPS setup (#197)
Full Changelog: forwarder-v0.10.1...forwarder-v0.11.0
What's Changed
- fix(sbc): use official PiSugar installer for UPS setup by @iwismer in #197
- feat(sbc): enable PiSugar RTC auto-sync for offline time by @iwismer in #198
- fix(sbc): enable SPI in boot config for e-ink display by @iwismer in #199
- fix(sbc): pre-seed debconf for headless PiSugar install by @iwismer in #200
- feat(sbc): run apt update and upgrade on first boot by @iwismer in #201
- feat(eink): improve logging for debugging display failures by @iwismer in #202
Full Changelog: forwarder-v0.10.1...forwarder-v0.11.0
Forwarder v0.10.1
Bug Fixes
E-Ink Display Hardware Compatibility (#196)
Fixed two issues that prevented the e-ink display feature from compiling on ARM targets (the actual hardware):
-
Missing
halfeature onrppal: Without thehalfeature flag,rppal::hal::Delaydoesn't exist and GPIO/SPI types don't implement the embedded-hal 1.0 traits required byepd-waveshare. Addedfeatures = ["hal"]and wrappedSpiinSimpleHalSpiDevicesince rppal'sSpidoesn't directly implementembedded_hal::spi::SpiDevice. -
ColorvsBinaryColortype mismatch: Theepd-waveshareDisplay2in13usesepd_waveshare::color::Coloras itsDrawTarget::Colortype, notembedded_graphics::pixelcolor::BinaryColor. Used thecolor_converted()adapter from embedded-graphics to bridge the two types in the forwarder's e-ink draw closure.
Full Changelog: forwarder-v0.10.0...forwarder-v0.10.1
Forwarder v0.10.0
What's New
E-Ink Display Support (#191)
Added support for the Waveshare 2.13" e-ink display HAT (250×122px), giving forwarders a local status screen without needing a monitor.
- New
rt-einkcrate with a two-column layout engine, embedded-graphics renderer, and epd-waveshare hardware driver - Integrates via
tokio::sync::watch—StatusServerpublishesDisplayStateon every mutation, and the e-ink task redraws with a hybrid partial/full refresh strategy - Desktop simulator available:
cargo run -p rt-eink --example eink_sim --features simulator --eink-simflag added todev.pyfor launching the simulator alongside the dev environment- Deployment updates: systemd service gets SPI/GPIO group access,
rt-setup.shauto-detects SPI and generates[eink]config section
Deployment Fix (#195)
- Fixed UPS setup failures and config generation in
rt-setup.sh
Full Changelog: forwarder-v0.9.0...forwarder-v0.10.0
Server v0.12.0
New Features
- Reader control via WS proxy: Added a WebSocket proxy layer that lets receivers send reader control commands (clock sync, read mode, TTO, recording, download, etc.) through the server to forwarders — no direct receiver-to-forwarder connection needed (#186)
- Sentinel tunneling: Server now tunnels
ReaderInfoUpdateandReaderDownloadProgressevents from forwarders to connected receivers in real time, enabling live feedback for reader operations - Reader control UI: New
ReaderControlPanelcard on the server stream detail page (above epoch mapping) using a shared Svelte component fromshared-ui
rt-protocol
- 4 new structs:
ReceiverProxyReaderControlRequest,ReceiverProxyReaderControlResponse,ReceiverReaderInfoUpdate,ReceiverReaderDownloadProgress - 4 new
WsMessagevariants for the proxy/tunneling protocol - 2 sentinel constants for reader info/download progress routing
Changed Files
services/server/src/ws_receiver.rs— WS handler for proxied reader control requests + sentinel tunneling logic (+267 lines)services/server/src/ws_forwarder.rs— forwarder-side proxy relay (+104 lines)crates/rt-protocol/src/lib.rs— new protocol types and message variantsapps/server-ui/src/routes/streams/[streamId]/+page.svelte— reader control card integrationapps/shared-ui/src/components/ReaderControlPanel.svelte— shared reader control panel component
Full Changelog: server-v0.11.1...server-v0.12.0
Receiver v0.16.0
New Features
- Admin clear-data action: New "Clear Data" button in the Admin tab that wipes subscriptions, cursors, earliest epochs, receiver mode, and DBF config while preserving server URL, token, and receiver ID — a middle ground between full factory reset and manual cleanup (#188)
- Uses a database transaction to atomically reset non-profile fields and delete operational tables
- Two-step confirmation UI placed between "Reset Profile" and "Factory Reset" buttons
Bug Fixes
- Stream metrics on initial load: Fixed "Metrics unavailable" showing when first opening the receiver until unsubscribing/resubscribing — initial metrics sent during the WS handshake were lost because Svelte event listeners weren't registered yet (#189)
- Stream metrics are now cached in the receiver backend (
AppState) and exposed via a newget_stream_metricsTauri command, fetched duringloadAll()alongside other startup data - Cache is cleared on disconnect to stay consistent with the frontend
- Stream metrics are now cached in the receiver backend (
- Vite dev server binding: Fixed Tauri dev server hanging by explicitly binding Vite to
127.0.0.1instead oflocalhost(which may resolve to::1on IPv6 systems)
Receiver Backend
- New
clear_data()DB method with transactional reset of operational state - New
get_stream_metricscontrol API endpoint + Tauri command for cached metrics - Session handling updated to cache metrics in
AppStateon receipt
Receiver UI
- Admin tab: new two-step "Clear Data" confirmation button
- Stream metrics loaded eagerly on startup via
loadAll() - Store updated with metrics caching and clear-data state management
Full Changelog: receiver-v0.15.0...receiver-v0.16.0