Version 1.4.0
4 July 2026
-
Target lifecycle: Whodunnit now follows the entity it tracks. Renaming the tracked entity's entity ID updates the tracker automatically (the sensor keeps its own entity ID, settings, and history), and deleting the tracked entity from Home Assistant removes the Whodunnit entry along with it. Previously the sensor only noticed a missing target at startup and would otherwise keep showing its last state indefinitely.
-
Recorder storage: The
history_logandcache_debugattributes are no longer written to Home Assistant's recorder database on every state change, which keeps long-term database growth down. Both attributes are still live on the entity, still work in templates and dashboard cards, andhistory_logstill persists across restarts. -
Performance: Each sensor's entity-registry listener now uses Home Assistant's keyed dispatcher instead of subscribing to every registry event in the system and filtering by hand - the same O(N)-listener cleanup that version 1.3.0 applied to the event-bus listeners.
-
Robustness: If the sensor platform fails to set up, the shared event listeners are now torn down instead of remaining subscribed with nothing consuming the cache. The internal loaded-entry refcount was removed; the count is now derived directly from the loaded entries, so the two can no longer drift apart.
-
Maintenance: The attribute-only debounce is now a tunable constant (
ATTRIBUTE_CHANGE_THROTTLE, default 2 seconds) listed under Advanced Tuning. Removed redundantNone-alias constants, consolidated the duplicated slug-to-title logic into a shared helper module, renamed private coroutines to Home Assistant's_async_convention, and fixed the duplicate-tracker message to say "entity" rather than "device". -
Testing: Test suite updated to Home Assistant 2026.7.1. Branch coverage is now measured in CI, and eleven new tests cover target renames and deletion, unknown users, user-cache expiry, corrupt restored history, cache-eviction edge cases, and setup-failure cleanup.