diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml index 32c8d4e..f407e5c 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml @@ -56,129 +56,15 @@ esphome: on_boot: - priority: 700 then: - - wait_until: - condition: - - lambda: return sl_tx_model_format->active_index().has_value(); - - lambda: return sl_tx_model_gang->active_index().has_value(); - - lambda: |- - const bool us_model = sl_tx_model_format->active_index().has_value() and - sl_tx_model_format->active_index().value() == 1; - const uint8_t num_gangs = (sl_tx_model_gang->active_index().has_value()) ? - (sl_tx_model_gang->active_index().value() + 1) : 0; - bs_button_1->publish_state(false); - bs_button_1->set_internal(num_gangs < 1); - sl_button_1_action->set_internal(num_gangs < 1); - bs_button_2->publish_state(false); - bs_button_2->set_internal(num_gangs < 2); - sl_button_2_action->set_internal(num_gangs < 2); - bs_button_3->publish_state(false); - bs_button_3->set_internal(num_gangs < 3); - sl_button_3_action->set_internal(num_gangs < 3); - bs_button_4->publish_state(false); - bs_button_4->set_internal(num_gangs < 4); - sl_button_4_action->set_internal(num_gangs < 4); - bs_multi_touch->publish_state(false); - bs_swipe_down->publish_state(false); - bs_swipe_down->set_internal(!us_model); - bs_swipe_left->publish_state(false); - bs_swipe_left->set_internal(us_model); - bs_swipe_right->publish_state(false); - bs_swipe_right->set_internal(us_model); - bs_swipe_up->publish_state(false); - bs_swipe_up->set_internal(!us_model); - light_28->set_internal(!us_model); - light_29->set_internal(!us_model); - light_30->set_internal(!us_model); - light_31->set_internal(!us_model); - light_eu->set_internal(us_model); - light_eu_bottom->set_internal(us_model); - light_eu_left->set_internal(us_model); - light_eu_right->set_internal(us_model); - light_eu_top->set_internal(us_model); - light_us->set_internal(!us_model); - light_us_bottom->set_internal(!us_model); - light_us_left->set_internal(!us_model); - light_us_right->set_internal(!us_model); - light_us_top->set_internal(!us_model); - sl_relay_1_mode->set_internal(num_gangs < 1); - sl_relay_1_light_mode_eu->set_internal(us_model or num_gangs < 1); - sl_relay_1_light_mode_us->set_internal(!us_model or num_gangs < 1); - sl_relay_2_mode->set_internal(num_gangs < 2); - sl_relay_2_light_mode_eu->set_internal(us_model or num_gangs < 2); - sl_relay_2_light_mode_us->set_internal(!us_model or num_gangs < 2); - sl_relay_3_mode->set_internal(num_gangs < 3); - sl_relay_3_light_mode_eu->set_internal(us_model or num_gangs < 3); - sl_relay_3_light_mode_us->set_internal(!us_model or num_gangs < 3); - sl_relay_4_mode->set_internal(num_gangs < 4); - sl_relay_4_light_mode_eu->set_internal(us_model or num_gangs < 4); - sl_relay_4_light_mode_us->set_internal(!us_model or num_gangs < 4); - auto relay_mode_index = sl_relay_1_mode->active_index(); - if (relay_mode_index.has_value()) { - ligth_output_1->set_internal(false or relay_mode_index.value() != 1); - sw_relay_1->set_internal(false or relay_mode_index.value() != 0); - } - relay_mode_index = sl_relay_2_mode->active_index(); - if (relay_mode_index.has_value()) { - ligth_output_2->set_internal(num_gangs < 2 or relay_mode_index.value() != 1); - sw_relay_2->set_internal(num_gangs < 2 or relay_mode_index.value() != 0); - } - relay_mode_index = sl_relay_3_mode->active_index(); - if (relay_mode_index.has_value()) { - ligth_output_3->set_internal(num_gangs < 3 or relay_mode_index.value() != 1); - sw_relay_3->set_internal(num_gangs < 3 or relay_mode_index.value() != 0); - } - relay_mode_index = sl_relay_4_mode->active_index(); - if (relay_mode_index.has_value()) { - ligth_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); - } - switch (num_gangs) { - case 1: // 1 Gang - if (us_model) { - id(gb_lights_1) = { light_us_rl_1_1_left }; - id(gb_lights_2) = { light_us_rl_1_1_right }; - } else { - id(gb_lights_1) = { light_eu_rl_1_1_bottom }; - id(gb_lights_2) = { light_eu_rl_1_1_top }; - } - break; - case 2: // 2 Gang - if (us_model) { - id(gb_lights_1) = { light_us_rl_1_2_left, light_us_rl_2_2_left }; - id(gb_lights_2) = { light_us_rl_1_2_right, light_us_rl_2_2_right }; - } else { - id(gb_lights_1) = { light_eu_rl_1_2_bottom, light_eu_rl_2_2_bottom }; - id(gb_lights_2) = { light_eu_rl_1_2_top, light_eu_rl_2_2_top }; - } - break; - case 3: // 3 Gang - if (us_model) { - id(gb_lights_1) = { light_us_rl_1_3_left, light_us_rl_2_3_left, light_us_rl_3_3_left }; - id(gb_lights_2) = { light_us_rl_1_3_right, light_us_rl_2_3_right, light_us_rl_3_3_right }; - } else { - id(gb_lights_1) = { light_eu_rl_1_3_bottom, light_eu_rl_2_3_bottom, light_eu_rl_3_3_bottom }; - id(gb_lights_2) = { light_eu_rl_1_3_top, light_eu_rl_2_3_top, light_eu_rl_3_3_top }; - } - break; - case 4: // 3 Gang - if (us_model) { - id(gb_lights_1) = { light_us_rl_1_4_left, light_us_rl_2_4_left, light_us_rl_3_4_left, light_us_rl_4_4_left }; - id(gb_lights_2) = { light_us_rl_1_4_right, light_us_rl_2_4_right, light_us_rl_3_4_right, light_us_rl_4_4_right }; - } else { - id(gb_lights_1) = { light_eu_rl_1_4_bottom, light_eu_rl_2_4_bottom, light_eu_rl_3_4_bottom, light_eu_rl_4_4_bottom }; - id(gb_lights_2) = { light_eu_rl_1_4_top, light_eu_rl_2_4_top, light_eu_rl_3_4_top, light_eu_rl_4_4_top }; - } - break; - } + - script.execute: boot_initialize - priority: 600 # This is where most sensors are set up. then: - - lambda: |- - tx_fw_version->publish_state("${version}"); - tx_device_name->publish_state("${name}"); + - script.execute: boot_sequence + - priority: -100 # At this priority, pretty much everything should already be initialized. then: - - lambda: send_event_to_ha->execute("boot", "done"); + - script.execute: boot_done improv_serial: id: serial_improv @@ -191,9 +77,25 @@ ota: psram: script: + - id: boot_done + mode: restart + then: + - lambda: send_event_to_ha->execute("boot", "done"); + - id: boot_initialize mode: restart then: # There's nothing here so far + # Extended by: + # - HW Buttons + # - HW Relays + # - HW Touch + + - id: boot_sequence + mode: restart + then: + - lambda: |- + tx_fw_version->publish_state("${version}"); + tx_device_name->publish_state("${name}"); select: - id: sl_tx_model_format diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_api.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_api.yaml index c326718..6cc49f6 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_api.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core_api.yaml @@ -21,8 +21,11 @@ api: then: - lambda: |- if (!isnan(val)) { - if (component == "latitude") sun_entity->set_latitude(val); - else if (component == "longitude") sun_entity->set_longitude(val); + if (component == "latitude" && val >= -90 && val <= 90) { + sun_entity->set_latitude(val); + } else if (component == "longitude" && val >= -180 && val <= 180) { + sun_entity->set_longitude(val); + } } script: diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml index 7b3e76e..e83804f 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml @@ -121,6 +121,32 @@ binary_sensor: event: long_click script: + - id: !extend boot_initialize + then: + - script.execute: boot_initialize_buttons + + - id: boot_initialize_buttons + mode: restart + then: + - wait_until: + condition: + - lambda: return sl_tx_model_gang->active_index().has_value(); + - lambda: |- + const uint8_t num_gangs = (sl_tx_model_gang->active_index().has_value()) ? + (sl_tx_model_gang->active_index().value() + 1) : 0; + bs_button_1->publish_state(false); + bs_button_1->set_internal(num_gangs < 1); + sl_button_1_action->set_internal(num_gangs < 1); + bs_button_2->publish_state(false); + bs_button_2->set_internal(num_gangs < 2); + sl_button_2_action->set_internal(num_gangs < 2); + bs_button_3->publish_state(false); + bs_button_3->set_internal(num_gangs < 3); + sl_button_3_action->set_internal(num_gangs < 3); + bs_button_4->publish_state(false); + bs_button_4->set_internal(num_gangs < 4); + sl_button_4_action->set_internal(num_gangs < 4); + - id: button_action mode: parallel parameters: @@ -133,34 +159,15 @@ script: - id: buttons_release mode: restart then: - - if: - condition: - binary_sensor.is_on: bs_button_1 - then: - - binary_sensor.template.publish: - id: bs_button_1 - state: OFF # yamllint disable-line rule:truthy - - if: - condition: - binary_sensor.is_on: bs_button_2 - then: - - binary_sensor.template.publish: - id: bs_button_2 - state: OFF # yamllint disable-line rule:truthy - - if: - condition: - binary_sensor.is_on: bs_button_3 - then: - - binary_sensor.template.publish: - id: bs_button_3 - state: OFF # yamllint disable-line rule:truthy - - if: - condition: - binary_sensor.is_on: bs_button_4 - then: - - binary_sensor.template.publish: - id: bs_button_4 - state: OFF # yamllint disable-line rule:truthy + - lambda: |- + std::vector buttons = { + bs_button_1, bs_button_2, bs_button_3, bs_button_4 + }; + for (auto* button : buttons) { + if (button->state) { + button->publish_state(false); + } + } - id: !extend touch_on_multi_touch_release then: diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml index 555b5ca..0d60d8e 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml @@ -23,22 +23,22 @@ globals: restore_value: false light: - - id: ligth_output_1 + - id: light_output_1 name: Light output 1 internal: true platform: binary output: output_relay_1 - - id: ligth_output_2 + - id: light_output_2 name: Light output 2 internal: true platform: binary output: output_relay_2 - - id: ligth_output_3 + - id: light_output_3 name: Light output 3 internal: true platform: binary output: output_relay_3 - - id: ligth_output_4 + - id: light_output_4 name: Light output 4 internal: true platform: binary @@ -748,6 +748,71 @@ light: from: 7 to: 7 +script: + - id: !extend boot_initialize + then: + - wait_until: + condition: + - lambda: return sl_tx_model_format->active_index().has_value(); + - lambda: return sl_tx_model_gang->active_index().has_value(); + - lambda: |- + const bool is_model_us = sl_tx_model_format->active_index().has_value() and + sl_tx_model_format->active_index().value() == 1; + const uint8_t num_gangs = (sl_tx_model_gang->active_index().has_value()) ? + (sl_tx_model_gang->active_index().value() + 1) : 0; + light_28->set_internal(!is_model_us); + light_29->set_internal(!is_model_us); + light_30->set_internal(!is_model_us); + light_31->set_internal(!is_model_us); + light_eu->set_internal(is_model_us); + light_eu_bottom->set_internal(is_model_us); + light_eu_left->set_internal(is_model_us); + light_eu_right->set_internal(is_model_us); + light_eu_top->set_internal(is_model_us); + light_us->set_internal(!is_model_us); + light_us_bottom->set_internal(!is_model_us); + light_us_left->set_internal(!is_model_us); + light_us_right->set_internal(!is_model_us); + light_us_top->set_internal(!is_model_us); + switch (num_gangs) { + case 1: // 1 Gang + if (is_model_us) { + id(gb_lights_1) = { light_us_rl_1_1_left }; + id(gb_lights_2) = { light_us_rl_1_1_right }; + } else { + id(gb_lights_1) = { light_eu_rl_1_1_bottom }; + id(gb_lights_2) = { light_eu_rl_1_1_top }; + } + break; + case 2: // 2 Gang + if (is_model_us) { + id(gb_lights_1) = { light_us_rl_1_2_left, light_us_rl_2_2_left }; + id(gb_lights_2) = { light_us_rl_1_2_right, light_us_rl_2_2_right }; + } else { + id(gb_lights_1) = { light_eu_rl_1_2_bottom, light_eu_rl_2_2_bottom }; + id(gb_lights_2) = { light_eu_rl_1_2_top, light_eu_rl_2_2_top }; + } + break; + case 3: // 3 Gang + if (is_model_us) { + id(gb_lights_1) = { light_us_rl_1_3_left, light_us_rl_2_3_left, light_us_rl_3_3_left }; + id(gb_lights_2) = { light_us_rl_1_3_right, light_us_rl_2_3_right, light_us_rl_3_3_right }; + } else { + id(gb_lights_1) = { light_eu_rl_1_3_bottom, light_eu_rl_2_3_bottom, light_eu_rl_3_3_bottom }; + id(gb_lights_2) = { light_eu_rl_1_3_top, light_eu_rl_2_3_top, light_eu_rl_3_3_top }; + } + break; + case 4: // 3 Gang + if (is_model_us) { + id(gb_lights_1) = { light_us_rl_1_4_left, light_us_rl_2_4_left, light_us_rl_3_4_left, light_us_rl_4_4_left }; + id(gb_lights_2) = { light_us_rl_1_4_right, light_us_rl_2_4_right, light_us_rl_3_4_right, light_us_rl_4_4_right }; + } else { + id(gb_lights_1) = { light_eu_rl_1_4_bottom, light_eu_rl_2_4_bottom, light_eu_rl_3_4_bottom, light_eu_rl_4_4_bottom }; + id(gb_lights_2) = { light_eu_rl_1_4_top, light_eu_rl_2_4_top, light_eu_rl_3_4_top, light_eu_rl_4_4_top }; + } + break; + } + select: # EU relay light mode template - &relay_light_mode_eu diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_relays.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_relays.yaml index 04cd406..dd3279c 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_relays.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_relays.yaml @@ -78,6 +78,55 @@ output: pin: GPIO23 script: + - id: !extend boot_initialize + then: + - script.execute: boot_initialize_relays + + - id: boot_initialize_relays + mode: restart + then: + - wait_until: + condition: + - lambda: return sl_tx_model_format->active_index().has_value(); + - lambda: return sl_tx_model_gang->active_index().has_value(); + - lambda: |- + const bool is_model_us = sl_tx_model_format->active_index().has_value() and + sl_tx_model_format->active_index().value() == 1; + const uint8_t num_gangs = (sl_tx_model_gang->active_index().has_value()) ? + (sl_tx_model_gang->active_index().value() + 1) : 0; + sl_relay_1_mode->set_internal(num_gangs < 1); + sl_relay_1_light_mode_eu->set_internal(is_model_us or num_gangs < 1); + sl_relay_1_light_mode_us->set_internal(!is_model_us or num_gangs < 1); + sl_relay_2_mode->set_internal(num_gangs < 2); + sl_relay_2_light_mode_eu->set_internal(is_model_us or num_gangs < 2); + sl_relay_2_light_mode_us->set_internal(!is_model_us or num_gangs < 2); + sl_relay_3_mode->set_internal(num_gangs < 3); + sl_relay_3_light_mode_eu->set_internal(is_model_us or num_gangs < 3); + sl_relay_3_light_mode_us->set_internal(!is_model_us or num_gangs < 3); + sl_relay_4_mode->set_internal(num_gangs < 4); + sl_relay_4_light_mode_eu->set_internal(is_model_us or num_gangs < 4); + sl_relay_4_light_mode_us->set_internal(!is_model_us or num_gangs < 4); + auto relay_mode_index = sl_relay_1_mode->active_index(); + if (relay_mode_index.has_value()) { + light_output_1->set_internal(false or relay_mode_index.value() != 1); + sw_relay_1->set_internal(false or relay_mode_index.value() != 0); + } + relay_mode_index = sl_relay_2_mode->active_index(); + if (relay_mode_index.has_value()) { + light_output_2->set_internal(num_gangs < 2 or relay_mode_index.value() != 1); + sw_relay_2->set_internal(num_gangs < 2 or relay_mode_index.value() != 0); + } + relay_mode_index = sl_relay_3_mode->active_index(); + if (relay_mode_index.has_value()) { + light_output_3->set_internal(num_gangs < 3 or relay_mode_index.value() != 1); + sw_relay_3->set_internal(num_gangs < 3 or relay_mode_index.value() != 0); + } + relay_mode_index = sl_relay_4_mode->active_index(); + if (relay_mode_index.has_value()) { + 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: show_relay_status mode: restart then: diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_touch.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_touch.yaml index dc5dcc4..958b0c8 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_touch.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_touch.yaml @@ -58,7 +58,7 @@ binary_sensor: - lambda: send_event_to_ha->execute("swipe", "down"); external_components: - - source: github://edwardtfn/TX-Ultimate-Easy@dev # Change this before releasing + - source: github://edwardtfn/TX-Ultimate-Easy@main components: - tx_ultimate_easy @@ -79,6 +79,29 @@ number: restore_value: true script: + - id: !extend boot_initialize + then: + - script.execute: boot_initialize_touch + + - id: boot_initialize_touch + mode: restart + then: + - wait_until: + condition: + - lambda: return sl_tx_model_format->active_index().has_value(); + - lambda: |- + const bool is_model_us = sl_tx_model_format->active_index().has_value() and + sl_tx_model_format->active_index().value() == 1; + bs_multi_touch->publish_state(false); + bs_swipe_down->publish_state(false); + bs_swipe_down->set_internal(!is_model_us); + bs_swipe_left->publish_state(false); + bs_swipe_left->set_internal(is_model_us); + bs_swipe_right->publish_state(false); + bs_swipe_right->set_internal(is_model_us); + bs_swipe_up->publish_state(false); + bs_swipe_up->set_internal(!is_model_us); + - id: touch_on_multi_touch_release mode: restart then: diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_vibration.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_vibration.yaml index 2d1689c..570eaf2 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_vibration.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_vibration.yaml @@ -11,6 +11,9 @@ ##### - For normal system use, modifications to this file are NOT required. ##### #################################################################################################### --- +substitutions: + vibration_max_duration: 5s + binary_sensor: - id: bs_vibrating name: Vibrating @@ -45,6 +48,11 @@ number: optimistic: true restore_value: true +ota: + on_state_change: + then: + - switch.turn_off: sw_vibration_motor + script: - id: !extend touch_on_multi_touch_release then: @@ -112,9 +120,19 @@ switch: internal: true on_turn_on: then: - - lambda: bs_vibrating->publish_state(true); + - binary_sensor.template.publish: + id: bs_vibrating + state: ON # yamllint disable-line rule:truthy + - delay: ${vibration_max_duration} + - if: + condition: + switch.is_on: sw_vibration_motor + then: + - switch.turn_off: sw_vibration_motor on_turn_off: then: - - lambda: bs_vibrating->publish_state(false); + - binary_sensor.template.publish: + id: bs_vibrating + state: OFF # yamllint disable-line rule:truthy ...