diff --git a/esphome/components/cover/__init__.py b/esphome/components/cover/__init__.py index 3f46777a84..7d1f22d737 100644 --- a/esphome/components/cover/__init__.py +++ b/esphome/components/cover/__init__.py @@ -87,8 +87,11 @@ ToggleAction = cover_ns.class_("ToggleAction", automation.Action) ControlAction = cover_ns.class_("ControlAction", automation.Action) CoverPublishAction = cover_ns.class_("CoverPublishAction", automation.Action) CoverIsCondition = cover_ns.class_("CoverIsCondition", Condition) -CoverPositionTrigger = cover_ns.class_( - "CoverPositionTrigger", automation.Trigger.template() +CoverOpenedTrigger = cover_ns.class_( + "CoverOpenedTrigger", automation.Trigger.template() +) +CoverClosedTrigger = cover_ns.class_( + "CoverClosedTrigger", automation.Trigger.template() ) CoverTrigger = cover_ns.class_("CoverTrigger", automation.Trigger.template()) @@ -131,23 +134,17 @@ _COVER_SCHEMA = ( # Deprecated trigger cv.Optional(CONF_ON_OPEN): automation.validate_automation( { - cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id( - CoverPositionTrigger.template(COVER_OPEN) - ), + cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(CoverOpenedTrigger), } ), cv.Optional(CONF_ON_OPENED): automation.validate_automation( { - cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id( - CoverPositionTrigger.template(COVER_OPEN) - ), + cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(CoverOpenedTrigger), } ), cv.Optional(CONF_ON_CLOSED): automation.validate_automation( { - cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id( - CoverPositionTrigger.template(COVER_CLOSED) - ), + cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(CoverClosedTrigger), } ), **{ diff --git a/esphome/components/cover/automation.h b/esphome/components/cover/automation.h index 840bf2fc4f..76cb8a37b7 100644 --- a/esphome/components/cover/automation.h +++ b/esphome/components/cover/automation.h @@ -90,23 +90,49 @@ template class CoverPublishAction : public Action { Cover *cover_; }; -template class CoverIsCondition : public Condition { +template class CoverIsOpenCondition : public Condition { public: - CoverIsCondition(Cover *cover) : cover_(cover) {} + CoverIsOpenCondition(Cover *cover) : cover_(cover) {} - bool check(const Ts &...x) override { return this->cover_->position == POS; } + bool check(const Ts &...x) override { return this->cover_->position == COVER_OPEN; } protected: Cover *cover_; }; -template class CoverPositionTrigger : public Trigger<> { +template class CoverIsClosedCondition : public Condition { public: - CoverPositionTrigger(Cover *a_cover) { + CoverIsClosedCondition(Cover *cover) : cover_(cover) {} + + bool check(const Ts &...x) override { return this->cover_->position == COVER_CLOSED; } + + protected: + Cover *cover_; +}; + +class CoverOpenedTrigger : public Trigger<> { + public: + CoverOpenedTrigger(Cover *a_cover) { a_cover->add_on_state_callback([this, a_cover]() { if (a_cover->position != this->last_position_) { this->last_position_ = a_cover->position; - if (a_cover->position == POS) + if (a_cover->position == COVER_OPEN) + this->trigger(); + } + }); + } + + protected: + float last_position_{NAN}; +}; + +class CoverClosedTrigger : public Trigger<> { + public: + CoverClosedTrigger(Cover *a_cover) { + a_cover->add_on_state_callback([this, a_cover]() { + if (a_cover->position != this->last_position_) { + this->last_position_ = a_cover->position; + if (a_cover->position == COVER_CLOSED) this->trigger(); } });