👻👻👻👻👻👻👻👻👻👻
Spook 5 was about making detection trustworthy. Spook 5.1 gives you things to build with.
The big one is a trigger and condition platform: ten triggers and seven conditions, living in your automations next to the ones Home Assistant ships. A cron trigger for schedules the built-in ones cannot express. A stale trigger for a sensor that quietly stopped reporting without ever going unavailable. A watchdog for the thing that should have happened and did not. Sequences, flapping detection, quotas, cooldowns, and conditions that tell you who set an automation off, a person or another automation.
Detection did not stand still. Twenty-three new repairs: orphaned long-term statistics, forgotten long-lived access tokens, empty areas and floors, unused labels and blueprints, dashboard resources pointing at files that are gone, alerts that will not work when they are needed, notify groups delivering into the void.
There are new actions too. automation.snooze turns an automation off for a while and puts it back on when the time is up, restarts included, so a snooze does not quietly become a disable. automation.turn_on_for is the same trick the other way round, for the guest mode you switch on in December and find again in March.
A stability round went in right before this release. The whole codebase was reviewed from the outside, and nine real bugs came out of it, including two repairs that told people their perfectly good automations were broken. That is the worst thing Spook can do, so those are gone.
Thanks to everyone who helped out on this one!
../Frenck
Blogging my personal ramblings at frenck.dev
Or subscribe to my bi-weekly newsletter: https://frenck.dev/newsletter
✨ New features
- Detect unknown trigger types in automations @frenck (#1357)
- Detect unknown condition types in automations @frenck (#1358)
- Detect unknown trigger and condition types in scripts @frenck (#1359)
- Detect unknown source entities in ten more helper types @frenck (#1361)
- Detect unknown area references in dashboards @frenck (#1365)
- Detect stale device references in templates @frenck (#1366)
- Detect unknown entities referenced in template helpers @frenck (#1367)
- Detect orphaned long-term statistics @frenck (#1370)
- Detect dashboard resources pointing at missing files @frenck (#1371)
- Detect unknown entities in the energy dashboard @frenck (#1372)
- Detect registered entities that no longer exist @frenck (#1373)
- Detect and revoke forgotten long-lived access tokens @frenck (#1374)
- Detect empty areas and offer to remove them @frenck (#1375)
- Detect empty floors and offer to remove them @frenck (#1376)
- Detect unused labels and offer to remove them @frenck (#1377)
- Detect unused blueprints and offer to remove them @frenck (#1378)
- Detect and clean up unknown device trackers on people @frenck (#1379)
- Detect customizations for non-existing entities @frenck (#1380)
- Offer to clean up unknown members in groups @frenck (#1383)
- Detect and prune missing members in min/max helpers @frenck (#1384)
- Offer to remove helpers whose source entities are gone @frenck (#1385)
- Add a condition platform with a chance condition @frenck (#1386)
- Detect unknown entities in template helper actions @pos-ei-don (#1399)
- Add a cooldown condition @frenck (#1387)
- Detect unknown actions in template helpers @cnotin (#1397)
- Count timers, counters and groups @frenck (#1437)
- Add actions to expose entities to voice assistants @frenck (#1442)
- Let input_number increment and decrement cycle the range @frenck (#1443)
- Add an action to set a sensor's display precision @frenck (#1441)
- Detect broken alerts before they need to work @frenck (#1446)
- Detect notify groups delivering to actions that are gone @frenck (#1450)
- Add spook.triggered_by_user and its counterpart @frenck (#1466)
- Add a spook.cron trigger @frenck (#1479)
- Add a spook.stale trigger @frenck (#1480)
- Add a spook.integration_failed trigger @frenck (#1481)
- Add a spook.triggered_by_automation condition @frenck (#1482)
- Add repair issue triggers and a repair issue condition @frenck (#1483)
- Add a spook.quota condition @frenck (#1484)
- Add spook.condition_met and spook.wait_for_condition @frenck (#1485)
- Add a spook.sequence trigger @frenck (#1489)
- Add a spook.while trigger @frenck (#1491)
- Add a spook.watchdog trigger @frenck (#1492)
- Add a spook.flapping trigger @frenck (#1493)
- Add an automation.snooze action @frenck (#1494)
- Add an automation.turn_on_for action @frenck (#1495)
🐛 Bug fixes
- Fix known floor IDs defaulting to label IDs @frenck (#1340)
- Fix garbled debug logging in script reference repairs @frenck (#1341)
- Fix broken edit links for YAML items without an ID @frenck (#1343)
- Clean up repair issues for removed items reliably @frenck (#1342)
- Fix repair issue cleanup on unload never matching @frenck (#1345)
- Detect stale targets nested in repeat steps in automations @frenck (#1355)
- Detect stale targets nested in repeat steps in scripts @frenck (#1356)
- Stop reporting devices split by Home Assistant Core 2026.8 as unknown @frenck (#1413)
- Fix input_number increment/decrement/min/max services after HA 2026.8.0 @Dillton (#1407)
- Guard device enable/disable helpers against via_device_id cycles @proscar87 (#1401)
- Set repairs up when loaded on a running Home Assistant @frenck (#1435)
- Report missing scenes instead of ignoring every scene @frenck (#1436)
- Stop calling a helper API that Home Assistant is removing @frenck (#1438)
- Stop reporting action names as unknown entities @frenck (#1440)
- Recheck people when a state-only device tracker comes or goes @frenck (#1448)
- Notice an entity dying or returning without waiting for a coincidence @frenck (#1451)
- Say what went wrong instead of printing a tuple @frenck (#1456)
- Stop reading the device registry as a mapping @frenck (#1471)
- Handle child devices in the device actions @frenck (#1474)
- Build the service set once per inspection, not once per template @frenck (#1488)
- Tie a sequence deadline to the run that set it @frenck (#1490)
- Stop the Home Assistant dev canary reading core's built translations @frenck (#1496)
- Fix two repairs that had quietly stopped looking @frenck (#1497)
- Three more from the stability review @frenck (#1500)
- Four from the second stability review @frenck (#1501)
🚀 Enhancements
- Add regression test for templated action names in service repairs @frenck (#1344)
- Add end-to-end repairs test and reset cache state between tests @frenck (#1347)
- Isolate setup failures so one broken feature cannot take down Spook @frenck (#1346)
- Remove dead pre-2025.10 compatibility branch @frenck (#1349)
- Move entity ID cache from module globals into hass.data @frenck (#1350)
- Migrate script reference repairs to the shared base class @frenck (#1351)
- Yield to the event loop during repair inspections @frenck (#1352)
- Split template extraction out of entity_filtering and cache template scans @frenck (#1353)
- Add target reference walker for raw configurations @frenck (#1354)
- Migrate source-entity repairs to the config entry table @frenck (#1362)
- Add generic dashboard entity reference walker @frenck (#1363)
- Use the generic walker in the Lovelace repair @frenck (#1364)
- Explain why referenced entities are unknown @frenck (#1368)
- Enrich unknown entity issues across all repairs @frenck (#1369)
- Make the stale access token repair dismissable @frenck (#1381)
- Offer a fix-it-myself link in repair fix flows @frenck (#1382)
- Fix some minor typos @cnotin (#1398)
- Qualify entity references only disabled steps make @pos-ei-don (#1400)
- Stop comparing every unknown entity against every known one @frenck (#1439)
- Only wake the alert repair for entities an alert watches @frenck (#1447)
- Only wake the person repair for device trackers @frenck (#1449)
- Build the service set once per inspection, not once per template @frenck (#1488)
- Add an automation.turn_on_for action @frenck (#1495)
- Three more from the stability review @frenck (#1500)
🧰 Maintenance
- Add Home Assistant dev canary and helper repair smoke tests @frenck (#1348)
- Bump Home Assistant to 2026.8.2 in the development environment @frenck (#1414)
- Translations update from Hosted Weblate @weblate (#1332)
- Translations update from Hosted Weblate @weblate (#1329)
- Translations update from Hosted Weblate @weblate (#1445)
- Say what went wrong instead of printing a tuple @frenck (#1456)
- Translations update from Hosted Weblate @weblate (#1454)
- Build the documentation from a locked MyST version @frenck (#1457)
- Translations update from Hosted Weblate @weblate (#1455)
- Keep blank strings out of the translation files @frenck (#1460)
- Translations update from Hosted Weblate @weblate (#1465)
- Catch the exception the condition_met test means to catch @frenck (#1487)
- Stop the Home Assistant dev canary reading core's built translations @frenck (#1496)
📚 Documentation
- Call a config entry an integration entry @frenck (#1444)
- Detect broken alerts before they need to work @frenck (#1446)
- Detect notify groups delivering to actions that are gone @frenck (#1450)
- Document every repair Spook can raise @frenck (#1461)
- Correct what the repair documentation claims @frenck (#1462)
- Correct four more claims in the repair documentation @frenck (#1463)
- Spell the two repeated headings correctly @frenck (#1464)
- Add a spook.cron trigger @frenck (#1479)
- Add a spook.stale trigger @frenck (#1480)
- Add a spook.integration_failed trigger @frenck (#1481)
- Add a spook.triggered_by_automation condition @frenck (#1482)
- Add repair issue triggers and a repair issue condition @frenck (#1483)
- Add a spook.quota condition @frenck (#1484)
- Add spook.condition_met and spook.wait_for_condition @frenck (#1485)
- Add a spook.sequence trigger @frenck (#1489)
- Tie a sequence deadline to the run that set it @frenck (#1490)
- Add a spook.while trigger @frenck (#1491)
- Add a spook.watchdog trigger @frenck (#1492)
- Add a spook.flapping trigger @frenck (#1493)
- Add an automation.snooze action @frenck (#1494)
- Add an automation.turn_on_for action @frenck (#1495)
- docs: fix typo definitly -> definitely @vaibhav8a (#1498)
⬆️ Dependency updates
30 changes
- Bump pip from 26.1.1 to 26.1.2 @dependabot[bot] (#1393)
- ⬆️ Pin actions/upload-pages-artifact action to v5.0.0 @renovate[bot] (#1415)
- ⬆️ Update hacs/action digest to 1ebf01c @renovate[bot] (#1416)
- Bump Home Assistant to 2026.8.2 in the development environment @frenck (#1414)
- ⬆️ Update astral-sh/setup-uv action to v10 @renovate[bot] (#1423)
- ⬆️ Update actions/setup-node action to v6.5.0 @renovate[bot] (#1421)
- ⬆️ Update github/codeql-action action to v4.37.7 @renovate[bot] (#1426)
- ⬆️ Update sigstore/gh-action-sigstore-python action to v3.5.0 @renovate[bot] (#1427)
- ⬆️ Update actions/dependency-review-action action to v5 @renovate[bot] (#1429)
- ⬆️ Update actions/checkout action to v7 @renovate[bot] (#1428)
- ⬆️ Update release-drafter/release-drafter action to v7.7.0 @renovate[bot] (#1422)
- ⬆️ Update actions/setup-node action to v7 @renovate[bot] (#1430)
- ⬆️ Update codecov/codecov-action action to v7 @renovate[bot] (#1431)
- ⬆️ Update dependency node to v24.19.0 @renovate[bot] (#1425)
- ⬆️ Update ossf/scorecard-action action to v2.4.4 @renovate[bot] (#1419)
- ⬆️ Update ludeeus/action-require-labels action to v2 @renovate[bot] (#1433)
- ⬆️ Update ghcr.io/devcontainers/features/node Docker tag to v2 @renovate[bot] (#1432)
- ⬆️ Update home-assistant/actions digest to a7c616c @renovate[bot] (#1417)
- ⬆️ Update github/codeql-action action to v4.37.8 @renovate[bot] (#1452)
- Pin the dev dependency group @frenck (#1458)
- ⬆️ Lock file maintenance @renovate[bot] (#1434)
- ⬆️ Update dependency pytest-homeassistant-custom-component to v0.13.357 @renovate[bot] (#1467)
- ⬆️ Lock file maintenance @renovate[bot] (#1469)
- ⬆️ Update dependency node to v24.20.0 @renovate[bot] (#1473)
- ⬆️ Update github/codeql-action action to v4.37.9 @renovate[bot] (#1472)
- ⬆️ Update dependency prek to v0.5.0 @renovate[bot] (#1475)
- ⬆️ Update dependency pytest-homeassistant-custom-component to v0.13.358 @renovate[bot] (#1476)
- ⬆️ Update dependency ruff to v0.16.5 @renovate[bot] (#1478)
- ⬆️ Update dependency pytest-homeassistant-custom-component to v0.13.359 @renovate[bot] (#1486)
- ⬆️ Update dependency pytest-homeassistant-custom-component to v0.13.360 @renovate[bot] (#1499)