Use switch.control from pr#10105 (esphome)
This commit is contained in:
@@ -25,7 +25,36 @@ esphome:
|
|||||||
build_flags:
|
build_flags:
|
||||||
- -D TX_ULTIMATE_EASY_STANDARD_HW_RELAYS
|
- -D TX_ULTIMATE_EASY_STANDARD_HW_RELAYS
|
||||||
|
|
||||||
|
external_components:
|
||||||
|
- source: github://pr#10105 # To-do: remove after this PR is released
|
||||||
|
components: [switch]
|
||||||
|
refresh: 1h
|
||||||
|
|
||||||
globals:
|
globals:
|
||||||
|
- &global_attr_dual_light
|
||||||
|
id: attr_light_rl_1_1_both # 1-gang: relay 1, both groups
|
||||||
|
type: uint64_t
|
||||||
|
restore_value: true
|
||||||
|
initial_value: '${LIGHT_DUAL_ATTRS_DEFAULT}'
|
||||||
|
- id: attr_light_rl_1_2_both # 2-gang: relay 1, both groups
|
||||||
|
<<: *global_attr_dual_light
|
||||||
|
- id: attr_light_rl_2_2_both # 2-gang: relay 2, both groups
|
||||||
|
<<: *global_attr_dual_light
|
||||||
|
- id: attr_light_rl_1_3_both # 3-gang: relay 1, both groups
|
||||||
|
<<: *global_attr_dual_light
|
||||||
|
- id: attr_light_rl_2_3_both # 3-gang: relay 2, both groups
|
||||||
|
<<: *global_attr_dual_light
|
||||||
|
- id: attr_light_rl_3_3_both # 3-gang: relay 3, both groups
|
||||||
|
<<: *global_attr_dual_light
|
||||||
|
- id: attr_light_rl_1_4_both # 4-gang: relay 1, both groups
|
||||||
|
<<: *global_attr_dual_light
|
||||||
|
- id: attr_light_rl_2_4_both # 4-gang: relay 2, both groups
|
||||||
|
<<: *global_attr_dual_light
|
||||||
|
- id: attr_light_rl_3_4_both # 4-gang: relay 3, both groups
|
||||||
|
<<: *global_attr_dual_light
|
||||||
|
- id: attr_light_rl_4_4_both # 4-gang: relay 4, both groups
|
||||||
|
<<: *global_attr_dual_light
|
||||||
|
|
||||||
- id: boot_initialization_relays
|
- id: boot_initialization_relays
|
||||||
type: bool
|
type: bool
|
||||||
restore_value: false
|
restore_value: false
|
||||||
@@ -54,6 +83,14 @@ globals:
|
|||||||
type: std::vector<light::LightState*>
|
type: std::vector<light::LightState*>
|
||||||
restore_value: false
|
restore_value: false
|
||||||
|
|
||||||
|
# Packed relay light modes - stores current model's 4 light modes
|
||||||
|
- id: relay_light_modes_packed
|
||||||
|
type: uint16_t
|
||||||
|
restore_value: true
|
||||||
|
initial_value: '0x1111' # All 4 relays set to option 1 (bottom/left)
|
||||||
|
# Bit layout: [relay4(4)][relay3(4)][relay2(4)][relay1(4)]
|
||||||
|
# 16-bit value with 4 bits per relay: 0=Disabled, 1=Bottom/Left, 2=Top/Right, 3=Both, 4-15=Reserved
|
||||||
|
|
||||||
# Packed relay modes - replaces 4 separate selects
|
# Packed relay modes - replaces 4 separate selects
|
||||||
- id: relay_modes_packed
|
- id: relay_modes_packed
|
||||||
type: uint16_t
|
type: uint16_t
|
||||||
@@ -69,30 +106,6 @@ globals:
|
|||||||
initial_value: '0' # All switches default to OFF
|
initial_value: '0' # All switches default to OFF
|
||||||
# Bit layout: [unused(3)][sw_relay4][sw_relay3][sw_relay2][sw_relay1][sw_expose_leds]
|
# Bit layout: [unused(3)][sw_relay4][sw_relay3][sw_relay2][sw_relay1][sw_expose_leds]
|
||||||
|
|
||||||
- &global_attr_dual_light
|
|
||||||
id: attr_light_rl_1_1_both # 1-gang: relay 1, both groups
|
|
||||||
type: uint64_t
|
|
||||||
restore_value: true
|
|
||||||
initial_value: '${LIGHT_DUAL_ATTRS_DEFAULT}'
|
|
||||||
- id: attr_light_rl_1_2_both # 2-gang: relay 1, both groups
|
|
||||||
<<: *global_attr_dual_light
|
|
||||||
- id: attr_light_rl_2_2_both # 2-gang: relay 2, both groups
|
|
||||||
<<: *global_attr_dual_light
|
|
||||||
- id: attr_light_rl_1_3_both # 3-gang: relay 1, both groups
|
|
||||||
<<: *global_attr_dual_light
|
|
||||||
- id: attr_light_rl_2_3_both # 3-gang: relay 2, both groups
|
|
||||||
<<: *global_attr_dual_light
|
|
||||||
- id: attr_light_rl_3_3_both # 3-gang: relay 3, both groups
|
|
||||||
<<: *global_attr_dual_light
|
|
||||||
- id: attr_light_rl_1_4_both # 4-gang: relay 1, both groups
|
|
||||||
<<: *global_attr_dual_light
|
|
||||||
- id: attr_light_rl_2_4_both # 4-gang: relay 2, both groups
|
|
||||||
<<: *global_attr_dual_light
|
|
||||||
- id: attr_light_rl_3_4_both # 4-gang: relay 3, both groups
|
|
||||||
<<: *global_attr_dual_light
|
|
||||||
- id: attr_light_rl_4_4_both # 4-gang: relay 4, both groups
|
|
||||||
<<: *global_attr_dual_light
|
|
||||||
|
|
||||||
light:
|
light:
|
||||||
# These lights are used for the physical relays to be shown as lights
|
# These lights are used for the physical relays to be shown as lights
|
||||||
- id: light_output_1
|
- id: light_output_1
|
||||||
@@ -181,7 +194,7 @@ light:
|
|||||||
internal: true
|
internal: true
|
||||||
disabled_by_default: false
|
disabled_by_default: false
|
||||||
default_transition_length: ${default_transition_length}
|
default_transition_length: ${default_transition_length}
|
||||||
restore_mode: ${LIGHT_RELAYS_RESTORE_MODE}
|
restore_mode: ALWAYS_OFF
|
||||||
segments:
|
segments:
|
||||||
- id: light_full
|
- id: light_full
|
||||||
from: 9
|
from: 9
|
||||||
@@ -1143,42 +1156,50 @@ script:
|
|||||||
id: sl_relay_4_mode
|
id: sl_relay_4_mode
|
||||||
index: !lambda return std::min((uint8_t)((id(relay_modes_packed) >> 12) & 0x0F), (uint8_t)2);
|
index: !lambda return std::min((uint8_t)((id(relay_modes_packed) >> 12) & 0x0F), (uint8_t)2);
|
||||||
|
|
||||||
|
# Light mode restoration - restore to active model's selects only
|
||||||
|
# Restore US light modes
|
||||||
|
- select.set_index:
|
||||||
|
id: sl_relay_1_light_mode_us
|
||||||
|
index: !lambda return std::min((uint8_t)(id(relay_light_modes_packed) & 0x0F), (uint8_t)3);
|
||||||
|
- select.set_index:
|
||||||
|
id: sl_relay_2_light_mode_us
|
||||||
|
index: !lambda return std::min((uint8_t)((id(relay_light_modes_packed) >> 4) & 0x0F), (uint8_t)3);
|
||||||
|
- select.set_index:
|
||||||
|
id: sl_relay_3_light_mode_us
|
||||||
|
index: !lambda return std::min((uint8_t)((id(relay_light_modes_packed) >> 8) & 0x0F), (uint8_t)3);
|
||||||
|
- select.set_index:
|
||||||
|
id: sl_relay_4_light_mode_us
|
||||||
|
index: !lambda return std::min((uint8_t)((id(relay_light_modes_packed) >> 12) & 0x0F), (uint8_t)3);
|
||||||
|
# Restore EU light modes
|
||||||
|
- select.set_index:
|
||||||
|
id: sl_relay_1_light_mode_eu
|
||||||
|
index: !lambda return std::min((uint8_t)(id(relay_light_modes_packed) & 0x0F), (uint8_t)3);
|
||||||
|
- select.set_index:
|
||||||
|
id: sl_relay_2_light_mode_eu
|
||||||
|
index: !lambda return std::min((uint8_t)((id(relay_light_modes_packed) >> 4) & 0x0F), (uint8_t)3);
|
||||||
|
- select.set_index:
|
||||||
|
id: sl_relay_3_light_mode_eu
|
||||||
|
index: !lambda return std::min((uint8_t)((id(relay_light_modes_packed) >> 8) & 0x0F), (uint8_t)3);
|
||||||
|
- select.set_index:
|
||||||
|
id: sl_relay_4_light_mode_eu
|
||||||
|
index: !lambda return std::min((uint8_t)((id(relay_light_modes_packed) >> 12) & 0x0F), (uint8_t)3);
|
||||||
|
|
||||||
# Switch states
|
# Switch states
|
||||||
- if:
|
- switch.control:
|
||||||
condition:
|
id: sw_expose_relays_leds_to_ha
|
||||||
lambda: return (id(relay_switches_packed) & 0x01) == 0;
|
state: !lambda return (id(relay_switches_packed) & 0x01);
|
||||||
then:
|
- switch.control:
|
||||||
- switch.turn_off: sw_expose_relays_leds_to_ha
|
id: sw_relay_1
|
||||||
else:
|
state: !lambda return (id(relay_switches_packed) & 0x02);
|
||||||
- switch.turn_on: sw_expose_relays_leds_to_ha
|
- switch.control:
|
||||||
- if:
|
id: sw_relay_2
|
||||||
condition:
|
state: !lambda return (id(relay_switches_packed) & 0x04);
|
||||||
lambda: return (id(relay_switches_packed) & 0x02) == 0;
|
- switch.control:
|
||||||
then:
|
id: sw_relay_3
|
||||||
- switch.turn_off: sw_relay_1
|
state: !lambda return (id(relay_switches_packed) & 0x08);
|
||||||
else:
|
- switch.control:
|
||||||
- switch.turn_on: sw_relay_1
|
id: sw_relay_4
|
||||||
- if:
|
state: !lambda return (id(relay_switches_packed) & 0x10);
|
||||||
condition:
|
|
||||||
lambda: return (id(relay_switches_packed) & 0x04) == 0;
|
|
||||||
then:
|
|
||||||
- switch.turn_off: sw_relay_2
|
|
||||||
else:
|
|
||||||
- switch.turn_on: sw_relay_2
|
|
||||||
- if:
|
|
||||||
condition:
|
|
||||||
lambda: return (id(relay_switches_packed) & 0x08) == 0;
|
|
||||||
then:
|
|
||||||
- switch.turn_off: sw_relay_3
|
|
||||||
else:
|
|
||||||
- switch.turn_on: sw_relay_3
|
|
||||||
- if:
|
|
||||||
condition:
|
|
||||||
lambda: return (id(relay_switches_packed) & 0x10) == 0;
|
|
||||||
then:
|
|
||||||
- switch.turn_off: sw_relay_4
|
|
||||||
else:
|
|
||||||
- switch.turn_on: sw_relay_4
|
|
||||||
|
|
||||||
# update lights based on new relay statuses (catch up, as this should be done when each relay is updated)
|
# update lights based on new relay statuses (catch up, as this should be done when each relay is updated)
|
||||||
- script.execute: show_relay_status
|
- script.execute: show_relay_status
|
||||||
@@ -1325,11 +1346,15 @@ select:
|
|||||||
- "${LIGHT_MODE_BOTH_TEXT}"
|
- "${LIGHT_MODE_BOTH_TEXT}"
|
||||||
initial_option: "${LIGHT_MODE_BOTTOM_TEXT}"
|
initial_option: "${LIGHT_MODE_BOTTOM_TEXT}"
|
||||||
optimistic: true
|
optimistic: true
|
||||||
restore_value: true
|
restore_value: false
|
||||||
internal: true
|
internal: true
|
||||||
entity_category: config
|
entity_category: config
|
||||||
disabled_by_default: false
|
disabled_by_default: false
|
||||||
icon: mdi:dots-square
|
icon: mdi:dots-square
|
||||||
|
on_value:
|
||||||
|
- lambda: |-
|
||||||
|
id(relay_light_modes_packed) = (id(relay_light_modes_packed) & ~(0x0F << 0)) |
|
||||||
|
((id(sl_relay_1_light_mode_eu).active_index().value_or(1) & 0x0F) << 0);
|
||||||
|
|
||||||
# US relay light mode template
|
# US relay light mode template
|
||||||
- &relay_light_mode_us
|
- &relay_light_mode_us
|
||||||
@@ -1343,11 +1368,15 @@ select:
|
|||||||
- "${LIGHT_MODE_BOTH_TEXT}"
|
- "${LIGHT_MODE_BOTH_TEXT}"
|
||||||
initial_option: "${LIGHT_MODE_RIGHT_TEXT}"
|
initial_option: "${LIGHT_MODE_RIGHT_TEXT}"
|
||||||
optimistic: true
|
optimistic: true
|
||||||
restore_value: true
|
restore_value: false
|
||||||
internal: true
|
internal: true
|
||||||
entity_category: config
|
entity_category: config
|
||||||
disabled_by_default: false
|
disabled_by_default: false
|
||||||
icon: mdi:dots-square
|
icon: mdi:dots-square
|
||||||
|
on_value:
|
||||||
|
- lambda: |-
|
||||||
|
id(relay_light_modes_packed) = (id(relay_light_modes_packed) & ~(0x0F << 0)) |
|
||||||
|
((id(sl_relay_1_light_mode_us).active_index().value_or(1) & 0x0F) << 0);
|
||||||
|
|
||||||
- id: sl_relay_1_mode
|
- id: sl_relay_1_mode
|
||||||
name: Relay 1 display mode
|
name: Relay 1 display mode
|
||||||
@@ -1358,7 +1387,7 @@ select:
|
|||||||
- "${RELAY_MODE_TEXT_NOT_USED}"
|
- "${RELAY_MODE_TEXT_NOT_USED}"
|
||||||
initial_option: "${RELAY_MODE_TEXT_SWITCH}"
|
initial_option: "${RELAY_MODE_TEXT_SWITCH}"
|
||||||
optimistic: true
|
optimistic: true
|
||||||
restore_value: true
|
restore_value: false
|
||||||
internal: true
|
internal: true
|
||||||
entity_category: config
|
entity_category: config
|
||||||
disabled_by_default: false
|
disabled_by_default: false
|
||||||
@@ -1370,15 +1399,23 @@ select:
|
|||||||
state: true
|
state: true
|
||||||
- lambda: |-
|
- lambda: |-
|
||||||
id(relay_modes_packed) = (id(relay_modes_packed) & ~(0x0F << 0)) |
|
id(relay_modes_packed) = (id(relay_modes_packed) & ~(0x0F << 0)) |
|
||||||
((id(sl_relay_1_mode).active_index().value_or(1) & 0x0F) << 0);
|
((id(sl_relay_1_mode).active_index().value_or(0) & 0x0F) << 0);
|
||||||
|
|
||||||
- id: sl_relay_2_light_mode_eu
|
- id: sl_relay_2_light_mode_eu
|
||||||
name: Relay 2 light mode EU
|
name: Relay 2 light mode EU
|
||||||
<<: *relay_light_mode_eu
|
<<: *relay_light_mode_eu
|
||||||
|
on_value:
|
||||||
|
- lambda: |-
|
||||||
|
id(relay_light_modes_packed) = (id(relay_light_modes_packed) & ~(0x0F << 4)) |
|
||||||
|
((id(sl_relay_2_light_mode_eu).active_index().value_or(1) & 0x0F) << 4);
|
||||||
|
|
||||||
- id: sl_relay_2_light_mode_us
|
- id: sl_relay_2_light_mode_us
|
||||||
name: Relay 2 light mode US
|
name: Relay 2 light mode US
|
||||||
<<: *relay_light_mode_us
|
<<: *relay_light_mode_us
|
||||||
|
on_value:
|
||||||
|
- lambda: |-
|
||||||
|
id(relay_light_modes_packed) = (id(relay_light_modes_packed) & ~(0x0F << 4)) |
|
||||||
|
((id(sl_relay_2_light_mode_us).active_index().value_or(1) & 0x0F) << 4);
|
||||||
|
|
||||||
- id: sl_relay_2_mode
|
- id: sl_relay_2_mode
|
||||||
name: Relay 2 display mode
|
name: Relay 2 display mode
|
||||||
@@ -1389,7 +1426,7 @@ select:
|
|||||||
- "${RELAY_MODE_TEXT_NOT_USED}"
|
- "${RELAY_MODE_TEXT_NOT_USED}"
|
||||||
initial_option: "${RELAY_MODE_TEXT_SWITCH}"
|
initial_option: "${RELAY_MODE_TEXT_SWITCH}"
|
||||||
optimistic: true
|
optimistic: true
|
||||||
restore_value: true
|
restore_value: false
|
||||||
internal: true
|
internal: true
|
||||||
entity_category: config
|
entity_category: config
|
||||||
disabled_by_default: false
|
disabled_by_default: false
|
||||||
@@ -1401,15 +1438,23 @@ select:
|
|||||||
state: true
|
state: true
|
||||||
- lambda: |-
|
- lambda: |-
|
||||||
id(relay_modes_packed) = (id(relay_modes_packed) & ~(0x0F << 4)) |
|
id(relay_modes_packed) = (id(relay_modes_packed) & ~(0x0F << 4)) |
|
||||||
((id(sl_relay_2_mode).active_index().value_or(1) & 0x0F) << 4);
|
((id(sl_relay_2_mode).active_index().value_or(0) & 0x0F) << 4);
|
||||||
|
|
||||||
- id: sl_relay_3_light_mode_eu
|
- id: sl_relay_3_light_mode_eu
|
||||||
name: Relay 3 light mode EU
|
name: Relay 3 light mode EU
|
||||||
<<: *relay_light_mode_eu
|
<<: *relay_light_mode_eu
|
||||||
|
on_value:
|
||||||
|
- lambda: |-
|
||||||
|
id(relay_light_modes_packed) = (id(relay_light_modes_packed) & ~(0x0F << 8)) |
|
||||||
|
((id(sl_relay_3_light_mode_eu).active_index().value_or(1) & 0x0F) << 8);
|
||||||
|
|
||||||
- id: sl_relay_3_light_mode_us
|
- id: sl_relay_3_light_mode_us
|
||||||
name: Relay 3 light mode US
|
name: Relay 3 light mode US
|
||||||
<<: *relay_light_mode_us
|
<<: *relay_light_mode_us
|
||||||
|
on_value:
|
||||||
|
- lambda: |-
|
||||||
|
id(relay_light_modes_packed) = (id(relay_light_modes_packed) & ~(0x0F << 8)) |
|
||||||
|
((id(sl_relay_3_light_mode_us).active_index().value_or(1) & 0x0F) << 8);
|
||||||
|
|
||||||
- id: sl_relay_3_mode
|
- id: sl_relay_3_mode
|
||||||
name: Relay 3 display mode
|
name: Relay 3 display mode
|
||||||
@@ -1420,7 +1465,7 @@ select:
|
|||||||
- "${RELAY_MODE_TEXT_NOT_USED}"
|
- "${RELAY_MODE_TEXT_NOT_USED}"
|
||||||
initial_option: "${RELAY_MODE_TEXT_SWITCH}"
|
initial_option: "${RELAY_MODE_TEXT_SWITCH}"
|
||||||
optimistic: true
|
optimistic: true
|
||||||
restore_value: true
|
restore_value: false
|
||||||
internal: true
|
internal: true
|
||||||
entity_category: config
|
entity_category: config
|
||||||
disabled_by_default: false
|
disabled_by_default: false
|
||||||
@@ -1432,15 +1477,23 @@ select:
|
|||||||
state: true
|
state: true
|
||||||
- lambda: |-
|
- lambda: |-
|
||||||
id(relay_modes_packed) = (id(relay_modes_packed) & ~(0x0F << 8)) |
|
id(relay_modes_packed) = (id(relay_modes_packed) & ~(0x0F << 8)) |
|
||||||
((id(sl_relay_3_mode).active_index().value_or(1) & 0x0F) << 8);
|
((id(sl_relay_3_mode).active_index().value_or(0) & 0x0F) << 8);
|
||||||
|
|
||||||
- id: sl_relay_4_light_mode_eu
|
- id: sl_relay_4_light_mode_eu
|
||||||
name: Relay 4 light mode EU
|
name: Relay 4 light mode EU
|
||||||
<<: *relay_light_mode_eu
|
<<: *relay_light_mode_eu
|
||||||
|
on_value:
|
||||||
|
- lambda: |-
|
||||||
|
id(relay_light_modes_packed) = (id(relay_light_modes_packed) & ~(0x0F << 12)) |
|
||||||
|
((id(sl_relay_4_light_mode_eu).active_index().value_or(1) & 0x0F) << 12);
|
||||||
|
|
||||||
- id: sl_relay_4_light_mode_us
|
- id: sl_relay_4_light_mode_us
|
||||||
name: Relay 4 light mode US
|
name: Relay 4 light mode US
|
||||||
<<: *relay_light_mode_us
|
<<: *relay_light_mode_us
|
||||||
|
on_value:
|
||||||
|
- lambda: |-
|
||||||
|
id(relay_light_modes_packed) = (id(relay_light_modes_packed) & ~(0x0F << 12)) |
|
||||||
|
((id(sl_relay_4_light_mode_eu).active_index().value_or(1) & 0x0F) << 12);
|
||||||
|
|
||||||
- id: sl_relay_4_mode
|
- id: sl_relay_4_mode
|
||||||
name: Relay 4 display mode
|
name: Relay 4 display mode
|
||||||
@@ -1451,7 +1504,7 @@ select:
|
|||||||
- "${RELAY_MODE_TEXT_NOT_USED}"
|
- "${RELAY_MODE_TEXT_NOT_USED}"
|
||||||
initial_option: "${RELAY_MODE_TEXT_SWITCH}"
|
initial_option: "${RELAY_MODE_TEXT_SWITCH}"
|
||||||
optimistic: true
|
optimistic: true
|
||||||
restore_value: true
|
restore_value: false
|
||||||
internal: true
|
internal: true
|
||||||
entity_category: config
|
entity_category: config
|
||||||
disabled_by_default: false
|
disabled_by_default: false
|
||||||
@@ -1463,7 +1516,7 @@ select:
|
|||||||
state: true
|
state: true
|
||||||
- lambda: |-
|
- lambda: |-
|
||||||
id(relay_modes_packed) = (id(relay_modes_packed) & ~(0x0F << 12)) |
|
id(relay_modes_packed) = (id(relay_modes_packed) & ~(0x0F << 12)) |
|
||||||
((id(sl_relay_4_mode).active_index().value_or(1) & 0x0F) << 12);
|
((id(sl_relay_4_mode).active_index().value_or(0) & 0x0F) << 12);
|
||||||
|
|
||||||
switch:
|
switch:
|
||||||
- id: sw_expose_relays_leds_to_ha
|
- id: sw_expose_relays_leds_to_ha
|
||||||
|
|||||||
Reference in New Issue
Block a user