diff --git a/.github/workflows/validate_esphome_beta.yml b/.github/workflows/validate_esphome_beta.yml index 43d5f7e..5d16d51 100644 --- a/.github/workflows/validate_esphome_beta.yml +++ b/.github/workflows/validate_esphome_beta.yml @@ -1,8 +1,7 @@ --- name: Validate ESPHome (Beta) -# yamllint disable-line rule:truthy -on: +on: # yamllint disable-line rule:truthy push: paths: - "*.yaml" diff --git a/.github/workflows/versioning.yml b/.github/workflows/versioning.yml new file mode 100644 index 0000000..c15dfb5 --- /dev/null +++ b/.github/workflows/versioning.yml @@ -0,0 +1,51 @@ +# Workflow for managing versioning, tagging, and conditional updates +--- +name: Bump Version and Tag + +on: # yamllint disable-line rule:truthy + push: + branches: + - main + 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: | + if ! git push origin main; then + echo "Failed to push to main branch" + exit 1 + fi + if ! git push origin --tags --force; then + echo "Failed to push tags" + exit 1 + fi + + - name: Conditionally Update Stable Tag + if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.update_stable == 'true' }} + run: | + git tag -f stable + git push origin stable --force +... diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml index 22374f6..0cf8b30 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml @@ -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 }; diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml deleted file mode 100644 index 9430a37..0000000 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds_light_base.yaml +++ /dev/null @@ -1,4 +0,0 @@ ---- -platform: partition -default_transition_length: ${default_transition_length} -... diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds_light_effects.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds_light_effects.yaml deleted file mode 100644 index dcdf7fb..0000000 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds_light_effects.yaml +++ /dev/null @@ -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" -... diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds_light_internal.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds_light_internal.yaml deleted file mode 100644 index 42e596a..0000000 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds_light_internal.yaml +++ /dev/null @@ -1,4 +0,0 @@ ---- -internal: true -disabled_by_default: true -... diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_relays.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_relays.yaml index e096d2a..79a92ce 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_relays.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_relays.yaml @@ -66,6 +66,27 @@ globals: 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 diff --git a/README.md b/README.md index a184ba5..80a5575 100644 --- a/README.md +++ b/README.md @@ -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: diff --git a/versioning/README.md b/versioning/README.md new file mode 100644 index 0000000..fd527fb --- /dev/null +++ b/versioning/README.md @@ -0,0 +1,66 @@ +# Versioning + +## Overview +This project uses a time-based versioning scheme: `year.month.sequential_number`. +This scheme makes it easy to identify when a version was released and provides a clear order for releases within a given month. + +### Examples +- `2024.12.01` – First release of December 2024. +- `2024.12.02` – Second release of December 2024. +- `2025.01.01` – First release of January 2025. + +## Files +- **`VERSION`**: Contains the current version of the project as plain text. +- **`bump_version.sh`**: A script to increment the version based on the current date and release sequence. +- **`README.md`**: Documentation for the versioning process. + +## Versioning Rules +1. The version format is `YYYY.MM.NN`, where: + - `YYYY` is the current year. + - `MM` is the current month (two digits). + - `NN` is the sequential release number within the month (starting at `01`). +2. On each new merge to the `main` branch: + - If the month hasn’t changed, the sequential number (`NN`) is incremented. + - If the month has changed, the sequential number resets to `01`. + +## Usage + +### Automatically Managed +The versioning process is fully integrated into the workflow. Developers do not need to manually increment or manage versions. +Simply push your changes, and the system will handle version updates and tagging automatically. + +### Access 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 used directly in the ESPHome setup without requiring manual updates. + +## Benefits of this Versioning Approach +1. **Clarity**: Each version is tied to a specific point in time, making it easy to track releases. +2. **Automation**: The process is seamless and reduces manual effort. +3. **Scalability**: Supports frequent releases while keeping the versioning system organized. +4. **Traceability**: Git tags and the `VERSION` file ensure releases are well-documented and easily accessible. + +## Extending the System +- Add more scripts to handle additional automation tasks, such as generating changelogs or notifying stakeholders of new releases. +- Enhance the `bump_version.sh` script to support different versioning schemes if needed. +- Integrate versioning information into your deployment pipelines to label builds with their corresponding version. + +## Version Validation + +The versioning system enforces strict format validation: +- Year must be a 4-digit number (YYYY) +- Month must be a 2-digit number (01-12) +- Sequence must be a 2-digit number (01-99) + +The `bump_version.sh` script includes validation checks and will fail if: +- The version format is invalid +- The sequence number would exceed 99 in a month + +### GitHub Actions Workflow Adjustment +The GitHub Actions workflow for versioning runs only when changes are merged into the `main` branch, ensuring no premature version updates during PR creation. +This behavior is automatically handled by the integrated workflow. diff --git a/versioning/bump_version.sh b/versioning/bump_version.sh new file mode 100644 index 0000000..6cd72c6 --- /dev/null +++ b/versioning/bump_version.sh @@ -0,0 +1,57 @@ +#!/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 + +# Extract components +CURRENT_YEAR=$(date +%Y) +CURRENT_MONTH=$(date +%m) +if ! [[ "$CURRENT_VERSION" =~ ^[0-9]{4}\.[0-9]{2}\.[0-9]{2}$ ]]; then + echo "Error: Invalid version format in $VERSION_FILE" + exit 1 +fi +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=$((10#$CURRENT_SEQ + 1)) + if [ $NEXT_SEQ -gt 99 ]; then + echo "Error: Sequence number would exceed 99" + exit 1 + fi + NEW_SEQ=$(printf "%02d" $NEXT_SEQ) +else + NEW_SEQ="01" # Reset sequence for a new month +fi + +NEW_VERSION="${CURRENT_YEAR}.${CURRENT_MONTH}.${NEW_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"; 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