Files
TX-Ultimate-Easy/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml
2025-07-14 13:51:21 +02:00

626 lines
20 KiB
YAML

####################################################################################################
##### TX Ultimate Easy for ESPHome #####
##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy #####
####################################################################################################
##### Purpose: ESPHome Core - Hardware - LEDs #####
####################################################################################################
##### Author: edwardtfn - https://github.com/edwardtfn - https://buymeacoffee.com/edwardfirmo #####
####################################################################################################
##### NOTE: #####
##### - Make changes ONLY if absolutely necessary and you have the required knowledge. #####
##### - For normal system use, modifications to this file are NOT required. #####
####################################################################################################
---
substitutions:
default_transition_length: 500ms
LIGHT_MODE_BOTH_TEXT: "Both"
LIGHT_MODE_DISABLED_TEXT: "Disabled"
LIGHT_MODE_LEFT_TEXT: "Left"
LIGHT_MODE_RIGHT_TEXT: "Right"
LIGHT_MODE_BOTTOM_TEXT: "Bottom"
LIGHT_MODE_TOP_TEXT: "Top"
LIGHT_TRANSITION_TURN_ON: '0' # Transition time in msec
LIGHT_TRANSITION_TURN_OFF: '0' # Transition time in msec
LIGHT_BRIGHTNESS_TURN_ON: '0' # Brightness (1 to 100%, 0 to not set it)
LIGHT_FULL_RESTORE_MODE: RESTORE_DEFAULT_OFF
LIGHT_SIDES_RESTORE_MODE: RESTORE_DEFAULT_OFF
LIGHT_INDIVIDUAL_RESTORE_MODE: RESTORE_DEFAULT_OFF
esphome:
platformio_options:
build_flags:
- -D TX_ULTIMATE_EASY_CORE_HW_LEDS
globals:
- id: gb_lights_1
type: std::vector<light::LightState*>
restore_value: false
- id: gb_lights_2
type: std::vector<light::LightState*>
restore_value: false
light:
# These lights are controlling the LEDs on the device
- id: light_full
name: Light - All
internal: true
num_leds: 32
pin: GPIO13
restore_mode: ${LIGHT_FULL_RESTORE_MODE}
platform: esp32_rmt_led_strip
rgb_order: GRB
chipset: ws2812
max_refresh_rate: 33ms
use_psram: false
# platform: neopixelbus
# type: GRB
# variant: WS2811
# Those lights are available based on the model selections
- &light_partition_with_effects
id: light_eu
name: Light EU
platform: partition
default_transition_length: ${default_transition_length}
internal: true
restore_mode: ${LIGHT_SIDES_RESTORE_MODE}
effects:
- addressable_rainbow:
name: "Rainbow"
- addressable_rainbow:
name: "Rainbow - Fast"
speed: 50
- pulse:
name: "Pulse"
transition_length: 1s
update_interval: 1s
- pulse:
name: "Pulse - Slow"
transition_length: 2s
update_interval: 2s
- addressable_scan:
name: "Scan"
move_interval: 100ms
scan_width: 3
- addressable_twinkle:
name: "Twinkle"
twinkle_probability: 5%
progress_interval: 4ms
- addressable_random_twinkle:
name: "Random Twinkle"
twinkle_probability: 20%
progress_interval: 32ms
- addressable_fireworks:
name: "Fireworks"
update_interval: 32ms
spark_probability: 10%
use_random_color: false
fade_out_rate: 120
- addressable_flicker:
name: "Flicker"
update_interval: 16ms
intensity: 5%
- random:
name: "Random"
segments:
- id: light_full
from: 0
to: 27
- id: light_us
name: Light US
<<: *light_partition_with_effects
segments:
- id: light_full
from: 0
to: 31
- &light_partition_with_effects_disabled
id: light_eu_bottom
name: Light - Bottom EU
disabled_by_default: true
<<: *light_partition_with_effects
segments:
- id: light_full
from: 6
to: 12
reversed: true
- id: light_eu_left
name: Light - Left EU
<<: *light_partition_with_effects_disabled
segments:
- id: light_full
from: 13
to: 19
reversed: true
- id: light_eu_right
name: Light - Right EU
<<: *light_partition_with_effects_disabled
segments:
- id: light_full
from: 27
to: 27
reversed: false
- id: light_full
from: 0
to: 5
reversed: false
- id: light_eu_top
name: Light - Top EU
<<: *light_partition_with_effects_disabled
segments:
- id: light_full
from: 20
to: 26
reversed: false
- id: light_us_bottom
name: Light - Bottom US
<<: *light_partition_with_effects_disabled
segments:
- id: light_full
from: 9
to: 14
reversed: true
- id: light_us_left
name: Light - Left US
<<: *light_partition_with_effects_disabled
segments:
- id: light_full
from: 15
to: 24
reversed: true
- id: light_us_right
name: Light - Right US
<<: *light_partition_with_effects_disabled
segments:
- id: light_full
from: 31
to: 31
reversed: false
- id: light_full
from: 0
to: 8
reversed: false
- id: light_us_top
name: Light - Top US
<<: *light_partition_with_effects_disabled
segments:
- id: light_full
from: 25
to: 30
reversed: false
- &light_partition_individual_led
id: light_00
name: Light - LED 00
platform: partition
disabled_by_default: true
default_transition_length: ${default_transition_length}
restore_mode: ${LIGHT_INDIVIDUAL_RESTORE_MODE}
segments:
- id: light_full
from: 0
to: 0
- id: light_01
name: Light - LED 01
<<: *light_partition_individual_led
segments:
- id: light_full
from: 1
to: 1
- id: light_02
name: Light - LED 02
<<: *light_partition_individual_led
segments:
- id: light_full
from: 2
to: 2
- id: light_03
name: Light - LED 03
<<: *light_partition_individual_led
segments:
- id: light_full
from: 3
to: 3
- id: light_04
name: Light - LED 04
<<: *light_partition_individual_led
segments:
- id: light_full
from: 4
to: 4
- id: light_05
name: Light - LED 05
<<: *light_partition_individual_led
segments:
- id: light_full
from: 5
to: 5
- id: light_06
name: Light - LED 06
<<: *light_partition_individual_led
segments:
- id: light_full
from: 6
to: 6
- id: light_07
name: Light - LED 07
<<: *light_partition_individual_led
segments:
- id: light_full
from: 7
to: 7
- id: light_08
name: Light - LED 08
<<: *light_partition_individual_led
segments:
- id: light_full
from: 8
to: 8
- id: light_09
name: Light - LED 09
<<: *light_partition_individual_led
segments:
- id: light_full
from: 9
to: 9
- id: light_10
name: Light - LED 10
<<: *light_partition_individual_led
segments:
- id: light_full
from: 10
to: 10
- id: light_11
name: Light - LED 11
<<: *light_partition_individual_led
segments:
- id: light_full
from: 11
to: 11
- id: light_12
name: Light - LED 12
<<: *light_partition_individual_led
segments:
- id: light_full
from: 12
to: 12
- id: light_13
name: Light - LED 13
<<: *light_partition_individual_led
segments:
- id: light_full
from: 13
to: 13
- id: light_14
name: Light - LED 14
<<: *light_partition_individual_led
segments:
- id: light_full
from: 14
to: 14
- id: light_15
name: Light - LED 15
<<: *light_partition_individual_led
segments:
- id: light_full
from: 15
to: 15
- id: light_16
name: Light - LED 16
<<: *light_partition_individual_led
segments:
- id: light_full
from: 16
to: 16
- id: light_17
name: Light - LED 17
<<: *light_partition_individual_led
segments:
- id: light_full
from: 17
to: 17
- id: light_18
name: Light - LED 18
<<: *light_partition_individual_led
segments:
- id: light_full
from: 18
to: 18
- id: light_19
name: Light - LED 19
<<: *light_partition_individual_led
segments:
- id: light_full
from: 19
to: 19
- id: light_20
name: Light - LED 20
<<: *light_partition_individual_led
segments:
- id: light_full
from: 20
to: 20
- id: light_21
name: Light - LED 21
<<: *light_partition_individual_led
segments:
- id: light_full
from: 21
to: 21
- id: light_22
name: Light - LED 22
<<: *light_partition_individual_led
segments:
- id: light_full
from: 22
to: 22
- id: light_23
name: Light - LED 23
<<: *light_partition_individual_led
segments:
- id: light_full
from: 23
to: 23
- id: light_24
name: Light - LED 24
<<: *light_partition_individual_led
segments:
- id: light_full
from: 24
to: 24
- id: light_25
name: Light - LED 25
<<: *light_partition_individual_led
segments:
- id: light_full
from: 25
to: 25
- id: light_26
name: Light - LED 26
<<: *light_partition_individual_led
segments:
- id: light_full
from: 26
to: 26
- id: light_27
name: Light - LED 27
<<: *light_partition_individual_led
segments:
- id: light_full
from: 27
to: 27
- id: light_28 # US Model only
name: Light - LED 28
internal: true
<<: *light_partition_individual_led
segments:
- id: light_full
from: 28
to: 28
- id: light_29 # US Model only
name: Light - LED 29
internal: true
<<: *light_partition_individual_led
segments:
- id: light_full
from: 29
to: 29
- id: light_30 # US Model only
name: Light - LED 30
internal: true
<<: *light_partition_individual_led
segments:
- id: light_full
from: 30
to: 30
- id: light_31 # US Model only
name: Light - LED 31
internal: true
<<: *light_partition_individual_led
segments:
- id: light_full
from: 31
to: 31
script:
- id: !extend boot_initialize
then:
- lambda: |-
light_28->set_internal(!id(is_us_model));
light_29->set_internal(!id(is_us_model));
light_30->set_internal(!id(is_us_model));
light_31->set_internal(!id(is_us_model));
light_eu->set_internal(id(is_us_model));
light_eu_bottom->set_internal(id(is_us_model));
light_eu_left->set_internal(id(is_us_model));
light_eu_right->set_internal(id(is_us_model));
light_eu_top->set_internal(id(is_us_model));
light_us->set_internal(!id(is_us_model));
light_us_bottom->set_internal(!id(is_us_model));
light_us_left->set_internal(!id(is_us_model));
light_us_right->set_internal(!id(is_us_model));
light_us_top->set_internal(!id(is_us_model));
- id: !extend dump_config
then:
- lambda: |-
// Relay's LEDs modes
ESP_LOGCONFIG("core_hw_leds", "Relay%s LEDs mode%s:",
id(gang_count_plural_suffix).c_str(),
id(gang_count_plural_suffix).c_str());
ESP_LOGCONFIG("core_hw_leds", " Relay 1: %s", id(is_us_model)
? sl_relay_1_light_mode_us->state.c_str()
: sl_relay_1_light_mode_eu->state.c_str());
if (id(gang_count) >= 2)
ESP_LOGCONFIG("core_hw_leds", " Relay 2: %s", id(is_us_model)
? sl_relay_2_light_mode_us->state.c_str()
: sl_relay_2_light_mode_eu->state.c_str());
if (id(gang_count) >= 3)
ESP_LOGCONFIG("core_hw_leds", " Relay 3: %s", id(is_us_model)
? sl_relay_3_light_mode_us->state.c_str()
: sl_relay_3_light_mode_eu->state.c_str());
if (id(gang_count) >= 4)
ESP_LOGCONFIG("core_hw_leds", " Relay 4: %s", id(is_us_model)
? sl_relay_4_light_mode_us->state.c_str()
: sl_relay_4_light_mode_eu->state.c_str());
// Transition times
ESP_LOGCONFIG("core_hw_leds", "Transition times:");
ESP_LOGCONFIG("core_hw_leds", " Default: ${default_transition_length}");
if (${LIGHT_TRANSITION_TURN_ON} > 0)
ESP_LOGCONFIG("core_hw_leds", " Turning on: ${LIGHT_TRANSITION_TURN_ON}ms");
else
ESP_LOGCONFIG("core_hw_leds", " Turning on: Disabled");
if (${LIGHT_TRANSITION_TURN_OFF} > 0)
ESP_LOGCONFIG("core_hw_leds", " Turning off: ${LIGHT_TRANSITION_TURN_OFF}ms");
else
ESP_LOGCONFIG("core_hw_leds", " Turning off: Disabled");
// Restore modes
ESP_LOGCONFIG("core_hw_leds", "LED restore modes:");
ESP_LOGCONFIG("core_hw_leds", " Light - All: ${LIGHT_FULL_RESTORE_MODE}");
ESP_LOGCONFIG("core_hw_leds", " Sides: ${LIGHT_SIDES_RESTORE_MODE}");
ESP_LOGCONFIG("core_hw_leds", " Individual: ${LIGHT_INDIVIDUAL_RESTORE_MODE}");
- id: !extend dump_config_list_packages
then:
- script.wait: dump_config
- lambda: |-
// Check for requirements
#if !defined(TX_ULTIMATE_EASY_CORE)
#error "The package TX-Ultimate-Easy-ESPHome_core.yaml is required."
#endif
// Identify itself
ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Core - Hardware - LEDs");
- id: light_set_state
mode: parallel
parameters:
light_group: uint8_t
light_index: uint8_t
state: bool
then:
- lambda: |-
static const uint32_t LIGHT_TRANSITION_TURN_ON = ${LIGHT_TRANSITION_TURN_ON};
static const uint32_t LIGHT_TRANSITION_TURN_OFF = ${LIGHT_TRANSITION_TURN_OFF};
static const uint8_t LIGHT_BRIGHTNESS_TURN_ON = ${LIGHT_BRIGHTNESS_TURN_ON};
const std::string light_mode_group_1 = id(is_us_model)
? "${LIGHT_MODE_LEFT_TEXT}"
: "${LIGHT_MODE_BOTTOM_TEXT}";
const std::string light_mode_group_2 = id(is_us_model)
? "${LIGHT_MODE_RIGHT_TEXT}"
: "${LIGHT_MODE_TOP_TEXT}";
switch (light_group) {
case 1:
if (light_index >= id(gb_lights_1).size()) {
ESP_LOGE("core_hw_leds", "Invalid set with %s light for Relay %" PRIu8,
light_mode_group_1.c_str(), light_index+1);
return;
}
if (state and !id(gb_lights_1)[light_index]->current_values.is_on()) {
ESP_LOGI("core_hw_leds", "Turn-on %s light for Relay %" PRIu8,
light_mode_group_1.c_str(), light_index+1);
auto call = id(gb_lights_1)[light_index]->turn_on();
if (LIGHT_TRANSITION_TURN_ON > 0)
call.set_transition_length(LIGHT_TRANSITION_TURN_ON); // in ms
if (LIGHT_BRIGHTNESS_TURN_ON > 0 and LIGHT_BRIGHTNESS_TURN_ON <= 100)
call.set_brightness(LIGHT_BRIGHTNESS_TURN_ON / 100.0f);
call.perform();
} else if (!state and id(gb_lights_1)[light_index]->current_values.is_on()) {
ESP_LOGI("core_hw_leds", "Turn-off %s light for Relay %" PRIu8,
light_mode_group_1.c_str(), light_index+1);
auto call = id(gb_lights_1)[light_index]->turn_off();
if (LIGHT_TRANSITION_TURN_OFF > 0)
call.set_transition_length(LIGHT_TRANSITION_TURN_OFF); // in ms
call.perform();
}
break;
case 2:
if (light_index >= id(gb_lights_2).size()) {
ESP_LOGE("core_hw_leds", "Invalid set with %s light for Relay %" PRIu8,
light_mode_group_2.c_str(), light_index+1);
return;
}
if (state and !id(gb_lights_2)[light_index]->current_values.is_on()) {
ESP_LOGI("core_hw_leds", "Turn-on %s light for Relay %" PRIu8,
light_mode_group_2.c_str(), light_index+1);
auto call = id(gb_lights_2)[light_index]->turn_on();
if (LIGHT_TRANSITION_TURN_ON > 0)
call.set_transition_length(LIGHT_TRANSITION_TURN_ON); // in ms
if (LIGHT_BRIGHTNESS_TURN_ON > 0 and LIGHT_BRIGHTNESS_TURN_ON <= 100)
call.set_brightness(LIGHT_BRIGHTNESS_TURN_ON / 100.0f);
call.perform();
} else if (!state and id(gb_lights_2)[light_index]->current_values.is_on()) {
ESP_LOGI("core_hw_leds", "Turn-off %s light for Relay %" PRIu8,
light_mode_group_2.c_str(), light_index+1);
auto call = id(gb_lights_2)[light_index]->turn_off();
if (LIGHT_TRANSITION_TURN_OFF > 0)
call.set_transition_length(LIGHT_TRANSITION_TURN_OFF); // in ms
call.perform();
}
break;
}
select:
# EU relay light mode template
- &relay_light_mode_eu
id: sl_relay_1_light_mode_eu
name: Relay 1 light mode EU
platform: template
options:
- "${LIGHT_MODE_DISABLED_TEXT}"
- "${LIGHT_MODE_BOTTOM_TEXT}"
- "${LIGHT_MODE_TOP_TEXT}"
- "${LIGHT_MODE_BOTH_TEXT}"
initial_option: "${LIGHT_MODE_BOTTOM_TEXT}"
optimistic: true
restore_value: true
internal: true
entity_category: config
disabled_by_default: false
icon: mdi:dots-square
- id: sl_relay_2_light_mode_eu
name: Relay 2 light mode EU
<<: *relay_light_mode_eu
- id: sl_relay_3_light_mode_eu
name: Relay 3 light mode EU
<<: *relay_light_mode_eu
- id: sl_relay_4_light_mode_eu
name: Relay 4 light mode EU
<<: *relay_light_mode_eu
# US relay light mode template
- &relay_light_mode_us
id: sl_relay_1_light_mode_us
name: Relay 1 light mode US
platform: template
options:
- "${LIGHT_MODE_DISABLED_TEXT}"
- "${LIGHT_MODE_LEFT_TEXT}"
- "${LIGHT_MODE_RIGHT_TEXT}"
- "${LIGHT_MODE_BOTH_TEXT}"
initial_option: "${LIGHT_MODE_RIGHT_TEXT}"
optimistic: true
restore_value: true
internal: true
entity_category: config
disabled_by_default: false
icon: mdi:dots-square
- id: sl_relay_2_light_mode_us
name: Relay 2 light mode US
<<: *relay_light_mode_us
- id: sl_relay_3_light_mode_us
name: Relay 3 light mode US
<<: *relay_light_mode_us
- id: sl_relay_4_light_mode_us
name: Relay 4 light mode US
<<: *relay_light_mode_us
...