From 290952fd9cc4a34b8726beb06e758b22bc50cb13 Mon Sep 17 00:00:00 2001 From: oarcher Date: Wed, 17 Jul 2024 20:27:25 +0200 Subject: [PATCH] on_disconnect callback --- esphome/components/modem/__init__.py | 15 +++++++++++++++ esphome/components/modem/automation.h | 11 +++++++++++ 2 files changed, 26 insertions(+) diff --git a/esphome/components/modem/__init__.py b/esphome/components/modem/__init__.py index 2f273c5f4f..70b66a6f11 100644 --- a/esphome/components/modem/__init__.py +++ b/esphome/components/modem/__init__.py @@ -8,6 +8,7 @@ from esphome.const import ( CONF_MODEL, CONF_TRIGGER_ID, CONF_ON_CONNECT, + CONF_ON_DISCONNECT, ) import esphome.codegen as cg import esphome.config_validation as cv @@ -36,6 +37,9 @@ ModemOnNotRespondingTrigger = modem_ns.class_( ModemOnConnectTrigger = modem_ns.class_( "ModemOnConnectTrigger", automation.Trigger.template() ) +ModemOnDisconnectTrigger = modem_ns.class_( + "ModemOndisconnectTrigger", automation.Trigger.template() +) CONFIG_SCHEMA = cv.All( @@ -62,6 +66,13 @@ CONFIG_SCHEMA = cv.All( cv.Optional(CONF_ON_CONNECT): automation.validate_automation( {cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(ModemOnConnectTrigger)} ), + cv.Optional(CONF_ON_DISCONNECT): automation.validate_automation( + { + cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id( + ModemOnDisconnectTrigger + ) + } + ), } ).extend(cv.COMPONENT_SCHEMA), cv.require_framework_version( @@ -130,4 +141,8 @@ async def to_code(config): trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) await automation.build_automation(trigger, [], conf) + for conf in config.get(CONF_ON_DISCONNECT, []): + trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) + await automation.build_automation(trigger, [], conf) + await cg.register_component(var, config) diff --git a/esphome/components/modem/automation.h b/esphome/components/modem/automation.h index 4a5457f90f..3fa18dd339 100644 --- a/esphome/components/modem/automation.h +++ b/esphome/components/modem/automation.h @@ -31,6 +31,17 @@ class ModemOnConnectTrigger : public Trigger<> { } }; +class ModemOnDisconnectTrigger : public Trigger<> { + public: + explicit ModemOnDisconnectTrigger(ModemComponent *parent) { + parent->add_on_state_callback([this, parent](ModemState state) { + if (!parent->is_failed() && state == ModemState::DISCONNECTED) { + this->trigger(); + } + }); + } +}; + } // namespace modem } // namespace esphome #endif // USE_ESP_IDF