Version 1.3.0
1 May 2026
-
Architecture: Replaced per-sensor global event listeners with a single shared listener set. Previously, each tracked entity registered its own listeners for all automation, script, and service call events system-wide, scaling as O(N). Now a single set of listeners populates a shared context cache that all sensors read from.
-
Fixed a race condition where rapid consecutive state changes during a user identity lookup could produce a sensor state mixing fields from two different events.
-
User identity cache now expires after 5 minutes. Previously, person name and service account status were cached permanently until HA restarted, causing stale classifications after person renames or account changes.
-
Cached the bleed-platform check per entity (resolved once at setup rather than on every state change).
-
Added
entity_category: diagnosticso the sensor is properly excluded from energy dashboards, voice assistants, and area summaries. -
Added
SensorDeviceClass.ENUMwith a defined options list for richer UI support. -
Added target entity availability tracking - the sensor now reports unavailable if the tracked entity is removed from HA.
-
Added diagnostics support (Settings -> Integrations -> Whodunnit -> Download diagnostics).
-
Migrated
device_infofrom plain dicts to the typedDeviceInfodataclass. -
Validated restored state on startup - invalid state slugs from older versions are now logged and reset to
monitoringinstead of silently persisting. -
Removed unused imports and dead code.
-
Breaking changes:
- Default attribute values (
source_type,source_id,user_id,event_time,context_id) changed from the string"None"to actualnull. Update any automations or templates that test for the string value"None"- useis noneor== Nonein Jinja2 templates instead. - The
source_idfor unresolved automation chains changed fromautomation.indirecttowhodunnit.indirect. Update any automations filtering onsource_id: automation.indirect.
- Default attribute values (