Compare commits
65 Commits
0.0.4
...
v2024.12.4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e5d941c460 | ||
|
|
9b134a786a | ||
|
|
be0fc353f6 | ||
|
|
fbc5cb79cc | ||
|
|
c65acc3298 | ||
|
|
4d8107faf2 | ||
|
|
65bbd901b1 | ||
|
|
8c610a406a | ||
|
|
696e3bf28d | ||
|
|
5ae4564e6a | ||
|
|
857c43940d | ||
|
|
8668fe8dc9 | ||
|
|
976a903118 | ||
|
|
35cc0c4a8e | ||
|
|
5c4581563e | ||
|
|
7f1c362a50 | ||
|
|
cf3018c95c | ||
|
|
360ae3123a | ||
|
|
6767b5e765 | ||
|
|
d5e5ebb3d6 | ||
|
|
46c04eb992 | ||
|
|
8558bc3650 | ||
|
|
f32e2eee4f | ||
|
|
5a993165cd | ||
|
|
d04c2aff2f | ||
|
|
2d79ee42c7 | ||
|
|
3f4fc7a505 | ||
|
|
be23a5a0fd | ||
|
|
a23a2db352 | ||
|
|
4e73a11528 | ||
|
|
3c98d81bb7 | ||
|
|
e63447984d | ||
|
|
1f1a8049e6 | ||
|
|
0dddc0747b | ||
|
|
86d1513c6a | ||
|
|
ac4d583b64 | ||
|
|
15830d4134 | ||
|
|
0c19ca1205 | ||
|
|
2d676036dc | ||
|
|
c8ffa9e224 | ||
|
|
1406ada53a | ||
|
|
f02f90c3fa | ||
|
|
f6169e3ea2 | ||
|
|
6774a1ac18 | ||
|
|
21720d8ba3 | ||
|
|
7727c968db | ||
|
|
dc9e19d43c | ||
|
|
737343e395 | ||
|
|
5569260f92 | ||
|
|
04ca752c3b | ||
|
|
23436428a4 | ||
|
|
26a244cbed | ||
|
|
ce8b4e700e | ||
|
|
35bf4bc0ec | ||
|
|
ee8ff66add | ||
|
|
96db05cc34 | ||
|
|
61a5d67082 | ||
|
|
ce9aefc7fe | ||
|
|
1d38ac282c | ||
|
|
2ae4d2abe8 | ||
|
|
3543c0c088 | ||
|
|
242325e556 | ||
|
|
f65f3a930c | ||
|
|
0bf52a28c0 | ||
|
|
976814eb58 |
8
.github/workflows/release_tag.yml
vendored
8
.github/workflows/release_tag.yml
vendored
@@ -1,3 +1,11 @@
|
||||
# This GitHub Actions workflow updates the "stable" and "latest" Git tags
|
||||
# to point to the tag associated with a newly published release. It performs
|
||||
# the following steps:
|
||||
# 1. Checks out the repository code with full history.
|
||||
# 2. Configures Git with a generic user for the action.
|
||||
# 3. Moves and forcibly pushes the "stable" and "latest" tags to align with
|
||||
# the tag of the newly published release.
|
||||
# This ensures that "stable" and "latest" always point to the most recent release.
|
||||
---
|
||||
name: Update Tags
|
||||
|
||||
|
||||
3
.github/workflows/validate_esphome_beta.yml
vendored
3
.github/workflows/validate_esphome_beta.yml
vendored
@@ -1,8 +1,7 @@
|
||||
---
|
||||
name: Validate ESPHome (Beta)
|
||||
|
||||
# yamllint disable-line rule:truthy
|
||||
on:
|
||||
on: # yamllint disable-line rule:truthy
|
||||
push:
|
||||
paths:
|
||||
- "*.yaml"
|
||||
|
||||
42
.github/workflows/versioning.yml
vendored
Normal file
42
.github/workflows/versioning.yml
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
# Workflow for managing versioning and tagging
|
||||
---
|
||||
name: Version Bump and Tag
|
||||
|
||||
on: # yamllint disable-line rule:truthy
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths-ignore:
|
||||
- '**/VERSION'
|
||||
- '**/VERSION_YAML'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
update_stable:
|
||||
description: "Update stable tag?"
|
||||
required: true
|
||||
default: "false"
|
||||
|
||||
jobs:
|
||||
versioning:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: "actions/checkout@v4"
|
||||
|
||||
- name: Set up Git
|
||||
run: |
|
||||
git config user.name "GitHub Actions"
|
||||
git config user.email "actions@github.com"
|
||||
|
||||
- name: Bump Version
|
||||
run: |
|
||||
chmod +x "./versioning/bump_version.sh"
|
||||
"./versioning/bump_version.sh"
|
||||
|
||||
- name: Push Changes and Tags
|
||||
env:
|
||||
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
||||
run: |
|
||||
git push "https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git" main
|
||||
git push "https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git" --tags
|
||||
...
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
packages:
|
||||
basic_package: !include ../TX-Ultimate-Easy-ESPHome.yaml # Basic package
|
||||
basic_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml # Basic package
|
||||
|
||||
esp32:
|
||||
framework:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
packages:
|
||||
basic_package: !include ../TX-Ultimate-Easy-ESPHome.yaml # Core package
|
||||
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||
addon_bluetooth_proxy: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml
|
||||
|
||||
esp32:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
packages:
|
||||
basic_package: !include ../TX-Ultimate-Easy-ESPHome.yaml # Core package
|
||||
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||
addon_bluetooth_proxy: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml
|
||||
...
|
||||
|
||||
BIN
Assets/Logo.png
Normal file
BIN
Assets/Logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 165 KiB |
@@ -15,11 +15,7 @@ substitutions:
|
||||
name: tx-ultimate-easy
|
||||
friendly_name: TX Ultimate Easy
|
||||
|
||||
latitude: '0'
|
||||
longitude: '0'
|
||||
zone_home: 'zone.home'
|
||||
|
||||
version: '0.0.4'
|
||||
<<: !include ../versioning/VERSION_YAML
|
||||
|
||||
TX_MODEL_FORMAT_EU_TEXT: "EU (Square, T5-xC-86)"
|
||||
TX_MODEL_FORMAT_US_TEXT: "US (Rectangle, T5-xC-120)"
|
||||
@@ -78,7 +74,7 @@ improv_serial:
|
||||
id: serial_improv
|
||||
|
||||
logger:
|
||||
level: INFO
|
||||
level: DEBUG
|
||||
|
||||
ota:
|
||||
platform: esphome
|
||||
|
||||
@@ -20,111 +20,53 @@ substitutions:
|
||||
BUTTON_3_ACTION_TEXT: "Relay 3 (toggle)"
|
||||
BUTTON_4_ACTION_TEXT: "Relay 4 (toggle)"
|
||||
|
||||
binary_sensor:
|
||||
- id: bs_button_1
|
||||
name: Button 1
|
||||
icon: mdi:gesture-tap-box
|
||||
internal: false
|
||||
platform: template
|
||||
on_click:
|
||||
then:
|
||||
- script.execute:
|
||||
id: button_action
|
||||
component: bs_button_1
|
||||
event: click
|
||||
on_double_click:
|
||||
then:
|
||||
- script.execute:
|
||||
id: button_action
|
||||
component: bs_button_1
|
||||
event: double_click
|
||||
on_multi_click:
|
||||
- timing: &long_click-timing
|
||||
- ON for at least 0.8s
|
||||
invalid_cooldown: ${invalid_cooldown}
|
||||
then:
|
||||
- script.execute:
|
||||
id: button_action
|
||||
component: bs_button_1
|
||||
event: long_click
|
||||
BUTTON_CLICK_MIN_LENGTH: '50' # The minimum duration the click should last, in msec
|
||||
BUTTON_CLICK_MAX_LENGTH: '350' # The maximum duration the click should last, in msec
|
||||
BUTTON_MULTI_CLICK_DELAY: '250' # The time to wait for another click, in msec
|
||||
BUTTON_PRESS_TIMEOUT: '10000' # Ignore if button is pressed for longer than this time, in msec
|
||||
BUTTON_LONG_PRESS_DELAY: '800' # The time to wait to consider a long press, in msec
|
||||
|
||||
- id: bs_button_2
|
||||
binary_sensor:
|
||||
- &binary_sensor_button_base
|
||||
id: bs_button_2
|
||||
name: Button 2
|
||||
icon: mdi:gesture-tap-box
|
||||
internal: true
|
||||
platform: template
|
||||
on_click:
|
||||
then:
|
||||
- script.execute:
|
||||
id: button_action
|
||||
component: bs_button_2
|
||||
event: click
|
||||
on_double_click:
|
||||
then:
|
||||
- script.execute:
|
||||
id: button_action
|
||||
component: bs_button_2
|
||||
event: double_click
|
||||
on_multi_click:
|
||||
- timing: *long_click-timing
|
||||
invalid_cooldown: ${invalid_cooldown}
|
||||
then:
|
||||
- script.execute:
|
||||
id: button_action
|
||||
component: bs_button_2
|
||||
event: long_click
|
||||
internal: true
|
||||
|
||||
- id: bs_button_3
|
||||
name: Button 3
|
||||
icon: mdi:gesture-tap-box
|
||||
internal: true
|
||||
platform: template
|
||||
on_click:
|
||||
then:
|
||||
- script.execute:
|
||||
id: button_action
|
||||
component: bs_button_3
|
||||
event: click
|
||||
on_double_click:
|
||||
then:
|
||||
- script.execute:
|
||||
id: button_action
|
||||
component: bs_button_3
|
||||
event: double_click
|
||||
on_multi_click:
|
||||
- timing: *long_click-timing
|
||||
invalid_cooldown: ${invalid_cooldown}
|
||||
then:
|
||||
- script.execute:
|
||||
id: button_action
|
||||
component: bs_button_3
|
||||
event: long_click
|
||||
<<: *binary_sensor_button_base
|
||||
|
||||
- id: bs_button_4
|
||||
name: Button 4
|
||||
icon: mdi:gesture-tap-box
|
||||
internal: true
|
||||
platform: template
|
||||
on_click:
|
||||
then:
|
||||
- script.execute:
|
||||
id: button_action
|
||||
component: bs_button_4
|
||||
event: click
|
||||
on_double_click:
|
||||
then:
|
||||
- script.execute:
|
||||
id: button_action
|
||||
component: bs_button_4
|
||||
event: double_click
|
||||
on_multi_click:
|
||||
- timing: *long_click-timing
|
||||
invalid_cooldown: ${invalid_cooldown}
|
||||
then:
|
||||
- script.execute:
|
||||
id: button_action
|
||||
component: bs_button_4
|
||||
event: long_click
|
||||
<<: *binary_sensor_button_base
|
||||
|
||||
- id: bs_button_1
|
||||
name: Button 1
|
||||
internal: false
|
||||
<<: *binary_sensor_button_base
|
||||
|
||||
globals:
|
||||
- id: button_press_button
|
||||
type: uint8_t
|
||||
restore_value: false
|
||||
initial_value: '0'
|
||||
|
||||
- id: button_press_position
|
||||
type: uint8_t
|
||||
restore_value: false
|
||||
initial_value: '0'
|
||||
|
||||
- id: button_press_start_time
|
||||
type: uint32_t
|
||||
restore_value: false
|
||||
initial_value: '0'
|
||||
|
||||
- id: click_counter
|
||||
type: uint8_t
|
||||
restore_value: false
|
||||
initial_value: '0'
|
||||
|
||||
script:
|
||||
- id: !extend boot_initialize
|
||||
@@ -162,9 +104,31 @@ script:
|
||||
parameters:
|
||||
component: string
|
||||
event: string
|
||||
then: # There's nothing here so far
|
||||
# Extended by:
|
||||
# - core_api
|
||||
then:
|
||||
# Extended by:
|
||||
# - core_api
|
||||
- lambda: |-
|
||||
ESP_LOGI("core_hw_buttons", "Button '%s' action: '%s'", component.c_str(), event.c_str());
|
||||
id(button_press_button) = 0;
|
||||
id(click_counter) = 0;
|
||||
id(button_press_start_time) = 0;
|
||||
buttons_release->execute();
|
||||
|
||||
- id: button_click_event
|
||||
mode: restart
|
||||
parameters:
|
||||
button_id: uint8_t
|
||||
click_count: uint8_t
|
||||
then:
|
||||
- delay:
|
||||
milliseconds: ${BUTTON_MULTI_CLICK_DELAY}
|
||||
- lambda: |-
|
||||
const std::string button_name = "bs_button_" + std::to_string(button_id);
|
||||
std::string event_name;
|
||||
if (click_count == 1) event_name = "click";
|
||||
else if (click_count == 2) event_name = "double_click";
|
||||
else event_name = std::to_string(click_count) + "_click";
|
||||
button_action->execute(button_name.c_str(), event_name.c_str());
|
||||
|
||||
- id: buttons_release
|
||||
mode: restart
|
||||
@@ -187,42 +151,78 @@ script:
|
||||
then:
|
||||
- script.execute:
|
||||
id: touch_on_press_buttons
|
||||
touch_x: !lambda return touch_x;
|
||||
touch_position: !lambda return touch_position;
|
||||
|
||||
- id: touch_on_press_buttons
|
||||
mode: restart
|
||||
parameters:
|
||||
touch_x: uint8_t
|
||||
touch_position: uint8_t
|
||||
then:
|
||||
- lambda: |-
|
||||
id(button_press_start_time) = millis();
|
||||
id(button_press_position) = touch_position;
|
||||
uint8_t button = 0;
|
||||
auto model_index = sl_tx_model_gang->active_index();
|
||||
if (model_index.has_value()) {
|
||||
uint8_t model_idx = model_index.value() + 1;
|
||||
switch (model_idx) {
|
||||
case 1: // 1 Gang
|
||||
bs_button_1->publish_state(true);
|
||||
break;
|
||||
case 2: // 2 Gang
|
||||
if (touch_x <= 5) bs_button_1->publish_state(true);
|
||||
else bs_button_2->publish_state(true);
|
||||
break;
|
||||
case 3: // 3 Gang
|
||||
if (touch_x <= 3) bs_button_1->publish_state(true);
|
||||
else if (touch_x <= 7) bs_button_2->publish_state(true);
|
||||
else bs_button_3->publish_state(true);
|
||||
break;
|
||||
case 4: // 4 Gang
|
||||
if (touch_x <= 2) bs_button_1->publish_state(true);
|
||||
else if (touch_x <= 5) bs_button_2->publish_state(true);
|
||||
else if (touch_x <= 8) bs_button_3->publish_state(true);
|
||||
else bs_button_4->publish_state(true);
|
||||
break;
|
||||
}
|
||||
const uint8_t model_idx = model_index.value() + 1; // Increment for 1-based indexing
|
||||
if (model_idx == 1) {
|
||||
button = 1; // Single button, always 1
|
||||
} else {
|
||||
const uint8_t width = ${TOUCH_POSITION_MAX_VALUE} / model_idx; // Width of each button region
|
||||
ESP_LOGV("core_hw_buttons", "Button regions: width=%" PRIu8 ", touch_position=%" PRIu8,
|
||||
width, touch_position);
|
||||
button = (touch_position / width) + 1; // Determine button region
|
||||
if (button > model_idx)
|
||||
button = model_idx; // Clamp to max button count
|
||||
}
|
||||
}
|
||||
// Update binary sensor
|
||||
switch (button) {
|
||||
case 1:
|
||||
bs_button_1->publish_state(true);
|
||||
break;
|
||||
case 2:
|
||||
bs_button_2->publish_state(true);
|
||||
break;
|
||||
case 3:
|
||||
bs_button_3->publish_state(true);
|
||||
break;
|
||||
case 4:
|
||||
bs_button_4->publish_state(true);
|
||||
break;
|
||||
}
|
||||
// Update counters
|
||||
if (id(button_press_button) == button) {
|
||||
id(click_counter)++;
|
||||
} else {
|
||||
id(click_counter) = 1;
|
||||
id(button_press_button) = button;
|
||||
}
|
||||
|
||||
- id: !extend touch_on_release
|
||||
then:
|
||||
- script.execute: buttons_release
|
||||
- lambda: |-
|
||||
uint32_t current_time = millis();
|
||||
buttons_release->execute();
|
||||
if (id(button_press_start_time) > 0 and
|
||||
id(button_press_start_time) < current_time) {
|
||||
uint32_t press_duration = current_time - id(button_press_start_time);
|
||||
// Handle overflow (optional, since it's unlikely to happen here)
|
||||
ESP_LOGI("core_hw_buttons", "Button press duration: %" PRIu32 " ms", press_duration);
|
||||
if (press_duration < ${BUTTON_CLICK_MIN_LENGTH}) {
|
||||
ESP_LOGW("core_hw_buttons", "Ignoring button press (too short)");
|
||||
} else if (press_duration >= ${BUTTON_CLICK_MIN_LENGTH} and
|
||||
press_duration <= ${BUTTON_CLICK_MAX_LENGTH}) { // Short/normal click
|
||||
button_click_event->execute(id(button_press_button), id(click_counter));
|
||||
} else if (press_duration >= ${BUTTON_LONG_PRESS_DELAY} and press_duration <= ${BUTTON_PRESS_TIMEOUT}) {
|
||||
button_action->execute(("bs_button_" + std::to_string(id(button_press_button))).c_str(), "long_click");
|
||||
} else if (press_duration > ${BUTTON_PRESS_TIMEOUT}) { // Timeout or invalid
|
||||
ESP_LOGW("core_hw_buttons", "Button press cancelled or timed out after ${BUTTON_PRESS_TIMEOUT} ms");
|
||||
}
|
||||
} else {
|
||||
ESP_LOGW("core_hw_buttons", "Press event timestamp not recorded yet");
|
||||
}
|
||||
id(button_press_start_time) = 0;
|
||||
|
||||
- id: !extend touch_swipe_left
|
||||
then:
|
||||
|
||||
@@ -21,9 +21,9 @@ substitutions:
|
||||
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_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)
|
||||
|
||||
globals:
|
||||
- id: gb_lights_1
|
||||
@@ -34,27 +34,7 @@ globals:
|
||||
restore_value: false
|
||||
|
||||
light:
|
||||
- id: light_output_1
|
||||
name: Light output 1
|
||||
internal: true
|
||||
platform: binary
|
||||
output: output_relay_1
|
||||
- id: light_output_2
|
||||
name: Light output 2
|
||||
internal: true
|
||||
platform: binary
|
||||
output: output_relay_2
|
||||
- id: light_output_3
|
||||
name: Light output 3
|
||||
internal: true
|
||||
platform: binary
|
||||
output: output_relay_3
|
||||
- id: light_output_4
|
||||
name: Light output 4
|
||||
internal: true
|
||||
platform: binary
|
||||
output: output_relay_4
|
||||
|
||||
# These lights are controlling the LEDs on the device
|
||||
- id: light_full
|
||||
name: Light - All
|
||||
internal: true
|
||||
@@ -65,11 +45,51 @@ light:
|
||||
num_leds: 32
|
||||
pin: GPIO13
|
||||
|
||||
- id: light_eu
|
||||
# Those lights are available based on the model selections
|
||||
- &light_partition_with_effects
|
||||
id: light_eu
|
||||
name: Light
|
||||
platform: partition
|
||||
default_transition_length: ${default_transition_length}
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_effects.yaml
|
||||
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
|
||||
@@ -77,20 +97,17 @@ light:
|
||||
|
||||
- id: light_us
|
||||
name: Light
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_effects.yaml
|
||||
<<: *light_partition_with_effects
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 0
|
||||
to: 31
|
||||
|
||||
# Those lights are available based on the model selections
|
||||
- id: light_eu_bottom
|
||||
- &light_partition_with_effects_disabled
|
||||
id: light_eu_bottom
|
||||
name: Light - Bottom
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_internal.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_effects.yaml
|
||||
disabled_by_default: true
|
||||
<<: *light_partition_with_effects
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 6
|
||||
@@ -98,9 +115,7 @@ light:
|
||||
reversed: true
|
||||
- id: light_eu_left
|
||||
name: Light - Left
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_internal.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_effects.yaml
|
||||
<<: *light_partition_with_effects_disabled
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 13
|
||||
@@ -108,9 +123,7 @@ light:
|
||||
reversed: true
|
||||
- id: light_eu_right
|
||||
name: Light - Right
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_internal.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_effects.yaml
|
||||
<<: *light_partition_with_effects_disabled
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 27
|
||||
@@ -122,9 +135,7 @@ light:
|
||||
reversed: false
|
||||
- id: light_eu_top
|
||||
name: Light - Top
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_internal.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_effects.yaml
|
||||
<<: *light_partition_with_effects_disabled
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 20
|
||||
@@ -132,9 +143,7 @@ light:
|
||||
reversed: false
|
||||
- id: light_us_bottom
|
||||
name: Light - Bottom
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_internal.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_effects.yaml
|
||||
<<: *light_partition_with_effects_disabled
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 9
|
||||
@@ -142,9 +151,7 @@ light:
|
||||
reversed: true
|
||||
- id: light_us_left
|
||||
name: Light - Left
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_internal.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_effects.yaml
|
||||
<<: *light_partition_with_effects_disabled
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 15
|
||||
@@ -152,9 +159,7 @@ light:
|
||||
reversed: true
|
||||
- id: light_us_right
|
||||
name: Light - Right
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_internal.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_effects.yaml
|
||||
<<: *light_partition_with_effects_disabled
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 31
|
||||
@@ -166,444 +171,399 @@ light:
|
||||
reversed: false
|
||||
- id: light_us_top
|
||||
name: Light - Top
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_internal.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_effects.yaml
|
||||
<<: *light_partition_with_effects_disabled
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 25
|
||||
to: 30
|
||||
reversed: false
|
||||
|
||||
- id: light_00
|
||||
- &light_partition_individual_led
|
||||
id: light_00
|
||||
name: Light - LED 00
|
||||
platform: partition
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
default_transition_length: ${default_transition_length}
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 0
|
||||
to: 0
|
||||
- id: light_01
|
||||
name: Light - LED 01
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 1
|
||||
to: 1
|
||||
- id: light_02
|
||||
name: Light - LED 02
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 2
|
||||
to: 2
|
||||
- id: light_03
|
||||
name: Light - LED 03
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 3
|
||||
to: 3
|
||||
- id: light_04
|
||||
name: Light - LED 04
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 4
|
||||
to: 4
|
||||
- id: light_05
|
||||
name: Light - LED 05
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 5
|
||||
to: 5
|
||||
- id: light_06
|
||||
name: Light - LED 06
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 6
|
||||
to: 6
|
||||
- id: light_07
|
||||
name: Light - LED 07
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 7
|
||||
to: 7
|
||||
- id: light_08
|
||||
name: Light - LED 08
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 8
|
||||
to: 8
|
||||
- id: light_09
|
||||
name: Light - LED 09
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 9
|
||||
to: 9
|
||||
- id: light_10
|
||||
name: Light - LED 10
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 10
|
||||
to: 10
|
||||
- id: light_11
|
||||
name: Light - LED 11
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 11
|
||||
to: 11
|
||||
- id: light_12
|
||||
name: Light - LED 12
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 12
|
||||
to: 12
|
||||
- id: light_13
|
||||
name: Light - LED 13
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 13
|
||||
to: 13
|
||||
- id: light_14
|
||||
name: Light - LED 14
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 14
|
||||
to: 14
|
||||
- id: light_15
|
||||
name: Light - LED 15
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 15
|
||||
to: 15
|
||||
- id: light_16
|
||||
name: Light - LED 16
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 16
|
||||
to: 16
|
||||
- id: light_17
|
||||
name: Light - LED 17
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 17
|
||||
to: 17
|
||||
- id: light_18
|
||||
name: Light - LED 18
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 18
|
||||
to: 18
|
||||
- id: light_19
|
||||
name: Light - LED 19
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 19
|
||||
to: 19
|
||||
- id: light_20
|
||||
name: Light - LED 20
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 20
|
||||
to: 20
|
||||
- id: light_21
|
||||
name: Light - LED 21
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 21
|
||||
to: 21
|
||||
- id: light_22
|
||||
name: Light - LED 22
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 22
|
||||
to: 22
|
||||
- id: light_23
|
||||
name: Light - LED 23
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 23
|
||||
to: 23
|
||||
- id: light_24
|
||||
name: Light - LED 24
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 24
|
||||
to: 24
|
||||
- id: light_25
|
||||
name: Light - LED 25
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 25
|
||||
to: 25
|
||||
- id: light_26
|
||||
name: Light - LED 26
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 26
|
||||
to: 26
|
||||
- id: light_27
|
||||
name: Light - LED 27
|
||||
disabled_by_default: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 27
|
||||
to: 27
|
||||
- id: light_28
|
||||
- id: light_28 # US Model only
|
||||
name: Light - LED 28
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_internal.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
internal: true
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 28
|
||||
to: 28
|
||||
- id: light_29
|
||||
- id: light_29 # US Model only
|
||||
name: Light - LED 29
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_internal.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
internal: true
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 29
|
||||
to: 29
|
||||
- id: light_30
|
||||
- id: light_30 # US Model only
|
||||
name: Light - LED 30
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_internal.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
internal: true
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 30
|
||||
to: 30
|
||||
- id: light_31
|
||||
- id: light_31 # US Model only
|
||||
name: Light - LED 31
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_internal.yaml
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
internal: true
|
||||
<<: *light_partition_individual_led
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 31
|
||||
to: 31
|
||||
|
||||
- id: light_eu_rl_1_1_bottom
|
||||
# These lights are used to indicate relay's statuses
|
||||
- &light_partition_relays
|
||||
id: light_eu_rl_1_1_bottom
|
||||
name: Light - Relay 1 of 1 (bottom)
|
||||
platform: partition
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
default_transition_length: ${default_transition_length}
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 9
|
||||
to: 9
|
||||
- id: light_eu_rl_1_1_top
|
||||
name: Light - Relay 1 of 1 (top)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 23
|
||||
to: 23
|
||||
- id: light_eu_rl_1_2_bottom
|
||||
name: Light - Relay 1 of 2 (bottom)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 11
|
||||
to: 11
|
||||
- id: light_eu_rl_1_2_top
|
||||
name: Light - Relay 1 of 2 (top)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 21
|
||||
to: 21
|
||||
- id: light_eu_rl_2_2_bottom
|
||||
name: Light - Relay 2 of 2 (bottom)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 7
|
||||
to: 7
|
||||
- id: light_eu_rl_2_2_top
|
||||
name: Light - Relay 2 of 2 (top)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 25
|
||||
to: 25
|
||||
- id: light_eu_rl_1_3_bottom
|
||||
name: Light - Relay 1 of 3 (bottom)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 12
|
||||
to: 12
|
||||
- id: light_eu_rl_1_3_top
|
||||
name: Light - Relay 1 of 3 (top)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 20
|
||||
to: 20
|
||||
- id: light_eu_rl_2_3_bottom
|
||||
name: Light - Relay 2 of 3 (bottom)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 9
|
||||
to: 9
|
||||
- id: light_eu_rl_2_3_top
|
||||
name: Light - Relay 2 of 3 (top)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 23
|
||||
to: 23
|
||||
- id: light_eu_rl_3_3_bottom
|
||||
name: Light - Relay 3 of 3 (bottom)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 6
|
||||
to: 6
|
||||
- id: light_eu_rl_3_3_top
|
||||
name: Light - Relay 3 of 3 (top)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 26
|
||||
to: 26
|
||||
- id: light_eu_rl_1_4_bottom
|
||||
name: Light - Relay 1 of 4 (bottom)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 12
|
||||
to: 12
|
||||
- id: light_eu_rl_1_4_top
|
||||
name: Light - Relay 1 of 4 (top)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 20
|
||||
to: 20
|
||||
- id: light_eu_rl_2_4_bottom
|
||||
name: Light - Relay 2 of 4 (bottom)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 10
|
||||
to: 10
|
||||
- id: light_eu_rl_2_4_top
|
||||
name: Light - Relay 2 of 4 (top)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 22
|
||||
to: 22
|
||||
- id: light_eu_rl_3_4_bottom
|
||||
name: Light - Relay 3 of 4 (bottom)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 8
|
||||
to: 8
|
||||
- id: light_eu_rl_3_4_top
|
||||
name: Light - Relay 3 of 4 (top)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 24
|
||||
to: 24
|
||||
- id: light_eu_rl_4_4_bottom
|
||||
name: Light - Relay 4 of 4 (bottom)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 6
|
||||
to: 6
|
||||
- id: light_eu_rl_4_4_top
|
||||
name: Light - Relay 4 of 4 (top)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 26
|
||||
to: 26
|
||||
- id: light_us_rl_1_1_left
|
||||
name: Light - Relay 1 of 1 (left)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 15
|
||||
to: 24
|
||||
- id: light_us_rl_1_1_right
|
||||
name: Light - Relay 1 of 1 (right)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 31
|
||||
@@ -613,16 +573,14 @@ light:
|
||||
to: 8
|
||||
- id: light_us_rl_1_2_left
|
||||
name: Light - Relay 1 of 2 (left)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 20
|
||||
to: 24
|
||||
- id: light_us_rl_1_2_right
|
||||
name: Light - Relay 1 of 2 (right)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 31
|
||||
@@ -632,128 +590,112 @@ light:
|
||||
to: 3
|
||||
- id: light_us_rl_2_2_left
|
||||
name: Light - Relay 2 of 2 (left)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 15
|
||||
to: 19
|
||||
- id: light_us_rl_2_2_right
|
||||
name: Light - Relay 2 of 2 (right)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 4
|
||||
to: 8
|
||||
- id: light_us_rl_1_3_left
|
||||
name: Light - Relay 1 of 3 (left)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 22
|
||||
to: 23
|
||||
- id: light_us_rl_1_3_right
|
||||
name: Light - Relay 1 of 3 (right)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 0
|
||||
to: 1
|
||||
- id: light_us_rl_2_3_left
|
||||
name: Light - Relay 2 of 3 (left)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 19
|
||||
to: 20
|
||||
- id: light_us_rl_2_3_right
|
||||
name: Light - Relay 2 of 3 (right)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 3
|
||||
to: 4
|
||||
- id: light_us_rl_3_3_left
|
||||
name: Light - Relay 3 of 3 (left)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 17
|
||||
to: 18
|
||||
- id: light_us_rl_3_3_right
|
||||
name: Light - Relay 3 of 3 (right)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 6
|
||||
to: 7
|
||||
- id: light_us_rl_1_4_left
|
||||
name: Light - Relay 1 of 4 (left)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 12
|
||||
to: 12
|
||||
- id: light_us_rl_1_4_right
|
||||
name: Light - Relay 1 of 4 (right)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 31
|
||||
to: 31
|
||||
- id: light_us_rl_2_4_left
|
||||
name: Light - Relay 2 of 4 (left)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 24
|
||||
to: 24
|
||||
- id: light_us_rl_2_4_right
|
||||
name: Light - Relay 2 of 4 (right)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 2
|
||||
to: 2
|
||||
- id: light_us_rl_3_4_left
|
||||
name: Light - Relay 3 of 4 (left)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 21
|
||||
to: 21
|
||||
- id: light_us_rl_3_4_right
|
||||
name: Light - Relay 3 of 4 (right)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 4
|
||||
to: 4
|
||||
- id: light_us_rl_4_4_left
|
||||
name: Light - Relay 4 of 4 (left)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 19
|
||||
to: 19
|
||||
- id: light_us_rl_4_4_right
|
||||
name: Light - Relay 4 of 4 (right)
|
||||
internal: true
|
||||
<<: !include TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml
|
||||
<<: *light_partition_relays
|
||||
segments:
|
||||
- id: light_full
|
||||
from: 7
|
||||
@@ -817,7 +759,7 @@ script:
|
||||
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
|
||||
case 4: // 4 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 };
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
---
|
||||
platform: partition
|
||||
default_transition_length: ${default_transition_length}
|
||||
...
|
||||
@@ -1,40 +0,0 @@
|
||||
---
|
||||
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"
|
||||
...
|
||||
@@ -1,4 +0,0 @@
|
||||
---
|
||||
internal: true
|
||||
disabled_by_default: true
|
||||
...
|
||||
@@ -11,61 +11,33 @@
|
||||
##### - For normal system use, modifications to this file are NOT required. #####
|
||||
####################################################################################################
|
||||
---
|
||||
binary_sensor:
|
||||
- id: !extend bs_button_1
|
||||
on_click:
|
||||
then:
|
||||
- if:
|
||||
condition:
|
||||
- lambda: return sl_button_1_action->active_index().has_value();
|
||||
- lambda: return sl_button_1_action->active_index().value() == 1;
|
||||
- and: &button_click_no_other_click
|
||||
- lambda: return not bs_multi_touch->state;
|
||||
- lambda: return not bs_swipe_left->state;
|
||||
- lambda: return not bs_swipe_down->state;
|
||||
- lambda: return not bs_swipe_right->state;
|
||||
then:
|
||||
- switch.toggle: sw_relay_1
|
||||
|
||||
- id: !extend bs_button_2
|
||||
on_click:
|
||||
then:
|
||||
- if:
|
||||
condition:
|
||||
- lambda: return sl_button_2_action->active_index().has_value();
|
||||
- lambda: return sl_button_2_action->active_index().value() == 1;
|
||||
- and: *button_click_no_other_click
|
||||
then:
|
||||
- switch.toggle: sw_relay_2
|
||||
|
||||
- id: !extend bs_button_3
|
||||
on_click:
|
||||
then:
|
||||
- if:
|
||||
condition:
|
||||
- lambda: return sl_button_3_action->active_index().has_value();
|
||||
- lambda: return sl_button_3_action->active_index().value() == 1;
|
||||
- and: *button_click_no_other_click
|
||||
then:
|
||||
- switch.toggle: sw_relay_3
|
||||
|
||||
- id: !extend bs_button_4
|
||||
on_click:
|
||||
then:
|
||||
- if:
|
||||
condition:
|
||||
- lambda: return sl_button_4_action->active_index().has_value();
|
||||
- lambda: return sl_button_4_action->active_index().value() == 1;
|
||||
- and: *button_click_no_other_click
|
||||
then:
|
||||
- switch.toggle: sw_relay_4
|
||||
|
||||
globals:
|
||||
- id: boot_initialization_relays
|
||||
type: bool
|
||||
restore_value: false
|
||||
initial_value: 'false'
|
||||
|
||||
light:
|
||||
# These lights are used for the physical relays to be shown as lights
|
||||
- &light_binary_base
|
||||
id: light_output_1
|
||||
name: Light output 1
|
||||
output: output_relay_1
|
||||
platform: binary
|
||||
internal: true
|
||||
- id: light_output_2
|
||||
name: Light output 2
|
||||
output: output_relay_2
|
||||
<<: *light_binary_base
|
||||
- id: light_output_3
|
||||
name: Light output 3
|
||||
output: output_relay_3
|
||||
<<: *light_binary_base
|
||||
- id: light_output_4
|
||||
name: Light output 4
|
||||
output: output_relay_4
|
||||
<<: *light_binary_base
|
||||
|
||||
output:
|
||||
- id: output_relay_1
|
||||
platform: gpio
|
||||
@@ -138,6 +110,45 @@ script:
|
||||
}
|
||||
id(boot_initialization_relays) = true;
|
||||
|
||||
- id: !extend button_click_event
|
||||
then:
|
||||
- lambda: |-
|
||||
// Handle only single clicks
|
||||
if (click_count != 1)
|
||||
return;
|
||||
|
||||
// Ignore if other touch events are active
|
||||
if (bs_multi_touch->state ||
|
||||
bs_swipe_left->state ||
|
||||
bs_swipe_down->state ||
|
||||
bs_swipe_right->state) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Toggle relay if corresponding button action is enabled
|
||||
switch (button_id) {
|
||||
case 1:
|
||||
if (sl_button_1_action->active_index().has_value() and
|
||||
sl_button_1_action->active_index().value() == 1)
|
||||
sw_relay_1->toggle();
|
||||
break;
|
||||
case 2:
|
||||
if (sl_button_2_action->active_index().has_value() and
|
||||
sl_button_2_action->active_index().value() == 1)
|
||||
sw_relay_2->toggle();
|
||||
break;
|
||||
case 3:
|
||||
if (sl_button_3_action->active_index().has_value() and
|
||||
sl_button_3_action->active_index().value() == 1)
|
||||
sw_relay_3->toggle();
|
||||
break;
|
||||
case 4:
|
||||
if (sl_button_4_action->active_index().has_value() and
|
||||
sl_button_4_action->active_index().value() == 1)
|
||||
sw_relay_4->toggle();
|
||||
break;
|
||||
}
|
||||
|
||||
- id: show_relay_status
|
||||
mode: restart
|
||||
then:
|
||||
|
||||
@@ -11,6 +11,9 @@
|
||||
##### - For normal system use, modifications to this file are NOT required. #####
|
||||
####################################################################################################
|
||||
---
|
||||
substitutions:
|
||||
TOUCH_POSITION_MAX_VALUE: '10' # Maximum touch position value returned by the touch pad via uart
|
||||
|
||||
binary_sensor:
|
||||
- id: bs_multi_touch
|
||||
name: Multi-touch
|
||||
@@ -61,7 +64,7 @@ external_components:
|
||||
- source:
|
||||
type: git
|
||||
url: https://github.com/edwardtfn/TX-Ultimate-Easy
|
||||
ref: ${version}
|
||||
ref: v${version}
|
||||
refresh: 1h
|
||||
components:
|
||||
- tx_ultimate_easy
|
||||
@@ -124,7 +127,7 @@ script:
|
||||
- id: touch_on_press
|
||||
mode: restart
|
||||
parameters:
|
||||
touch_x: uint8_t
|
||||
touch_position: uint8_t
|
||||
then:
|
||||
# Extended by:
|
||||
# - HW Buttons
|
||||
@@ -203,16 +206,28 @@ tx_ultimate_easy:
|
||||
id: tx_ultimate
|
||||
uart: uart_touch
|
||||
|
||||
on_long_touch_release:
|
||||
- lambda: |-
|
||||
const uint8_t touch_position = static_cast<uint8_t>(touch.x);
|
||||
if (touch_position > ${TOUCH_POSITION_MAX_VALUE}) { // Check for valid range
|
||||
ESP_LOGE("tx_ultimate_easy", "Invalid long-touch position: %" PRIu8, touch_position);
|
||||
} else {
|
||||
ESP_LOGI("tx_ultimate_easy", "Long-touch released at position %" PRIu8, touch_position);
|
||||
}
|
||||
|
||||
on_multi_touch_release:
|
||||
- lambda: ESP_LOGI("tx_ultimate_easy", "Multi-touch released");
|
||||
- script.execute: touch_on_multi_touch_release
|
||||
|
||||
on_press:
|
||||
- lambda: |-
|
||||
ESP_LOGI("tx_ultimate_easy", "Pressed at position %" PRIu8, static_cast<uint8_t>(touch.x));
|
||||
- script.execute:
|
||||
id: touch_on_press
|
||||
touch_x: !lambda return static_cast<uint8_t>(touch.x);
|
||||
const uint8_t touch_position = static_cast<uint8_t>(touch.x);
|
||||
if (touch_position > ${TOUCH_POSITION_MAX_VALUE}) { // Check for valid range
|
||||
ESP_LOGE("tx_ultimate_easy", "Invalid touch position: %" PRIu8, touch_position);
|
||||
} else {
|
||||
ESP_LOGI("tx_ultimate_easy", "Pressed at position %" PRIu8, touch_position);
|
||||
touch_on_press->execute(touch_position);
|
||||
}
|
||||
|
||||
on_release:
|
||||
- lambda: ESP_LOGI("tx_ultimate_easy", "Released");
|
||||
@@ -233,8 +248,8 @@ tx_ultimate_easy:
|
||||
ESP_LOGD("tx_ultimate_easy", " Position: %i", touch.x);
|
||||
|
||||
uart:
|
||||
id: uart_touch
|
||||
tx_pin: GPIO19
|
||||
rx_pin: GPIO22
|
||||
baud_rate: 115200
|
||||
- id: uart_touch
|
||||
tx_pin: GPIO19
|
||||
rx_pin: GPIO22
|
||||
baud_rate: 115200
|
||||
...
|
||||
|
||||
@@ -98,17 +98,15 @@ TX Ultimate Easy offers extensive configuration options:
|
||||
We welcome contributions from the community! Here's how you can help:
|
||||
|
||||
1. Fork the repository
|
||||
2. Create a feature branch from `dev`
|
||||
2. Create a feature branch from `main`
|
||||
3. Make your changes
|
||||
4. Submit a pull request targeting the `dev` branch
|
||||
4. Submit a pull request targeting the `main` branch
|
||||
|
||||
Please ensure your code follows our standards:
|
||||
- Passes all lint checks (YAML, C++, Markdown)
|
||||
- Includes appropriate documentation
|
||||
- Follows existing code style
|
||||
|
||||
All pull requests should be made against the `dev` branch. We don't accept pull requests directly to `main` as it's reserved for stable releases.
|
||||
|
||||
## Support and Community
|
||||
|
||||
Need help? Here are your options:
|
||||
|
||||
@@ -16,7 +16,7 @@ wifi:
|
||||
packages:
|
||||
remote_package:
|
||||
url: https://github.com/edwardtfn/TX-Ultimate-Easy
|
||||
ref: dev
|
||||
ref: latest
|
||||
refresh: 30s
|
||||
files:
|
||||
- ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||
|
||||
@@ -13,6 +13,7 @@ DEPENDENCIES = ['uart']
|
||||
CONF_TX_ULTIMATE_EASY = "tx_ultimate_easy"
|
||||
|
||||
CONF_UART = "uart"
|
||||
CONF_GANG_COUNT = "gang_count"
|
||||
|
||||
CONF_ON_TOUCH_EVENT = "on_touch_event"
|
||||
CONF_ON_PRESS = "on_press"
|
||||
@@ -33,6 +34,7 @@ CONFIG_SCHEMA = cv.Schema({
|
||||
cv.GenerateID(): cv.declare_id(TxUltimateTouch),
|
||||
|
||||
cv.Required(CONF_UART): cv.use_id(uart),
|
||||
cv.Optional(CONF_GANG_COUNT, default=1): cv.int_range(min=1, max=4),
|
||||
|
||||
cv.Optional(CONF_ON_TOUCH_EVENT): automation.validate_automation(single=True),
|
||||
cv.Optional(CONF_ON_PRESS): automation.validate_automation(single=True),
|
||||
@@ -49,6 +51,9 @@ async def register_tx_ultimate_easy(var, config):
|
||||
uart_component = await cg.get_variable(config[CONF_UART])
|
||||
cg.add(var.set_uart_component(uart_component))
|
||||
|
||||
if CONF_GANG_COUNT in config:
|
||||
cg.add(var.set_gang_count(config[CONF_GANG_COUNT]))
|
||||
|
||||
if CONF_ON_TOUCH_EVENT in config:
|
||||
await automation.build_automation(
|
||||
var.get_trigger_touch_event(),
|
||||
@@ -98,6 +103,7 @@ async def register_tx_ultimate_easy(var, config):
|
||||
config[CONF_ON_LONG_TOUCH_RELEASE],
|
||||
)
|
||||
|
||||
|
||||
async def to_code(config):
|
||||
var = cg.new_Pvariable(config[CONF_ID])
|
||||
await cg.register_component(var, config)
|
||||
|
||||
@@ -48,6 +48,35 @@ namespace esphome {
|
||||
|
||||
void TxUltimateEasy::dump_config() {
|
||||
ESP_LOGCONFIG(TAG, "TX Ultimate Easy");
|
||||
ESP_LOGCONFIG(TAG, " Gang count: %" PRIu8, this->gang_count_);
|
||||
}
|
||||
|
||||
bool TxUltimateEasy::set_gang_count(const uint8_t gang_count) {
|
||||
// Hardware supports maximum of 4 touch-sensitive buttons
|
||||
if (gang_count < 1 or gang_count > 4)
|
||||
return false;
|
||||
this->gang_count_ = gang_count;
|
||||
return true;
|
||||
}
|
||||
|
||||
uint8_t TxUltimateEasy::get_button_from_position(const uint8_t position) {
|
||||
// Validate position bounds
|
||||
if (position > TOUCH_MAX_POSITION)
|
||||
return 0;
|
||||
|
||||
// Special case for single gang (only one button exists)
|
||||
if (this->gang_count_ == 1)
|
||||
return 1;
|
||||
|
||||
// Calculate button number
|
||||
const uint8_t width = (TOUCH_MAX_POSITION + 1) / this->gang_count_; // Width of each button region
|
||||
if (width < 1 or width > this->gang_count_) // Invalid width - and prevents division by zero
|
||||
return 0;
|
||||
const uint8_t button = std::min(
|
||||
static_cast<uint8_t>((position / width) + 1), // Convert position to button index
|
||||
this->gang_count_ // Clamp to max gang count
|
||||
);
|
||||
return button;
|
||||
}
|
||||
|
||||
void TxUltimateEasy::send_touch_(TouchPoint tp) {
|
||||
@@ -103,7 +132,8 @@ namespace esphome {
|
||||
state == TOUCH_STATE_SWIPE_LEFT ||
|
||||
state == TOUCH_STATE_SWIPE_RIGHT ||
|
||||
state == TOUCH_STATE_MULTI_TOUCH) &&
|
||||
(uart_received_bytes[6] >= 0 || state == TOUCH_STATE_MULTI_TOUCH);
|
||||
// Multi-touch events may have x < 0, all other events require valid x position
|
||||
(uart_received_bytes[6] >= 0 || state == TOUCH_STATE_MULTI_TOUCH);
|
||||
}
|
||||
|
||||
int TxUltimateEasy::get_touch_position_x(const std::array<int, UART_RECEIVED_BYTES_SIZE> &uart_received_bytes) {
|
||||
@@ -133,6 +163,8 @@ namespace esphome {
|
||||
TouchPoint TxUltimateEasy::get_touch_point(const std::array<int, UART_RECEIVED_BYTES_SIZE> &uart_received_bytes) {
|
||||
TouchPoint tp;
|
||||
tp.x = this->get_touch_position_x(uart_received_bytes);
|
||||
if (tp.x >= 0)
|
||||
tp.button = this->get_button_from_position(static_cast<uint8_t>(tp.x));
|
||||
tp.state = this->get_touch_state(uart_received_bytes);
|
||||
switch (tp.state) {
|
||||
case TOUCH_STATE_RELEASE:
|
||||
|
||||
@@ -13,6 +13,9 @@
|
||||
|
||||
namespace esphome {
|
||||
namespace tx_ultimate_easy {
|
||||
// Touch Max Position
|
||||
constexpr uint8_t TOUCH_MAX_POSITION = 10;
|
||||
|
||||
// Touch State Constants
|
||||
constexpr uint8_t TOUCH_STATE_RELEASE = 0x01;
|
||||
constexpr uint8_t TOUCH_STATE_PRESS = 0x02;
|
||||
@@ -32,6 +35,7 @@ namespace esphome {
|
||||
static const char *TAG = "tx_ultimate_easy";
|
||||
|
||||
struct TouchPoint {
|
||||
uint8_t button = 0;
|
||||
int8_t x = -1;
|
||||
int8_t state = -1;
|
||||
std::string state_str = "Unknown";
|
||||
@@ -53,6 +57,10 @@ namespace esphome {
|
||||
void loop() override;
|
||||
void dump_config() override;
|
||||
|
||||
uint8_t get_gang_count() { return this->gang_count_; }
|
||||
bool set_gang_count(const uint8_t gang_count);
|
||||
uint8_t get_button_from_position(const uint8_t position);
|
||||
|
||||
protected:
|
||||
void send_touch_(TouchPoint tp);
|
||||
void handle_touch(const std::array<int, UART_RECEIVED_BYTES_SIZE> &bytes);
|
||||
@@ -70,6 +78,8 @@ namespace esphome {
|
||||
Trigger<TouchPoint> trigger_multi_touch_release_;
|
||||
Trigger<TouchPoint> trigger_long_touch_release_;
|
||||
|
||||
uint8_t gang_count_ = 1;
|
||||
|
||||
}; // class TxUltimateEasy
|
||||
|
||||
} // namespace tx_ultimate_easy
|
||||
|
||||
76
versioning/README.md
Normal file
76
versioning/README.md
Normal file
@@ -0,0 +1,76 @@
|
||||
# Versioning
|
||||
|
||||
## Overview
|
||||
This project uses a time-based versioning scheme: `year.month.sequential_number`.
|
||||
The system automates version updates and tagging to ensure consistent, conflict-free management of releases.
|
||||
|
||||
### Examples
|
||||
- `2024.1.1` – First release of January 2024.
|
||||
- `2024.12.2` – Second release of December 2024.
|
||||
|
||||
## How It Works
|
||||
1. **Temporary Branch Creation**: A unique branch is created for each workflow run.
|
||||
2. **Version Update**: The workflow updates the `VERSION` and `VERSION_YAML` files using the current date and release sequence.
|
||||
3. **Commit with Marker**: Changes are committed with a `[skip-versioning]` marker to prevent triggering the workflow again.
|
||||
4. **Merge into Main**: The temporary branch is merged into `main`.
|
||||
5. **Branch Cleanup**: The temporary branch is deleted after merging.
|
||||
|
||||
## Usage
|
||||
|
||||
### Automated Workflow
|
||||
The versioning process is fully automated:
|
||||
- Developers submit their changes as usual.
|
||||
- The workflow handles version updates, tagging, and integration into `main`.
|
||||
- No manual intervention is needed for versioning.
|
||||
|
||||
### Accessing the Version in Code
|
||||
The version is accessible in the ESPHome YAML configuration file (`TX-Ultimate-Easy-ESPHome_core.yaml`) using the following syntax:
|
||||
|
||||
```yaml
|
||||
substitutions:
|
||||
version: <<: !include ../versioning/VERSION
|
||||
```
|
||||
|
||||
This ensures the correct version is dynamically included in the ESPHome setup.
|
||||
|
||||
## Benefits
|
||||
- **Clarity**: Easily track when a release occurred with meaningful version numbers.
|
||||
- **Automation**: Eliminates manual version management.
|
||||
- **Scalability**: Supports frequent updates and concurrent workflows.
|
||||
- **Traceability**: Maintains a clear history of changes through Git tags and version files.
|
||||
|
||||
## System Details
|
||||
|
||||
### Version Format
|
||||
The format `year.month.sequential_number` includes:
|
||||
- `year` (YYYY): A 4-digit number representing the year.
|
||||
- `month` (M): A number from 1 to 12 (no leading zeros).
|
||||
- `sequential_number`: A positive number incremented with each release in the same month.
|
||||
|
||||
### Validation Rules
|
||||
The `bump_version.sh` script enforces strict validation:
|
||||
- Year must be a 4-digit number.
|
||||
- Month must be 1–12 without leading zeros.
|
||||
- Sequence must be a positive number without leading zeros.
|
||||
|
||||
If validation fails, the workflow stops and provides an error message.
|
||||
|
||||
### GitHub Workflow
|
||||
The workflow is triggered automatically when:
|
||||
- Changes are pushed to `main`.
|
||||
- Developers trigger it manually using the `workflow_dispatch` event.
|
||||
|
||||
The workflow avoids infinite loops by committing changes with the `[skip-versioning]` marker.
|
||||
|
||||
## Extending the System
|
||||
Consider extending the system to:
|
||||
- Automatically generate release notes or changelogs.
|
||||
- Notify stakeholders when a new version is released.
|
||||
- Integrate versioning information into deployment pipelines.
|
||||
|
||||
## FAQ
|
||||
**Q: What happens if two workflows run concurrently?**
|
||||
A: Each workflow operates in its own temporary branch, avoiding conflicts.
|
||||
|
||||
**Q: Can I manually update the version?**
|
||||
A: Manual updates are not needed. The workflow ensures accurate, automated versioning.
|
||||
1
versioning/VERSION
Normal file
1
versioning/VERSION
Normal file
@@ -0,0 +1 @@
|
||||
2024.12.4
|
||||
1
versioning/VERSION_YAML
Normal file
1
versioning/VERSION_YAML
Normal file
@@ -0,0 +1 @@
|
||||
version: 2024.12.4
|
||||
54
versioning/bump_version.sh
Normal file
54
versioning/bump_version.sh
Normal file
@@ -0,0 +1,54 @@
|
||||
#!/bin/bash
|
||||
|
||||
VERSION_FILE="./versioning/VERSION"
|
||||
VERSION_YAML_FILE="./versioning/VERSION_YAML"
|
||||
|
||||
# Read the current version
|
||||
if [ -f "$VERSION_FILE" ]; then
|
||||
CURRENT_VERSION=$(cat "$VERSION_FILE")
|
||||
else
|
||||
CURRENT_VERSION="0.0.0" # Default if file doesn't exist
|
||||
fi
|
||||
|
||||
# Validate the current version format
|
||||
if ! [[ "$CURRENT_VERSION" =~ ^[0-9]{4}\.[0-9]{1,2}\.[0-9]+$ ]]; then
|
||||
echo "Error: Invalid version format in $VERSION_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Extract components
|
||||
CURRENT_YEAR=$(date +%Y)
|
||||
CURRENT_MONTH=$(date +%-m) # Avoid leading zero for the month
|
||||
CURRENT_SEQ=$(echo "$CURRENT_VERSION" | awk -F. '{print $3}')
|
||||
|
||||
VERSION_YEAR=$(echo "$CURRENT_VERSION" | awk -F. '{print $1}')
|
||||
VERSION_MONTH=$(echo "$CURRENT_VERSION" | awk -F. '{print $2}')
|
||||
|
||||
# Determine new version
|
||||
if [[ "$CURRENT_YEAR" == "$VERSION_YEAR" && "$CURRENT_MONTH" == "$VERSION_MONTH" ]]; then
|
||||
NEXT_SEQ=$((CURRENT_SEQ + 1))
|
||||
else
|
||||
NEXT_SEQ=1 # Reset sequence for a new month
|
||||
fi
|
||||
|
||||
NEW_VERSION="${CURRENT_YEAR}.${CURRENT_MONTH}.${NEXT_SEQ}"
|
||||
|
||||
# Update the plain text VERSION file
|
||||
echo "$NEW_VERSION" > "$VERSION_FILE"
|
||||
|
||||
# Update the YAML VERSION_YAML file
|
||||
echo "version: $NEW_VERSION" > "$VERSION_YAML_FILE"
|
||||
|
||||
# Commit and tag
|
||||
if ! git add "$VERSION_FILE" "$VERSION_YAML_FILE"; then
|
||||
echo "Error: Failed to stage version files"
|
||||
exit 1
|
||||
fi
|
||||
if ! git commit -m "Bump version to $NEW_VERSION [skip-versioning]"; then
|
||||
echo "Error: Failed to commit version bump"
|
||||
exit 1
|
||||
fi
|
||||
if ! git tag "v$NEW_VERSION"; then
|
||||
echo "Error: Failed to create version tag"
|
||||
exit 1
|
||||
fi
|
||||
Reference in New Issue
Block a user