mirror of
https://github.com/esphome/esphome.git
synced 2024-11-21 22:48:10 +01:00
[automation] Implement all and any condition shortcuts (#7565)
This commit is contained in:
parent
b0a25872da
commit
de943908bd
2 changed files with 31 additions and 2 deletions
|
@ -1,6 +1,8 @@
|
||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.const import (
|
from esphome.const import (
|
||||||
|
CONF_ALL,
|
||||||
|
CONF_ANY,
|
||||||
CONF_AUTOMATION_ID,
|
CONF_AUTOMATION_ID,
|
||||||
CONF_CONDITION,
|
CONF_CONDITION,
|
||||||
CONF_COUNT,
|
CONF_COUNT,
|
||||||
|
@ -73,6 +75,13 @@ def validate_potentially_and_condition(value):
|
||||||
return validate_condition(value)
|
return validate_condition(value)
|
||||||
|
|
||||||
|
|
||||||
|
def validate_potentially_or_condition(value):
|
||||||
|
if isinstance(value, list):
|
||||||
|
with cv.remove_prepend_path(["or"]):
|
||||||
|
return validate_condition({"or": value})
|
||||||
|
return validate_condition(value)
|
||||||
|
|
||||||
|
|
||||||
DelayAction = cg.esphome_ns.class_("DelayAction", Action, cg.Component)
|
DelayAction = cg.esphome_ns.class_("DelayAction", Action, cg.Component)
|
||||||
LambdaAction = cg.esphome_ns.class_("LambdaAction", Action)
|
LambdaAction = cg.esphome_ns.class_("LambdaAction", Action)
|
||||||
IfAction = cg.esphome_ns.class_("IfAction", Action)
|
IfAction = cg.esphome_ns.class_("IfAction", Action)
|
||||||
|
@ -166,6 +175,18 @@ async def or_condition_to_code(config, condition_id, template_arg, args):
|
||||||
return cg.new_Pvariable(condition_id, template_arg, conditions)
|
return cg.new_Pvariable(condition_id, template_arg, conditions)
|
||||||
|
|
||||||
|
|
||||||
|
@register_condition("all", AndCondition, validate_condition_list)
|
||||||
|
async def all_condition_to_code(config, condition_id, template_arg, args):
|
||||||
|
conditions = await build_condition_list(config, template_arg, args)
|
||||||
|
return cg.new_Pvariable(condition_id, template_arg, conditions)
|
||||||
|
|
||||||
|
|
||||||
|
@register_condition("any", OrCondition, validate_condition_list)
|
||||||
|
async def any_condition_to_code(config, condition_id, template_arg, args):
|
||||||
|
conditions = await build_condition_list(config, template_arg, args)
|
||||||
|
return cg.new_Pvariable(condition_id, template_arg, conditions)
|
||||||
|
|
||||||
|
|
||||||
@register_condition("not", NotCondition, validate_potentially_and_condition)
|
@register_condition("not", NotCondition, validate_potentially_and_condition)
|
||||||
async def not_condition_to_code(config, condition_id, template_arg, args):
|
async def not_condition_to_code(config, condition_id, template_arg, args):
|
||||||
condition = await build_condition(config, template_arg, args)
|
condition = await build_condition(config, template_arg, args)
|
||||||
|
@ -223,15 +244,21 @@ async def delay_action_to_code(config, action_id, template_arg, args):
|
||||||
IfAction,
|
IfAction,
|
||||||
cv.All(
|
cv.All(
|
||||||
{
|
{
|
||||||
cv.Required(CONF_CONDITION): validate_potentially_and_condition,
|
cv.Exclusive(
|
||||||
|
CONF_CONDITION, CONF_CONDITION
|
||||||
|
): validate_potentially_and_condition,
|
||||||
|
cv.Exclusive(CONF_ANY, CONF_CONDITION): validate_potentially_or_condition,
|
||||||
|
cv.Exclusive(CONF_ALL, CONF_CONDITION): validate_potentially_and_condition,
|
||||||
cv.Optional(CONF_THEN): validate_action_list,
|
cv.Optional(CONF_THEN): validate_action_list,
|
||||||
cv.Optional(CONF_ELSE): validate_action_list,
|
cv.Optional(CONF_ELSE): validate_action_list,
|
||||||
},
|
},
|
||||||
cv.has_at_least_one_key(CONF_THEN, CONF_ELSE),
|
cv.has_at_least_one_key(CONF_THEN, CONF_ELSE),
|
||||||
|
cv.has_at_least_one_key(CONF_CONDITION, CONF_ANY, CONF_ALL),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
async def if_action_to_code(config, action_id, template_arg, args):
|
async def if_action_to_code(config, action_id, template_arg, args):
|
||||||
conditions = await build_condition(config[CONF_CONDITION], template_arg, args)
|
cond_conf = next(el for el in config if el in (CONF_ANY, CONF_ALL, CONF_CONDITION))
|
||||||
|
conditions = await build_condition(config[cond_conf], template_arg, args)
|
||||||
var = cg.new_Pvariable(action_id, template_arg, conditions)
|
var = cg.new_Pvariable(action_id, template_arg, conditions)
|
||||||
if CONF_THEN in config:
|
if CONF_THEN in config:
|
||||||
actions = await build_action_list(config[CONF_THEN], template_arg, args)
|
actions = await build_action_list(config[CONF_THEN], template_arg, args)
|
||||||
|
|
|
@ -49,6 +49,7 @@ CONF_ADDRESS = "address"
|
||||||
CONF_ADDRESSABLE_LIGHT_ID = "addressable_light_id"
|
CONF_ADDRESSABLE_LIGHT_ID = "addressable_light_id"
|
||||||
CONF_ADVANCED = "advanced"
|
CONF_ADVANCED = "advanced"
|
||||||
CONF_AFTER = "after"
|
CONF_AFTER = "after"
|
||||||
|
CONF_ALL = "all"
|
||||||
CONF_ALLOW_OTHER_USES = "allow_other_uses"
|
CONF_ALLOW_OTHER_USES = "allow_other_uses"
|
||||||
CONF_ALPHA = "alpha"
|
CONF_ALPHA = "alpha"
|
||||||
CONF_ALTITUDE = "altitude"
|
CONF_ALTITUDE = "altitude"
|
||||||
|
@ -57,6 +58,7 @@ CONF_AMMONIA = "ammonia"
|
||||||
CONF_ANALOG = "analog"
|
CONF_ANALOG = "analog"
|
||||||
CONF_AND = "and"
|
CONF_AND = "and"
|
||||||
CONF_ANGLE = "angle"
|
CONF_ANGLE = "angle"
|
||||||
|
CONF_ANY = "any"
|
||||||
CONF_AP = "ap"
|
CONF_AP = "ap"
|
||||||
CONF_APPARENT_POWER = "apparent_power"
|
CONF_APPARENT_POWER = "apparent_power"
|
||||||
CONF_ARDUINO_VERSION = "arduino_version"
|
CONF_ARDUINO_VERSION = "arduino_version"
|
||||||
|
|
Loading…
Reference in a new issue