mirror of
https://github.com/esphome/esphome.git
synced 2026-10-07 03:16:37 +00:00
[alarm_control_panel] Use register_apply_action for arm_away, arm_home, arm_night and disarm (#19521)
This commit is contained in:
@@ -41,10 +41,6 @@ StateAnyForwarder = alarm_control_panel_ns.class_("StateAnyForwarder")
|
|||||||
StateEnterForwarder = alarm_control_panel_ns.class_("StateEnterForwarder")
|
StateEnterForwarder = alarm_control_panel_ns.class_("StateEnterForwarder")
|
||||||
AlarmControlPanelState = alarm_control_panel_ns.enum("AlarmControlPanelState")
|
AlarmControlPanelState = alarm_control_panel_ns.enum("AlarmControlPanelState")
|
||||||
|
|
||||||
ArmAwayAction = alarm_control_panel_ns.class_("ArmAwayAction", automation.Action)
|
|
||||||
ArmHomeAction = alarm_control_panel_ns.class_("ArmHomeAction", automation.Action)
|
|
||||||
ArmNightAction = alarm_control_panel_ns.class_("ArmNightAction", automation.Action)
|
|
||||||
DisarmAction = alarm_control_panel_ns.class_("DisarmAction", automation.Action)
|
|
||||||
PendingAction = alarm_control_panel_ns.class_("PendingAction", automation.Action)
|
PendingAction = alarm_control_panel_ns.class_("PendingAction", automation.Action)
|
||||||
TriggeredAction = alarm_control_panel_ns.class_("TriggeredAction", automation.Action)
|
TriggeredAction = alarm_control_panel_ns.class_("TriggeredAction", automation.Action)
|
||||||
ChimeAction = alarm_control_panel_ns.class_("ChimeAction", automation.Action)
|
ChimeAction = alarm_control_panel_ns.class_("ChimeAction", automation.Action)
|
||||||
@@ -196,64 +192,20 @@ async def new_alarm_control_panel(config, *args):
|
|||||||
return var
|
return var
|
||||||
|
|
||||||
|
|
||||||
@automation.register_action(
|
# Mirrors AlarmControlPanel::arm_with_code_: arm first, set the code only when given.
|
||||||
"alarm_control_panel.arm_away",
|
for _name, _arm in (
|
||||||
ArmAwayAction,
|
("alarm_control_panel.arm_away", "arm_away()"),
|
||||||
ALARM_CONTROL_PANEL_ACTION_SCHEMA,
|
("alarm_control_panel.arm_home", "arm_home()"),
|
||||||
synchronous=True,
|
("alarm_control_panel.arm_night", "arm_night()"),
|
||||||
)
|
("alarm_control_panel.disarm", "disarm()"),
|
||||||
async def alarm_action_arm_away_to_code(config, action_id, template_arg, args):
|
):
|
||||||
paren = await cg.get_variable(config[CONF_ID])
|
automation.register_apply_action(
|
||||||
var = cg.new_Pvariable(action_id, template_arg, paren)
|
_name,
|
||||||
if code_config := config.get(CONF_CODE):
|
ALARM_CONTROL_PANEL_ACTION_SCHEMA,
|
||||||
templatable_ = await cg.templatable(code_config, args, cg.std_string)
|
automation.ApplyCall(_arm),
|
||||||
cg.add(var.set_code(templatable_))
|
automation.ApplyField(CONF_CODE, "set_code", cg.std_string),
|
||||||
return var
|
call="make_call",
|
||||||
|
)
|
||||||
|
|
||||||
@automation.register_action(
|
|
||||||
"alarm_control_panel.arm_home",
|
|
||||||
ArmHomeAction,
|
|
||||||
ALARM_CONTROL_PANEL_ACTION_SCHEMA,
|
|
||||||
synchronous=True,
|
|
||||||
)
|
|
||||||
async def alarm_action_arm_home_to_code(config, action_id, template_arg, args):
|
|
||||||
paren = await cg.get_variable(config[CONF_ID])
|
|
||||||
var = cg.new_Pvariable(action_id, template_arg, paren)
|
|
||||||
if code_config := config.get(CONF_CODE):
|
|
||||||
templatable_ = await cg.templatable(code_config, args, cg.std_string)
|
|
||||||
cg.add(var.set_code(templatable_))
|
|
||||||
return var
|
|
||||||
|
|
||||||
|
|
||||||
@automation.register_action(
|
|
||||||
"alarm_control_panel.arm_night",
|
|
||||||
ArmNightAction,
|
|
||||||
ALARM_CONTROL_PANEL_ACTION_SCHEMA,
|
|
||||||
synchronous=True,
|
|
||||||
)
|
|
||||||
async def alarm_action_arm_night_to_code(config, action_id, template_arg, args):
|
|
||||||
paren = await cg.get_variable(config[CONF_ID])
|
|
||||||
var = cg.new_Pvariable(action_id, template_arg, paren)
|
|
||||||
if CONF_CODE in config:
|
|
||||||
templatable_ = await cg.templatable(config[CONF_CODE], args, cg.std_string)
|
|
||||||
cg.add(var.set_code(templatable_))
|
|
||||||
return var
|
|
||||||
|
|
||||||
|
|
||||||
@automation.register_action(
|
|
||||||
"alarm_control_panel.disarm",
|
|
||||||
DisarmAction,
|
|
||||||
ALARM_CONTROL_PANEL_ACTION_SCHEMA,
|
|
||||||
synchronous=True,
|
|
||||||
)
|
|
||||||
async def alarm_action_disarm_to_code(config, action_id, template_arg, args):
|
|
||||||
paren = await cg.get_variable(config[CONF_ID])
|
|
||||||
var = cg.new_Pvariable(action_id, template_arg, paren)
|
|
||||||
if code_config := config.get(CONF_CODE):
|
|
||||||
templatable_ = await cg.templatable(code_config, args, cg.std_string)
|
|
||||||
cg.add(var.set_code(templatable_))
|
|
||||||
return var
|
|
||||||
|
|
||||||
|
|
||||||
@automation.register_action(
|
@automation.register_action(
|
||||||
|
|||||||
@@ -27,54 +27,6 @@ static_assert(std::is_trivially_copyable_v<StateAnyForwarder>);
|
|||||||
static_assert(sizeof(StateEnterForwarder<ACP_STATE_TRIGGERED>) <= sizeof(void *));
|
static_assert(sizeof(StateEnterForwarder<ACP_STATE_TRIGGERED>) <= sizeof(void *));
|
||||||
static_assert(std::is_trivially_copyable_v<StateEnterForwarder<ACP_STATE_TRIGGERED>>);
|
static_assert(std::is_trivially_copyable_v<StateEnterForwarder<ACP_STATE_TRIGGERED>>);
|
||||||
|
|
||||||
template<typename... Ts> class ArmAwayAction final : public Action<Ts...> {
|
|
||||||
public:
|
|
||||||
explicit ArmAwayAction(AlarmControlPanel *alarm_control_panel) : alarm_control_panel_(alarm_control_panel) {}
|
|
||||||
|
|
||||||
TEMPLATABLE_VALUE(std::string, code)
|
|
||||||
|
|
||||||
void play(const Ts &...x) override { this->alarm_control_panel_->arm_away(this->code_.optional_value(x...)); }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
AlarmControlPanel *alarm_control_panel_;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename... Ts> class ArmHomeAction final : public Action<Ts...> {
|
|
||||||
public:
|
|
||||||
explicit ArmHomeAction(AlarmControlPanel *alarm_control_panel) : alarm_control_panel_(alarm_control_panel) {}
|
|
||||||
|
|
||||||
TEMPLATABLE_VALUE(std::string, code)
|
|
||||||
|
|
||||||
void play(const Ts &...x) override { this->alarm_control_panel_->arm_home(this->code_.optional_value(x...)); }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
AlarmControlPanel *alarm_control_panel_;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename... Ts> class ArmNightAction final : public Action<Ts...> {
|
|
||||||
public:
|
|
||||||
explicit ArmNightAction(AlarmControlPanel *alarm_control_panel) : alarm_control_panel_(alarm_control_panel) {}
|
|
||||||
|
|
||||||
TEMPLATABLE_VALUE(std::string, code)
|
|
||||||
|
|
||||||
void play(const Ts &...x) override { this->alarm_control_panel_->arm_night(this->code_.optional_value(x...)); }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
AlarmControlPanel *alarm_control_panel_;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename... Ts> class DisarmAction final : public Action<Ts...> {
|
|
||||||
public:
|
|
||||||
explicit DisarmAction(AlarmControlPanel *alarm_control_panel) : alarm_control_panel_(alarm_control_panel) {}
|
|
||||||
|
|
||||||
TEMPLATABLE_VALUE(std::string, code)
|
|
||||||
|
|
||||||
void play(const Ts &...x) override { this->alarm_control_panel_->disarm(this->code_.optional_value(x...)); }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
AlarmControlPanel *alarm_control_panel_;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename... Ts> class PendingAction final : public Action<Ts...> {
|
template<typename... Ts> class PendingAction final : public Action<Ts...> {
|
||||||
public:
|
public:
|
||||||
explicit PendingAction(AlarmControlPanel *alarm_control_panel) : alarm_control_panel_(alarm_control_panel) {}
|
explicit PendingAction(AlarmControlPanel *alarm_control_panel) : alarm_control_panel_(alarm_control_panel) {}
|
||||||
|
|||||||
@@ -67,3 +67,28 @@ alarm_control_panel:
|
|||||||
on_cleared:
|
on_cleared:
|
||||||
then:
|
then:
|
||||||
- logger.log: "### CLEARED ###"
|
- logger.log: "### CLEARED ###"
|
||||||
|
|
||||||
|
button:
|
||||||
|
# Exercise the arm/disarm actions with a constant code, a lambda code and no code.
|
||||||
|
- platform: template
|
||||||
|
name: Alarm Panel Actions
|
||||||
|
on_press:
|
||||||
|
- alarm_control_panel.arm_away:
|
||||||
|
id: alarmcontrolpanel1
|
||||||
|
code: "1234"
|
||||||
|
- alarm_control_panel.arm_home:
|
||||||
|
id: alarmcontrolpanel1
|
||||||
|
code: !lambda |-
|
||||||
|
std::string code = "56";
|
||||||
|
code += "78";
|
||||||
|
return code;
|
||||||
|
- alarm_control_panel.arm_night:
|
||||||
|
id: alarmcontrolpanel1
|
||||||
|
code: "0000"
|
||||||
|
- alarm_control_panel.disarm:
|
||||||
|
id: alarmcontrolpanel1
|
||||||
|
code: "1234"
|
||||||
|
- alarm_control_panel.arm_away: alarmcontrolpanel2
|
||||||
|
- alarm_control_panel.arm_home: alarmcontrolpanel2
|
||||||
|
- alarm_control_panel.arm_night: alarmcontrolpanel2
|
||||||
|
- alarm_control_panel.disarm: alarmcontrolpanel2
|
||||||
|
|||||||
Reference in New Issue
Block a user