[template] Use register_apply_action for lock.template.publish and valve.template.publish (#19525)

This commit is contained in:
J. Nick Koston
2026-09-23 17:20:05 -05:00
committed by GitHub
parent 170bb02fa3
commit 0110215e31
5 changed files with 26 additions and 77 deletions
+2 -16
View File
@@ -4,7 +4,6 @@ from esphome.components import lock
import esphome.config_validation as cv
from esphome.const import (
CONF_ASSUMED_STATE,
CONF_ID,
CONF_LAMBDA,
CONF_LOCK_ACTION,
CONF_OPEN_ACTION,
@@ -17,12 +16,6 @@ from .. import template_ns
TemplateLock = template_ns.class_("TemplateLock", lock.Lock, cg.Component)
TemplateLockPublishAction = template_ns.class_(
"TemplateLockPublishAction",
automation.Action,
cg.Parented.template(TemplateLock),
)
def validate(config):
if not config[CONF_OPTIMISTIC] and (
@@ -80,9 +73,8 @@ async def to_code(config):
cg.add(var.set_optimistic(config[CONF_OPTIMISTIC]))
@automation.register_action(
automation.register_apply_action(
"lock.template.publish",
TemplateLockPublishAction,
cv.maybe_simple_value(
{
cv.GenerateID(): cv.use_id(TemplateLock),
@@ -90,11 +82,5 @@ async def to_code(config):
},
key=CONF_STATE,
),
synchronous=True,
automation.ApplyField(CONF_STATE, "publish_state", lock.LockState),
)
async def lock_template_publish_to_code(config, action_id, template_arg, args):
var = cg.new_Pvariable(action_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
template_ = await cg.templatable(config[CONF_STATE], args, lock.LockState)
cg.add(var.set_state(template_))
return var
@@ -1,16 +0,0 @@
#pragma once
#include "template_lock.h"
#include "esphome/core/automation.h"
namespace esphome::template_ {
template<typename... Ts> class TemplateLockPublishAction final : public Action<Ts...>, public Parented<TemplateLock> {
public:
TEMPLATABLE_VALUE(lock::LockState, state)
void play(const Ts &...x) override { this->parent_->publish_state(this->state_.value(x...)); }
};
} // namespace esphome::template_
+9 -23
View File
@@ -7,7 +7,6 @@ from esphome.const import (
CONF_CLOSE_ACTION,
CONF_CURRENT_OPERATION,
CONF_DEVICE_CLASS,
CONF_ID,
CONF_LAMBDA,
CONF_OPEN_ACTION,
CONF_OPTIMISTIC,
@@ -22,10 +21,6 @@ from .. import template_ns
TemplateValve = template_ns.class_("TemplateValve", valve.Valve, cg.Component)
TemplateValvePublishAction = template_ns.class_(
"TemplateValvePublishAction", automation.Action, cg.Parented.template(TemplateValve)
)
TemplateValveRestoreMode = template_ns.enum("TemplateValveRestoreMode")
RESTORE_MODES = {
"NO_RESTORE": TemplateValveRestoreMode.VALVE_NO_RESTORE,
@@ -104,9 +99,10 @@ async def to_code(config):
cg.add(var.set_restore_mode(config[CONF_RESTORE_MODE]))
@automation.register_action(
# CONF_STATE and CONF_POSITION are cv.Exclusive in the schema, so at most
# one is present and both write the position.
automation.register_apply_action(
"valve.template.publish",
TemplateValvePublishAction,
cv.Schema(
{
cv.GenerateID(): cv.use_id(TemplateValve),
@@ -117,20 +113,10 @@ async def to_code(config):
),
}
),
synchronous=True,
automation.ApplyField(CONF_STATE, "position = {}", cg.float_),
automation.ApplyField(CONF_POSITION, "position = {}", cg.float_),
automation.ApplyField(
CONF_CURRENT_OPERATION, "current_operation = {}", valve.ValveOperation
),
automation.ApplyCall("publish_state()"),
)
async def valve_template_publish_to_code(config, action_id, template_arg, args):
var = cg.new_Pvariable(action_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
if state_config := config.get(CONF_STATE):
template_ = await cg.templatable(state_config, args, cg.float_)
cg.add(var.set_position(template_))
if (position_config := config.get(CONF_POSITION)) is not None:
template_ = await cg.templatable(position_config, args, cg.float_)
cg.add(var.set_position(template_))
if current_operation_config := config.get(CONF_CURRENT_OPERATION):
template_ = await cg.templatable(
current_operation_config, args, valve.ValveOperation
)
cg.add(var.set_current_operation(template_))
return var
@@ -1,22 +0,0 @@
#pragma once
#include "template_valve.h"
#include "esphome/core/automation.h"
namespace esphome::template_ {
template<typename... Ts> class TemplateValvePublishAction final : public Action<Ts...>, public Parented<TemplateValve> {
TEMPLATABLE_VALUE(float, position)
TEMPLATABLE_VALUE(valve::ValveOperation, current_operation)
void play(const Ts &...x) override {
if (this->position_.has_value())
this->parent_->position = this->position_.value(x...);
if (this->current_operation_.has_value())
this->parent_->current_operation = this->current_operation_.value(x...);
this->parent_->publish_state();
}
};
} // namespace esphome::template_
@@ -475,6 +475,7 @@ select:
lock:
- platform: template
id: template_lock
name: "Template Lock"
lambda: |-
if (id(template_some_binary_sensor).state) {
@@ -483,8 +484,14 @@ lock:
return LOCK_STATE_UNLOCKED;
lock_action:
- logger.log: lock_action
- lock.template.publish:
id: template_lock
state: LOCKED
unlock_action:
- logger.log: unlock_action
- lock.template.publish:
id: template_lock
state: !lambda "return LOCK_STATE_UNLOCKED;"
open_action:
- logger.log: open_action
@@ -504,6 +511,14 @@ valve:
- valve.template.publish:
id: template_valve
state: CLOSED
- valve.template.publish:
id: template_valve
position: 50%
current_operation: IDLE
- valve.template.publish:
id: template_valve
position: !lambda "return 0.25f;"
current_operation: !lambda "return VALVE_OPERATION_CLOSING;"
stop_action:
- logger.log: stop_action
# Exercise valve.control with various field combinations so the