From 60a3248c6ba71f2f7bb6d69b7b51bb0eb8629f4a Mon Sep 17 00:00:00 2001 From: Edward Firmo <94725493+edwardtfn@users.noreply.github.com> Date: Mon, 23 Dec 2024 20:30:32 +0100 Subject: [PATCH] Adds "Relay n (API failsafe only)" to button's actions Solves #23 --- ...Ultimate-Easy-ESPHome_core_hw_buttons.yaml | 8 ++ ...-Ultimate-Easy-ESPHome_core_hw_relays.yaml | 73 +++++++++---------- 2 files changed, 44 insertions(+), 37 deletions(-) diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml index 3029db4..b7be303 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml @@ -19,6 +19,10 @@ substitutions: BUTTON_2_ACTION_TEXT: "Relay 2 (toggle)" BUTTON_3_ACTION_TEXT: "Relay 3 (toggle)" BUTTON_4_ACTION_TEXT: "Relay 4 (toggle)" + BUTTON_1_ACTION_FAILSAFE_TEXT: "Relay 1 (API failsafe only)" + BUTTON_2_ACTION_FAILSAFE_TEXT: "Relay 2 (API failsafe only)" + BUTTON_3_ACTION_FAILSAFE_TEXT: "Relay 3 (API failsafe only)" + BUTTON_4_ACTION_FAILSAFE_TEXT: "Relay 4 (API failsafe only)" BUTTON_CLICK_MIN_LENGTH: '50' # The minimum duration the click should last, in msec BUTTON_CLICK_MAX_LENGTH: '350' # The maximum duration the click should last, in msec @@ -289,6 +293,7 @@ select: options: - "${BUTTON_ACTION_NONE_TEXT}" - "${BUTTON_1_ACTION_TEXT}" + - "${BUTTON_1_ACTION_FAILSAFE_TEXT}" initial_option: "${BUTTON_1_ACTION_TEXT}" optimistic: true restore_value: true @@ -303,6 +308,7 @@ select: options: - "${BUTTON_ACTION_NONE_TEXT}" - "${BUTTON_2_ACTION_TEXT}" + - "${BUTTON_2_ACTION_FAILSAFE_TEXT}" initial_option: "${BUTTON_2_ACTION_TEXT}" <<: *button_select_action_base @@ -312,6 +318,7 @@ select: options: - "${BUTTON_ACTION_NONE_TEXT}" - "${BUTTON_3_ACTION_TEXT}" + - "${BUTTON_3_ACTION_FAILSAFE_TEXT}" initial_option: "${BUTTON_3_ACTION_TEXT}" <<: *button_select_action_base @@ -321,6 +328,7 @@ select: options: - "${BUTTON_ACTION_NONE_TEXT}" - "${BUTTON_4_ACTION_TEXT}" + - "${BUTTON_4_ACTION_FAILSAFE_TEXT}" initial_option: "${BUTTON_4_ACTION_TEXT}" <<: *button_select_action_base ... diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_relays.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_relays.yaml index d9a163e..5735035 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_relays.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_relays.yaml @@ -191,57 +191,56 @@ script: } // Toggle relay if corresponding button action is enabled - ESP_LOGVV("core_hw_relays", "Toggle relays: (${BUTTON_ACTION_NONE_TEXT})"); - ESP_LOGVV("core_hw_relays", " Relay 1: %s (%s)", - YESNO(sl_button_1_action->state != "${BUTTON_ACTION_NONE_TEXT}"), - sl_button_1_action->state.c_str()); - ESP_LOGVV("core_hw_relays", " Relay 2: %s (%s)", - YESNO(sl_button_2_action->state != "${BUTTON_ACTION_NONE_TEXT}"), - sl_button_2_action->state.c_str()); - ESP_LOGVV("core_hw_relays", " Relay 3: %s (%s)", - YESNO(sl_button_3_action->state != "${BUTTON_ACTION_NONE_TEXT}"), - sl_button_3_action->state.c_str()); - ESP_LOGVV("core_hw_relays", " Relay 4: %s (%s)", - YESNO(sl_button_4_action->state != "${BUTTON_ACTION_NONE_TEXT}"), - sl_button_4_action->state.c_str()); + const bool api_disconnected = not global_api_server->is_connected(); + std::string select_state; + bool toggle_relay = false; + if (api_disconnected) { + ESP_LOGW("core_hw_relays", "Toggle relays:"); + ESP_LOGW("core_hw_relays", " API state: DISCONNECTED"); + ESP_LOGW("core_hw_relays", " Button: %" PRIu8, button); + } else { + ESP_LOGVV("core_hw_relays", "Toggle relays:"); + ESP_LOGVV("core_hw_relays", " API state: Connected"); + ESP_LOGVV("core_hw_relays", " Button: %" PRIu8, button); + } switch (button) { case ${BUTTON_1_ID}: - if (sl_button_1_action->state != "${BUTTON_ACTION_NONE_TEXT}") { - ESP_LOGV("core_hw_relays", "Toggle relay 1: (%s)", sl_button_1_action->state.c_str()); + select_state = sl_button_1_action->state; + toggle_relay = (select_state == "${BUTTON_1_ACTION_TEXT}" or + (api_disconnected and select_state == "${BUTTON_1_ACTION_FAILSAFE_TEXT}")); + if (toggle_relay) sw_relay_1->toggle(); - } else { - ESP_LOGV("core_hw_relays", "Ignoring toggle for relay 1: action is '%s'", - sl_button_1_action->state.c_str()); - } break; case ${BUTTON_2_ID}: - if (sl_button_2_action->state != "${BUTTON_ACTION_NONE_TEXT}") { - ESP_LOGV("core_hw_relays", "Toggle relay 2: (%s)", sl_button_2_action->state.c_str()); + select_state = sl_button_2_action->state; + toggle_relay = (select_state == "${BUTTON_2_ACTION_TEXT}" or + (api_disconnected and select_state == "${BUTTON_2_ACTION_FAILSAFE_TEXT}")); + if (toggle_relay) sw_relay_2->toggle(); - } else { - ESP_LOGV("core_hw_relays", "Ignoring toggle for relay 2: action is '%s'", - sl_button_2_action->state.c_str()); - } break; case ${BUTTON_3_ID}: - if (sl_button_3_action->state != "${BUTTON_ACTION_NONE_TEXT}") { - ESP_LOGV("core_hw_relays", "Toggle relay 3: (%s)", sl_button_3_action->state.c_str()); + select_state = sl_button_3_action->state; + toggle_relay = (select_state == "${BUTTON_3_ACTION_TEXT}" or + (api_disconnected and select_state == "${BUTTON_3_ACTION_FAILSAFE_TEXT}")); + if (toggle_relay) sw_relay_3->toggle(); - } else { - ESP_LOGV("core_hw_relays", "Ignoring toggle for relay 3: action is '%s'", - sl_button_3_action->state.c_str()); - } break; case ${BUTTON_4_ID}: - if (sl_button_4_action->state != "${BUTTON_ACTION_NONE_TEXT}") { - ESP_LOGV("core_hw_relays", "Toggle relay 4: (%s)", sl_button_4_action->state.c_str()); + select_state = sl_button_4_action->state; + toggle_relay = (select_state == "${BUTTON_4_ACTION_TEXT}" or + (api_disconnected and select_state == "${BUTTON_4_ACTION_FAILSAFE_TEXT}")); + if (toggle_relay) sw_relay_4->toggle(); - } else { - ESP_LOGV("core_hw_relays", "Ignoring toggle for relay 4: action is '%s'", - sl_button_4_action->state.c_str()); - } break; } + if (toggle_relay) { + ESP_LOGI("core_hw_relays", "Toggle relay %" PRIu8 ": (%s)", button, select_state.c_str()); + } else if (not select_state.empty()) { + ESP_LOGV("core_hw_relays", "Ignoring toggle for relay %" PRIu8 ": action is '%s'", + button, select_state.c_str()); + } else { + ESP_LOGE("core_hw_relays", "No button action selected for button %" PRIu8, button); + } - id: show_relay_status mode: restart