ha-mcp-dev 8.4.3.dev2587__tar.gz → 8.4.3.dev2590__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.
- {ha_mcp_dev-8.4.3.dev2587/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.4.3.dev2590}/PKG-INFO +1 -1
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/pyproject.toml +1 -1
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +1 -1
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +1 -1
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +26 -5
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/README.md +1 -1
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +3 -2
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +49 -1
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +2 -1
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +10 -5
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +15 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +15 -7
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +30 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +1 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/cs.json +3 -1
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/de.json +3 -1
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/eo.json +3 -1
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/es.json +3 -1
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/fr.json +3 -1
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/it.json +3 -1
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/ko.json +3 -1
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/nl.json +3 -1
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/pl.json +2 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/ru.json +3 -1
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/sv.json +3 -1
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/zh-Hans.json +3 -1
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/LICENSE +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/MANIFEST.in +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/README.md +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/setup.cfg +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/ha_request_queue.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/log_filters.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/renamed_tools.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/evals/area-target-over-entity-list/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/evals/arrive-home-automation/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/evals/assist-shortcut-card/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/evals/avg-temperature/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/evals/backup-deletion-confirmation/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/evals/blueprint-authoring/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/evals/button-event-entity/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/evals/device-id-trigger-migration/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/evals/helper-flow-fields-not-platform-yaml/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/evals/media-player-song/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/evals/motion-light-automation-mode/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/evals/rename-entity-impact-analysis/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/evals/template-attributes-yaml-exception/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/evals/timer-finished-automation/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/evals/vacuum-last-clean/case.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/scripts/check_eval_cases.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/settings.js +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tool_dispatch.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/blueprint_sources.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/blueprint_write.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/bulk_selector.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/component_config_entries.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/config_entry_identity.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/error_log_parsing.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/log_common.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/log_sources.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/log_sources_fault.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_logs.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/utils/entity_membership.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/visibility/resolver.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/tests/__init__.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/tests/test_constants.py +0 -0
- {ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/tests/test_env_manager.py +0 -0
|
@@ -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.
|
|
7
|
+
version = "8.4.3.dev2590"
|
|
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.
|
|
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.
|
|
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
|
-
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
96
|
-
|
|
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
|
{ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/resources/skills-vendor/README.md
RENAMED
|
@@ -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
|
+
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
|
|
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
|
-
|
|
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.
|
|
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
|
|
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
|
|
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` (
|
|
1192
|
-
- Not valid
|
|
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
|
|
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.
|
{ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/cs.json
RENAMED
|
@@ -404,6 +404,8 @@
|
|
|
404
404
|
"advanced.individual_config_timeout.help": "Časový limit pro každé načtení konfigurace automatizace/skriptu/scény. Rozsah 1–600. Vyžadován restart.",
|
|
405
405
|
"advanced.individual_fetch_batch_size.label": "Velikost dávky načítání konfigurace",
|
|
406
406
|
"advanced.individual_fetch_batch_size.help": "Souběžné načítání konfigurací podle ID. Snižte směrem k 1 na sériových HA serverech. Rozsah 1–100. Vyžadován restart.",
|
|
407
|
+
"advanced.enable_history_query_guardrails.label": "Ochrana historických dotazů",
|
|
408
|
+
"advanced.enable_history_query_guardrails.help": "Zamítat dotazy do záznamu (recorder), které překračují konzervativní limity entit a časového rozsahu. Ve výchozím nastavení vypnuto.",
|
|
407
409
|
"advanced.ha_tool_concurrency.label": "Souběžnost nástrojů Home Assistant",
|
|
408
410
|
"advanced.ha_tool_concurrency.help": "Volitelný limit pro vnější volání nástrojů Home Assistant napříč všemi relacemi. Vnitřní souběžnost REST, WebSocket a distribuce pro jednotlivé nástroje zůstává nezměněna. Hodnota 0 zachovává neomezené chování. Volání čekající na kapacitu selže po 60 sekundách. Rozsah 0–32. Vyžadován restart.",
|
|
409
411
|
"advanced.backup_hint.label": "Úroveň nápovědy k zálohování",
|
|
@@ -661,7 +663,7 @@
|
|
|
661
663
|
},
|
|
662
664
|
"ha_get_history": {
|
|
663
665
|
"title": "Získat historii nebo statistiky entity",
|
|
664
|
-
"description": "
|
|
666
|
+
"description": "Získat historická data ze záznamu (recorder) v Home Assistant."
|
|
665
667
|
},
|
|
666
668
|
"ha_get_integration": {
|
|
667
669
|
"title": "Získat integraci",
|
{ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/de.json
RENAMED
|
@@ -404,6 +404,8 @@
|
|
|
404
404
|
"advanced.individual_config_timeout.help": "Timeout für jeden Automatisierungs-/Skript-/Szenen-Konfigurations-Abruf. Bereich 1-600. Neustart erforderlich.",
|
|
405
405
|
"advanced.individual_fetch_batch_size.label": "Konfigurations-Abruf-Batch-Größe",
|
|
406
406
|
"advanced.individual_fetch_batch_size.help": "Gleichzeitige Pro-ID-Konfigurations-Abrufe. Senke auf 1 bei seriellen HA-Servern. Bereich 1-100. Neustart erforderlich.",
|
|
407
|
+
"advanced.enable_history_query_guardrails.label": "Verlauf-Abfrage-Schutzplanken",
|
|
408
|
+
"advanced.enable_history_query_guardrails.help": "Recorder-Abfragen ablehnen, die konservative Entitäts- und Zeitbereichsbudgets überschreiten. Standardmäßig deaktiviert.",
|
|
407
409
|
"advanced.ha_tool_concurrency.label": "Home-Assistant-Tool-Gleichzeitigkeit",
|
|
408
410
|
"advanced.ha_tool_concurrency.help": "Optionales Limit für äußere Home-Assistant-Tool-Aufrufe über alle Sitzungen hinweg. Interne REST-, WebSocket- und tool-spezifische Fan-Out-Gleichzeitigkeit bleibt unverändert. 0 behält das unbegrenzte Verhalten bei. Ein auf Kapazität wartender Aufruf schlägt nach 60 Sekunden fehl. Bereich 0–32. Neustart erforderlich.",
|
|
409
411
|
"advanced.backup_hint.label": "Backup-Hinweis-Level",
|
|
@@ -692,7 +694,7 @@
|
|
|
692
694
|
},
|
|
693
695
|
"ha_get_history": {
|
|
694
696
|
"title": "Verlauf oder Statistiken abrufen",
|
|
695
|
-
"description": "
|
|
697
|
+
"description": "Historische Daten aus dem Recorder von Home Assistant abrufen."
|
|
696
698
|
},
|
|
697
699
|
"ha_get_integration": {
|
|
698
700
|
"title": "Integration abrufen",
|
{ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/eo.json
RENAMED
|
@@ -404,6 +404,8 @@
|
|
|
404
404
|
"advanced.individual_config_timeout.help": "Limtempo por ĉiu akirado de aŭtomatiga/skripta/scena agordo. Gamo 1–600. Restartigo necesas.",
|
|
405
405
|
"advanced.individual_fetch_batch_size.label": "Grandeco de agorda akira aro",
|
|
406
406
|
"advanced.individual_fetch_batch_size.help": "Samtempaj agordaj akiroj por ĉiu ID. Malaltigu al 1 ĉe seriaj HA-serviloj. Gamo 1–100. Restartigo necesas.",
|
|
407
|
+
"advanced.enable_history_query_guardrails.label": "Protektaj gvidlinioj por historikurioj",
|
|
408
|
+
"advanced.enable_history_query_guardrails.help": "Malakcepti registrilajn kuriojn, kiuj superas konservativajn entajn kaj tempintervalajn buĝetojn. Malŝaltite defaŭlte.",
|
|
407
409
|
"advanced.ha_tool_concurrency.label": "Konkureco de hejmaŭtomatigaj iloj de Home Assistant",
|
|
408
410
|
"advanced.ha_tool_concurrency.help": "Laŭvola limo pri eksteraj vokoj al Home Assistant-iloj tra ĉiuj sesioj. Interna REST-, WebSocket-, kaj perila disbranĉiĝa konkureco restas neŝanĝita. 0 tenas la senliman konduton. Voko atendanta je kapablo malsukcesas post 60 sekundoj. Intervalo 0–32. Postiĝas restartigo.",
|
|
409
411
|
"advanced.backup_hint.label": "Nivelo de rezerva sugesto",
|
|
@@ -661,7 +663,7 @@
|
|
|
661
663
|
},
|
|
662
664
|
"ha_get_history": {
|
|
663
665
|
"title": "Akiri Entan Historion aŭ Statistikojn",
|
|
664
|
-
"description": "
|
|
666
|
+
"description": "Akiri historiajn datumojn el la registrilo de Home Assistant."
|
|
665
667
|
},
|
|
666
668
|
"ha_get_integration": {
|
|
667
669
|
"title": "Akiri Integriĝon",
|
{ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/es.json
RENAMED
|
@@ -404,6 +404,8 @@
|
|
|
404
404
|
"advanced.individual_config_timeout.help": "Tiempo de espera de cada obtención de configuración de automatización, script o escena. Rango 1–600. Hay que reiniciar.",
|
|
405
405
|
"advanced.individual_fetch_batch_size.label": "Tamaño del lote de obtención de configuraciones",
|
|
406
406
|
"advanced.individual_fetch_batch_size.help": "Obtenciones de configuración por ID en paralelo. Bájalo hacia 1 en servidores HA que responden en serie. Rango 1–100. Hay que reiniciar.",
|
|
407
|
+
"advanced.enable_history_query_guardrails.label": "Protecciones de consultas del historial",
|
|
408
|
+
"advanced.enable_history_query_guardrails.help": "Rechazar consultas del registrador que superen los límites conservadores de entidades y rangos de tiempo. Desactivado por defecto.",
|
|
407
409
|
"advanced.ha_tool_concurrency.label": "Concurrencia de herramientas de Home Assistant",
|
|
408
410
|
"advanced.ha_tool_concurrency.help": "Límite opcional en las llamadas externas a herramientas de Home Assistant en todas las sesiones. La concurrencia interna de REST, WebSocket y de distribución por herramienta no se modifica. 0 mantiene el comportamiento ilimitado. Una llamada que espera capacidad falla después de 60 segundos. Rango de 0 a 32. Requiere reinicio.",
|
|
409
411
|
"advanced.backup_hint.label": "Nivel de la indicación de copia de seguridad",
|
|
@@ -692,7 +694,7 @@
|
|
|
692
694
|
},
|
|
693
695
|
"ha_get_history": {
|
|
694
696
|
"title": "Obtener historial o estadísticas de entidades",
|
|
695
|
-
"description": "
|
|
697
|
+
"description": "Obtener datos históricos del registrador de Home Assistant."
|
|
696
698
|
},
|
|
697
699
|
"ha_get_integration": {
|
|
698
700
|
"title": "Obtener integración",
|
{ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/fr.json
RENAMED
|
@@ -404,6 +404,8 @@
|
|
|
404
404
|
"advanced.individual_config_timeout.help": "Délai d'attente pour chaque récupération de configuration d'automatisation/script/scène. Plage 1–600. Redémarrage requis.",
|
|
405
405
|
"advanced.individual_fetch_batch_size.label": "Taille du lot de récupération de configuration",
|
|
406
406
|
"advanced.individual_fetch_batch_size.help": "Récupérations simultanées de configuration par ID. Diminue vers 1 sur les serveurs HA série. Plage 1–100. Redémarrage requis.",
|
|
407
|
+
"advanced.enable_history_query_guardrails.label": "Limites de requêtes d'historique",
|
|
408
|
+
"advanced.enable_history_query_guardrails.help": "Rejette les requêtes d'historique qui dépassent les budgets prudents d'entités et de plages horaires. Désactivé par défaut.",
|
|
407
409
|
"advanced.ha_tool_concurrency.label": "Concurrence des outils Home Assistant",
|
|
408
410
|
"advanced.ha_tool_concurrency.help": "Limite optionnelle sur les appels d'outils Home Assistant externes pour toutes les sessions. La concurrence interne pour REST, WebSocket et par outil reste inchangée. 0 conserve un comportement illimité. Un appel en attente de capacité échoue après 60 secondes. Plage de 0 à 32. Redémarrage requis.",
|
|
409
411
|
"advanced.backup_hint.label": "Niveau d'indication de sauvegarde",
|
|
@@ -692,7 +694,7 @@
|
|
|
692
694
|
},
|
|
693
695
|
"ha_get_history": {
|
|
694
696
|
"title": "Obtenir l'historique ou les statistiques",
|
|
695
|
-
"description": "
|
|
697
|
+
"description": "Obtenir des données historiques à partir de l'enregistreur de Home Assistant."
|
|
696
698
|
},
|
|
697
699
|
"ha_get_integration": {
|
|
698
700
|
"title": "Obtenir l'intégration",
|
{ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/it.json
RENAMED
|
@@ -404,6 +404,8 @@
|
|
|
404
404
|
"advanced.individual_config_timeout.help": "Timeout di ogni recupero di configurazione di automazione, script o scena. Intervallo 1–600. È necessario il riavvio.",
|
|
405
405
|
"advanced.individual_fetch_batch_size.label": "Dimensione del lotto di recupero delle configurazioni",
|
|
406
406
|
"advanced.individual_fetch_batch_size.help": "Recuperi di configurazione per singolo ID eseguiti in parallelo. Avvicinati a 1 sui server HA che lavorano in sequenza. Intervallo 1–100. È necessario il riavvio.",
|
|
407
|
+
"advanced.enable_history_query_guardrails.label": "Protezioni per le query sulla cronologia",
|
|
408
|
+
"advanced.enable_history_query_guardrails.help": "Rifiuta le query del recorder che superano i limiti conservativi di entità e intervallo di tempo. Disabilitato per impostazione predefinita.",
|
|
407
409
|
"advanced.ha_tool_concurrency.label": "Concorrenza degli strumenti di Home Assistant",
|
|
408
410
|
"advanced.ha_tool_concurrency.help": "Limite opzionale sulle chiamate esterne agli strumenti di Home Assistant in tutte le sessioni. La concorrenza interna di REST, WebSocket e fan-out per strumento rimane invariata. 0 mantiene il comportamento illimitato. Una chiamata in attesa di capacità fallisce dopo 60 secondi. Intervallo 0–32. Riavvio necessario.",
|
|
409
411
|
"advanced.backup_hint.label": "Livello del suggerimento di backup",
|
|
@@ -692,7 +694,7 @@
|
|
|
692
694
|
},
|
|
693
695
|
"ha_get_history": {
|
|
694
696
|
"title": "Ottieni la cronologia o le statistiche di un'entità",
|
|
695
|
-
"description": "
|
|
697
|
+
"description": "Ottieni dati storici dal recorder di Home Assistant."
|
|
696
698
|
},
|
|
697
699
|
"ha_get_integration": {
|
|
698
700
|
"title": "Ottieni un'integrazione",
|
{ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/ko.json
RENAMED
|
@@ -404,6 +404,8 @@
|
|
|
404
404
|
"advanced.individual_config_timeout.help": "자동화/스크립트/장면 설정을 각각 가져올 때의 제한 시간입니다. 범위 1~600. 다시 시작해야 합니다.",
|
|
405
405
|
"advanced.individual_fetch_batch_size.label": "설정 조회 배치 크기",
|
|
406
406
|
"advanced.individual_fetch_batch_size.help": "ID별 설정 조회를 동시에 몇 건까지 할지 정합니다. 직렬 처리에 가까운 HA 서버에서는 1에 가깝게 낮추세요. 범위 1~100. 다시 시작해야 합니다.",
|
|
407
|
+
"advanced.enable_history_query_guardrails.label": "기록 쿼리 안전장치",
|
|
408
|
+
"advanced.enable_history_query_guardrails.help": "보수적인 엔티티 및 시간 범위 예산을 초과하는 recorder 쿼리를 거부합니다. 기본적으로 비활성화되어 있습니다.",
|
|
407
409
|
"advanced.ha_tool_concurrency.label": "Home Assistant 도구 동시성",
|
|
408
410
|
"advanced.ha_tool_concurrency.help": "모든 세션에 걸친 외부 Home Assistant 도구 호출에 대한 선택적 제한입니다. 내부 REST, WebSocket 및 도구별 팬아웃 동시성은 변경되지 않습니다. 0은 무제한 동작을 유지합니다. 용량을 기다리는 호출은 60초 후에 실패합니다. 범위는 0~32입니다. 다시 시작이 필요합니다.",
|
|
409
411
|
"advanced.backup_hint.label": "백업 권유 강도",
|
|
@@ -692,7 +694,7 @@
|
|
|
692
694
|
},
|
|
693
695
|
"ha_get_history": {
|
|
694
696
|
"title": "엔티티 기록 또는 통계 조회",
|
|
695
|
-
"description": "Home Assistant recorder에서 과거 데이터를 가져옵니다."
|
|
697
|
+
"description": "Home Assistant의 recorder에서 과거 데이터를 가져옵니다."
|
|
696
698
|
},
|
|
697
699
|
"ha_get_integration": {
|
|
698
700
|
"title": "통합 구성요소 조회",
|
{ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/nl.json
RENAMED
|
@@ -404,6 +404,8 @@
|
|
|
404
404
|
"advanced.individual_config_timeout.help": "Time-out voor elke automatisering/script/scène configuratie-ophalen. Bereik 1–600. Herstart vereist.",
|
|
405
405
|
"advanced.individual_fetch_batch_size.label": "Batchgrootte voor configuratie-ophalen",
|
|
406
406
|
"advanced.individual_fetch_batch_size.help": "Gelijktijdige configuratie-ophalingen per ID. Verlaag naar 1 op seriële HA-servers. Bereik 1–100. Herstart vereist.",
|
|
407
|
+
"advanced.enable_history_query_guardrails.label": "Beveiligingen voor geschiedenisquery's",
|
|
408
|
+
"advanced.enable_history_query_guardrails.help": "Wijs recorderquery's af die de conservatieve budgetten voor entiteiten en tijdsbereik overschrijden. Standaard uitgeschakeld.",
|
|
407
409
|
"advanced.ha_tool_concurrency.label": "Home Assistant-toolgelijktijdigheid",
|
|
408
410
|
"advanced.ha_tool_concurrency.help": "Optionele limiet voor uiterste Home Assistant-toolaanroepen over alle sessies. Interne REST-, WebSocket- en per-tool fan-out gelijktijdigheid blijft ongewijzigd. 0 behoudt onbeperkt gedrag. Een aanroep die wacht op capaciteit mislukt na 60 seconden. Bereik 0–32. Herstart vereist.",
|
|
409
411
|
"advanced.backup_hint.label": "Back-up hintniveau",
|
|
@@ -661,7 +663,7 @@
|
|
|
661
663
|
},
|
|
662
664
|
"ha_get_history": {
|
|
663
665
|
"title": "Haal Entiteitsgeschiedenis of Statistieken op",
|
|
664
|
-
"description": "Haal historische gegevens op
|
|
666
|
+
"description": "Haal historische gegevens op uit de recorder van Home Assistant."
|
|
665
667
|
},
|
|
666
668
|
"ha_get_integration": {
|
|
667
669
|
"title": "Haal Integratie op",
|
{ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/pl.json
RENAMED
|
@@ -404,6 +404,8 @@
|
|
|
404
404
|
"advanced.individual_config_timeout.help": "Limit czasu dla każdego pobierania konfiguracji automatyzacji/skryptu/sceny. Zakres 1–600. Wymagany restart.",
|
|
405
405
|
"advanced.individual_fetch_batch_size.label": "Rozmiar partii pobierania konfiguracji",
|
|
406
406
|
"advanced.individual_fetch_batch_size.help": "Równoczesne pobieranie konfiguracji dla każdego ID. Zmniejsz do 1 na szeregowych serwerach HA. Zakres 1–100. Wymagany restart.",
|
|
407
|
+
"advanced.enable_history_query_guardrails.label": "Zabezpieczenia zapytań historycznych",
|
|
408
|
+
"advanced.enable_history_query_guardrails.help": "Odrzucaj zapytania rejestratora przekraczające zachowawcze limity encji i zakresu czasu. Domyślnie wyłączone.",
|
|
407
409
|
"advanced.ha_tool_concurrency.label": "Współbieżność narzędzi Home Assistant",
|
|
408
410
|
"advanced.ha_tool_concurrency.help": "Opcjonalny limit zewnętrznych wywołań narzędzi Home Assistant we wszystkich sesjach. Wewnętrzna współbieżność REST, WebSocket oraz rozgałęziania dla poszczególnych narzędzi pozostaje bez zmian. Wartość 0 zachowuje zachowanie bez limitu. Wywołanie oczekujące na wolne zasoby kończy się niepowodzeniem po 60 sekundach. Zakres 0–32. Wymagany restart.",
|
|
409
411
|
"advanced.backup_hint.label": "Poziom podpowiedzi o kopii zapasowej",
|
{ha_mcp_dev-8.4.3.dev2587 → ha_mcp_dev-8.4.3.dev2590}/src/ha_mcp/settings_ui/locales/ru.json
RENAMED
|
@@ -404,6 +404,8 @@
|
|
|
404
404
|
"advanced.individual_config_timeout.help": "Тайм-аут каждой загрузки автоматизации, скрипта или сцены. 1–600. Нужен перезапуск.",
|
|
405
405
|
"advanced.individual_fetch_batch_size.label": "Размер пакета загрузки конфигураций",
|
|
406
406
|
"advanced.individual_fetch_batch_size.help": "Число параллельных загрузок. Для последовательных серверов HA снижайте к 1. 1–100. Нужен перезапуск.",
|
|
407
|
+
"advanced.enable_history_query_guardrails.label": "Защита запросов истории",
|
|
408
|
+
"advanced.enable_history_query_guardrails.help": "Отклонять запросы к истории, превышающие консервативные лимиты по объектам и временным диапазонам. Отключено по умолчанию.",
|
|
407
409
|
"advanced.ha_tool_concurrency.label": "Параллелизм инструментов Home Assistant",
|
|
408
410
|
"advanced.ha_tool_concurrency.help": "Необязательный лимит внешних вызовов инструментов Home Assistant во всех сеансах. Внутренний параллелизм REST, WebSocket и вентирования по инструментам остается неизменным. 0 сохраняет неограниченное поведение. Вызов, ожидающий свободных ресурсов, завершается ошибкой через 60 секунд. Диапазон 0–32. Требуется перезапуск.",
|
|
409
411
|
"advanced.backup_hint.label": "Уровень напоминания о резервной копии",
|
|
@@ -692,7 +694,7 @@
|
|
|
692
694
|
},
|
|
693
695
|
"ha_get_history": {
|
|
694
696
|
"title": "Получить историю или статистику",
|
|
695
|
-
"description": "Получить исторические данные из
|
|
697
|
+
"description": "Получить исторические данные из службы записи Home Assistant."
|
|
696
698
|
},
|
|
697
699
|
"ha_get_integration": {
|
|
698
700
|
"title": "Получить интеграцию",
|