diff --git a/esphome/components/current_based/current_based_cover.cpp b/esphome/components/current_based/current_based_cover.cpp index 4a52770bcf..3d7a9b8425 100644 --- a/esphome/components/current_based/current_based_cover.cpp +++ b/esphome/components/current_based/current_based_cover.cpp @@ -13,6 +13,7 @@ using namespace esphome::cover; CoverTraits CurrentBasedCover::get_traits() { auto traits = CoverTraits(); traits.set_supports_position(true); + traits.set_supports_toggle(true); traits.set_is_assumed_state(false); return traits; } @@ -20,6 +21,20 @@ void CurrentBasedCover::control(const CoverCall &call) { if (call.get_stop()) { this->direction_idle_(); } + if (call.get_toggle().has_value()) { + if (this->current_operation != COVER_OPERATION_IDLE) { + this->start_direction_(COVER_OPERATION_IDLE); + this->publish_state(); + } else { + if (this->position == COVER_CLOSED || this->last_operation_ == COVER_OPERATION_CLOSING) { + this->target_position_ = COVER_OPEN; + this->start_direction_(COVER_OPERATION_OPENING); + } else { + this->target_position_ = COVER_CLOSED; + this->start_direction_(COVER_OPERATION_CLOSING); + } + } + } if (call.get_position().has_value()) { auto pos = *call.get_position(); if (pos == this->position) { @@ -202,9 +217,11 @@ void CurrentBasedCover::start_direction_(CoverOperation dir) { trig = this->stop_trigger_; break; case COVER_OPERATION_OPENING: + this->last_operation_ = dir; trig = this->open_trigger_; break; case COVER_OPERATION_CLOSING: + this->last_operation_ = dir; trig = this->close_trigger_; break; default: diff --git a/esphome/components/current_based/current_based_cover.h b/esphome/components/current_based/current_based_cover.h index 220b770c05..b172e762b0 100644 --- a/esphome/components/current_based/current_based_cover.h +++ b/esphome/components/current_based/current_based_cover.h @@ -89,6 +89,8 @@ class CurrentBasedCover : public cover::Cover, public Component { uint32_t start_dir_time_{0}; uint32_t last_publish_time_{0}; float target_position_{0}; + + cover::CoverOperation last_operation_{cover::COVER_OPERATION_OPENING}; }; } // namespace current_based diff --git a/tests/test3.yaml b/tests/test3.yaml index 8150f43e02..da704d90a3 100644 --- a/tests/test3.yaml +++ b/tests/test3.yaml @@ -884,6 +884,7 @@ binary_sensor: then: - cover.toggle: time_based_cover - cover.toggle: endstop_cover + - cover.toggle: current_based_cover - platform: hydreon_rgxx hydreon_rgxx_id: hydreon_rg9 too_cold: @@ -1246,6 +1247,7 @@ cover: close_duration: 4.5min - platform: current_based name: Current Based Cover + id: current_based_cover open_sensor: ade7953_current_a open_moving_current_threshold: 0.5 open_obstacle_current_threshold: 0.8