From 59da9bcb96c221bfdd2bd9b7979ebf764a403772 Mon Sep 17 00:00:00 2001 From: Edward Firmo <94725493+edwardtfn@users.noreply.github.com> Date: Fri, 20 Dec 2024 02:08:49 +0100 Subject: [PATCH] Wait for initialization to complete before update relay status That was crashing that method right after boot. - Solves #28 --- ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml | 1 - ...Ultimate-Easy-ESPHome_core_hw_buttons.yaml | 2 +- ...TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml | 2 +- ...-Ultimate-Easy-ESPHome_core_hw_relays.yaml | 33 ++++++++++++++++--- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml index 566bdd3..0c164c0 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml @@ -129,7 +129,6 @@ select: disabled_by_default: false icon: mdi:dip-switch - sensor: - id: sun_elevation name: Sun Elevation diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml index 30667b2..f8cd34f 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml @@ -135,7 +135,7 @@ script: const uint8_t num_gangs = (sl_tx_model_gang->active_index().has_value()) ? (sl_tx_model_gang->active_index().value() + 1) : 0; if (num_gangs < 1 || num_gangs > 4) { - ESP_LOGE("hw_buttons", "Invalid number of gangs: %" PRIu8, num_gangs); + ESP_LOGE("core_hw_buttons", "Invalid number of gangs: %" PRIu8, num_gangs); return; } bs_button_1->publish_state(false); diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml index e025ac8..3892843 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml @@ -761,7 +761,7 @@ script: const uint8_t num_gangs = (sl_tx_model_gang->active_index().has_value()) ? (sl_tx_model_gang->active_index().value() + 1) : 0; if (num_gangs < 1 || num_gangs > 4) { - ESP_LOGE("hw_leds", "Invalid number of gangs: %" PRIu8, num_gangs); + ESP_LOGE("core_hw_leds", "Invalid number of gangs: %" PRIu8, num_gangs); return; } light_28->set_internal(!is_model_us); diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_relays.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_relays.yaml index 0fe9c83..3b3f01d 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_relays.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_relays.yaml @@ -60,6 +60,12 @@ binary_sensor: !bs_swipe_right->state) sw_relay_4->toggle(); +globals: + - id: boot_initialization_relays + type: bool + restore_value: false + initial_value: 'false' + output: - id: output_relay_1 platform: gpio @@ -95,7 +101,7 @@ script: const uint8_t num_gangs = (sl_tx_model_gang->active_index().has_value()) ? (sl_tx_model_gang->active_index().value() + 1) : 0; if (num_gangs < 1 || num_gangs > 4) { - ESP_LOGE("hw_relays", "Invalid number of gangs: %" PRIu8, num_gangs); + ESP_LOGE("core_hw_relays", "Invalid number of gangs: %" PRIu8, num_gangs); return; } sl_relay_1_mode->set_internal(num_gangs < 1); @@ -130,13 +136,22 @@ script: light_output_4->set_internal(num_gangs < 4 or relay_mode_index.value() != 1); sw_relay_4->set_internal(num_gangs < 4 or relay_mode_index.value() != 0); } + id(boot_initialization_relays) = true; - id: show_relay_status mode: restart then: + - script.wait: boot_initialize_relays + - wait_until: + condition: + - lambda: return sl_tx_model_format->active_index().has_value(); + - lambda: return id(boot_initialization_relays); - lambda: |- auto model_format = sl_tx_model_format->active_index(); - if (!model_format.has_value()) return; // Early return if no model format + if (!model_format.has_value()) { + ESP_LOGE("core_hw_relays", "Model (Format) not defined"); + return; + } std::vector relay_modes; const bool is_eu_model = model_format.value() == 0; @@ -153,8 +168,16 @@ script: // Get switch states const std::vector switches = {sw_relay_1, sw_relay_2, sw_relay_3, sw_relay_4}; + // Check if light vectors are initialized + if (id(gb_lights_1).empty() || id(gb_lights_2).empty()) { + ESP_LOGE("core_hw_relays", "Light vector not initialized"); + return; + } + // Update lights based on relay states - for (size_t i = 0; i < relay_modes.size(); ++i) { + for (size_t i = 0; i < relay_modes.size() && i < id(gb_lights_1).size(); ++i) { + if (!relay_modes[i] || !switches[i]) continue; + auto light_index = relay_modes[i]->active_index(); if (!light_index.has_value()) continue; @@ -162,7 +185,7 @@ script: const bool switch_state = switches[i]->state; // Update first light group (bottom/left) - if (light_idx == 1 || light_idx == 3) { + if ((light_idx == 1 || light_idx == 3) && i < id(gb_lights_1).size() && id(gb_lights_1)[i]) { if (switch_state) id(gb_lights_1)[i]->turn_on(); else @@ -170,7 +193,7 @@ script: } // Update second light group (top/right) - if (light_idx == 2 || light_idx == 3) { + if ((light_idx == 2 || light_idx == 3) && i < id(gb_lights_2).size() && id(gb_lights_2)[i]) { if (switch_state) id(gb_lights_2)[i]->turn_on(); else