diff --git a/base.yaml b/base.yaml index c279b9f..97495f6 100644 --- a/base.yaml +++ b/base.yaml @@ -21,7 +21,7 @@ ratgdo: service: persistent_notification.create data: title: "${friendly_name} sync failed" - message: "Failed to communicate with garage opener on startup; Check the ${friendly_name} Rolling code counter number entity history and set the entity to one number larger than the largest value in history. [ESPHome devices](/config/devices/dashboard?domain=esphome)" + message: "Failed to communicate with garage opener on startup." notification_id: "esphome_ratgdo_${id_prefix}_sync_failed" api: services: diff --git a/base_secplusv1.yaml b/base_secplusv1.yaml index 1e4668b..d50f227 100644 --- a/base_secplusv1.yaml +++ b/base_secplusv1.yaml @@ -22,7 +22,7 @@ ratgdo: service: persistent_notification.create data: title: "${friendly_name} sync failed" - message: "Failed to communicate with garage opener on startup; Check the ${friendly_name} Rolling code counter number entity history and set the entity to one number larger than the largest value in history. [ESPHome devices](/config/devices/dashboard?domain=esphome)" + message: "Failed to communicate with garage opener on startup." notification_id: "esphome_ratgdo_${id_prefix}_sync_failed" sensor: diff --git a/components/ratgdo/secplus1.cpp b/components/ratgdo/secplus1.cpp index 9905fc0..3bd6153 100644 --- a/components/ratgdo/secplus1.cpp +++ b/components/ratgdo/secplus1.cpp @@ -45,6 +45,13 @@ namespace secplus1 { wall_panel_emulation_start_ = millis(); this->scheduler_->cancel_timeout(this->ratgdo_, "wall_panel_emulation"); this->wall_panel_emulation(); + + this->scheduler_->set_timeout(this->ratgdo_, "", 40000, [=] { + if (this->door_state == DoorState::UNKNOWN) { + ESP_LOGW(TAG, "Triggering sync failed actions."); + this->ratgdo_->sync_failed = true; + } + }); } void Secplus1::wall_panel_emulation(size_t index) @@ -79,11 +86,12 @@ namespace secplus1 { void Secplus1::light_action(LightAction action) { + ESP_LOG1(TAG, "Light action: %s", LightAction_to_string(action)); if (action == LightAction::UNKNOWN) { return; } if (this->light_state == LightState::UNKNOWN) { - ESP_LOG1(TAG, "Unknown current light state, ignoring command: %s", LightAction_to_string(action)); + ESP_LOGW(TAG, "Unknown current light state, ignoring command: %s", LightAction_to_string(action)); // TODO: request state? } if (action == LightAction::TOGGLE || @@ -95,11 +103,12 @@ namespace secplus1 { void Secplus1::lock_action(LockAction action) { + ESP_LOG1(TAG, "Lock action: %s", LockAction_to_string(action)); if (action == LockAction::UNKNOWN) { return; } if (this->lock_state == LockState::UNKNOWN) { - ESP_LOG1(TAG, "Unknown current lock state, ignoring command: %s", LockAction_to_string(action)); + ESP_LOGW(TAG, "Unknown current lock state, ignoring command: %s", LockAction_to_string(action)); // TODO: request state? } if (action == LockAction::TOGGLE || @@ -111,11 +120,14 @@ namespace secplus1 { void Secplus1::door_action(DoorAction action) { + ESP_LOG1(TAG, "Door action: %s, door state: %s", DoorAction_to_string(action), DoorState_to_string(this->door_state)); if (this->door_state == DoorState::UNKNOWN) { - ESP_LOG1(TAG, "Unknown current door state, ignoring command: %s", DoorAction_to_string(action)); + ESP_LOGW(TAG, "Unknown current door state, ignoring command: %s", DoorAction_to_string(action)); // TODO: request state? } + const uint32_t double_toggle_delay = 1000; + if (action == DoorAction::UNKNOWN) { return; } else if (action == DoorAction::TOGGLE) { @@ -123,26 +135,32 @@ namespace secplus1 { } else if (action == DoorAction::OPEN) { if (this->door_state == DoorState::CLOSED || this->door_state == DoorState::CLOSING) { this->transmit_packet(toggle_door); + } else if (this->door_state == DoorState::STOPPED) { + this->transmit_packet(toggle_door); // this starts closing door + // this changes direction of door + this->scheduler_->set_timeout(this->ratgdo_, "", double_toggle_delay, [=] { + this->transmit_packet(toggle_door); + }); } } else if (action == DoorAction::CLOSE) { if (this->door_state == DoorState::OPEN) { this->transmit_packet(toggle_door); - } - if (this->door_state == DoorState::OPENING) { + } else if (this->door_state == DoorState::OPENING) { this->transmit_packet(toggle_door); // this switches to stopped // another toggle needed to close - this->scheduler_->set_timeout(this->ratgdo_, "", 500, [=] { + this->scheduler_->set_timeout(this->ratgdo_, "", double_toggle_delay, [=] { this->transmit_packet(toggle_door); }); - } + } else if (this->door_state == DoorState::STOPPED) { + this->transmit_packet(toggle_door); + } } else if (action == DoorAction::STOP) { if (this->door_state == DoorState::OPENING) { this->transmit_packet(toggle_door); - } - if (this->door_state == DoorState::CLOSING) { + } else if (this->door_state == DoorState::CLOSING) { this->transmit_packet(toggle_door); // this switches to opening // another toggle needed to stop - this->scheduler_->set_timeout(this->ratgdo_, "", 500, [=] { + this->scheduler_->set_timeout(this->ratgdo_, "", double_toggle_delay, [=] { this->transmit_packet(toggle_door); }); } diff --git a/components/ratgdo/secplus2.cpp b/components/ratgdo/secplus2.cpp index d2199c1..d9790bb 100644 --- a/components/ratgdo/secplus2.cpp +++ b/components/ratgdo/secplus2.cpp @@ -106,7 +106,7 @@ namespace secplus2 { } if (r == 0) { // this was last attempt, notify of sync failure - ESP_LOGD(TAG, "Triggering sync failed actions."); + ESP_LOGW(TAG, "Triggering sync failed actions."); this->ratgdo_->sync_failed = true; } } @@ -515,11 +515,6 @@ namespace secplus2 { this->rolling_code_counter_ = counter; } - observable& Secplus2::get_rolling_code_counter() - { - return this->rolling_code_counter_; - } - void Secplus2::set_client_id(uint64_t client_id) { this->client_id_ = client_id & 0xFFFFFFFF; diff --git a/components/ratgdo/secplus2.h b/components/ratgdo/secplus2.h index fe1961f..a068ab3 100644 --- a/components/ratgdo/secplus2.h +++ b/components/ratgdo/secplus2.h @@ -87,7 +87,6 @@ namespace secplus2 { void increment_rolling_code_counter(int delta = 1); void set_rolling_code_counter(uint32_t counter); - observable& get_rolling_code_counter(); void set_client_id(uint64_t client_id); protected: