mirror of
https://github.com/esphome/esphome.git
synced 2026-09-28 15:30:21 +00:00
[template] Use register_apply_action for lock.template.publish and valve.template.publish (#19525)
This commit is contained in:
@@ -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_
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user