diff --git a/.github/workflows/validate_esphome_beta.yml b/.github/workflows/validate_esphome_beta.yml index bd40471..dedada4 100644 --- a/.github/workflows/validate_esphome_beta.yml +++ b/.github/workflows/validate_esphome_beta.yml @@ -8,10 +8,22 @@ permissions: on: # yamllint disable-line rule:truthy push: paths: - - "**/*.{yml,yaml,h,cpp,c,py}" # Match any file with the extensions in any directory + - "**/*.yml" + - "**/*.yaml" + - "**/*.h" + - "**/*.cpp" + - "**/*.c" + - "**/*.py" + pull_request: paths: - - "**/*.{yml,yaml,h,cpp,c,py}" # Match any file with the extensions in any directory + - "**/*.yml" + - "**/*.yaml" + - "**/*.h" + - "**/*.cpp" + - "**/*.c" + - "**/*.py" + workflow_dispatch: concurrency: diff --git a/.github/workflows/versioning.yml b/.github/workflows/versioning.yml index 31a94d5..ea3c246 100644 --- a/.github/workflows/versioning.yml +++ b/.github/workflows/versioning.yml @@ -4,7 +4,6 @@ # 2. Manual dispatch - allows independent control over stable and latest tags --- - name: Version and Tags on: # yamllint disable-line rule:truthy @@ -56,10 +55,9 @@ jobs: - name: Update stable tag if: | - success() && ( - github.event_name == 'workflow_dispatch' && inputs.update_stable || - github.event_name == 'push' - ) + success() && + github.event_name == 'workflow_dispatch' && + inputs.update_stable run: | # Verify version bump was successful if [ ! -f "./versioning/VERSION" ]; then diff --git a/.test/common.yaml b/.test/common.yaml new file mode 100644 index 0000000..ef08688 --- /dev/null +++ b/.test/common.yaml @@ -0,0 +1,5 @@ +--- +wifi: + ssid: !secret wifi_ssid + password: !secret wifi_password +... diff --git a/.test/common_ard.yaml b/.test/common_ard.yaml new file mode 100644 index 0000000..fbd0402 --- /dev/null +++ b/.test/common_ard.yaml @@ -0,0 +1,8 @@ +--- +packages: + common: !include common.yaml + +esp32: + framework: + type: arduino +... diff --git a/.test/common_idf.yaml b/.test/common_idf.yaml new file mode 100644 index 0000000..fb9297c --- /dev/null +++ b/.test/common_idf.yaml @@ -0,0 +1,19 @@ +--- +packages: + common: !include common.yaml + +esp32: + framework: + type: esp-idf + +light: + - id: !extend light_full + platform: esp32_rmt_led_strip + rgb_order: GRB + rmt_channel: 1 + chipset: ws2812 + max_refresh_rate: 33ms + use_psram: false + type: !remove + variant: !remove +... diff --git a/.test/common_idf53.yaml b/.test/common_idf53.yaml new file mode 100644 index 0000000..f2b9b5d --- /dev/null +++ b/.test/common_idf53.yaml @@ -0,0 +1,10 @@ +--- +packages: + common_idf: !include common_idf.yaml + +esp32: + framework: + type: esp-idf + version: 5.3.1 + platform_version: 6.9.0 +... diff --git a/.test/esphome_ard_basic.yaml b/.test/esphome_ard_basic.yaml index 20554a4..505acee 100644 --- a/.test/esphome_ard_basic.yaml +++ b/.test/esphome_ard_basic.yaml @@ -1,13 +1,6 @@ --- packages: + common_arduino: !include common_ard.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml standard_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml - -esp32: - framework: - type: arduino - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password ... diff --git a/.test/esphome_ard_ble_proxy.yaml b/.test/esphome_ard_ble_proxy.yaml index 86cc07c..097e273 100644 --- a/.test/esphome_ard_ble_proxy.yaml +++ b/.test/esphome_ard_ble_proxy.yaml @@ -1,14 +1,7 @@ --- packages: + common_arduino: !include common_ard.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml standard_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml addon_bluetooth_proxy: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml - -esp32: - framework: - type: arduino - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password ... diff --git a/.test/esphome_ard_core.yaml b/.test/esphome_ard_core.yaml index 1b50c90..6b9bdba 100644 --- a/.test/esphome_ard_core.yaml +++ b/.test/esphome_ard_core.yaml @@ -1,12 +1,5 @@ --- packages: + common_arduino: !include common_ard.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml - -esp32: - framework: - type: arduino - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password ... diff --git a/.test/esphome_ard_hw_relays.yaml b/.test/esphome_ard_hw_relays.yaml index 704ac7d..b12f6fe 100644 --- a/.test/esphome_ard_hw_relays.yaml +++ b/.test/esphome_ard_hw_relays.yaml @@ -1,13 +1,6 @@ --- packages: + common_arduino: !include common_ard.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml standard_hw_relays_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml - -esp32: - framework: - type: arduino - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password ... diff --git a/.test/esphome_ard_hw_speaker.yaml b/.test/esphome_ard_hw_speaker.yaml index 62272ca..e054db8 100644 --- a/.test/esphome_ard_hw_speaker.yaml +++ b/.test/esphome_ard_hw_speaker.yaml @@ -1,13 +1,6 @@ --- packages: + common_arduino: !include common_ard.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml standard_hw_speaker_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml - -esp32: - framework: - type: arduino - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password ... diff --git a/.test/esphome_ard_hw_vibration.yaml b/.test/esphome_ard_hw_vibration.yaml index 5dbacea..b0f06f6 100644 --- a/.test/esphome_ard_hw_vibration.yaml +++ b/.test/esphome_ard_hw_vibration.yaml @@ -1,13 +1,6 @@ --- packages: + common_arduino: !include common_ard.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml standard_hw_vibration_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml - -esp32: - framework: - type: arduino - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password ... diff --git a/.test/esphome_ard_media_player.yaml b/.test/esphome_ard_media_player.yaml index 9a9f744..f12a529 100644 --- a/.test/esphome_ard_media_player.yaml +++ b/.test/esphome_ard_media_player.yaml @@ -1,15 +1,8 @@ --- packages: + common_arduino: !include common_ard.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml standard_hw_relays_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml standard_hw_vibration_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml addon_media_player: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_addon_media_player.yaml - -esp32: - framework: - type: arduino - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password ... diff --git a/.test/esphome_idf53_basic.yaml b/.test/esphome_idf53_basic.yaml index 1dabf1f..10024d4 100644 --- a/.test/esphome_idf53_basic.yaml +++ b/.test/esphome_idf53_basic.yaml @@ -1,15 +1,11 @@ --- packages: + common_idf53: !include common_idf53.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml standard_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml -esp32: - framework: - type: esp-idf - version: 5.3.1 - platform_version: 6.9.0 +media_player: !remove -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password +switch: + - id: !remove sw_speaker_amplifier ... diff --git a/.test/esphome_idf53_ble_proxy.yaml b/.test/esphome_idf53_ble_proxy.yaml index b17b6d2..5acf57b 100644 --- a/.test/esphome_idf53_ble_proxy.yaml +++ b/.test/esphome_idf53_ble_proxy.yaml @@ -1,5 +1,6 @@ --- packages: + common: !include common.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml standard_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml addon_bluetooth_proxy: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml @@ -9,8 +10,4 @@ esp32: type: esp-idf version: 5.3.1 platform_version: 6.9.0 - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password ... diff --git a/.test/esphome_idf53_core.yaml b/.test/esphome_idf53_core.yaml index 18239c7..82b38fc 100644 --- a/.test/esphome_idf53_core.yaml +++ b/.test/esphome_idf53_core.yaml @@ -1,14 +1,5 @@ --- packages: + common_idf53: !include common_idf53.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml - -esp32: - framework: - type: esp-idf - version: 5.3.1 - platform_version: 6.9.0 - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password ... diff --git a/.test/esphome_idf53_hw_relays.yaml b/.test/esphome_idf53_hw_relays.yaml index d9f5bd0..628bb79 100644 --- a/.test/esphome_idf53_hw_relays.yaml +++ b/.test/esphome_idf53_hw_relays.yaml @@ -1,15 +1,6 @@ --- packages: + common_idf53: !include common_idf53.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml standard_hw_relays_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml - -esp32: - framework: - type: esp-idf - version: 5.3.1 - platform_version: 6.9.0 - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password ... diff --git a/.test/esphome_idf53_hw_speaker.yaml b/.test/esphome_idf53_hw_speaker.yaml index 651ac37..4b4581f 100644 --- a/.test/esphome_idf53_hw_speaker.yaml +++ b/.test/esphome_idf53_hw_speaker.yaml @@ -1,15 +1,6 @@ --- packages: + common_idf53: !include common_idf53.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml standard_hw_speaker_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml - -esp32: - framework: - type: esp-idf - version: 5.3.1 - platform_version: 6.9.0 - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password ... diff --git a/.test/esphome_idf53_hw_vibration.yaml b/.test/esphome_idf53_hw_vibration.yaml index d0a5ed3..1bc90ad 100644 --- a/.test/esphome_idf53_hw_vibration.yaml +++ b/.test/esphome_idf53_hw_vibration.yaml @@ -1,15 +1,6 @@ --- packages: + common_idf53: !include common_idf53.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml standard_hw_vibration_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml - -esp32: - framework: - type: esp-idf - version: 5.3.1 - platform_version: 6.9.0 - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password ... diff --git a/.test/esphome_idf_basic.yaml b/.test/esphome_idf_basic.yaml index ab3d202..82e7f09 100644 --- a/.test/esphome_idf_basic.yaml +++ b/.test/esphome_idf_basic.yaml @@ -1,13 +1,11 @@ --- packages: + common_idf: !include common_idf.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml standard_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml -esp32: - framework: - type: esp-idf +media_player: !remove -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password +switch: + - id: !remove sw_speaker_amplifier ... diff --git a/.test/esphome_idf_ble_proxy.yaml b/.test/esphome_idf_ble_proxy.yaml index c972d0f..dc303a6 100644 --- a/.test/esphome_idf_ble_proxy.yaml +++ b/.test/esphome_idf_ble_proxy.yaml @@ -1,14 +1,7 @@ --- packages: + common: !include common.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml standard_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml addon_bluetooth_proxy: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml - -esp32: - framework: - type: esp-idf - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password ... diff --git a/.test/esphome_idf_core.yaml b/.test/esphome_idf_core.yaml index 846889a..6cb4742 100644 --- a/.test/esphome_idf_core.yaml +++ b/.test/esphome_idf_core.yaml @@ -1,12 +1,5 @@ --- packages: + common_idf: !include common_idf.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml - -esp32: - framework: - type: esp-idf - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password ... diff --git a/.test/esphome_idf_hw_relays.yaml b/.test/esphome_idf_hw_relays.yaml index d78b1b4..b746d8a 100644 --- a/.test/esphome_idf_hw_relays.yaml +++ b/.test/esphome_idf_hw_relays.yaml @@ -1,13 +1,6 @@ --- packages: + common_idf: !include common_idf.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml standard_hw_relays_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml - -esp32: - framework: - type: esp-idf - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password ... diff --git a/.test/esphome_idf_hw_speaker.yaml b/.test/esphome_idf_hw_speaker.yaml index 8bcf3ff..2ce797a 100644 --- a/.test/esphome_idf_hw_speaker.yaml +++ b/.test/esphome_idf_hw_speaker.yaml @@ -1,13 +1,6 @@ --- packages: + common_idf: !include common_idf.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml standard_hw_speaker_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml - -esp32: - framework: - type: esp-idf - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password ... diff --git a/.test/esphome_idf_hw_vibration.yaml b/.test/esphome_idf_hw_vibration.yaml index 8ac9039..30d7358 100644 --- a/.test/esphome_idf_hw_vibration.yaml +++ b/.test/esphome_idf_hw_vibration.yaml @@ -1,13 +1,6 @@ --- packages: + common_idf: !include common_idf.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml standard_hw_vibration_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml - -esp32: - framework: - type: esp-idf - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password ... diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome.yaml new file mode 100644 index 0000000..061c27c --- /dev/null +++ b/ESPHome/TX-Ultimate-Easy-ESPHome.yaml @@ -0,0 +1,19 @@ +#################################################################################################### +##### TX Ultimate Easy for ESPHome ##### +##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy ##### +#################################################################################################### +##### Purpose: ESPHome Basic (includes core plus non-essential, but recommended packages) ##### +#################################################################################################### +##### 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. ##### +#################################################################################################### +--- +packages: + # yamllint disable rule:colons + core: !include TX-Ultimate-Easy-ESPHome_core.yaml + standard: !include TX-Ultimate-Easy-ESPHome_standard.yaml + # yamllint enable rule:colons +... diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml index 1346efb..292ed0a 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml @@ -11,13 +11,35 @@ ##### - For normal system use, modifications to this file are NOT required. ##### #################################################################################################### --- +packages: + standard_hw_speaker: !include TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml + bluetooth_proxy: +esp32: + framework: + type: esp-idf + esphome: platformio_options: build_flags: - -D TX_ULTIMATE_EASY_ADDON_BLE_PROXY +i2s_audio: !remove + +light: + - id: !extend light_full + platform: esp32_rmt_led_strip + rgb_order: GRB + rmt_channel: 1 + chipset: ws2812 + max_refresh_rate: 33ms + use_psram: false + type: !remove + variant: !remove + +media_player: !remove + script: - id: !extend dump_config_list_packages then: @@ -30,4 +52,7 @@ script: // Identify itself ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Add-on - BLE Proxy"); + +switch: + - id: !remove sw_speaker_amplifier ... diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml index 843ca1a..6672dd3 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml @@ -11,312 +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 # adafruit_feather_esp32_v2 # esp32dev - flash_size: 8MB - framework: - type: esp-idf - -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_core_hw_leds.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml index 62579f7..76e3bf6 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml @@ -47,15 +47,12 @@ light: - id: light_full name: Light - All internal: true - platform: esp32_rmt_led_strip - rgb_order: GRB - rmt_channel: 1 - chipset: ws2812 num_leds: 32 pin: GPIO13 restore_mode: ${LIGHT_FULL_RESTORE_MODE} - max_refresh_rate: 33ms - use_psram: true + platform: neopixelbus + type: GRB + variant: WS2811 # Those lights are available based on the model selections - &light_partition_with_effects diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml index 0d9c0a7..17cbe16 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml @@ -13,60 +13,8 @@ --- packages: # yamllint disable rule:colons - core_hw_relays: !include TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml - core_hw_speaker: !include TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml - core_hw_vibration: !include TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml + standard_hw_relays: !include TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml + 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 - -captive_portal: - id: ap_captive_portal - -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: %s", esphome_fw_version->state.c_str()); - -improv_serial: - id: serial_improv - -text_sensor: - - id: esphome_fw_version - name: ESPHome Version - platform: version - entity_category: diagnostic - internal: false - -time: - - id: time_source - platform: homeassistant - -web_server: - -wifi: - ap: ... diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_standard_media_player.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_standard_media_player.yaml new file mode 100644 index 0000000..32a8eb5 --- /dev/null +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_standard_media_player.yaml @@ -0,0 +1,64 @@ +#################################################################################################### +##### TX Ultimate Easy for ESPHome ##### +##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy ##### +#################################################################################################### +##### Purpose: ESPHome - Add-on - Media player ##### +#################################################################################################### +##### 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. ##### +#################################################################################################### +--- +packages: + standard_hw_audio: !include TX-Ultimate-Easy-ESPHome_standard_hw_audio.yaml + +esphome: + platformio_options: + build_flags: + - -D TX_ULTIMATE_EASY_ADDON_MEDIA_PLAYER + +media_player: + - id: mp_media_player + name: Media Player + internal: false + platform: i2s_audio + i2s_dout_pin: GPIO15 + i2s_audio_id: if_i2s_audio + i2s_comm_fmt: msb + dac_type: external + mode: mono + mute_pin: + number: GPIO26 + inverted: true + allow_other_uses: true + +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 + #if !defined(TX_ULTIMATE_EASY_STANDARD_HW_AUDIO) + #error "The package TX-Ultimate-Easy-ESPHome_standard_hw_audio.yaml is required." + #endif + + // Identify itself + ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Add-on - Media Player"); + +switch: + - id: sw_speaker_amplifier + name: Speaker - Amplifier + platform: gpio + pin: + number: GPIO26 + inverted: true + allow_other_uses: true + restore_mode: RESTORE_DEFAULT_ON + internal: true + entity_category: config +... diff --git a/README.md b/README.md index 4922e5d..c7f64d0 100644 --- a/README.md +++ b/README.md @@ -111,28 +111,81 @@ Follow these steps to get your TX Ultimate device up and running with ESPHome. 4. Copy this basic configuration to your new device: ```yaml substitutions: - name: tx-ultimate-easy # Change this to your device name + name: tx-ultimate-easy friendly_name: TX Ultimate Easy - - packages: - remote_package: - url: https://github.com/edwardtfn/TX-Ultimate-Easy - ref: main # For latest stable release - files: - - TX-Ultimate-Easy-ESPHome.yaml - + 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: + - ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml # Core (essential) packages + - ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml # Non-essential, but recommended packages + # - ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml # Adds BLE proxy support + ``` You can also use a specific version tag for better control over updates: ```yaml ref: v2024.12.2 # Using specific version for controlled updates ``` - **Note:** [Click here](https://github.com/edwardtfn/TX-Ultimate-Easy/tags) for a full list of versions available. + **Notes:** + - [Click here](https://github.com/edwardtfn/TX-Ultimate-Easy/tags) for a full list of versions available. + - [Click here](TX-Ultimate-Easy-ESPHome.yaml) + for the latest version of this yaml. 5. Click "Save" and then "Install" +> [!IMPORTANT] +> Starting from version 2025.1.0, non-essential components like `web_server`, `captive_portal`, and `wifi` +> are no longer included in the core package. If you need these components, +> you must add them manually to your local configuration file. +> For example: +> ```yaml +> # Add these to your configuration if needed +> web_server: +> captive_portal: +> wifi: +> 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 # 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 + - 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.yaml b/TX-Ultimate-Easy-ESPHome.yaml index f8cff7b..6653f8e 100644 --- a/TX-Ultimate-Easy-ESPHome.yaml +++ b/TX-Ultimate-Easy-ESPHome.yaml @@ -16,11 +16,10 @@ wifi: packages: remote_package: url: https://github.com/edwardtfn/TX-Ultimate-Easy - ref: latest # Or you can specify a version, like `ref: v2024.12.6` + ref: stable # Or you can specify a version, like `ref: v2024.12.6` or `ref: latest` to the latest non-stable refresh: 5min files: - ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml # Core (essential) packages - ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml # Non-essential, but recommended packages # - ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml # Adds BLE proxy support - # - ESPHome/TX-Ultimate-Easy-ESPHome_addon_media_player.yaml # Adds experimental Media Player (limited) ... diff --git a/TX-Ultimate-Easy-ESPHome_advanced.yaml b/TX-Ultimate-Easy-ESPHome_advanced.yaml new file mode 100644 index 0000000..9ffd141 --- /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 +... diff --git a/components/tx_ultimate_easy/__init__.py b/components/tx_ultimate_easy/__init__.py index 7120ead..eef1a13 100644 --- a/components/tx_ultimate_easy/__init__.py +++ b/components/tx_ultimate_easy/__init__.py @@ -109,3 +109,17 @@ async def to_code(config): await cg.register_component(var, config) await uart.register_uart_device(var, config) await register_tx_ultimate_easy(var, config) + + if CORE.using_esp_idf: + add_idf_sdkconfig_option("CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST", True) + add_idf_sdkconfig_option("CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY", True) + add_idf_sdkconfig_option("CONFIG_ESP32_REV_MIN_3", True) + add_idf_sdkconfig_option("CONFIG_MBEDTLS_DYNAMIC_BUFFER", True) + add_idf_sdkconfig_option("CONFIG_MBEDTLS_DYNAMIC_FREE_CA_CERT", True) + add_idf_sdkconfig_option("CONFIG_MBEDTLS_DYNAMIC_FREE_CONFIG_DATA", True) + add_idf_sdkconfig_option("CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC", True) + add_idf_sdkconfig_option("CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY", True) + add_idf_sdkconfig_option("CONFIG_SPIRAM_RODATA", True) + add_idf_sdkconfig_option("CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP", True) + + cg.add_define("USE_TX_ULTIMATE_EASY")