Enjoying Spook? 👻 A ⭐ on GitHub lets others know Spook is actually pretty great. Sponsoring Frenck keeps this ghost well fed. And his free bi-weekly newsletter keeps your inner ghost well fed.
👻👻👻👻👻👻👻👻👻👻
Spook now knows what your entities can actually be.
Until now, Spook could tell you an entity does not exist. This release it also tells you when the entity is fine, but what you ask of it is not: an attribute it never has, a state it is never in, or a value its attribute never takes. state_attr('light.kitchen', 'Brightness') with a capital, a condition waiting for Heating instead of heating, or an unquoted off that YAML quietly turns into false. Spook goes by what core knows about the entity and everything the recorder remembers, and only speaks up when the whole history agrees. Automations, scripts, template helpers and dashboards all get this.
A whole new batch of ghosts. Templates that can never pass because of how they are written (quotes around a >- block, a missing {{, on where a condition wants true), trigger IDs no trigger has, dashboard buttons navigating to views that are gone, themes and mdi: icons that do not exist, users that were removed but still decide who sees a card, integration entries handed to actions after the integration was added again, names Assist cannot tell apart, and area, floor and label lookups in templates that find nothing. Template entities you wrote in YAML are now checked too.
New actions to manage things from an automation instead of the UI: homeassistant.update_area, homeassistant.update_floor, homeassistant.update_device, and schedule.create, schedule.delete and schedule.set_day.
action: schedule.set_day
target:
entity_id: schedule.heating
data:
day: [saturday, sunday]
blocks:
- from: "08:00:00"
to: "23:00:00"Fewer false alarms as well. Every detection in this release was run against a new corpus of over 300 real configurations, distilled from the forums and public configs, and a long list of false findings got fixed on the way. Spook also loads a lot faster after a restart, and is ready for Home Assistant 2026.11.
And an apology: number.increment and number.decrement were broken for everyone in 5.10.0. Spook's own number.max and number.min actions got in their way. Fixed, and a test now makes sure this kind of mixup cannot sneak back in.
Thanks @plains203, @JoeAstor, @dfischer0, @r3mcos3, @dCatfish and @pjdubya for the reports, fixes and pushback behind this one, and the translators on Weblate, with a special nod to b.n.maricic and Esspel. 🫶
../Frenck
Blogging my personal ramblings at frenck.dev
Or subscribe to my bi-weekly newsletter: https://frenck.dev/newsletter
👻👻👻👻👻👻👻👻👻👻
✨ New features
- Add repairs for unknown attributes used in automations and scripts @frenck (#1880)
- Add repairs for unknown states used in automations and scripts @frenck (#1881)
- Report unknown attributes in template helpers @frenck (#1912)
- Find dashboard navigation to views that do not exist @frenck (#1913)
- Report trigger IDs an automation checks for that none of its triggers has @frenck (#1916)
- Point out names Assist cannot tell apart @frenck (#1914)
- Check attributes and states dashboards name @frenck (#1919)
- Add homeassistant.update_floor @frenck (#1937)
- Add schedule.delete @frenck (#1940)
- Add schedule.create @frenck (#1939)
- Add homeassistant.update_area @frenck (#1936)
- Find mdi: icons the frontend does not have @frenck (#1935)
- Add homeassistant.update_device @frenck (#1938)
- Report config entries automations and scripts hand to actions that do not exist @frenck (#1931)
- Add schedule.set_day @frenck (#1941)
- Report templates that can never pass, from how they are written @frenck (#1934)
- Report dashboards that name removed users @frenck (#1942)
- Check template entities from YAML for unknown entities and attributes @frenck (#1929)
- Find themes in dashboards that do not exist @frenck (#1930)
- Report automations that name removed users @frenck (#1946)
- Report scripts that name removed users @frenck (#1947)
- Check template entities from YAML for unknown actions @frenck (#1951)
- Find areas, floors and labels in templates that do not exist @frenck (#1955)
🐛 Bug fixes
- Spell out stop_actions instead of importing it from core @frenck (#1876)
- Reach timer, zone and person storage the way every version allows @frenck (#1877)
- Do not judge an entity that changed while the recorder was asked @frenck (#1882)
- Leave the entity in somebody's own event out of unknown entities @frenck (#1883)
- Leave names, descriptions and field examples out of unknown entities @frenck (#1884)
- Check mixed case entity IDs in state lookups as the entity they read @frenck (#1885)
- Keep checking the entity of events Home Assistant fires about it @frenck (#1886)
- Leave a literal glued to more with + out of entity references @frenck (#1887)
- Check the actions inside a sequence block @frenck (#1890)
- Leave the items a repeat goes over out of trigger and condition types @frenck (#1894)
- Check the states is_state is given as a list @frenck (#1889)
- Check the areas dashboard, including its per-area options @frenck (#1893)
- Check the entities script.turn_on hands to a script @frenck (#1888)
- Check the device IDs device_attr and friends are given @frenck (#1891)
- Check the entity a numeric state threshold reads @frenck (#1892)
- Leave made-up logbook entities out of unknown entities @frenck (#1895)
- Check the action a picture-elements button performs @frenck (#1897)
- Report entities named with capitals on dashboards @frenck (#1896)
- Check the action an entities card call-service row performs @frenck (#1900)
- Check mixed case entity IDs in filter and test lookups too @frenck (#1899)
- Tell a glued literal from a filtered one with Jinja's tokens @frenck (#1904)
- Read expand's mapping keys, and skip lookups called with impossible arguments @frenck (#1902)
- Check filters and tests a local name does not hide @frenck (#1903)
- Leave dotted filter and test names alone @frenck (#1910)
- Find text arguments after whitespace control too @frenck (#1908)
- Read device_entities from Jinja's tokens @frenck (#1909)
- Leave out what only disabled parts name, whichever key core reads @frenck (#1915)
- Keep inspecting when Home Assistant cannot list what an automation or script references @frenck (#1921)
- Read a draft Gemini hands over as a JSON string @frenck (#1923)
- Say why a number step amount is refused, instead of Unknown error @frenck (#1932)
- Clean up the aliases update_floor stores, like the floor editor does @frenck (#1945)
- Report Home dashboard area views of removed areas @frenck (#1949)
- Leave card placeholders out of dashboard area references @frenck (#1950)
- Stop Spook's own number.max and number.min from breaking number stepping @frenck (#1953)
- Leave states.x.y alone when states is not Home Assistant's @frenck (#1954)
🚀 Enhancements
- Import ectoplasm platform modules before forwarding the platforms @frenck (#1901)
- Spread the first repair inspections after a start, and keep the suggestions @frenck (#1905)
- Report values on core dashboard cards that are not entity IDs @frenck (#1911)
- Report entity fields in automations and scripts that hold no entity ID @frenck (#1920)
- Share how the automation and script entity repairs settle what is unknown @frenck (#1922)
- Report a missing entity a new style threshold compares against @frenck (#1917)
- Check the attribute values state triggers and conditions wait for @frenck (#1918)
- Give find_usages a plain string schema, and name the merged tool prefix in the skill @frenck (#1927)
- Use the shared not-an-entity-ID check for dashboards too @frenck (#1948)
- Check the attribute values Spook's own state trigger waits for @frenck (#1952)
- Report unquoted booleans in Spook's state trigger that were meant as text @frenck (#1956)
🧰 Maintenance
- Give translations a label of their own @frenck (#1878)
- Stop test runs sharing a config directory, and fix two order dependent tests @frenck (#1906)
- Run the Home Assistant dev canary with python -m pytest @frenck (#1925)
- Load restored states the way Home Assistant dev reads them in the canary @frenck (#1933)
- Add a corpus of real-world configuration shapes as a test suite @frenck (#1907)
🌍 Translations
- Fix nb translations and add missing strings @dCatfish (#1874)
- Translations update from Hosted Weblate @weblate (#1879)
- Translations update from Hosted Weblate @weblate (#1928)
⬆️ Dependency updates
6 changes
- ⬆️ Update dependency ruff to v0.17.0 @renovate[bot] (#1873)
- ⬆️ Update astral-sh/setup-uv action to v10.3.0 @renovate[bot] (#1872)
- ⬆️ Update dependency pylint to v4.1.3 @renovate[bot] (#1924)
- ⬆️ Update dependency pytest-homeassistant-custom-component to v0.13.372 @renovate[bot] (#1943)
- ⬆️ Update ossf/scorecard-action action to v2.5.0 @renovate[bot] (#1958)
- ⬆️ Lock file maintenance @renovate[bot] (#1957)