116 lines
3.3 KiB
Python
116 lines
3.3 KiB
Python
"""
|
|
homeassistant.components.automation
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Allows to setup simple automation rules via the config file.
|
|
"""
|
|
import logging
|
|
|
|
from homeassistant.bootstrap import prepare_setup_platform
|
|
from homeassistant.helpers import config_per_platform
|
|
from homeassistant.util import split_entity_id
|
|
from homeassistant.const import ATTR_ENTITY_ID, CONF_PLATFORM
|
|
from homeassistant.components import logbook
|
|
|
|
DOMAIN = "automation"
|
|
|
|
DEPENDENCIES = ["group"]
|
|
|
|
CONF_ALIAS = "alias"
|
|
CONF_SERVICE = "execute_service"
|
|
CONF_SERVICE_ENTITY_ID = "service_entity_id"
|
|
CONF_SERVICE_DATA = "service_data"
|
|
CONF_IF = "if"
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
def setup(hass, config):
|
|
""" Sets up automation. """
|
|
success = False
|
|
|
|
for p_type, p_config in config_per_platform(config, DOMAIN, _LOGGER):
|
|
platform = prepare_setup_platform(hass, config, DOMAIN, p_type)
|
|
|
|
if platform is None:
|
|
_LOGGER.error("Unknown automation platform specified: %s", p_type)
|
|
continue
|
|
|
|
action = _get_action(hass, p_config)
|
|
|
|
if action is None:
|
|
return
|
|
|
|
if CONF_IF in p_config:
|
|
action = _process_if(hass, config, p_config[CONF_IF], action)
|
|
|
|
if platform.trigger(hass, p_config, action):
|
|
_LOGGER.info(
|
|
"Initialized %s rule %s", p_type, p_config.get(CONF_ALIAS, ""))
|
|
success = True
|
|
else:
|
|
_LOGGER.error(
|
|
"Error setting up rule %s", p_config.get(CONF_ALIAS, ""))
|
|
|
|
return success
|
|
|
|
|
|
def _get_action(hass, config):
|
|
""" Return an action based on a config. """
|
|
|
|
name = config.get(CONF_ALIAS, 'Unnamed automation')
|
|
|
|
if CONF_SERVICE not in config:
|
|
_LOGGER.error('Error setting up %s, no action specified.',
|
|
name)
|
|
return
|
|
|
|
def action():
|
|
""" Action to be executed. """
|
|
_LOGGER.info('Executing %s', name)
|
|
logbook.log_entry(hass, name, 'has been triggered', DOMAIN)
|
|
|
|
domain, service = split_entity_id(config[CONF_SERVICE])
|
|
|
|
service_data = config.get(CONF_SERVICE_DATA, {})
|
|
|
|
if not isinstance(service_data, dict):
|
|
_LOGGER.error("%s should be a dictionary", CONF_SERVICE_DATA)
|
|
service_data = {}
|
|
|
|
if CONF_SERVICE_ENTITY_ID in config:
|
|
try:
|
|
service_data[ATTR_ENTITY_ID] = \
|
|
config[CONF_SERVICE_ENTITY_ID].split(",")
|
|
except AttributeError:
|
|
service_data[ATTR_ENTITY_ID] = \
|
|
config[CONF_SERVICE_ENTITY_ID]
|
|
|
|
hass.services.call(domain, service, service_data)
|
|
|
|
return action
|
|
|
|
|
|
def _process_if(hass, config, if_configs, action):
|
|
""" Processes if checks. """
|
|
|
|
if isinstance(if_configs, dict):
|
|
if_configs = [if_configs]
|
|
|
|
for if_config in if_configs:
|
|
p_type = if_config.get(CONF_PLATFORM)
|
|
if p_type is None:
|
|
_LOGGER.error("No platform defined found for if-statement %s",
|
|
if_config)
|
|
continue
|
|
|
|
platform = prepare_setup_platform(hass, config, DOMAIN, p_type)
|
|
|
|
if platform is None or not hasattr(platform, 'if_action'):
|
|
_LOGGER.error("Unsupported if-statement platform specified: %s",
|
|
p_type)
|
|
continue
|
|
|
|
action = platform.if_action(hass, if_config, action)
|
|
|
|
return action
|