From ab8ff42cdd10db7d1ec39c28e59f3808d1831b7e Mon Sep 17 00:00:00 2001 From: Philip Lundrigan Date: Wed, 16 Dec 2015 10:52:33 -0700 Subject: [PATCH] Create template automation --- .../components/automation/template.py | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 homeassistant/components/automation/template.py diff --git a/homeassistant/components/automation/template.py b/homeassistant/components/automation/template.py new file mode 100644 index 00000000000..1f594dad914 --- /dev/null +++ b/homeassistant/components/automation/template.py @@ -0,0 +1,63 @@ +""" +homeassistant.components.automation.template +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Offers template automation rules. + +For more details about this automation rule, please refer to the documentation +at https://home-assistant.io/components/automation/#template-trigger +""" +import logging + +from homeassistant.const import CONF_VALUE_TEMPLATE +from homeassistant.exceptions import TemplateError +from homeassistant.helpers.event import track_state_change +from homeassistant.util import template + +_LOGGER = logging.getLogger(__name__) + + +def trigger(hass, config, action): + """ Listen for state changes based on `config`. """ + value_template = config.get(CONF_VALUE_TEMPLATE) + + if value_template is None: + _LOGGER.error("Missing configuration key %s", CONF_VALUE_TEMPLATE) + return False + + # Get all entity ids + all_entity_ids = hass.states.entity_ids() + + # pylint: disable=unused-argument + def state_automation_listener(entity, from_s, to_s): + """ Listens for state changes and calls action. """ + + # Check to see if template returns true + if _check_template(hass, value_template): + action() + + track_state_change(hass, all_entity_ids, state_automation_listener) + + return True + + +def if_action(hass, config): + """ Wraps action method with state based condition. """ + + value_template = config.get(CONF_VALUE_TEMPLATE) + + if value_template is None: + _LOGGER.error("Missing configuration key %s", CONF_VALUE_TEMPLATE) + return False + + return lambda: _check_template(hass, value_template) + + +def _check_template(hass, value_template): + """ Checks if result of template is true """ + try: + value = template.render(hass, value_template, {}) + except TemplateError: + _LOGGER.exception('Error parsing template') + return False + + return value.lower() == 'true'