627 lines
20 KiB
YAML
627 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: |-
|
|
std:string gang_count_plural_suffix = id(gang_count) > 1 ? "s" : "";
|
|
// Relay's LEDs modes
|
|
ESP_LOGCONFIG("core_hw_leds", "Relay%s LEDs mode%s:",
|
|
gang_count_plural_suffix.c_str(),
|
|
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
|
|
...
|