From e47726dc4710f5f6225fc38cf27eac5f669a2a2a Mon Sep 17 00:00:00 2001 From: Edward Firmo <94725493+edwardtfn@users.noreply.github.com> Date: Sun, 5 Jan 2025 12:40:52 +0100 Subject: [PATCH] Advanced settings with granular package selection Resolves #86 --- ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml | 301 +--------------- .../TX-Ultimate-Easy-ESPHome_core_common.yaml | 323 ++++++++++++++++++ .../TX-Ultimate-Easy-ESPHome_standard.yaml | 31 -- README.md | 35 +- TX-Ultimate-Easy-ESPHome_advanced.yaml | 38 +++ 5 files changed, 396 insertions(+), 332 deletions(-) create mode 100644 ESPHome/TX-Ultimate-Easy-ESPHome_core_common.yaml create mode 100644 TX-Ultimate-Easy-ESPHome_advanced.yaml diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml index 3c7b7e2..6672dd3 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml @@ -11,310 +11,11 @@ ##### - For normal system use, modifications to this file are NOT required. ##### #################################################################################################### --- -substitutions: - name: tx-ultimate-easy - friendly_name: TX Ultimate Easy - - <<: !include ../versioning/VERSION_YAML - - TX_MODEL_FORMAT_EU_TEXT: "EU (Square, T5-xC-86)" - TX_MODEL_FORMAT_US_TEXT: "US (Rectangle, T5-xC-120)" - - TX_MODEL_1_GANG_TEXT: "1 Gang" - TX_MODEL_2_GANG_TEXT: "2 Gang" - TX_MODEL_3_GANG_TEXT: "3 Gang" - TX_MODEL_4_GANG_TEXT: "4 Gang" - - DUMP_CONFIG_CALLER_DELAY: 10s # Delay to dump config after requested - packages: # yamllint disable rule:colons + core_common: !include TX-Ultimate-Easy-ESPHome_core_common.yaml core_hw_buttons: !include TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml core_hw_leds: !include TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml core_hw_touch: !include TX-Ultimate-Easy-ESPHome_core_hw_touch.yaml # yamllint enable rule:colons - -api: - id: api_server - on_client_connected: - then: - - script.execute: dump_config_caller - - script.execute: publish_device_info - -binary_sensor: - - id: bs_pending_restart - name: Pending Restart Status - internal: false - disabled_by_default: false - platform: template - entity_category: diagnostic - device_class: problem - on_state: - then: - - lambda: |- - if (x) - ESP_LOGW("core", "Pending restart: YES"); - else - ESP_LOGCONFIG("core", "Pending restart: No"); - - script.execute: dump_config_caller - -esp32: - board: esp32dev - flash_size: 8MB - -esphome: - name: ${name} - friendly_name: ${friendly_name} - comment: TX Ultimate Easy - project: - name: "edwardtfn.tx_ultimate_easy" - version: ${version} - platformio_options: - build_flags: - - -D TX_ULTIMATE_EASY_CORE - - on_boot: - - priority: 700 - then: - - script.execute: boot_initialize - - - priority: 600 # This is where most sensors are set up. - then: - - script.execute: boot_sequence - - - priority: -100 # At this priority, pretty much everything should already be initialized. - then: - - script.execute: boot_done - -globals: - - id: is_us_model - type: bool - restore_value: true - initial_value: 'false' - - - id: gang_count - type: uint8_t - restore_value: true - initial_value: '0' - - - id: gang_count_plural_suffix - type: std::string - restore_value: true - max_restore_data_length: 3 - # initial_value: "''" - -logger: - level: DEBUG - -ota: - platform: esphome - -psram: - mode: octal - speed: 80MHz - -script: - - id: api_send_ha_event_boot - mode: queued - parameters: - type: string - then: - - homeassistant.event: - event: esphome.tx_ultimate_easy - data: - device_name: !lambda return tx_device_name->state.c_str(); - firmware: ${version} - domain: boot - type: !lambda return type.c_str(); - - - id: boot_done - mode: restart - then: - - script.execute: - id: api_send_ha_event_boot - type: done - - - id: boot_initialize - mode: restart - then: - # Extended by: - # - HW Buttons - # - HW Relays - # - HW Touch - - script.execute: - id: api_send_ha_event_boot - type: start - - wait_until: - condition: - - lambda: return sl_tx_model_format->active_index().has_value(); - - lambda: return sl_tx_model_gang->active_index().has_value(); - - lambda: |- - id(is_us_model) = (sl_tx_model_format->state == "${TX_MODEL_FORMAT_US_TEXT}"); - id(gang_count) = sl_tx_model_gang->active_index().value() + 1; - if (id(gang_count) < 1 || id(gang_count) > 4) { - ESP_LOGE("core_hw_leds", "Invalid number of gangs: %" PRIu8, id(gang_count)); - } - id(gang_count_plural_suffix) = id(gang_count) > 1 ? "s" : ""; - - - id: boot_sequence - mode: restart - then: - - script.execute: publish_device_info - - binary_sensor.template.publish: - id: bs_pending_restart - state: false - - - id: dump_config - mode: restart - then: - # Extended by all modules - - lambda: |- - // Device identification - ESP_LOGCONFIG("core", "Device friendly name: ${friendly_name}"); - ESP_LOGCONFIG("core", "Device name: ${name}"); - ESP_LOGCONFIG("core", "Device name (HA): %s", tx_device_name->state.c_str()); - ESP_LOGCONFIG("core", "Device hostname: %s", App.get_name().c_str()); - - dump_config_versions->execute(); - - // Framework detection - #ifdef USE_ARDUINO - ESP_LOGCONFIG("core", "Framework: Arduino"); - #elif defined(USE_ESP_IDF) - ESP_LOGCONFIG("core", "Framework: ESP-IDF"); - #else - ESP_LOGW("core", "Framework: UNKNOWN"); - #endif - - // Model configuration - ESP_LOGCONFIG("core", "Model format (selected): %s", sl_tx_model_format->state.c_str()); - ESP_LOGCONFIG("core", "Model format (detected): %s", id(is_us_model) ? "US" : "EU"); - ESP_LOGCONFIG("core", "Gangs (selected): %s", sl_tx_model_gang->state.c_str()); - ESP_LOGCONFIG("core", "Gangs (detected): %" PRIu8 "-Gang%s", id(gang_count), id(gang_count_plural_suffix).c_str()); - - // System state - if (bs_pending_restart->state) - ESP_LOGW("core", "Pending restart: YES"); - else - ESP_LOGCONFIG("core", "Pending restart: No"); - - - id: dump_config_caller - mode: restart - then: - - delay: ${DUMP_CONFIG_CALLER_DELAY} - - script.execute: dump_config - - script.wait: dump_config - - script.execute: dump_config_list_packages - - - id: dump_config_list_packages - mode: restart - then: - - script.wait: dump_config - - lambda: |- - ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, "Installed packages:"); - - // Identify itself - ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Core"); - - - id: dump_config_versions - mode: restart - then: - - lambda: |- - // Version information - ESP_LOGCONFIG("core", "TX Ultimate firmware version: ${version}"); - - - id: publish_device_info - mode: restart - then: - - lambda: |- - tx_fw_version->publish_state("${version}"); - tx_device_name->publish_state(App.get_name().c_str()); - -select: - - id: sl_tx_model_format - name: Model (Format) - platform: template - options: - - "${TX_MODEL_FORMAT_EU_TEXT}" - - "${TX_MODEL_FORMAT_US_TEXT}" - initial_option: "${TX_MODEL_FORMAT_EU_TEXT}" - optimistic: true - restore_value: true - internal: false - entity_category: config - disabled_by_default: false - icon: mdi:tablet-cellphone - on_value: - then: - - binary_sensor.template.publish: - id: bs_pending_restart - state: true - - lambda: |- - id(is_us_model) = (x == "${TX_MODEL_FORMAT_US_TEXT}"); - ESP_LOGI("core", "New model selected: %s", id(is_us_model) ? "US" : "EU"); - - - id: sl_tx_model_gang - name: Model (Gang) - platform: template - options: - - "${TX_MODEL_1_GANG_TEXT}" - - "${TX_MODEL_2_GANG_TEXT}" - - "${TX_MODEL_3_GANG_TEXT}" - - "${TX_MODEL_4_GANG_TEXT}" - initial_option: "${TX_MODEL_1_GANG_TEXT}" - optimistic: true - restore_value: true - internal: false - entity_category: config - disabled_by_default: false - icon: mdi:dip-switch - on_value: - then: - - binary_sensor.template.publish: - id: bs_pending_restart - state: true - - lambda: |- - id(gang_count) = static_cast(i) + 1; - ESP_LOGI("core", "New model selected: %" PRIu8 "-%s", id(gang_count), id(gang_count) > 1 ? "Gangs" : "Gang"); - tx_ultimate->set_gang_count(id(gang_count)); - -text_sensor: - - id: tx_fw_version - name: TX Ultimate Easy Firmware Version - platform: template - entity_category: diagnostic - icon: mdi:tag-text-outline - internal: false - update_interval: never - lambda: |- - return {"${version}"}; - - - id: tx_device_name - name: Device Name - platform: template - icon: mdi:identifier - entity_category: diagnostic - internal: false - disabled_by_default: false - update_interval: never - lambda: |- - return {"${name}"}; - filters: - - lambda: |- - const std::string raw_name = x; - std::string result; - bool last_was_underscore = false; - for (const char& c : raw_name) { - if (isalnum(c)) { - result += tolower(c); // Add alphanumeric characters as lowercase - last_was_underscore = false; - } else if (!last_was_underscore) { // Replace non-alphanumeric with '_' but avoid consecutive '_' - result += '_'; - last_was_underscore = true; - } - } - return result; - -wifi: - id: wifi_component ... diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_common.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_common.yaml new file mode 100644 index 0000000..150b46c --- /dev/null +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core_common.yaml @@ -0,0 +1,323 @@ +#################################################################################################### +##### TX Ultimate Easy for ESPHome ##### +##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy ##### +#################################################################################################### +##### Purpose: ESPHome Core - Common ##### +#################################################################################################### +##### Author: edwardtfn - https://github.com/edwardtfn - https://buymeacoffee.com/edwardfirmo ##### +#################################################################################################### +##### NOTE: ##### +##### - Make changes ONLY if absolutely necessary and you have the required knowledge. ##### +##### - For normal system use, modifications to this file are NOT required. ##### +#################################################################################################### +--- +substitutions: + name: tx-ultimate-easy + friendly_name: TX Ultimate Easy + + <<: !include ../versioning/VERSION_YAML + + TX_MODEL_FORMAT_EU_TEXT: "EU (Square, T5-xC-86)" + TX_MODEL_FORMAT_US_TEXT: "US (Rectangle, T5-xC-120)" + + TX_MODEL_1_GANG_TEXT: "1 Gang" + TX_MODEL_2_GANG_TEXT: "2 Gang" + TX_MODEL_3_GANG_TEXT: "3 Gang" + TX_MODEL_4_GANG_TEXT: "4 Gang" + + DUMP_CONFIG_CALLER_DELAY: 10s # Delay to dump config after requested + + +api: + id: api_server + on_client_connected: + then: + - script.execute: dump_config_caller + - script.execute: publish_device_info + +binary_sensor: + - id: bs_pending_restart + name: Pending Restart Status + internal: false + disabled_by_default: false + platform: template + entity_category: diagnostic + device_class: problem + on_state: + then: + - lambda: |- + if (x) + ESP_LOGW("core", "Pending restart: YES"); + else + ESP_LOGCONFIG("core", "Pending restart: No"); + - script.execute: dump_config_caller + +button: + - id: bt_restart + name: Restart + internal: false + platform: restart + +esp32: + board: esp32dev + flash_size: 8MB + +esphome: + name: ${name} + friendly_name: ${friendly_name} + comment: TX Ultimate Easy + project: + name: "edwardtfn.tx_ultimate_easy" + version: ${version} + platformio_options: + build_flags: + - -D TX_ULTIMATE_EASY_CORE + + on_boot: + - priority: 700 + then: + - script.execute: boot_initialize + + - priority: 600 # This is where most sensors are set up. + then: + - script.execute: boot_sequence + + - priority: -100 # At this priority, pretty much everything should already be initialized. + then: + - script.execute: boot_done + +globals: + - id: is_us_model + type: bool + restore_value: true + initial_value: 'false' + + - id: gang_count + type: uint8_t + restore_value: true + initial_value: '0' + + - id: gang_count_plural_suffix + type: std::string + restore_value: true + max_restore_data_length: 3 + # initial_value: "''" + +logger: + level: DEBUG + +ota: + platform: esphome + +psram: + mode: octal + speed: 80MHz + +script: + - id: api_send_ha_event_boot + mode: queued + parameters: + type: string + then: + - homeassistant.event: + event: esphome.tx_ultimate_easy + data: + device_name: !lambda return tx_device_name->state.c_str(); + firmware: ${version} + domain: boot + type: !lambda return type.c_str(); + + - id: boot_done + mode: restart + then: + - script.execute: + id: api_send_ha_event_boot + type: done + + - id: boot_initialize + mode: restart + then: + # Extended by: + # - HW Buttons + # - HW Relays + # - HW Touch + - script.execute: + id: api_send_ha_event_boot + type: start + - wait_until: + condition: + - lambda: return sl_tx_model_format->active_index().has_value(); + - lambda: return sl_tx_model_gang->active_index().has_value(); + - lambda: |- + id(is_us_model) = (sl_tx_model_format->state == "${TX_MODEL_FORMAT_US_TEXT}"); + id(gang_count) = sl_tx_model_gang->active_index().value() + 1; + if (id(gang_count) < 1 || id(gang_count) > 4) { + ESP_LOGE("core_hw_leds", "Invalid number of gangs: %" PRIu8, id(gang_count)); + } + id(gang_count_plural_suffix) = id(gang_count) > 1 ? "s" : ""; + + - id: boot_sequence + mode: restart + then: + - script.execute: publish_device_info + - binary_sensor.template.publish: + id: bs_pending_restart + state: false + + - id: dump_config + mode: restart + then: + # Extended by all modules + - lambda: |- + // Device identification + ESP_LOGCONFIG("core", "Device friendly name: ${friendly_name}"); + ESP_LOGCONFIG("core", "Device name: ${name}"); + ESP_LOGCONFIG("core", "Device name (HA): %s", tx_device_name->state.c_str()); + ESP_LOGCONFIG("core", "Device hostname: %s", App.get_name().c_str()); + + dump_config_versions->execute(); + + // Framework detection + #ifdef USE_ARDUINO + ESP_LOGCONFIG("core", "Framework: Arduino"); + #elif defined(USE_ESP_IDF) + ESP_LOGCONFIG("core", "Framework: ESP-IDF"); + #else + ESP_LOGW("core", "Framework: UNKNOWN"); + #endif + + // Model configuration + ESP_LOGCONFIG("core", "Model format (selected): %s", sl_tx_model_format->state.c_str()); + ESP_LOGCONFIG("core", "Model format (detected): %s", id(is_us_model) ? "US" : "EU"); + ESP_LOGCONFIG("core", "Gangs (selected): %s", sl_tx_model_gang->state.c_str()); + ESP_LOGCONFIG("core", "Gangs (detected): %" PRIu8 "-Gang%s", id(gang_count), id(gang_count_plural_suffix).c_str()); + + // System state + if (bs_pending_restart->state) + ESP_LOGW("core", "Pending restart: YES"); + else + ESP_LOGCONFIG("core", "Pending restart: No"); + + - id: dump_config_caller + mode: restart + then: + - delay: ${DUMP_CONFIG_CALLER_DELAY} + - script.execute: dump_config + - script.wait: dump_config + - script.execute: dump_config_list_packages + + - id: dump_config_list_packages + mode: restart + then: + - script.wait: dump_config + - lambda: |- + ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, "Installed packages:"); + + // Identify itself + ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Core"); + + - id: dump_config_versions + mode: restart + then: + - lambda: |- + // Version information + ESP_LOGCONFIG("core", "TX Ultimate firmware version: ${version}"); + // ESPHome builder information + ESP_LOGCONFIG("core", "ESPHome builder: " ESPHOME_VERSION); + ESP_LOGCONFIG("core", "ESPHome build timestamp: %s", App.get_compilation_time().c_str()); + + - id: publish_device_info + mode: restart + then: + - lambda: |- + tx_fw_version->publish_state("${version}"); + tx_device_name->publish_state(App.get_name().c_str()); + +select: + - id: sl_tx_model_format + name: Model (Format) + platform: template + options: + - "${TX_MODEL_FORMAT_EU_TEXT}" + - "${TX_MODEL_FORMAT_US_TEXT}" + initial_option: "${TX_MODEL_FORMAT_EU_TEXT}" + optimistic: true + restore_value: true + internal: false + entity_category: config + disabled_by_default: false + icon: mdi:tablet-cellphone + on_value: + then: + - binary_sensor.template.publish: + id: bs_pending_restart + state: true + - lambda: |- + id(is_us_model) = (x == "${TX_MODEL_FORMAT_US_TEXT}"); + ESP_LOGI("core", "New model selected: %s", id(is_us_model) ? "US" : "EU"); + + - id: sl_tx_model_gang + name: Model (Gang) + platform: template + options: + - "${TX_MODEL_1_GANG_TEXT}" + - "${TX_MODEL_2_GANG_TEXT}" + - "${TX_MODEL_3_GANG_TEXT}" + - "${TX_MODEL_4_GANG_TEXT}" + initial_option: "${TX_MODEL_1_GANG_TEXT}" + optimistic: true + restore_value: true + internal: false + entity_category: config + disabled_by_default: false + icon: mdi:dip-switch + on_value: + then: + - binary_sensor.template.publish: + id: bs_pending_restart + state: true + - lambda: |- + id(gang_count) = static_cast(i) + 1; + ESP_LOGI("core", "New model selected: %" PRIu8 "-%s", id(gang_count), id(gang_count) > 1 ? "Gangs" : "Gang"); + tx_ultimate->set_gang_count(id(gang_count)); + +text_sensor: + - id: tx_fw_version + name: TX Ultimate Easy Firmware Version + platform: template + entity_category: diagnostic + icon: mdi:tag-text-outline + internal: false + update_interval: never + lambda: |- + return {"${version}"}; + + - id: tx_device_name + name: Device Name + platform: template + icon: mdi:identifier + entity_category: diagnostic + internal: false + disabled_by_default: false + update_interval: never + lambda: |- + return {"${name}"}; + filters: + - lambda: |- + const std::string raw_name = x; + std::string result; + bool last_was_underscore = false; + for (const char& c : raw_name) { + if (isalnum(c)) { + result += tolower(c); // Add alphanumeric characters as lowercase + last_was_underscore = false; + } else if (!last_was_underscore) { // Replace non-alphanumeric with '_' but avoid consecutive '_' + result += '_'; + last_was_underscore = true; + } + } + return result; + +wifi: + id: wifi_component +... diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml index a8766d3..17cbe16 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml @@ -17,35 +17,4 @@ packages: standard_hw_vibration: !include TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml standard_media_player: !include TX-Ultimate-Easy-ESPHome_standard_media_player.yaml # yamllint enable rule:colons - -button: - - id: bt_restart - name: Restart - internal: false - platform: restart - -esphome: - platformio_options: - build_flags: - - -D TX_ULTIMATE_EASY_STANDARD - -script: - - id: !extend dump_config_list_packages - then: - - script.wait: dump_config - - lambda: |- - // Check for requirements - #if !defined(TX_ULTIMATE_EASY_CORE) - #error "The package TX-Ultimate-Easy-ESPHome_core.yaml is required." - #endif - - // Identify itself - ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Standard"); - - - id: !extend dump_config_versions - then: - - lambda: |- - // Version information - ESP_LOGCONFIG("standard", "ESPHome builder: " ESPHOME_VERSION); - ESP_LOGCONFIG("standard", "ESPHome build timestamp: %s", App.get_compilation_time().c_str()); ... diff --git a/README.md b/README.md index d282d26..986fe8a 100644 --- a/README.md +++ b/README.md @@ -134,7 +134,7 @@ Follow these steps to get your TX Ultimate device up and running with ESPHome. ``` **Notes:** - [Click here](https://github.com/edwardtfn/TX-Ultimate-Easy/tags) for a full list of versions available. - - [Click here](https://github.com/edwardtfn/TX-Ultimate-Easy/blob/main/TX-Ultimate-Easy-ESPHome.yaml) + - [Click here](TX-Ultimate-Easy-ESPHome.yaml) for the latest version of this yaml. 5. Click "Save" and then "Install" @@ -151,6 +151,39 @@ Follow these steps to get your TX Ultimate device up and running with ESPHome. > ap: # Access point configuration > ``` +### Advanced Settings +For more granular control over components, you can use our [advanced configuration template](TX-Ultimate-Easy-ESPHome_advanced.yaml). This template allows you to selectively include specific packages, which can be useful for: + +- Troubleshooting specific components +- Reducing memory usage by excluding unused features +- Customizing functionality for specific use cases + +Here's an example of the advanced configuration: +```yaml +packages: + remote_package: + url: https://github.com/edwardtfn/TX-Ultimate-Easy + ref: stable + refresh: 5min + files: + # Core (essential) packages + - ESPHome/TX-Ultimate-Easy-ESPHome_core_common.yaml # Basic shared settings + - ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml # Button logic + - ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml # LED configuration + - ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_touch.yaml # Touch panel support + + # Optional but recommended packages + - ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml # Relay control + - ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml # Haptic feedback + + # Audio options (use none or choose only one - using both will fail) + - ESPHome/TX-Ultimate-Easy-ESPHome_standard_media_player.yaml # Media player (Recommended for most users) + # - ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml # Basic speaker +``` + +> [!NOTE] +> Use the advanced configuration with caution. Excluding core packages may cause instability or reduced functionality. + ### Device Flashing Initial flashing must be done via serial connection. diff --git a/TX-Ultimate-Easy-ESPHome_advanced.yaml b/TX-Ultimate-Easy-ESPHome_advanced.yaml new file mode 100644 index 0000000..eb66df9 --- /dev/null +++ b/TX-Ultimate-Easy-ESPHome_advanced.yaml @@ -0,0 +1,38 @@ +#################################################################################################### +##### TX Ultimate Easy for ESPHome ##### +##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy ##### +#################################################################################################### +##### Author: edwardtfn - https://github.com/edwardtfn - https://buymeacoffee.com/edwardfirmo ##### +#################################################################################################### +##### WARNING: This is an advanced configuration template. Use with caution as improper ##### +##### configuration may lead to reduced functionality or system instability. ##### +#################################################################################################### +--- +substitutions: + name: tx-ultimate-easy-adv + friendly_name: TX Ultimate Easy Advanced + +wifi: + ssid: !secret wifi_ssid + password: !secret wifi_password + +packages: + remote_package: + url: https://github.com/edwardtfn/TX-Ultimate-Easy + ref: stable # Or you can specify a version, like `ref: v2024.12.6` or `ref: latest` to the latest non-stable + refresh: 5min + files: + # Core (essential) packages - Do not disable these unless you know what you're doing + - ESPHome/TX-Ultimate-Easy-ESPHome_core_common.yaml # Basic shared settings + - ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml # Button logic + - ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml # LED configuration + - ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_touch.yaml # Touch panel support + + # Optional functionality - Can be enabled/disabled as needed + - ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml # Relay control + - ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml # Haptic feedback + + # Audio options (use none or choose only one - using both will fail) + - ESPHome/TX-Ultimate-Easy-ESPHome_standard_media_player.yaml # Media player (Recommended for most users) + # - ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml # Basic speaker +...