Most of the the template platforms would check for extract_entities failing to extract entities and avoid setting up a state change listner for MATCH_ALL after extract_entities had warned that it could not extract the entities and updates would need to be done manually. This protection has been extended to all template platforms. Alter the behavior of extract_entities to return the successfully extracted entities if one or more templates fail extraction instead of returning MATCH_ALL
60 lines
1.9 KiB
Python
60 lines
1.9 KiB
Python
"""The template component."""
|
|
|
|
from itertools import chain
|
|
import logging
|
|
|
|
from homeassistant.const import MATCH_ALL
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
def initialise_templates(hass, templates, attribute_templates=None):
|
|
"""Initialise templates and attribute templates."""
|
|
if attribute_templates is None:
|
|
attribute_templates = {}
|
|
for template in chain(templates.values(), attribute_templates.values()):
|
|
if template is None:
|
|
continue
|
|
template.hass = hass
|
|
|
|
|
|
def extract_entities(
|
|
device_name, device_type, manual_entity_ids, templates, attribute_templates=None
|
|
):
|
|
"""Extract entity ids from templates and attribute templates."""
|
|
if attribute_templates is None:
|
|
attribute_templates = {}
|
|
entity_ids = set()
|
|
if manual_entity_ids is None:
|
|
invalid_templates = []
|
|
for template_name, template in chain(
|
|
templates.items(), attribute_templates.items()
|
|
):
|
|
if template is None:
|
|
continue
|
|
|
|
template_entity_ids = template.extract_entities()
|
|
|
|
if template_entity_ids != MATCH_ALL:
|
|
entity_ids |= set(template_entity_ids)
|
|
else:
|
|
invalid_templates.append(template_name.replace("_template", ""))
|
|
|
|
entity_ids = list(entity_ids)
|
|
|
|
if invalid_templates:
|
|
if not entity_ids:
|
|
entity_ids = MATCH_ALL
|
|
_LOGGER.warning(
|
|
"Template %s '%s' has no entity ids configured to track nor"
|
|
" were we able to extract the entities to track from the %s "
|
|
"template(s). This entity will only be able to be updated "
|
|
"manually",
|
|
device_type,
|
|
device_name,
|
|
", ".join(invalid_templates),
|
|
)
|
|
else:
|
|
entity_ids = manual_entity_ids
|
|
|
|
return entity_ids
|