ha-mcp-dev 7.8.1.dev721__tar.gz → 7.8.1.dev722__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-7.8.1.dev721/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.8.1.dev722}/PKG-INFO +1 -1
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/pyproject.toml +1 -1
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_integrations.py +88 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/LICENSE +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/MANIFEST.in +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/README.md +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/setup.cfg +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/settings.css +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/settings.js +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/settings_ui.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/enhanced.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/tests/__init__.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/tests/test_constants.py +0 -0
- {ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/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 = "7.8.1.
|
|
7
|
+
version = "7.8.1.dev722"
|
|
8
8
|
description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13,<3.14"
|
|
@@ -445,6 +445,25 @@ class IntegrationTools:
|
|
|
445
445
|
default=False,
|
|
446
446
|
),
|
|
447
447
|
] = False,
|
|
448
|
+
include_knx_project: Annotated[
|
|
449
|
+
bool,
|
|
450
|
+
Field(
|
|
451
|
+
description=(
|
|
452
|
+
"When entry_id is a KNX config entry, also return the parsed "
|
|
453
|
+
"ETS project: the full group-address table (address, name, "
|
|
454
|
+
"DPT, description) under knx_project.group_addresses, plus the "
|
|
455
|
+
"group-range hierarchy and project metadata. This is the "
|
|
456
|
+
"parsed-project GA table that is NOT in the diagnostics dump; "
|
|
457
|
+
"per-entity GA assignments are already covered by "
|
|
458
|
+
"include_diagnostics (config_store / configuration_yaml). "
|
|
459
|
+
"Ignored (with a warning) when the entry is not a KNX "
|
|
460
|
+
"integration. The KNX integration exposes a single project, "
|
|
461
|
+
"so the result is the same regardless of which KNX entry_id "
|
|
462
|
+
"is used."
|
|
463
|
+
),
|
|
464
|
+
default=False,
|
|
465
|
+
),
|
|
466
|
+
] = False,
|
|
448
467
|
device_id: Annotated[
|
|
449
468
|
str | None,
|
|
450
469
|
Field(
|
|
@@ -553,6 +572,7 @@ class IntegrationTools:
|
|
|
553
572
|
- Get entry with editable fields: ha_get_integration(entry_id="abc123", include_schema=True)
|
|
554
573
|
- Get entry with diagnostics dump: ha_get_integration(entry_id="abc123", include_diagnostics=True)
|
|
555
574
|
- Get device-scoped diagnostics: ha_get_integration(entry_id="abc123", include_diagnostics=True, device_id="dev123")
|
|
575
|
+
- Get the parsed KNX ETS project (group-address table): ha_get_integration(entry_id="<knx entry>", include_knx_project=True)
|
|
556
576
|
- Walk a sub-tree: ha_get_integration(entry_id="abc123", include_diagnostics=True, diagnostics_data_path="<dotted-path>")
|
|
557
577
|
- Paginate a large list: ha_get_integration(entry_id="abc123", include_diagnostics=True, diagnostics_data_path="<list-valued path>", diagnostics_data_limit=10, diagnostics_data_offset=20)
|
|
558
578
|
- List config subentries: ha_get_integration(entry_id="abc123", include_subentries=True)
|
|
@@ -580,6 +600,7 @@ class IntegrationTools:
|
|
|
580
600
|
include_opts = include_options
|
|
581
601
|
include_schema_bool = include_schema
|
|
582
602
|
include_diagnostics_bool = include_diagnostics
|
|
603
|
+
include_knx_project_bool = include_knx_project
|
|
583
604
|
include_subentries_bool = include_subentries
|
|
584
605
|
include_subentry_schema_bool = include_subentry_schema
|
|
585
606
|
show_advanced_options_bool = show_advanced_options
|
|
@@ -639,6 +660,8 @@ class IntegrationTools:
|
|
|
639
660
|
"device_id was provided but ignored because "
|
|
640
661
|
"include_diagnostics=False"
|
|
641
662
|
)
|
|
663
|
+
if include_knx_project_bool:
|
|
664
|
+
await self._attach_knx_project(resp, entry_id)
|
|
642
665
|
return resp
|
|
643
666
|
|
|
644
667
|
# List mode - get all config entries
|
|
@@ -648,6 +671,8 @@ class IntegrationTools:
|
|
|
648
671
|
ignored_detail_params = []
|
|
649
672
|
if include_diagnostics_bool:
|
|
650
673
|
ignored_detail_params.append("include_diagnostics")
|
|
674
|
+
if include_knx_project_bool:
|
|
675
|
+
ignored_detail_params.append("include_knx_project")
|
|
651
676
|
if device_id is not None:
|
|
652
677
|
ignored_detail_params.append("device_id")
|
|
653
678
|
if fields_list is not None:
|
|
@@ -777,6 +802,69 @@ class IntegrationTools:
|
|
|
777
802
|
)
|
|
778
803
|
return None # unreachable: exception_to_structured_error raises
|
|
779
804
|
|
|
805
|
+
async def _attach_knx_project(self, resp: dict[str, Any], entry_id: str) -> None:
|
|
806
|
+
"""Attach the parsed KNX ETS project to a single-entry response.
|
|
807
|
+
|
|
808
|
+
Reads ``knx/get_knx_project`` (the same command the KNX panel uses) and
|
|
809
|
+
attaches the group-address table, group-range hierarchy, and project
|
|
810
|
+
metadata under ``resp["knx_project"]``. The KNX integration exposes one
|
|
811
|
+
project globally, so the command takes no entry scope; this is gated on
|
|
812
|
+
the entry actually being a KNX integration to avoid attaching unrelated
|
|
813
|
+
data to a non-KNX entry.
|
|
814
|
+
|
|
815
|
+
Failures are surfaced as warnings rather than raised — the primary
|
|
816
|
+
entry read already succeeded, mirroring how diagnostics fetch failures
|
|
817
|
+
are handled. The "KNX integration not loaded" case collapses into
|
|
818
|
+
ha_get_integration's existing no-such-entry handling (no KNX entry → no
|
|
819
|
+
entry_id to pass here), so it needs no special casing.
|
|
820
|
+
"""
|
|
821
|
+
entry = resp.get("entry") if isinstance(resp.get("entry"), dict) else {}
|
|
822
|
+
domain = entry.get("domain") if isinstance(entry, dict) else None
|
|
823
|
+
if domain != "knx":
|
|
824
|
+
resp.setdefault("warnings", []).append(
|
|
825
|
+
f"include_knx_project ignored: entry {entry_id} is not a KNX "
|
|
826
|
+
f"integration (domain={domain!r})"
|
|
827
|
+
)
|
|
828
|
+
return
|
|
829
|
+
|
|
830
|
+
result = await self._client.send_websocket_message(
|
|
831
|
+
{"type": "knx/get_knx_project"}
|
|
832
|
+
)
|
|
833
|
+
if not isinstance(result, dict) or not result.get("success"):
|
|
834
|
+
error_msg = websocket_error_message(
|
|
835
|
+
result.get("error", "Unknown error")
|
|
836
|
+
if isinstance(result, dict)
|
|
837
|
+
else result
|
|
838
|
+
)
|
|
839
|
+
resp.setdefault("warnings", []).append(
|
|
840
|
+
f"Failed to fetch KNX project: {error_msg}"
|
|
841
|
+
)
|
|
842
|
+
return
|
|
843
|
+
|
|
844
|
+
project = result.get("result")
|
|
845
|
+
if not project:
|
|
846
|
+
# No ETS project uploaded yet — get_knxproject() returns None.
|
|
847
|
+
resp["knx_project"] = {
|
|
848
|
+
"count": 0,
|
|
849
|
+
"group_addresses": {},
|
|
850
|
+
"group_ranges": {},
|
|
851
|
+
"info": {},
|
|
852
|
+
"note": (
|
|
853
|
+
"The KNX integration is loaded but no ETS project has been "
|
|
854
|
+
"uploaded yet. Upload a .knxproj file via the KNX panel to "
|
|
855
|
+
"populate the group-address table."
|
|
856
|
+
),
|
|
857
|
+
}
|
|
858
|
+
return
|
|
859
|
+
|
|
860
|
+
group_addresses = project.get("group_addresses", {})
|
|
861
|
+
resp["knx_project"] = {
|
|
862
|
+
"count": len(group_addresses),
|
|
863
|
+
"group_addresses": group_addresses,
|
|
864
|
+
"group_ranges": project.get("group_ranges", {}),
|
|
865
|
+
"info": project.get("info", {}),
|
|
866
|
+
}
|
|
867
|
+
|
|
780
868
|
async def _fetch_config_subentries(self, entry_id: str) -> list[dict[str, Any]]:
|
|
781
869
|
"""Fetch config subentries for a detailed entry response."""
|
|
782
870
|
result = await self._client.list_config_subentries(entry_id)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/dashboard_screenshot/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/dashboard_screenshot/capture.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/dashboard_screenshot/provision.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/AGENTS.md
RENAMED
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/CLAUDE.md
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/LICENSE
RENAMED
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/README.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/best_practice_checker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_config.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_entities.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_overview.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_scenes.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_scoring.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tool_search_hint_middleware.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_config_automations.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_config_dashboards.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_config_helpers.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_config_scripts.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_dashboard_screenshot.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_voice_assistant.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/validation_middleware.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/transforms/categorized_search.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/transforms/lite_docstrings.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/kill_signal_diagnostics.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp_dev.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{ha_mcp_dev-7.8.1.dev721 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp_dev.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|