diff --git a/homeassistant/helpers/template.py b/homeassistant/helpers/template.py index 28ab4e9bfa0..a04023cfc4f 100644 --- a/homeassistant/helpers/template.py +++ b/homeassistant/helpers/template.py @@ -28,7 +28,7 @@ DATE_STR_FORMAT = "%Y-%m-%d %H:%M:%S" _RE_NONE_ENTITIES = re.compile(r"distance\(|closest\(", re.I | re.M) _RE_GET_ENTITIES = re.compile( - r"(?:(?:states\.|(?:is_state|is_state_attr|states)" + r"(?:(?:states\.|(?:is_state|is_state_attr|state_attr|states)" r"\((?:[\ \'\"]?))([\w]+\.[\w]+)|([\w]+))", re.I | re.M ) @@ -182,6 +182,7 @@ class Template(object): 'distance': template_methods.distance, 'is_state': self.hass.states.is_state, 'is_state_attr': template_methods.is_state_attr, + 'state_attr': template_methods.state_attr, 'states': AllStates(self.hass), }) @@ -405,9 +406,15 @@ class TemplateMethods(object): def is_state_attr(self, entity_id, name, value): """Test if a state is a specific attribute.""" + state_attr = self.state_attr(entity_id, name) + return state_attr is not None and state_attr == value + + def state_attr(self, entity_id, name): + """Get a specific attribute from a state.""" state_obj = self._hass.states.get(entity_id) - return state_obj is not None and \ - state_obj.attributes.get(name) == value + if state_obj is not None: + return state_obj.attributes.get(name) + return None def _resolve_state(self, entity_id_or_state): """Return state or entity_id if given.""" diff --git a/tests/helpers/test_template.py b/tests/helpers/test_template.py index def06ea9284..693c3909924 100644 --- a/tests/helpers/test_template.py +++ b/tests/helpers/test_template.py @@ -397,6 +397,19 @@ class TestHelpersTemplate(unittest.TestCase): """, self.hass) self.assertEqual('False', tpl.render()) + def test_state_attr(self): + """Test state_attr method.""" + self.hass.states.set('test.object', 'available', {'mode': 'on'}) + tpl = template.Template(""" +{% if state_attr("test.object", "mode") == "on" %}yes{% else %}no{% endif %} + """, self.hass) + self.assertEqual('yes', tpl.render()) + + tpl = template.Template(""" +{{ state_attr("test.noobject", "mode") == None }} + """, self.hass) + self.assertEqual('True', tpl.render()) + def test_states_function(self): """Test using states as a function.""" self.hass.states.set('test.object', 'available')