mirror of
https://github.com/home-assistant/core.git
synced 2025-05-12 09:59:20 +00:00

* Template domain blueprints * Default blueprint for templates * Some linting * Template entity updates * Load and use blueprints in config * Added missing mapping methods for templates * Linting * Added tests * Wrong schema type * Hassfest errors * More linting issues * Refactor based on desired schema In the [architecture discussion](https://github.com/home-assistant/architecture/discussions/1027), the template blueprint instance did not specify the platform (e.g. `binary_sensor`), but the initial implementation assumed that schema. * Create default template blueprints on first run * Moved TemplateConfig definition This is to avoid circular references * Corrected methods to find templates based on blueprints * Corrected missing entity config information * Added tests * Don't use hass.data Address comments https://github.com/home-assistant/core/pull/126971/#discussion_r1780097187 * Prevent creating blueprints during testing * Combine 2 ifs Address comment https://github.com/home-assistant/core/pull/126971/#discussion_r1780160870 * Improve test coverage * Prevent template component from dirtying test env * Remove useless hard-coded validation * Improve code coverage to 100% * Address review comments * Moved helpers in helpers.py As per comment https://github.com/home-assistant/core/pull/126971#discussion_r1786539889 * Fix blueprint source URL --------- Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
64 lines
2.1 KiB
Python
64 lines
2.1 KiB
Python
"""Helpers for template integration."""
|
|
|
|
import logging
|
|
|
|
from homeassistant.components import blueprint
|
|
from homeassistant.const import SERVICE_RELOAD
|
|
from homeassistant.core import HomeAssistant, callback
|
|
from homeassistant.helpers.entity_platform import async_get_platforms
|
|
from homeassistant.helpers.singleton import singleton
|
|
|
|
from .const import DOMAIN, TEMPLATE_BLUEPRINT_SCHEMA
|
|
from .template_entity import TemplateEntity
|
|
|
|
DATA_BLUEPRINTS = "template_blueprints"
|
|
|
|
LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
@callback
|
|
def templates_with_blueprint(hass: HomeAssistant, blueprint_path: str) -> list[str]:
|
|
"""Return all template entity ids that reference the blueprint."""
|
|
return [
|
|
entity_id
|
|
for platform in async_get_platforms(hass, DOMAIN)
|
|
for entity_id, template_entity in platform.entities.items()
|
|
if isinstance(template_entity, TemplateEntity)
|
|
and template_entity.referenced_blueprint == blueprint_path
|
|
]
|
|
|
|
|
|
@callback
|
|
def blueprint_in_template(hass: HomeAssistant, entity_id: str) -> str | None:
|
|
"""Return the blueprint the template entity is based on or None."""
|
|
for platform in async_get_platforms(hass, DOMAIN):
|
|
if isinstance(
|
|
(template_entity := platform.entities.get(entity_id)), TemplateEntity
|
|
):
|
|
return template_entity.referenced_blueprint
|
|
return None
|
|
|
|
|
|
def _blueprint_in_use(hass: HomeAssistant, blueprint_path: str) -> bool:
|
|
"""Return True if any template references the blueprint."""
|
|
return len(templates_with_blueprint(hass, blueprint_path)) > 0
|
|
|
|
|
|
async def _reload_blueprint_templates(hass: HomeAssistant, blueprint_path: str) -> None:
|
|
"""Reload all templates that rely on a specific blueprint."""
|
|
await hass.services.async_call(DOMAIN, SERVICE_RELOAD)
|
|
|
|
|
|
@singleton(DATA_BLUEPRINTS)
|
|
@callback
|
|
def async_get_blueprints(hass: HomeAssistant) -> blueprint.DomainBlueprints:
|
|
"""Get template blueprints."""
|
|
return blueprint.DomainBlueprints(
|
|
hass,
|
|
DOMAIN,
|
|
LOGGER,
|
|
_blueprint_in_use,
|
|
_reload_blueprint_templates,
|
|
TEMPLATE_BLUEPRINT_SCHEMA,
|
|
)
|