[template/binary_sensor] Implement condition: option as alternative to lambda. (#7561)

This commit is contained in:
Clyde Stubbs 2024-10-09 12:49:33 +11:00 committed by GitHub
parent fc97a6d1e3
commit 66f500e594
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 26 additions and 6 deletions

View file

@ -1,8 +1,10 @@
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome import automation from esphome import automation
import esphome.codegen as cg
from esphome.components import binary_sensor from esphome.components import binary_sensor
from esphome.const import CONF_ID, CONF_LAMBDA, CONF_STATE import esphome.config_validation as cv
from esphome.const import CONF_CONDITION, CONF_ID, CONF_LAMBDA, CONF_STATE
from esphome.cpp_generator import LambdaExpression
from .. import template_ns from .. import template_ns
TemplateBinarySensor = template_ns.class_( TemplateBinarySensor = template_ns.class_(
@ -13,7 +15,10 @@ CONFIG_SCHEMA = (
binary_sensor.binary_sensor_schema(TemplateBinarySensor) binary_sensor.binary_sensor_schema(TemplateBinarySensor)
.extend( .extend(
{ {
cv.Optional(CONF_LAMBDA): cv.returning_lambda, cv.Exclusive(CONF_LAMBDA, CONF_CONDITION): cv.returning_lambda,
cv.Exclusive(
CONF_CONDITION, CONF_CONDITION
): automation.validate_potentially_and_condition,
} }
) )
.extend(cv.COMPONENT_SCHEMA) .extend(cv.COMPONENT_SCHEMA)
@ -24,9 +29,17 @@ async def to_code(config):
var = await binary_sensor.new_binary_sensor(config) var = await binary_sensor.new_binary_sensor(config)
await cg.register_component(var, config) await cg.register_component(var, config)
if CONF_LAMBDA in config: if lamb := config.get(CONF_LAMBDA):
template_ = await cg.process_lambda( template_ = await cg.process_lambda(
config[CONF_LAMBDA], [], return_type=cg.optional.template(bool) lamb, [], return_type=cg.optional.template(bool)
)
cg.add(var.set_template(template_))
if condition := config.get(CONF_CONDITION):
condition = await automation.build_condition(
condition, cg.TemplateArguments(), []
)
template_ = LambdaExpression(
f"return {condition.check()};", [], return_type=cg.optional.template(bool)
) )
cg.add(var.set_template(template_)) cg.add(var.set_template(template_))

View file

@ -46,6 +46,13 @@ binary_sensor:
// Garage Door is closed. // Garage Door is closed.
return false; return false;
} }
- platform: template
id: other_binary_sensor
name: "Garage Door Closed"
condition:
sensor.in_range:
id: template_sens
below: 30.0
output: output:
- platform: template - platform: template