v0.42.0
Added
-
Smart sync (JIT rendering) — opt-in per schedule. When enabled on an interval schedule, the scheduler consults each bound device's telemetry-derived
predicted_next_wake_atand fires withinsmart_sync_lead_sseconds of a trusted device's wake instead of on a fixed cadence. The rendered frame is waiting for the panel when it wakes, rather than rendered after the panel paint.Falls back to plain interval firing when no bound device is trusted yet (warm-up) or when the schedule has no device bindings.
interval_minutesstays in force as a floor so smart sync can't push faster than the configured cadence. Tracked in #10.- Heartbeat parser pulls optional
sleep_until/next_sleep_sfields from firmware. Falls back to the device's configuredsleep_interval_s. - 10s debounce on consecutive heartbeats (some firmwares send connect-beat + sleep-beat per wake).
- Three consecutive on-time wakes within ±60s of prediction flips a device to trusted.
- Schedule list shows an indicator dot (green active / yellow warming / red blocked) per row.
- Device cards get a Smart sync section with a plain-English reason line so you can diagnose why a device isn't trusted yet.
Firmware wire contract for ESP32 / PhotoPainter clients to publish
sleep_untilis captured in the issue. - Heartbeat parser pulls optional
Changed
- Widget card borders removed.
.w's 1px outer frame was clipping at rounded corners; the matting gap is the cleaner separator.--edge-weight+--edgetokens stay defined for custom styles that want to re-enable. weather_now_sceniclight presets (snow, partly_day, cloudy_day) switched to dark text on their gradients.
Fixed
- Corner radius slider now live-updates the preview (was being sent but ignored).
- Battery indicator popover auto-closes 5s after opening and on any click outside.