From 41d637affe5c14791a780b71a08cb664067e86fd Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Sun, 17 Feb 2019 19:27:33 +0100 Subject: [PATCH] Add wait_until action (#440) --- esphome/automation.py | 26 +++++++++++++++++++++++++- esphome/const.py | 1 + tests/test1.yaml | 2 ++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/esphome/automation.py b/esphome/automation.py index c5ad537b99..7e880d1ea7 100644 --- a/esphome/automation.py +++ b/esphome/automation.py @@ -5,7 +5,7 @@ import voluptuous as vol import esphome.config_validation as cv from esphome.const import CONF_ABOVE, CONF_ACTION_ID, CONF_AND, CONF_AUTOMATION_ID, \ CONF_BELOW, CONF_CONDITION, CONF_CONDITION_ID, CONF_DELAY, CONF_ELSE, CONF_ID, CONF_IF, \ - CONF_LAMBDA, CONF_OR, CONF_RANGE, CONF_THEN, CONF_TRIGGER_ID, CONF_WHILE + CONF_LAMBDA, CONF_OR, CONF_RANGE, CONF_THEN, CONF_TRIGGER_ID, CONF_WHILE, CONF_WAIT_UNTIL from esphome.core import CORE from esphome.cpp_generator import Pvariable, TemplateArguments, add, get_variable, \ process_lambda, templatable @@ -102,6 +102,7 @@ DelayAction = esphome_ns.class_('DelayAction', Action, Component) LambdaAction = esphome_ns.class_('LambdaAction', Action) IfAction = esphome_ns.class_('IfAction', Action) WhileAction = esphome_ns.class_('WhileAction', Action) +WaitUntilAction = esphome_ns.class_('WaitUntilAction', Action, Component) UpdateComponentAction = esphome_ns.class_('UpdateComponentAction', Action) Automation = esphome_ns.class_('Automation') @@ -268,6 +269,29 @@ def while_action_to_code(config, action_id, arg_type, template_arg): yield action +def validate_wait_until(value): + schema = vol.Schema({ + vol.Required(CONF_CONDITION): validate_recursive_condition + }) + if isinstance(value, dict) and CONF_CONDITION in value: + return schema(value) + return validate_wait_until({CONF_CONDITION: value}) + + +WAIT_UNTIL_ACTION_SCHEMA = validate_wait_until + + +@ACTION_REGISTRY.register(CONF_WAIT_UNTIL, WAIT_UNTIL_ACTION_SCHEMA) +def wait_until_action_to_code(config, action_id, arg_type, template_arg): + for conditions in build_conditions(config[CONF_CONDITION], arg_type): + yield None + rhs = WaitUntilAction.new(template_arg, conditions) + type = WaitUntilAction.template(template_arg) + action = Pvariable(action_id, rhs, type=type) + add(App.register_component(action)) + yield action + + LAMBDA_ACTION_SCHEMA = cv.lambda_ diff --git a/esphome/const.py b/esphome/const.py index 99632c2f26..7b79733f20 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -93,6 +93,7 @@ CONF_BELOW = 'below' CONF_ON = 'on' CONF_IF = 'if' CONF_WHILE = 'while' +CONF_WAIT_UNTIL = 'wait_until' CONF_THEN = 'then' CONF_BINARY = 'binary' CONF_WHITE = 'white' diff --git a/tests/test1.yaml b/tests/test1.yaml index cd9526f50d..533f6cc1a8 100644 --- a/tests/test1.yaml +++ b/tests/test1.yaml @@ -194,6 +194,8 @@ sensor: then: - lambda: >- ESP_LOGD("main", "Got value range %f", x); + - wait_until: + binary_sensor.is_on: binary_sensor1 on_raw_value: - lambda: >- ESP_LOGD("main", "Got raw value %f", x);