ha-mcp-dev 8.4.3.dev2588__tar.gz → 8.4.3.dev2592__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. {ha_mcp_dev-8.4.3.dev2588/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.4.3.dev2592}/PKG-INFO +1 -1
  2. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/pyproject.toml +1 -1
  3. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +1 -1
  4. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +1 -1
  5. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +26 -5
  6. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/README.md +1 -1
  7. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +3 -2
  8. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +49 -1
  9. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +2 -1
  10. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +10 -5
  11. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +15 -0
  12. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +15 -7
  13. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +30 -0
  14. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +1 -0
  15. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  16. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/LICENSE +0 -0
  17. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/MANIFEST.in +0 -0
  18. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/README.md +0 -0
  19. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/setup.cfg +0 -0
  20. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/__init__.py +0 -0
  21. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/__main__.py +0 -0
  22. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_pypi_marker +0 -0
  23. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_rich_compat.py +0 -0
  24. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/__init__.py +0 -0
  25. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/requirements.txt +0 -0
  26. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  27. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  28. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  29. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  30. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  31. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  32. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  33. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  34. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  35. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  36. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  37. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  38. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  39. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  40. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  41. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  42. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  43. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  44. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  45. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  46. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  47. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  48. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  49. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  50. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  51. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  52. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  53. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  54. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  55. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  56. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  57. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  58. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  59. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  60. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  61. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  62. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  63. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  64. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  65. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  66. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  67. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  68. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  69. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  70. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  71. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  72. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  73. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  74. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  75. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  76. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  77. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  78. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  79. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  80. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  81. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  82. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/_version.py +0 -0
  83. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/auth/__init__.py +0 -0
  84. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/auth/consent_form.py +0 -0
  85. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/auth/oidc_compat.py +0 -0
  86. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/auth/provider.py +0 -0
  87. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/backup_manager.py +0 -0
  88. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/browser_landing.py +0 -0
  89. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/client/__init__.py +0 -0
  90. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/client/rest_client.py +0 -0
  91. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/client/supervisor_client.py +0 -0
  92. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/client/websocket_client.py +0 -0
  93. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/client/websocket_listener.py +0 -0
  94. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/config.py +0 -0
  95. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  96. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  97. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  98. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  99. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  100. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  101. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/errors.py +0 -0
  102. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/ha_request_queue.py +0 -0
  103. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  104. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/llm_exposure.py +0 -0
  105. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/log_filters.py +0 -0
  106. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/policy/__init__.py +0 -0
  107. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/policy/approval_queue.py +0 -0
  108. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/policy/editing.py +0 -0
  109. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/policy/evaluator.py +0 -0
  110. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/policy/handlers.py +0 -0
  111. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/policy/middleware.py +0 -0
  112. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/policy/model.py +0 -0
  113. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/policy/persistence.py +0 -0
  114. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/policy/value_sources.py +0 -0
  115. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/py.typed +0 -0
  116. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/read_only.py +0 -0
  117. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/redaction.py +0 -0
  118. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/renamed_tools.py +0 -0
  119. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  120. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  121. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  122. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  123. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  124. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  125. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/evals/area-target-over-entity-list/case.yaml +0 -0
  126. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/evals/arrive-home-automation/case.yaml +0 -0
  127. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/evals/assist-shortcut-card/case.yaml +0 -0
  128. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/evals/avg-temperature/case.yaml +0 -0
  129. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/evals/backup-deletion-confirmation/case.yaml +0 -0
  130. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/evals/blueprint-authoring/case.yaml +0 -0
  131. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/evals/button-event-entity/case.yaml +0 -0
  132. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/evals/device-id-trigger-migration/case.yaml +0 -0
  133. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/evals/helper-flow-fields-not-platform-yaml/case.yaml +0 -0
  134. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/evals/media-player-song/case.yaml +0 -0
  135. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/evals/motion-light-automation-mode/case.yaml +0 -0
  136. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/evals/rename-entity-impact-analysis/case.yaml +0 -0
  137. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/evals/template-attributes-yaml-exception/case.yaml +0 -0
  138. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/evals/timer-finished-automation/case.yaml +0 -0
  139. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/evals/vacuum-last-clean/case.yaml +0 -0
  140. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/scripts/check_eval_cases.py +0 -0
  141. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  142. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  143. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  144. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  145. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  146. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  147. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  148. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/server.py +0 -0
  149. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/__init__.py +0 -0
  150. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  151. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  152. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  153. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  154. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  155. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  156. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  157. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  158. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  159. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  160. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/_theme.py +0 -0
  161. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  162. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  163. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  164. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  165. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  166. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  167. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  168. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  169. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  170. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  171. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  172. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  173. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  174. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  175. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  176. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  177. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/settings.css +0 -0
  178. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/settings.html +0 -0
  179. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/settings_ui/settings.js +0 -0
  180. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/smoke_test.py +0 -0
  181. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  182. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/strict_bps.py +0 -0
  183. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tool_dispatch.py +0 -0
  184. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/__init__.py +0 -0
  185. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/auto_backup.py +0 -0
  186. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/backup.py +0 -0
  187. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  188. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/best_practice_result.py +0 -0
  189. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  190. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  191. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  192. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/blueprint_write.py +0 -0
  193. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/bulk_selector.py +0 -0
  194. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/component_api.py +0 -0
  195. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/component_config_entries.py +0 -0
  196. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/component_config_reads.py +0 -0
  197. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/component_devices.py +0 -0
  198. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/component_registries.py +0 -0
  199. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  200. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  201. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  202. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  203. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  204. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  205. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  206. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  207. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/device_control.py +0 -0
  208. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  209. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/hacs_registration.py +0 -0
  210. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/helpers.py +0 -0
  211. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  212. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/log_common.py +0 -0
  213. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/log_sources.py +0 -0
  214. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/log_sources_fault.py +0 -0
  215. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  216. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/radio/__init__.py +0 -0
  217. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/radio/base.py +0 -0
  218. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/radio/matter.py +0 -0
  219. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/radio/thread.py +0 -0
  220. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  221. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/radio/zwave.py +0 -0
  222. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/reference_validator.py +0 -0
  223. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/registry.py +0 -0
  224. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  225. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  226. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  227. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  228. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  229. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  230. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  231. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  232. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  233. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  234. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  235. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  236. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_addons.py +0 -0
  237. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_areas.py +0 -0
  238. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  239. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  240. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  241. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_calendar.py +0 -0
  242. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_camera.py +0 -0
  243. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_categories.py +0 -0
  244. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_code.py +0 -0
  245. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  246. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  247. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  248. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  249. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  250. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  251. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_dev.py +0 -0
  252. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_energy.py +0 -0
  253. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_entities.py +0 -0
  254. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  255. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_groups.py +0 -0
  256. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_hacs.py +0 -0
  257. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_history.py +0 -0
  258. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_integrations.py +0 -0
  259. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_labels.py +0 -0
  260. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_logs.py +0 -0
  261. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_radio.py +0 -0
  262. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_registry.py +0 -0
  263. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_resources.py +0 -0
  264. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_search.py +0 -0
  265. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  266. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_service.py +0 -0
  267. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_services.py +0 -0
  268. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_system.py +0 -0
  269. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_themes.py +0 -0
  270. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_todo.py +0 -0
  271. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_traces.py +0 -0
  272. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_updates.py +0 -0
  273. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_utility.py +0 -0
  274. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  275. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  276. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  277. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/tools_zones.py +0 -0
  278. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/util_helpers.py +0 -0
  279. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/tools/validation_middleware.py +0 -0
  280. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/transforms/__init__.py +0 -0
  281. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/transforms/categorized_search.py +0 -0
  282. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  283. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/transport_security.py +0 -0
  284. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/update_check.py +0 -0
  285. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/utils/__init__.py +0 -0
  286. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/utils/config_hash.py +0 -0
  287. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/utils/config_write_lock.py +0 -0
  288. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/utils/data_paths.py +0 -0
  289. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  290. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/utils/domain_handlers.py +0 -0
  291. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/utils/entity_membership.py +0 -0
  292. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  293. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  294. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/utils/operation_manager.py +0 -0
  295. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/utils/python_sandbox.py +0 -0
  296. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/utils/skill_loader.py +0 -0
  297. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/utils/usage_logger.py +0 -0
  298. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/visibility/__init__.py +0 -0
  299. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/visibility/enforcement.py +0 -0
  300. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/visibility/model.py +0 -0
  301. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/visibility/persistence.py +0 -0
  302. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp/visibility/resolver.py +0 -0
  303. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  304. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  305. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  306. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  307. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  308. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/tests/__init__.py +0 -0
  309. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/tests/test_constants.py +0 -0
  310. {ha_mcp_dev-8.4.3.dev2588 → ha_mcp_dev-8.4.3.dev2592}/tests/test_env_manager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.4.3.dev2588
3
+ Version: 8.4.3.dev2592
4
4
  Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
5
5
  Author-email: Julien <github@qc-h.net>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "8.4.3.dev2588"
7
+ version = "8.4.3.dev2592"
8
8
  description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
9
9
  readme = "README.md"
10
10
  # Upper bound widened to <3.15 so the package installs on Home Assistant's
@@ -6,7 +6,7 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "Agent skills for Home Assistant: best practices for automations, helpers, templates, scenes, blueprints, device control, dashboards, AppDaemon, and backups",
9
- "version": "0.26.0"
9
+ "version": "0.31.0"
10
10
  },
11
11
  "plugins": [
12
12
  {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "home-assistant-skills",
3
3
  "description": "Agent skills for Home Assistant: best practices for automations, helpers, templates, scenes, blueprints, device control, dashboards, AppDaemon, and backups.",
4
- "version": "0.26.0",
4
+ "version": "0.31.0",
5
5
  "repository": "https://github.com/homeassistant-ai/skills",
6
6
  "license": "MIT"
7
7
  }
@@ -29,9 +29,13 @@ INSTRUCTIONS FOR THE AGENT
29
29
  A skill in this repository misled you, and your user saw the result.
30
30
 
31
31
  BEFORE FILING:
32
- - Search existing issues for the same skill and failure. If a matching
33
- issue exists, react with thumbs-up or comment with additional context.
34
- Open a new issue only when the failure is unreported.
32
+ - Do not re-run any step that changed the user's config. Decide from
33
+ evidence you already have whether the failure is HA's or your tool's:
34
+ what your tool sent against what HA stored, HA's own log line, the state
35
+ the entity actually holds, and the core file or docs page that would
36
+ produce the behaviour. If the evidence points at the tool, there is no
37
+ skill gap: do not file. If you cannot tell, say so in 3b and file only
38
+ if the skill's guidance would still have changed what you did.
35
39
  - Did the skill actually load? If it never triggered, this is a triggering
36
40
  failure, not a content failure: write "Skill did not trigger" in 3a, keep
37
41
  the user's request verbatim apart from redactions (it is the prompt that
@@ -39,6 +43,16 @@ BEFORE FILING:
39
43
  - Did you follow the skill's guidance? If you skipped guidance that would
40
44
  have prevented the failure, that is not a skill bug. Report only what the
41
45
  skill got wrong or left out.
46
+ - Did your fix break a rule? A step you marked Success that does what the
47
+ Critical Anti-Patterns table in the skill's SKILL.md forbids is not a
48
+ fix. The test is what was written where, not which tool wrote it. Mark
49
+ that row Failure, keep it in this report, and in 3c give the supported
50
+ path or say you did not find one.
51
+ - One failure per report. If your timeline has two unrelated [GAP] rows,
52
+ file two reports.
53
+ - Search existing issues for the same skill and failure. If a matching
54
+ issue exists, react with thumbs-up or comment with additional context.
55
+ Open a new issue only when the failure is unreported.
42
56
  - Redact before filing: tokens, URLs, IP addresses, email addresses, names,
43
57
  and anything from the user's setup the public need not see — replace each
44
58
  with [REDACTED] and keep the wording otherwise. Show the user the finished
@@ -62,6 +76,8 @@ List each action you took. For each, record what you did, what resulted, and its
62
76
 
63
77
  Mark the first failing step with **[GAP]** in the `Status` column.
64
78
 
79
+ One change per row. If one step changed several things, keep them in one row and write "not attributed" in Result.
80
+
65
81
  | Step | Action | Result | Status |
66
82
  |------|--------|--------|-----|
67
83
  | 1 | | | |
@@ -92,8 +108,13 @@ and tie it to the skill content you quoted in 3a.
92
108
  ### 3c. What should the skill have told you instead?
93
109
 
94
110
  <!--
95
- Describe the guidance the skill should have included
96
- to prevent this failure.
111
+ State the HA behaviour the skill should carry, not the fix that worked for
112
+ your setup. Cite the core file or docs page for each claim; an uncited
113
+ claim is a hypothesis, so label it as one. Details of your installation
114
+ stay out unless the behaviour is specific to that integration
115
+ (CONTRIBUTING.md, Guiding Principles: skills apply to any HA installation).
116
+ If you cannot phrase it without them, write "No skill gap:
117
+ instance-specific" here and tell the user before filing.
97
118
  -->
98
119
 
99
120
  ## 4. Impact
@@ -104,7 +104,7 @@ The `home-assistant-best-practices` skill includes:
104
104
  | [`references/examples.yaml`](skills/home-assistant-best-practices/references/examples.yaml) | Compound examples combining multiple best practices |
105
105
  | [`references/appdaemon.md`](skills/home-assistant-best-practices/references/appdaemon.md) | AppDaemon apps: when to use vs. native HA, app structure, actions, scheduling, error handling, safe refactoring impact |
106
106
  | [`references/blueprint-guide.md`](skills/home-assistant-best-practices/references/blueprint-guide.md) | Blueprint authoring: metadata & `source_url`, inputs & selectors, `target` vs `entity`, defaults, `!input` templating, versioning |
107
- | [`references/backups.md`](skills/home-assistant-best-practices/references/backups.md) | Full instance backups vs rolling one object back, when an operation needs a backup first, what an archive contains, encryption keys, restore verification, backup deletion |
107
+ | [`references/backups.md`](skills/home-assistant-best-practices/references/backups.md) | Full instance backups vs rolling one object back, when an operation needs a backup first, what an archive contains, encryption keys, restore verification, backup deletion, why a git config repo does not replace a full backup |
108
108
 
109
109
  ## Contributing
110
110
 
@@ -23,7 +23,7 @@ description: >
23
23
  - Existing state changed with no recovery path
24
24
  - Jinja copy-pasted between templates
25
25
  metadata:
26
- version: "26"
26
+ version: "31"
27
27
  ---
28
28
 
29
29
  # Home Assistant Best Practices
@@ -100,6 +100,7 @@ See [device-control #buttonremote-patterns](references/device-control.md#buttonr
100
100
  | `condition: template` with `float > 25` | `condition: numeric_state` | Validated at load, not runtime | [automation-patterns #native-conditions](references/automation-patterns.md#native-conditions) |
101
101
  | `wait_template: "{{ is_state(...) }}"` | `wait_for_trigger` with state trigger | Event-driven, not polling; waits for *change* (see [safe-refactoring #trigger-restructuring](references/safe-refactoring.md#trigger-restructuring) for semantic differences) | [automation-patterns #wait-actions](references/automation-patterns.md#wait-actions) |
102
102
  | `device_id` in triggers | `entity_id` (or `device_ieee` for ZHA) | device_id breaks on re-add | [device-control #entity-id-vs-device-id](references/device-control.md#entity-id-vs-device-id) |
103
+ | `numeric_state` trigger driving a costly action, unguarded | Condition rejecting `unavailable`/`unknown` in `trigger.from_state` | A restart or blip re-arms the trigger, so an unchanged value fires with no crossing (the guard also drops real crossings) | [automation-patterns #unavailable-arms-a-numeric-state-trigger](references/automation-patterns.md#unavailable-arms-a-numeric-state-trigger) |
103
104
  | `mode: single` for motion lights | `mode: restart` | Re-triggers must reset the timer | [automation-patterns #automation-modes](references/automation-patterns.md#automation-modes) |
104
105
  | `enabled: false` as a top-level key in `automations.yaml` | `automation.turn_off` (temporary) or entity registry disable (permanent) | Not a valid top-level key — rejected during schema validation; automation loads as `unavailable` | [automation-patterns #disabling-automations](references/automation-patterns.md#disabling-automations) |
105
106
  | Template sensor for sum/mean | `min_max` helper | Declarative, handles unavailable states | [helper-selection #numeric-aggregation](references/helper-selection.md#numeric-aggregation) |
@@ -146,4 +147,4 @@ Read these when you need detailed information:
146
147
  | [examples.yaml](references/examples.yaml) | Need compound examples combining multiple best practices |
147
148
  | [appdaemon](references/appdaemon.md) | AppDaemon apps: when to use vs. native HA, app structure, actions, scheduling, error handling, safe refactoring impact |
148
149
  | [blueprint-guide](references/blueprint-guide.md) | Authoring reusable blueprints: metadata & `source_url`, inputs & selectors, `target` vs `entity`, defaults, input sections, `!input` templating, versioning |
149
- | [backups](references/backups.md) | Deciding whether an operation needs a backup first; choosing between a full restore, a partial restore, and rolling one object back; what an archive actually contains; encryption keys and the emergency kit; restore verification; what HA does and does not protect when deleting a backup |
150
+ | [backups](references/backups.md) | Deciding whether an operation needs a backup first; choosing between a full restore, a partial restore, and rolling one object back; what an archive actually contains; encryption keys and the emergency kit; restore verification; what HA does and does not protect when deleting a backup; whether a git config repo replaces a full backup |
@@ -276,7 +276,13 @@ conditions:
276
276
  | `climate.target_temperature` (condition) | `climate.is_target_temperature` |
277
277
  | `climate.target_humidity` (condition) | `climate.is_target_humidity` |
278
278
 
279
- **Discovering what exists:** every purpose-specific trigger and condition (and every action) has a dedicated documentation page covering its config shape, options, and examples — fetch it on demand instead of guessing keys; see [domain-docs #fetching-trigger-condition-and-action-docs](domain-docs.md#fetching-trigger-condition-and-action-docs). The trees span 50+ domains (~190 trigger and ~150 condition pages, generic types included): battery, motion, occupancy, door/window/gate/garage_door, climate, media_player, sun, timer, schedule, vacuum, lawn_mower, zone, event, vibration, moon, and more. The catalog grows every release — 2026.7 added the sun family (`sun.dawn`, `sun.dusk`, `sun.solar_noon`, `sun.solar_midnight`, elevation triggers); 2026.8 added the moon family (`moon.phase_changed` trigger; `moon.is_phase` / `moon.is_waning` / `moon.is_waxing` conditions) and the vibration family (`vibration.detected` / `vibration.cleared` triggers; `vibration.is_detected` / `vibration.is_not_detected` conditions) — both are new in 2026.8, so don't emit them for an instance on 2026.7. Check the doc tree rather than this list when a domain you need isn't named here.
279
+ **Discovering what exists:** every purpose-specific trigger and condition (and every action) has a dedicated documentation page covering its config shape, options, and examples — fetch it on demand instead of guessing keys; see [domain-docs #fetching-trigger-condition-and-action-docs](domain-docs.md#fetching-trigger-condition-and-action-docs). The trees span 50+ domains (~190 trigger and ~150 condition pages, generic types included): battery, motion, occupancy, door/window/gate/garage_door, climate, media_player, sun, timer, schedule, vacuum, lawn_mower, zone, event, vibration, moon, and more. The catalog grows every release, so check the doc tree rather than this list when a domain you need isn't named here.
280
+
281
+ | Version | Added to the catalog |
282
+ |---|---|
283
+ | 2026.7 | Sun family: `sun.sunrise`, `sun.sunset`, `sun.dawn`, `sun.dusk`, `sun.solar_noon`, `sun.solar_midnight`, elevation triggers |
284
+ | 2026.8 | Moon family (`moon.phase_changed` trigger; `moon.is_phase` / `moon.is_waning` / `moon.is_waxing` conditions) and vibration family (`vibration.detected` / `vibration.cleared` triggers; `vibration.is_detected` / `vibration.is_not_detected` conditions). Do not emit either on 2026.7 |
285
+ | 2026.9 | Sun family again: `sun.golden_hour_started` / `_ended` and `sun.blue_hour_started` / `_ended`, each taking `options.period`: `any` (default) / `morning` / `evening`, plus `sun.midnight_sun_started` / `_ended` and `sun.polar_night_started` / `_ended` for polar latitudes; conditions `sun.is_golden_hour` / `sun.is_blue_hour` with the same `options.period`, and `sun.is_midnight_sun` / `sun.is_polar_night` |
280
286
 
281
287
  Since 2026.7, `options.for` durations on **conditions** are primed from recorded history, so a freshly created or reloaded condition does not restart its duration clock from zero. Trigger `for:` clocks still reset as described in [`for:` duration resets](#for-duration-resets-on-restart-and-on-unavailable).
282
288
 
@@ -389,6 +395,48 @@ that was a restart re-stamp, not a real state change.
389
395
  > history, so those don't restart from zero on creation/reload. The resets described here still
390
396
  > apply to trigger `for:` clauses and to `last_changed`-based template math.
391
397
 
398
+ ### `unavailable` arms a numeric state trigger
399
+
400
+ The trigger tracks each entity as *armed* or not, judged on the **new** state alone. An entity
401
+ becomes armed when it evaluates as **not matching**, and a fire needs an armed entity to then
402
+ match. On the plain-state path, `unavailable` and `unknown` count as not matching rather than
403
+ raising, so they arm the trigger instead of being ignored. Any *other* non-numeric value (a text
404
+ state such as `idle`, or an entity absent from the state machine) raises instead, which logs a
405
+ warning and returns, leaving the armed flag as it was. A text state therefore neither arms nor
406
+ disarms: `unavailable`, then `idle`, then a matching number still fires.
407
+
408
+ Two consequences, neither involving a threshold being crossed:
409
+
410
+ - **After a restart.** The trigger builds its armed set when it attaches, and HA writes
411
+ `unavailable` for every registry entity that has no state yet, so the entity is armed. Its first
412
+ real reading past the threshold then fires.
413
+ - **After a blip.** An entity that flicks to `unavailable` and back is re-armed, so the same
414
+ unchanged value fires again.
415
+
416
+ `for:` does not prevent either case. The re-armed entity matches, the unchanged value keeps
417
+ matching for the whole window, so the trigger fires late rather than not at all.
418
+
419
+ **A guard costs real crossings.** Rejecting a non-numeric `from_state` also drops genuine
420
+ crossings that passed through `unavailable` (1400 to `unavailable` to 1600), and with `for:` a blip
421
+ inside the window cancels the timer and re-arms, so that crossing never fires at all. Guard only
422
+ where a false fire costs more than a missed one, such as switching a high-power load. As with
423
+ [`trigger.event`](#event-trigger), `trigger.from_state` is `LoggingUndefined` for non-state
424
+ triggers, so short-circuit on `trigger.platform` first:
425
+
426
+ ```yaml
427
+ # WRONG — raises UndefinedError when a non-state trigger fires the same automation
428
+ conditions:
429
+ - "{{ trigger.from_state.state not in ['unavailable', 'unknown'] }}"
430
+
431
+ # RIGHT — platform check first; is_number also rejects text states such as `idle`
432
+ conditions:
433
+ - condition: template
434
+ value_template: >
435
+ {{ trigger.platform == 'numeric_state'
436
+ and trigger.from_state is not none
437
+ and is_number(trigger.from_state.state) }}
438
+ ```
439
+
392
440
  ### Time Trigger
393
441
 
394
442
  Fires at specific times.
@@ -68,10 +68,11 @@ The test is reversibility, not how risky something feels: **back up before an op
68
68
 
69
69
  "It's just an action" is not a reversibility argument — the inverse depends on the action and the target, and a reversible state change is not always a reversible event.
70
70
 
71
- Two things this test depends on:
71
+ Three things this test depends on:
72
72
 
73
73
  - **Timing is the whole point.** A backup taken *after* the destructive step captures the damage. It must precede the operation.
74
74
  - **An existing schedule does not substitute.** On an instance with nightly automatic backups, the newest one can be almost a day stale — fine for reversible edits, not for an irreversible operation about to run now.
75
+ - **A git config repo does not substitute.** A `/config` directory tracked in git conventionally excludes the recorder database, along with `.storage` and `secrets.yaml`, which carry credentials and long-lived tokens in cleartext. Such a repo holds tracked files only, and the irreversible operations above destroy registry, config-entry, or install state that it does not hold. A repo that does track `.storage` carries those credentials into every clone, so it must not go anywhere the user has not chosen, and writing `.storage` back over a running instance is a direct edit of HA's internal state rather than a restore.
75
76
 
76
77
  ## What a Full Backup Contains
77
78
 
@@ -31,6 +31,7 @@ Patterns and decisions for designing Home Assistant Lovelace dashboards.
31
31
  "title": "My Home",
32
32
  "icon": "mdi:home",
33
33
  "config": {
34
+ "background": {"image": "/local/background.jpg", "opacity": 30, "size": "cover"},
34
35
  "views": [
35
36
  {
36
37
  "title": "Overview",
@@ -88,7 +89,7 @@ Section `title` is soft-deprecated (frontend source marks it `@deprecated Use he
88
89
  }
89
90
  ```
90
91
 
91
- `background.image` is a plain path or media-source reference (the `url(...)` wrapper belongs only to the legacy string form of `background`); `opacity` is an integer 0–100. Badges also accept full objects: `{"type": "entity", "entity": "person.jane", "show_name": true, "color": "accent", "visibility": [...]}`.
92
+ `background.image` is a plain path or media-source reference (the `url(...)` wrapper belongs only to the legacy string form of `background`); `opacity` is an integer 0–100. The same shape works at dashboard level, next to `views`, and each view that sets its own `background` overrides it. Badges also accept full objects: `{"type": "entity", "entity": "person.jane", "show_name": true, "color": "accent", "visibility": [...]}`.
92
93
 
93
94
  A `sections` view also supports a `header` (a markdown card plus badge positioning) and a `footer`:
94
95
 
@@ -243,8 +244,8 @@ Quick controls available on tile, area, humidifier, and thermostat cards.
243
244
 
244
245
  | Domain | Feature types |
245
246
  |--------|--------------|
246
- | Climate | `climate-hvac-modes`, `climate-fan-modes`, `climate-preset-modes`, `climate-swing-modes`, `climate-swing-horizontal-modes`, `target-temperature`, `target-humidity` |
247
- | Light | `light-brightness`, `light-color-temp`, `light-color-favorites` |
247
+ | Climate | `climate-hvac-modes`, `climate-fan-modes`, `climate-preset-modes`, `climate-swing-modes`, `climate-swing-horizontal-modes`, `target-temperature`, `target-humidity` (humidifier entities, and climate entities that support it since 2026.9) |
248
+ | Light | `light-brightness`, `light-color-temp`, `light-color-favorites`, `light-effect` (`effects:` filter list) |
248
249
  | Cover/Valve | `cover-open-close`, `cover-position`, `cover-position-favorite`, `cover-tilt`, `cover-tilt-position`, `cover-tilt-favorite`, `valve-open-close`, `valve-position`, `valve-position-favorite` |
249
250
  | Fan | `fan-speed`, `fan-preset-modes`, `fan-direction`, `fan-oscillate` |
250
251
  | Media | `media-player-playback` (configurable `controls`), `media-player-volume-slider`, `media-player-volume-buttons`, `media-player-source`, `media-player-sound-mode` |
@@ -252,7 +253,7 @@ Quick controls available on tile, area, humidifier, and thermostat cards.
252
253
  | Generic display | `trend-graph` (history sparkline; `hours_to_show`), `bar-gauge` (`min`/`max`) |
253
254
  | Generic control | `toggle`, `button` (run an action), `numeric-input` (`style`: `"buttons"`/`"slider"`), `select-options`, `counter-actions`, `date-set` |
254
255
  | Area card | `area-controls` |
255
- | Domain-specific | `alarm-modes`, `lock-commands`, `lock-open-door`, `vacuum-commands`, `lawn-mower-commands`, `humidifier-modes`, `humidifier-toggle`, `update-actions`, `water-heater-operation-modes` |
256
+ | Domain-specific | `alarm-modes`, `lock-commands`, `lock-open-door`, `vacuum-commands`, `vacuum-fan-speed` (`fan_speeds:` filter list), `lawn-mower-commands`, `humidifier-modes`, `humidifier-toggle`, `update-actions`, `water-heater-operation-modes` |
256
257
 
257
258
  Mode-list features accept `style`: `"dropdown"` or `"icons"`. Tile cards also support `features_position`: `"bottom"` (default) or `"inline"`.
258
259
 
@@ -552,7 +553,7 @@ Custom cards predating sections views (early 2024) that haven't updated since ar
552
553
  - Use **area** cards with navigation for hierarchical organization
553
554
  - Start sections with **heading** cards (`title`/`subtitle` styles); subtitle headings work well for inline caveats
554
555
 
555
- ### Recent Dashboard Features (2026.2–2026.6)
556
+ ### Recent Dashboard Features (2026.2–2026.9)
556
557
 
557
558
  | Feature | Version | Details |
558
559
  |---------|---------|---------|
@@ -565,6 +566,10 @@ Custom cards predating sections views (early 2024) that haven't updated since ar
565
566
  | **Media player tile features** | 2026.5 | `media-player-source`, `media-player-sound-mode`, configurable playback `controls` |
566
567
  | **Weather forecast features** | 2026.6 | `temperature-forecast`, `precipitation-forecast` tile features |
567
568
  | **Per-entity graph color** | 2026.6 | `color` on each entity of `history-graph` / `statistics-graph` |
569
+ | **Light effect feature** | 2026.9 | `light-effect` tile feature, for lights that report effects |
570
+ | **Vacuum fan speed feature** | 2026.9 | `vacuum-fan-speed` tile feature |
571
+ | **Climate target humidity** | 2026.9 | `target-humidity` now works on climate entities that support it |
572
+ | **Dashboard background editor** | 2026.9 | A Background tab in the dashboard detail dialog edits the dashboard-level `background` key, which applies to every view that sets none of its own. The key itself predates 2026.9 |
568
573
 
569
574
  **Legacy patterns to avoid:**
570
575
  - Single-view dashboards with all cards in one long scroll
@@ -294,6 +294,21 @@ actions:
294
294
  tilt_position: 75
295
295
  ```
296
296
 
297
+ **Speed (2026.9+):** `cover.open_cover`, `cover.close_cover` and `cover.set_cover_position`
298
+ take an optional `speed`. The values are per entity: read its `supported_speeds` attribute and
299
+ pass one of those strings. A value outside that list raises a validation error. A cover with no
300
+ `supported_speeds` ignores the option and moves at its normal speed.
301
+
302
+ ```yaml
303
+ actions:
304
+ - action: cover.set_cover_position
305
+ target:
306
+ entity_id: cover.living_room_blinds
307
+ data:
308
+ position: 50
309
+ speed: fast # one of the entity's supported_speeds
310
+ ```
311
+
297
312
  ### Media Players
298
313
 
299
314
  ```yaml
@@ -60,7 +60,7 @@ have none, so a YAML change needs `homeassistant.restart` — confirm with the u
60
60
  `threshold`, `tod`, `integration`, `mold_indicator`, `random`, `switch_as_x`,
61
61
  `generic_hygrostat`, and `utility_meter` (whose services are `reset`/`calibrate` only).
62
62
 
63
- **`YAML-only:` lines are verified against core 2026.8.3.** Those keys exist on the YAML
63
+ **`YAML-only:` lines are verified against core 2026.8.3** (2026.9 notes against core 2026.9.0). Those keys exist on the YAML
64
64
  platform schema and have no config-flow field, so needing one is a reason to write YAML.
65
65
  A helper with no `YAML-only:` line has no such keys. Where the two shapes differ or the flow
66
66
  cannot express a case (`trend`, `tod`, `bayesian`, `filter`, `template`), both are shown.
@@ -132,11 +132,14 @@ Note the key is `round_digits` here — `derivative` and `integration` spell the
132
132
  - Ignores `unknown` states (except `sum` which goes to unknown)
133
133
  - Returns error if unit of measurement differs between sensors
134
134
  - For spiky values, filter with statistics sensor first
135
+ - Always `state_class: measurement`, so the recorder compiles `mean`/`min`/`max` and never `sum` (`DEFAULT_STATISTICS` in `sensor/recorder.py`)
136
+ - Energy Dashboard consequence: a `sum` of energy (kWh) sensors plots nothing and is flagged `entity_state_class_measurement_no_last_reset`. Adding `last_reset` silences that issue but still plots nothing; energy sources need `total` or `total_increasing`. Add each energy sensor as its own dashboard source instead, which the dashboard sums for display. The grid `stat_rate` slot is the opposite case: it requires `measurement` with `device_class: power`, which a `sum` of power sensors satisfies (gas and water `stat_rate` take `volume_flow_rate` instead)
137
+ - Since 2026.3, `device_class` is inherited only when every entity in `entity_ids` carries the same one, evaluated once at setup
135
138
 
136
139
  **Common uses:**
137
140
  - Average house temperature from multiple room sensors
138
141
  - Maximum power consumption across circuits
139
- - Sum of all solar panel production sensors
142
+ - Sum of solar power (W) across arrays; for kWh use [integration](#integration-riemann-sum)
140
143
 
141
144
  ---
142
145
 
@@ -625,6 +628,10 @@ name: "Doorbell" # required
625
628
  icon: mdi:bell
626
629
  ```
627
630
 
631
+ **Trigger on a press:** since 2026.9, `trigger: button.pressed` accepts an `input_button`
632
+ helper as its target. On 2026.8 and earlier it only accepts `button` entities, so a helper
633
+ press needs a state trigger on the helper entity.
634
+
628
635
  **Common uses:**
629
636
  - Manual triggers for automations
630
637
  - Dashboard buttons
@@ -1188,8 +1195,8 @@ sets the entry up, which is why the YAML platform shape shows the key at the top
1188
1195
  **template → device_tracker** (the native replacement for the legacy `device_tracker.see` action)
1189
1196
  - Required: `name`, and **either** `in_zones` (a list of zone entity_ids the device is considered in) **or** both `latitude` and `longitude` (templates)
1190
1197
  - Optional: `device_id`; `availability` and `location_accuracy` inside `additional_options`
1191
- - **YAML-only:** `icon`, `picture` (and `unique_id`, as everywhere)
1192
- - Not valid here in **either** shape: `attributes`. Nor: `location_name`, `battery_level`, `source_type`, `host_name`, `mac_address`, `gps_accuracy`
1198
+ - **YAML-only:** `icon`, `picture`, and `attributes` for extra attributes of your own (added in 2026.9, YAML-only), plus `unique_id`, as everywhere. `attributes` cannot set the entity's own: `source_type`, `in_zones`, `tracking_type`, `latitude`, `longitude` and `gps_accuracy` are rejected there
1199
+ - Not valid as config keys in **either** shape: `location_name`, `battery_level`, `source_type`, `host_name`, `mac_address`, `gps_accuracy`
1193
1200
 
1194
1201
  Other sub-types follow the same shape — a `state` template plus domain-appropriate metadata.
1195
1202
 
@@ -1230,12 +1237,12 @@ template:
1230
1237
  device_class: presence
1231
1238
  ```
1232
1239
 
1233
- **YAML-only for template entities** (verified against the Template Helper flow at 2026.8.3):
1240
+ **YAML-only for template entities** (flow fields verified at 2026.8.3; the 2026.9 notes against core 2026.9.0):
1234
1241
 
1235
1242
  | YAML-only | Why the flow cannot do it |
1236
1243
  |---|---|
1237
- | **Trigger-based templates** (`triggers:` / `action:` / `variables:` on the block) | The flow has no trigger step. Its per-sub-type action fields (`press`, `turn_on`, `set_value`, …) are entity *commands*, not a trigger block's `actions:` |
1238
- | `attributes:` (extra state attributes) | No field in the flow |
1244
+ | **Trigger-based templates** (`triggers:` / `action:` / `variables:` on the block, and per-entity `conditions:` since 2026.9) | The flow has no trigger step. Its per-sub-type action fields (`press`, `turn_on`, `set_value`, …) are entity *commands*, not a trigger block's `actions:` |
1245
+ | `attributes:` (extra state attributes; on every platform since 2026.9) | No field in the flow |
1239
1246
  | Several entities in one block | One entity per config entry |
1240
1247
 
1241
1248
  (`unique_id` is not in this table: the flow assigns one. See the note at the top of this file.)
@@ -1255,6 +1262,7 @@ See the [Decision Matrix](#decision-matrix) for when the Template Helper is the
1255
1262
  |------|--------|-----|
1256
1263
  | Average of multiple sensors | `min_max` (type: mean) | Template with math |
1257
1264
  | Sum of multiple sensors | `min_max` (type: sum) | Template with math |
1265
+ | Sum of energy (kWh) sensors for the Energy Dashboard | Add each sensor as its own dashboard source | `min_max` (type: sum): `measurement` never compiles `sum` statistics |
1258
1266
  | Average over time | `statistics` | Template tracking history |
1259
1267
  | Rate of change | `derivative` | Template calculating delta |
1260
1268
  | On/off at threshold | `threshold` | Template binary sensor |
@@ -290,6 +290,36 @@ template:
290
290
  **Trigger-based blocks are YAML-only** — the Template Helper flow has no trigger step, and
291
291
  no `attributes:` field. This example uses both.
292
292
 
293
+ **Two 2026.9 additions to the YAML shape:**
294
+ - `attributes:` works on every template platform, trigger-based or not. Before 2026.9 only
295
+ `sensor`, `binary_sensor`, `image`, `event` and `vacuum` took it. It accepts a map of
296
+ templates, as above, or one template that renders a whole map. You cannot set an attribute
297
+ the entity already owns, such as `brightness` on a template light or `latitude` on a template
298
+ device_tracker: most platforms reject the config, the rest drop it at runtime with a logged
299
+ error.
300
+ - `conditions:` can sit on a single entity, gating that entity's update after the block's
301
+ triggers fire. The older block-level `conditions:` gates every entity in the block. Put both
302
+ on a trigger block only: HA refuses a per-entity `conditions:` when the block has no trigger.
303
+
304
+ ```yaml
305
+ # Per-entity conditions: this sensor updates only while someone is home
306
+ template:
307
+ - triggers:
308
+ - trigger: state
309
+ entity_id: sensor.power_meter
310
+ sensor:
311
+ - name: "Power While Home"
312
+ unique_id: power_while_home
313
+ conditions:
314
+ - condition: state
315
+ entity_id: binary_sensor.occupancy
316
+ state: "on"
317
+ state: "{{ trigger.to_state.state }}"
318
+ unit_of_measurement: "W"
319
+ device_class: power
320
+ state_class: measurement
321
+ ```
322
+
293
323
  **Use trigger-based when you need:**
294
324
  - The `trigger` variable — which entity fired, `from_state` / `to_state`, event data
295
325
  - A value captured at an instant rather than recomputed (timestamps, "last X")
@@ -6,6 +6,7 @@ This does NOT apply to:
6
6
 
7
7
  - Automations/scripts/scenes (use config APIs)
8
8
  - `.storage/` files (use REST/WebSocket APIs)
9
+ - `http` (2026.8+): moved to a storage-backed store with a WebSocket API (`http/config/configure`), managed from Settings → System → Network. A `configuration.yaml` `http:` block is imported once and then ignored, and HA raises a repair issue asking the user to remove it
9
10
  - UI-configured integrations and helpers (config flow): `input_*` helpers, the UI Group Helper (Settings → Devices & Services → Helpers → Group), and most modern notify integrations — **unless the helper's flow has no field for the config you need**, which is a real and common case: see the `YAML-only:` lines in [helper-selection](helper-selection.md)
10
11
 
11
12
  Old-style YAML `group:` blocks are still YAML-only and appear in the table below — only the UI Group Helper is excluded.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.4.3.dev2588
3
+ Version: 8.4.3.dev2592
4
4
  Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
5
5
  Author-email: Julien <github@qc-h.net>
6
6
  License: MIT