mirror of
https://github.com/home-assistant/core.git
synced 2025-07-25 06:07:17 +00:00
Extract entity ids from all templates (#17902)
This commit is contained in:
parent
3e6de21302
commit
e5c97fdcab
@ -15,7 +15,7 @@ from homeassistant.components.binary_sensor import (
|
|||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
ATTR_FRIENDLY_NAME, ATTR_ENTITY_ID, CONF_VALUE_TEMPLATE,
|
ATTR_FRIENDLY_NAME, ATTR_ENTITY_ID, CONF_VALUE_TEMPLATE,
|
||||||
CONF_ICON_TEMPLATE, CONF_ENTITY_PICTURE_TEMPLATE,
|
CONF_ICON_TEMPLATE, CONF_ENTITY_PICTURE_TEMPLATE,
|
||||||
CONF_SENSORS, CONF_DEVICE_CLASS, EVENT_HOMEASSISTANT_START)
|
CONF_SENSORS, CONF_DEVICE_CLASS, EVENT_HOMEASSISTANT_START, MATCH_ALL)
|
||||||
from homeassistant.exceptions import TemplateError
|
from homeassistant.exceptions import TemplateError
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
from homeassistant.helpers.entity import async_generate_entity_id
|
from homeassistant.helpers.entity import async_generate_entity_id
|
||||||
@ -55,22 +55,37 @@ async def async_setup_platform(hass, config, async_add_entities,
|
|||||||
icon_template = device_config.get(CONF_ICON_TEMPLATE)
|
icon_template = device_config.get(CONF_ICON_TEMPLATE)
|
||||||
entity_picture_template = device_config.get(
|
entity_picture_template = device_config.get(
|
||||||
CONF_ENTITY_PICTURE_TEMPLATE)
|
CONF_ENTITY_PICTURE_TEMPLATE)
|
||||||
entity_ids = (device_config.get(ATTR_ENTITY_ID) or
|
entity_ids = set()
|
||||||
value_template.extract_entities())
|
manual_entity_ids = device_config.get(ATTR_ENTITY_ID)
|
||||||
|
|
||||||
|
for template in (
|
||||||
|
value_template,
|
||||||
|
icon_template,
|
||||||
|
entity_picture_template,
|
||||||
|
):
|
||||||
|
if template is None:
|
||||||
|
continue
|
||||||
|
template.hass = hass
|
||||||
|
|
||||||
|
if manual_entity_ids is not None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
template_entity_ids = template.extract_entities()
|
||||||
|
if template_entity_ids == MATCH_ALL:
|
||||||
|
entity_ids = MATCH_ALL
|
||||||
|
elif entity_ids != MATCH_ALL:
|
||||||
|
entity_ids |= set(template_entity_ids)
|
||||||
|
|
||||||
|
if manual_entity_ids is not None:
|
||||||
|
entity_ids = manual_entity_ids
|
||||||
|
elif entity_ids != MATCH_ALL:
|
||||||
|
entity_ids = list(entity_ids)
|
||||||
|
|
||||||
friendly_name = device_config.get(ATTR_FRIENDLY_NAME, device)
|
friendly_name = device_config.get(ATTR_FRIENDLY_NAME, device)
|
||||||
device_class = device_config.get(CONF_DEVICE_CLASS)
|
device_class = device_config.get(CONF_DEVICE_CLASS)
|
||||||
delay_on = device_config.get(CONF_DELAY_ON)
|
delay_on = device_config.get(CONF_DELAY_ON)
|
||||||
delay_off = device_config.get(CONF_DELAY_OFF)
|
delay_off = device_config.get(CONF_DELAY_OFF)
|
||||||
|
|
||||||
if value_template is not None:
|
|
||||||
value_template.hass = hass
|
|
||||||
|
|
||||||
if icon_template is not None:
|
|
||||||
icon_template.hass = hass
|
|
||||||
|
|
||||||
if entity_picture_template is not None:
|
|
||||||
entity_picture_template.hass = hass
|
|
||||||
|
|
||||||
sensors.append(
|
sensors.append(
|
||||||
BinarySensorTemplate(
|
BinarySensorTemplate(
|
||||||
hass, device, friendly_name, device_class, value_template,
|
hass, device, friendly_name, device_class, value_template,
|
||||||
|
@ -106,7 +106,7 @@ class TestBinarySensorTemplate(unittest.TestCase):
|
|||||||
'platform': 'template',
|
'platform': 'template',
|
||||||
'sensors': {
|
'sensors': {
|
||||||
'test_template_sensor': {
|
'test_template_sensor': {
|
||||||
'value_template': "State",
|
'value_template': "{{ states.sensor.xyz.state }}",
|
||||||
'icon_template':
|
'icon_template':
|
||||||
"{% if "
|
"{% if "
|
||||||
"states.binary_sensor.test_state.state == "
|
"states.binary_sensor.test_state.state == "
|
||||||
@ -137,7 +137,7 @@ class TestBinarySensorTemplate(unittest.TestCase):
|
|||||||
'platform': 'template',
|
'platform': 'template',
|
||||||
'sensors': {
|
'sensors': {
|
||||||
'test_template_sensor': {
|
'test_template_sensor': {
|
||||||
'value_template': "State",
|
'value_template': "{{ states.sensor.xyz.state }}",
|
||||||
'entity_picture_template':
|
'entity_picture_template':
|
||||||
"{% if "
|
"{% if "
|
||||||
"states.binary_sensor.test_state.state == "
|
"states.binary_sensor.test_state.state == "
|
||||||
@ -160,6 +160,30 @@ class TestBinarySensorTemplate(unittest.TestCase):
|
|||||||
state = self.hass.states.get('binary_sensor.test_template_sensor')
|
state = self.hass.states.get('binary_sensor.test_template_sensor')
|
||||||
assert state.attributes['entity_picture'] == '/local/sensor.png'
|
assert state.attributes['entity_picture'] == '/local/sensor.png'
|
||||||
|
|
||||||
|
@mock.patch('homeassistant.components.binary_sensor.template.'
|
||||||
|
'BinarySensorTemplate._async_render')
|
||||||
|
def test_match_all(self, _async_render):
|
||||||
|
"""Test MATCH_ALL in template."""
|
||||||
|
with assert_setup_component(1):
|
||||||
|
assert setup.setup_component(self.hass, 'binary_sensor', {
|
||||||
|
'binary_sensor': {
|
||||||
|
'platform': 'template',
|
||||||
|
'sensors': {
|
||||||
|
'match_all_template_sensor': {
|
||||||
|
'value_template': "{{ 42 }}",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
self.hass.start()
|
||||||
|
self.hass.block_till_done()
|
||||||
|
init_calls = len(_async_render.mock_calls)
|
||||||
|
|
||||||
|
self.hass.states.set('sensor.any_state', 'update')
|
||||||
|
self.hass.block_till_done()
|
||||||
|
assert len(_async_render.mock_calls) > init_calls
|
||||||
|
|
||||||
def test_attributes(self):
|
def test_attributes(self):
|
||||||
"""Test the attributes."""
|
"""Test the attributes."""
|
||||||
vs = run_callback_threadsafe(
|
vs = run_callback_threadsafe(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user