v2.0.8
- [Fix] Connectivity blips no longer destroy running timers - previously, a device dropping to
unavailablemid-countdown (a Zigbee/Wi-Fi blip, or its integration reloading) cancelled the countdown, and the device coming backonstarted a fresh timer from theTime Offdefault - silently discarding a customset_off_afterduration and extending the total on-time. Blips are now ignored: the countdown keeps running and resumes untouched when the device returns. A device that comes backoffcancels the countdown cleanly, and one that reappearsonwith no countdown running (e.g. power restored at a wall switch) still auto-starts as before. - [Fix] Race between arming and the device turning off - if the device was turned off in the brief window while a new countdown's expiry was being written to storage, the countdown armed anyway and later fired a spurious turn-off plus
time_off_timer_expiredevent. The device state is now re-checked after the write. - [Improvement] Startup recovery is event-driven - instead of always sleeping a fixed 30 seconds before acting on a recovered timer, Time Off now acts as soon as the managed device reports a real state; the 30-second cap remains as a fallback for devices that never do. Recovery after a reload is effectively instant, and device turn-ons during the old fixed window are no longer silently ignored.
- [Improvement]
remainingattribute excluded from recorder history - the Timer Active sensor'sremainingattribute refreshes every 30 seconds while a timer runs; it is now excluded from long-term history so it no longer stores a new attribute blob per tick.expiryis still recorded. - [Doc] Corrected
start_timerdocumentation - the README claimedstart_timeralways restarts from theTime Offdefault; it actually honours a custom duration pre-set viaset_off_after(and always has - a regression test now locks the intended behaviour in). - [Internal] Cleanup pass - removed dead test helpers left over from the pre-2.0.7 architecture, the duplicate
VERSIONconstant (manifest.jsonis now the single source), a private re-export kept only for the test suite, a redundant dispatcher notification per timer arm, and stale comments; modernisedconfig_flow.pyanddevice_trigger.py(type hints, import order) to match the rest of the codebase; added arufflint job to CI and import sorting across the repo; new regression tests for the blip semantics, the arming race, thestart_timer/set_off_afterinteraction, the recovery grace window, and mid-loop duration changes in Trigger Only mode.