diff --git a/.github/workflows/validate_esphome.yml b/.github/workflows/validate_esphome.yml index 444fa08..a4f2363 100644 --- a/.github/workflows/validate_esphome.yml +++ b/.github/workflows/validate_esphome.yml @@ -1,12 +1,36 @@ --- -name: Validate ESPHome (Latest) +name: Validate ESPHome permissions: contents: read pull-requests: read on: # yamllint disable-line rule:truthy + push: + paths: + - "**/*.yml" + - "**/*.yaml" + - "**/*.h" + - "**/*.cpp" + - "**/*.c" + - "**/*.py" + + pull_request: + paths: + - "**/*.yml" + - "**/*.yaml" + - "**/*.h" + - "**/*.cpp" + - "**/*.c" + - "**/*.py" + workflow_dispatch: + inputs: + skip_dev: + description: 'Skip dev testing (test only on latest)' + required: false + default: false + type: boolean concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -15,178 +39,383 @@ concurrency: jobs: code_scan: name: Code scan (YAML) - runs-on: "ubuntu-latest" + runs-on: ubuntu-latest steps: - name: Checkout Code uses: actions/checkout@main - - name: Setup Python uses: actions/setup-python@main with: - python-version: '3.8' - + python-version: '3.11' - name: Install Yamllint run: pip install yamllint - - name: Validate YAML files run: find . -name "*.yaml" -exec yamllint -c ./.rules/yamllint.yml {} + + # Arduino Framework - Foundation (latest) build_ard_core: - name: Core (Arduino) + name: "🏗️ Arduino Core (latest)" needs: code_scan runs-on: ubuntu-latest steps: - uses: actions/checkout@main - - name: Build Core (Arduino) + - name: Build Arduino Core - latest uses: esphome/build-action@main with: yaml-file: ".test/esphome_ard_core.yaml" version: latest - build_idf_core: - name: Core (IDF) - needs: code_scan - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@main - - name: Build Core (IDF) - uses: esphome/build-action@main - with: - yaml-file: ".test/esphome_idf_core.yaml" - version: latest - build_ard_basic: - name: Basic (Arduino) + name: "📦 Arduino Basic (latest)" needs: build_ard_core runs-on: ubuntu-latest steps: - uses: actions/checkout@main - - name: Build Basic (Arduino) + - name: Build Arduino Basic - latest uses: esphome/build-action@main with: yaml-file: ".test/esphome_ard_basic.yaml" version: latest - build_idf_basic: - name: Basic (IDF) - needs: build_idf_core + build_ard_basic_dev: + name: "📦 Arduino Basic (dev)" + needs: build_ard_core + if: success() && !github.event.inputs.skip_dev runs-on: ubuntu-latest steps: - uses: actions/checkout@main - - name: Build Basic (IDF) + - name: Build Arduino Basic - dev uses: esphome/build-action@main with: - yaml-file: ".test/esphome_idf_basic.yaml" - version: latest + yaml-file: ".test/esphome_ard_basic.yaml" + version: dev build_ard_hw_relays: - name: HW Relays (Arduino) - needs: build_ard_core + name: "🔌 Arduino HW Relays (latest)" + needs: build_ard_basic runs-on: ubuntu-latest steps: - uses: actions/checkout@main - - name: Build HW Relays (Arduino) + - name: Build Arduino HW Relays - latest uses: esphome/build-action@main with: yaml-file: ".test/esphome_ard_hw_relays.yaml" version: latest - build_idf_hw_relays: - name: HW Relays (IDF) - needs: build_idf_core - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@main - - name: Build HW Relays (IDF) - uses: esphome/build-action@main - with: - yaml-file: ".test/esphome_idf_hw_relays.yaml" - version: latest - build_ard_hw_speaker: - name: HW Speaker (Arduino) - needs: build_ard_core + name: "🔌 Arduino HW Speaker (latest)" + needs: build_ard_basic runs-on: ubuntu-latest steps: - uses: actions/checkout@main - - name: Build HW Speaker (Arduino) + - name: Build Arduino HW Speaker - latest uses: esphome/build-action@main with: yaml-file: ".test/esphome_ard_hw_speaker.yaml" version: latest - build_idf_hw_speaker: - name: HW Speaker (IDF) - needs: build_idf_core - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@main - - name: Build HW Speaker (IDF) - uses: esphome/build-action@main - with: - yaml-file: ".test/esphome_idf_hw_speaker.yaml" - version: latest - build_ard_hw_vibration: - name: HW Vibration (Arduino) - needs: build_ard_core + name: "🔌 Arduino HW Vibration (latest)" + needs: build_ard_basic runs-on: ubuntu-latest steps: - uses: actions/checkout@main - - name: Build HW Vibration (Arduino) + - name: Build Arduino HW Vibration - latest uses: esphome/build-action@main with: yaml-file: ".test/esphome_ard_hw_vibration.yaml" version: latest - build_idf_hw_vibration: - name: HW Vibration (IDF) - needs: build_idf_core - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@main - - name: Build HW Vibration (IDF) - uses: esphome/build-action@main - with: - yaml-file: ".test/esphome_idf_hw_vibration.yaml" - version: latest - - build_ard_ble_proxy: - name: Bluetooth Proxy (Ard) + build_ard_ble_proxy_latest: + name: "⚡ Arduino BLE Proxy (latest)" needs: build_ard_basic runs-on: ubuntu-latest steps: - uses: actions/checkout@main - - name: Build BLE Proxy (Ard) + - name: Build Arduino BLE Proxy - latest uses: esphome/build-action@main with: yaml-file: ".test/esphome_ard_ble_proxy.yaml" version: latest - build_idf_ble_proxy: - name: Bluetooth Proxy (IDF) + build_ard_ble_proxy_dev: + name: "⚡ Arduino BLE Proxy (dev)" + needs: build_ard_basic_dev + if: success() && !github.event.inputs.skip_dev + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@main + - name: Build Arduino BLE Proxy - dev + uses: esphome/build-action@main + with: + yaml-file: ".test/esphome_ard_ble_proxy.yaml" + version: dev + + # IDF Framework - Foundation (latest) + build_idf_core: + name: "🏗️ IDF Core (latest)" + needs: code_scan + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@main + - name: Build IDF Core - latest + uses: esphome/build-action@main + with: + yaml-file: ".test/esphome_idf_core.yaml" + version: latest + + build_idf_basic: + name: "📦 IDF Basic (latest)" + needs: build_idf_core + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@main + - name: Build IDF Basic - latest + uses: esphome/build-action@main + with: + yaml-file: ".test/esphome_idf_basic.yaml" + version: latest + + build_idf_basic_dev: + name: "📦 IDF Basic (dev)" + needs: build_idf_core + if: success() && !github.event.inputs.skip_dev + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@main + - name: Build IDF Basic - dev + uses: esphome/build-action@main + with: + yaml-file: ".test/esphome_idf_basic.yaml" + version: dev + + build_idf_hw_relays: + name: "🔌 IDF HW Relays (latest)" needs: build_idf_basic runs-on: ubuntu-latest steps: - uses: actions/checkout@main - - name: Build BLE Proxy (IDF) + - name: Build IDF HW Relays - latest + uses: esphome/build-action@main + with: + yaml-file: ".test/esphome_idf_hw_relays.yaml" + version: latest + + build_idf_hw_speaker: + name: "🔌 IDF HW Speaker (latest)" + needs: build_idf_basic + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@main + - name: Build IDF HW Speaker - latest + uses: esphome/build-action@main + with: + yaml-file: ".test/esphome_idf_hw_speaker.yaml" + version: latest + + build_idf_hw_vibration: + name: "🔌 IDF HW Vibration (latest)" + needs: build_idf_basic + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@main + - name: Build IDF HW Vibration - latest + uses: esphome/build-action@main + with: + yaml-file: ".test/esphome_idf_hw_vibration.yaml" + version: latest + + build_idf_ble_proxy_latest: + name: "⚡ IDF BLE Proxy (latest)" + needs: build_idf_basic + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@main + - name: Build IDF BLE Proxy - latest uses: esphome/build-action@main with: yaml-file: ".test/esphome_idf_ble_proxy.yaml" version: latest - build_ard_media_player: - name: Media Player (Ard) - needs: - - build_ard_basic - - build_ard_hw_relays - - build_ard_hw_vibration + build_idf_ble_proxy_dev: + name: "⚡ IDF BLE Proxy (dev)" + needs: build_idf_basic_dev + if: success() && !github.event.inputs.skip_dev runs-on: ubuntu-latest steps: - uses: actions/checkout@main - - name: Build Media Player (Ard) + - name: Build IDF BLE Proxy - dev uses: esphome/build-action@main with: - yaml-file: ".test/esphome_ard_media_player.yaml" - version: latest + yaml-file: ".test/esphome_idf_ble_proxy.yaml" + version: dev + + # Summary Jobs - Grouped by framework and environment + summary_arduino: + name: "📊 Arduino Framework" + needs: + - build_ard_core + - build_ard_basic + - build_ard_basic_dev + - build_ard_hw_relays + - build_ard_hw_speaker + - build_ard_hw_vibration + - build_ard_ble_proxy_latest + - build_ard_ble_proxy_dev + if: always() + runs-on: ubuntu-latest + steps: + - name: Arduino Framework Results + run: | + SUCCESS=0 + TOTAL=0 + + # Count latest builds (always run) + [ "${{ needs.build_ard_core.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_ard_basic.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_ard_hw_relays.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_ard_hw_speaker.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_ard_hw_vibration.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_ard_ble_proxy_latest.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + TOTAL=$((TOTAL + 6)) + + # Count dev builds (if not skipped) + if [ "${{ github.event.inputs.skip_dev }}" != "true" ]; then + [ "${{ needs.build_ard_basic_dev.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_ard_ble_proxy_dev.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + TOTAL=$((TOTAL + 2)) + fi + + echo "🤖 Arduino Framework: $SUCCESS/$TOTAL builds passed" + + if [ "$SUCCESS" -eq "$TOTAL" ]; then + echo "✅ All Arduino builds successful!" + else + echo "❌ Some Arduino builds failed" + exit 1 + fi + + summary_idf: + name: "📊 ESP-IDF Framework" + needs: + - build_idf_core + - build_idf_basic + - build_idf_basic_dev + - build_idf_hw_relays + - build_idf_hw_speaker + - build_idf_hw_vibration + - build_idf_ble_proxy_latest + - build_idf_ble_proxy_dev + if: always() + runs-on: ubuntu-latest + steps: + - name: ESP-IDF Framework Results + run: | + SUCCESS=0 + TOTAL=0 + + # Count latest builds (always run) + [ "${{ needs.build_idf_core.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_idf_basic.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_idf_hw_relays.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_idf_hw_speaker.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_idf_hw_vibration.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_idf_ble_proxy_latest.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + TOTAL=$((TOTAL + 6)) + + # Count dev builds (if not skipped) + if [ "${{ github.event.inputs.skip_dev }}" != "true" ]; then + [ "${{ needs.build_idf_basic_dev.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_idf_ble_proxy_dev.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + TOTAL=$((TOTAL + 2)) + fi + + echo "🔧 ESP-IDF Framework: $SUCCESS/$TOTAL builds passed" + + if [ "$SUCCESS" -eq "$TOTAL" ]; then + echo "✅ All ESP-IDF builds successful!" + else + echo "❌ Some ESP-IDF builds failed" + exit 1 + fi + + summary_latest: + name: "📊 ESPHome (Latest)" + needs: + - build_ard_core + - build_ard_basic + - build_ard_hw_relays + - build_ard_hw_speaker + - build_ard_hw_vibration + - build_ard_ble_proxy_latest + - build_idf_core + - build_idf_basic + - build_idf_hw_relays + - build_idf_hw_speaker + - build_idf_hw_vibration + - build_idf_ble_proxy_latest + if: always() + runs-on: ubuntu-latest + steps: + - name: Latest ESPHome Results + run: | + SUCCESS=0 + TOTAL=12 + + # Arduino Latest builds + [ "${{ needs.build_ard_core.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_ard_basic.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_ard_hw_relays.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_ard_hw_speaker.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_ard_hw_vibration.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_ard_ble_proxy_latest.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + + # ESP-IDF Latest builds + [ "${{ needs.build_idf_core.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_idf_basic.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_idf_hw_relays.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_idf_hw_speaker.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_idf_hw_vibration.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_idf_ble_proxy_latest.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + + echo "📋 ESPHome (Latest): $SUCCESS/$TOTAL builds passed" + + if [ "$SUCCESS" -eq "$TOTAL" ]; then + echo "✅ All builds on latest ESPHome successful!" + else + echo "❌ Some builds on latest ESPHome failed" + exit 1 + fi + + summary_dev: + name: "📊 ESPHome (Dev)" + needs: + - build_ard_basic_dev + - build_ard_ble_proxy_dev + - build_idf_basic_dev + - build_idf_ble_proxy_dev + if: always() && !github.event.inputs.skip_dev + runs-on: ubuntu-latest + steps: + - name: Dev ESPHome Results + run: | + SUCCESS=0 + TOTAL=4 + + # Arduino Dev builds + [ "${{ needs.build_ard_basic_dev.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_ard_ble_proxy_dev.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + + # ESP-IDF Dev builds + [ "${{ needs.build_idf_basic_dev.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + [ "${{ needs.build_idf_ble_proxy_dev.result }}" == "success" ] && SUCCESS=$((SUCCESS + 1)) + + echo "🚀 ESPHome (Dev): $SUCCESS/$TOTAL builds passed" + + if [ "$SUCCESS" -eq "$TOTAL" ]; then + echo "✅ All builds on dev ESPHome successful!" + else + echo "❌ Some builds on dev ESPHome failed" + exit 1 + fi ... diff --git a/.github/workflows/validate_esphome_beta.yml b/.github/workflows/validate_esphome_beta.yml deleted file mode 100644 index 970b307..0000000 --- a/.github/workflows/validate_esphome_beta.yml +++ /dev/null @@ -1,210 +0,0 @@ ---- -name: Validate ESPHome (Beta) - -permissions: - contents: read - pull-requests: read - -on: # yamllint disable-line rule:truthy - push: - paths: - - "**/*.yml" - - "**/*.yaml" - - "**/*.h" - - "**/*.cpp" - - "**/*.c" - - "**/*.py" - - pull_request: - paths: - - "**/*.yml" - - "**/*.yaml" - - "**/*.h" - - "**/*.cpp" - - "**/*.c" - - "**/*.py" - - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -jobs: - code_scan: - name: Code scan (YAML) - runs-on: "ubuntu-latest" - steps: - - name: Checkout Code - uses: actions/checkout@main - - - name: Setup Python - uses: actions/setup-python@main - with: - python-version: '3.8' - - - name: Install Yamllint - run: pip install yamllint - - - name: Validate YAML files - run: find . -name "*.yaml" -exec yamllint -c ./.rules/yamllint.yml {} + - - build_ard_core: - name: Core (Arduino) - needs: code_scan - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@main - - name: Build Core (Arduino) - uses: esphome/build-action@main - with: - yaml-file: ".test/esphome_ard_core.yaml" - version: beta - - build_idf_core: - name: Core (IDF) - needs: code_scan - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@main - - name: Build Core (IDF) - uses: esphome/build-action@main - with: - yaml-file: ".test/esphome_idf_core.yaml" - version: beta - - build_ard_basic: - name: Basic (Arduino) - needs: build_ard_core - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@main - - name: Build Basic (Arduino) - uses: esphome/build-action@main - with: - yaml-file: ".test/esphome_ard_basic.yaml" - version: beta - - build_idf_basic: - name: Basic (IDF) - needs: build_idf_core - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@main - - name: Build Basic (IDF) - uses: esphome/build-action@main - with: - yaml-file: ".test/esphome_idf_basic.yaml" - version: beta - - build_ard_hw_relays: - name: HW Relays (Arduino) - needs: build_ard_core - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@main - - name: Build HW Relays (Arduino) - uses: esphome/build-action@main - with: - yaml-file: ".test/esphome_ard_hw_relays.yaml" - version: beta - - build_idf_hw_relays: - name: HW Relays (IDF) - needs: build_idf_core - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@main - - name: Build HW Relays (IDF) - uses: esphome/build-action@main - with: - yaml-file: ".test/esphome_idf_hw_relays.yaml" - version: beta - - build_ard_hw_speaker: - name: HW Speaker (Arduino) - needs: build_ard_core - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@main - - name: Build HW Speaker (Arduino) - uses: esphome/build-action@main - with: - yaml-file: ".test/esphome_ard_hw_speaker.yaml" - version: beta - - build_idf_hw_speaker: - name: HW Speaker (IDF) - needs: build_idf_core - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@main - - name: Build HW Speaker (IDF) - uses: esphome/build-action@main - with: - yaml-file: ".test/esphome_idf_hw_speaker.yaml" - version: beta - - build_ard_hw_vibration: - name: HW Vibration (Arduino) - needs: build_ard_core - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@main - - name: Build HW Vibration (Arduino) - uses: esphome/build-action@main - with: - yaml-file: ".test/esphome_ard_hw_vibration.yaml" - version: beta - - build_idf_hw_vibration: - name: HW Vibration (IDF) - needs: build_idf_core - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@main - - name: Build HW Vibration (IDF) - uses: esphome/build-action@main - with: - yaml-file: ".test/esphome_idf_hw_vibration.yaml" - version: beta - - build_ard_ble_proxy: - name: Bluetooth Proxy (Ard) - needs: build_ard_basic - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@main - - name: Build BLE Proxy (Ard) - uses: esphome/build-action@main - with: - yaml-file: ".test/esphome_ard_ble_proxy.yaml" - version: beta - - build_idf_ble_proxy: - name: Bluetooth Proxy (IDF) - needs: build_idf_basic - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@main - - name: Build BLE Proxy (IDF) - uses: esphome/build-action@main - with: - yaml-file: ".test/esphome_idf_ble_proxy.yaml" - version: beta - - build_ard_media_player: - name: Media Player (Ard) - needs: - - build_ard_basic - - build_ard_hw_relays - - build_ard_hw_vibration - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@main - - name: Build Media Player (Ard) - uses: esphome/build-action@main - with: - yaml-file: ".test/esphome_ard_media_player.yaml" - version: beta -... diff --git a/.test/common_idf.yaml b/.test/common_idf.yaml index 9351dd6..b163814 100644 --- a/.test/common_idf.yaml +++ b/.test/common_idf.yaml @@ -5,14 +5,4 @@ packages: esp32: framework: type: esp-idf - -light: - - id: !extend light_full - platform: esp32_rmt_led_strip - rgb_order: GRB - 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 deleted file mode 100644 index f2b9b5d..0000000 --- a/.test/common_idf53.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -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_ble_proxy.yaml b/.test/esphome_ard_ble_proxy.yaml index 097e273..a6eebcc 100644 --- a/.test/esphome_ard_ble_proxy.yaml +++ b/.test/esphome_ard_ble_proxy.yaml @@ -3,5 +3,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 - addon_bluetooth_proxy: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml + +bluetooth_proxy: ... diff --git a/.test/esphome_ard_media_player.yaml b/.test/esphome_ard_media_player.yaml deleted file mode 100644 index f12a529..0000000 --- a/.test/esphome_ard_media_player.yaml +++ /dev/null @@ -1,8 +0,0 @@ ---- -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 -... diff --git a/.test/esphome_idf_basic.yaml b/.test/esphome_idf_basic.yaml index 82e7f09..d4d0357 100644 --- a/.test/esphome_idf_basic.yaml +++ b/.test/esphome_idf_basic.yaml @@ -3,9 +3,4 @@ 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 - -media_player: !remove - -switch: - - id: !remove sw_speaker_amplifier ... diff --git a/.test/esphome_idf_ble_proxy.yaml b/.test/esphome_idf_ble_proxy.yaml index dc303a6..844ed48 100644 --- a/.test/esphome_idf_ble_proxy.yaml +++ b/.test/esphome_idf_ble_proxy.yaml @@ -3,5 +3,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 + +bluetooth_proxy: ... diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml index 0e6dbb3..f04c587 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml @@ -2,57 +2,22 @@ ##### TX Ultimate Easy for ESPHome ##### ##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy ##### #################################################################################################### -##### Purpose: ESPHome Core - Add-on - BLE Proxy ##### +##### Purpose: ESPHome Core - Add-on - BLE Proxy (REMOVED) ##### #################################################################################################### ##### 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. ##### +##### REMOVAL NOTICE: ##### +##### This package has been removed. Please update your configuration. ##### +##### Add BLE proxy functionality directly in your YAML configuration instead: ##### +##### bluetooth_proxy: ##### #################################################################################################### --- -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 # Not supported with IDF 5 - chipset: ws2812 - max_refresh_rate: 33ms - use_psram: false - type: !remove - variant: !remove - -media_player: !remove - +# Trigger the error at compile time script: - - id: !extend dump_config_list_packages + - id: force_compilation_error 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, " - Add-on - BLE Proxy"); - -switch: - - id: !remove sw_speaker_amplifier + #error "The package TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml has been removed." \ + "Please remove this package from your configuration and add" \ + "'bluetooth_proxy:' directly to your YAML instead." ... diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_addon_media_player.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_addon_media_player.yaml deleted file mode 100644 index d6985fb..0000000 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_addon_media_player.yaml +++ /dev/null @@ -1,68 +0,0 @@ -#################################################################################################### -##### 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 - -esp32: - framework: - type: arduino - -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/ESPHome/TX-Ultimate-Easy-ESPHome_core_common.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_common.yaml index dfd7cbf..a254e28 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_common.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core_common.yaml @@ -29,7 +29,6 @@ substitutions: DUMP_CONFIG_CALLER_DELAY: 10s # Delay to dump config after requested - api: id: api_server on_client_connected: @@ -63,6 +62,8 @@ button: esp32: board: esp32dev flash_size: 8MB + framework: + type: esp-idf esphome: name: ${name} @@ -99,11 +100,6 @@ globals: restore_value: true initial_value: '0' - - id: gang_count_plural_suffix - type: std::string - restore_value: true - max_restore_data_length: 3 - logger: level: DEBUG @@ -155,7 +151,6 @@ script: 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 @@ -191,7 +186,7 @@ script: 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()); + ESP_LOGCONFIG("core", "Gangs (detected): %" PRIu8 "-Gang%s", id(gang_count), id(gang_count) > 1 ? "s" : ""); // System state if (bs_pending_restart->state) diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml index e5c914d..d2be16f 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml @@ -209,10 +209,11 @@ script: - id: !extend dump_config then: - lambda: |- + std::string gang_count_plural_suffix = id(gang_count) > 1 ? "s" : ""; // Button's actions ESP_LOGCONFIG("core_hw_buttons", "Button%s action%s:", - id(gang_count_plural_suffix).c_str(), - id(gang_count_plural_suffix).c_str()); + gang_count_plural_suffix.c_str(), + gang_count_plural_suffix.c_str()); ESP_LOGCONFIG("core_hw_buttons", " Relay 1: %s", sl_button_1_action->has_state() ? sl_button_1_action->state.c_str() : "Unknown"); diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml index f0e790c..8af7ff7 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml @@ -50,9 +50,14 @@ light: num_leds: 32 pin: GPIO13 restore_mode: ${LIGHT_FULL_RESTORE_MODE} - platform: neopixelbus - type: GRB - variant: WS2811 + platform: esp32_rmt_led_strip + rgb_order: GRB + chipset: ws2812 + max_refresh_rate: 33ms + use_psram: false + # platform: neopixelbus + # type: GRB + # variant: WS2811 # Those lights are available based on the model selections - &light_partition_with_effects_eu @@ -492,10 +497,11 @@ script: - id: !extend dump_config then: - lambda: |- + std::string gang_count_plural_suffix = id(gang_count) > 1 ? "s" : ""; // Relay's LEDs modes ESP_LOGCONFIG("core_hw_leds", "Relay%s LEDs mode%s:", - id(gang_count_plural_suffix).c_str(), - id(gang_count_plural_suffix).c_str()); + gang_count_plural_suffix.c_str(), + gang_count_plural_suffix.c_str()); ESP_LOGCONFIG("core_hw_leds", " Relay 1: %s", id(is_us_model) ? sl_relay_1_light_mode_us->state.c_str() : sl_relay_1_light_mode_eu->state.c_str()); diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_media_player.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_media_player.yaml deleted file mode 100644 index d206ea6..0000000 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_media_player.yaml +++ /dev/null @@ -1,29 +0,0 @@ -#################################################################################################### -##### TX Ultimate Easy for ESPHome ##### -##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy ##### -#################################################################################################### -##### Purpose: ESPHome Core - Hardware - 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. ##### -#################################################################################################### ---- -i2s_audio: - id: if_i2s_audio - i2s_bclk_pin: GPIO2 - i2s_lrclk_pin: GPIO4 - -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 # Experimental - It was 'lsb' until v2024.12.12 - dac_type: external - mode: mono -... diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_touch.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_touch.yaml index 1d8d7af..0bf617c 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_touch.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_touch.yaml @@ -387,17 +387,16 @@ tx_ultimate_easy: on_multi_touch_release: then: + - homeassistant.event: + event: ${EVENT_NAME} + data: + device_name: !lambda return id(tx_device_name).state.c_str(); + firmware: ${version} + domain: touch + type: multi_touch + action: release + position: !lambda return std::to_string(touch.x); - lambda: |- - // Send event to Home Assistant - esphome::api::CustomAPIDevice ha_event; - ha_event.fire_homeassistant_event("${EVENT_NAME}", { - {"device_name", id(tx_device_name).state.c_str()}, - {"firmware", "${version}"}, - {"domain", "touch"}, - {"type", "multi_touch"}, - {"action", "release"}, - {"position", std::to_string(touch.x)} - }); ESP_LOGI("core_hw_touch", "Multi-touch released"); touch_on_multi_touch_release->execute(); @@ -419,38 +418,52 @@ tx_ultimate_easy: on_swipe_left: then: + - homeassistant.event: + event: ${EVENT_NAME} + data: + device_name: !lambda return id(tx_device_name).state.c_str(); + firmware: ${version} + domain: touch + type: swipe + action: !lambda |- + if (sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}") + return "left"; + else + return "down"; + swipe-direction: !lambda |- + if (sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}") + return "left"; + else + return "down"; + position: !lambda return std::to_string(touch.x); - lambda: |- - std::string swipe_direction = (sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}") ? "left" : "down"; - // Send event to Home Assistant - esphome::api::CustomAPIDevice ha_event; - ha_event.fire_homeassistant_event("${EVENT_NAME}", { - {"device_name", id(tx_device_name).state.c_str()}, - {"firmware", "${version}"}, - {"domain", "touch"}, - {"type", "swipe"}, - {"action", swipe_direction.c_str()}, - {"swipe-direction", swipe_direction.c_str()}, - {"position", std::to_string(touch.x)} - }); - ESP_LOGI("core_hw_touch", "Swipe %s", swipe_direction.c_str()); + ESP_LOGI("core_hw_touch", "Swipe %s", + (sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}") ? "left" : "down"); touch_swipe_left->execute(); on_swipe_right: then: + - homeassistant.event: + event: ${EVENT_NAME} + data: + device_name: !lambda return id(tx_device_name).state.c_str(); + firmware: ${version} + domain: touch + type: swipe + action: !lambda |- + if (sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}") + return "right"; + else + return "up"; + swipe-direction: !lambda |- + if (sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}") + return "right"; + else + return "up"; + position: !lambda return std::to_string(touch.x); - lambda: |- - std::string swipe_direction = (sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}") ? "right" : "up"; - // Send event to Home Assistant - esphome::api::CustomAPIDevice ha_event; - ha_event.fire_homeassistant_event("${EVENT_NAME}", { - {"device_name", id(tx_device_name).state.c_str()}, - {"firmware", "${version}"}, - {"domain", "touch"}, - {"type", "swipe"}, - {"action", swipe_direction.c_str()}, - {"swipe-direction", swipe_direction.c_str()}, - {"position", std::to_string(touch.x)} - }); - ESP_LOGI("core_hw_touch", "Swipe %s", swipe_direction.c_str()); + ESP_LOGI("core_hw_touch", "Swipe %s", + (sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}") ? "right" : "up"); touch_swipe_right->execute(); on_touch_event: diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_audio.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_audio.yaml index 3dcabb1..0894e3a 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_audio.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_audio.yaml @@ -11,15 +11,18 @@ ##### - For normal system use, modifications to this file are NOT required. ##### #################################################################################################### --- +substitutions: + SWITCH_AUDIO_AMPLIFIER_RESTORE_MODE: RESTORE_DEFAULT_ON + esphome: platformio_options: build_flags: - -D TX_ULTIMATE_EASY_STANDARD_HW_AUDIO i2s_audio: - id: if_i2s_audio - i2s_bclk_pin: GPIO2 - i2s_lrclk_pin: GPIO4 + - id: if_i2s_audio + i2s_bclk_pin: GPIO2 + i2s_lrclk_pin: GPIO4 script: - id: !extend dump_config_list_packages @@ -33,4 +36,15 @@ script: // Identify itself ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Standard - Hardware - Audio"); + +switch: + - id: sw_audio_amplifier + name: Audio Amplifier + platform: gpio + pin: + number: GPIO26 + inverted: false + restore_mode: ${SWITCH_AUDIO_AMPLIFIER_RESTORE_MODE} + internal: true + entity_category: config ... diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml index bb738ad..0f019eb 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml @@ -703,10 +703,11 @@ script: - id: !extend dump_config then: - lambda: |- + std::string gang_count_plural_suffix = id(gang_count) > 1 ? "s" : ""; // Relay's modes ESP_LOGCONFIG("standard_hw_relays", "Relay%s mode%s:", - id(gang_count_plural_suffix).c_str(), - id(gang_count_plural_suffix).c_str()); + gang_count_plural_suffix.c_str(), + gang_count_plural_suffix.c_str()); ESP_LOGCONFIG("standard_hw_relays", " Relay 1: %s", sl_relay_1_mode->has_state() ? sl_relay_1_mode->state.c_str() : "Unknown"); @@ -725,8 +726,8 @@ script: // Relay's states ESP_LOGCONFIG("standard_hw_relays", "Relay%s state%s:", - id(gang_count_plural_suffix).c_str(), - id(gang_count_plural_suffix).c_str()); + gang_count_plural_suffix.c_str(), + gang_count_plural_suffix.c_str()); ESP_LOGCONFIG("standard_hw_relays", " Relay 1: %s", sw_relay_1->state ? "ON" : "OFF"); if (id(gang_count) >= 2) ESP_LOGCONFIG("standard_hw_relays", " Relay 2: %s", sw_relay_2->state ? "ON" : "OFF"); diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml index e9d5c3b..e84a8a1 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml @@ -38,11 +38,11 @@ api: esphome: platformio_options: build_flags: - - -D TX_ULTIMATE_EASY_STANDARD_SPEAKER + - -D TX_ULTIMATE_EASY_STANDARD_HW_SPEAKER number: - id: speaker_volume - name: Sound - Volume + name: Speaker Volume platform: template max_value: 100 min_value: 0 @@ -179,4 +179,8 @@ speaker: i2s_audio_id: if_i2s_audio i2s_comm_fmt: stand_msb channel: mono + timeout: never + bits_per_sample: 16bit + sample_rate: 48000 + buffer_duration: 500ms ... diff --git a/ESPHome/TX-Ultimate-Easy-ESPHome_standard_media_player.yaml b/ESPHome/TX-Ultimate-Easy-ESPHome_standard_media_player.yaml index 32a8eb5..203ee28 100644 --- a/ESPHome/TX-Ultimate-Easy-ESPHome_standard_media_player.yaml +++ b/ESPHome/TX-Ultimate-Easy-ESPHome_standard_media_player.yaml @@ -12,29 +12,64 @@ #################################################################################################### --- packages: - standard_hw_audio: !include TX-Ultimate-Easy-ESPHome_standard_hw_audio.yaml + standard_hw_speaker: !include TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml esphome: platformio_options: build_flags: - - -D TX_ULTIMATE_EASY_ADDON_MEDIA_PLAYER + - -D TX_ULTIMATE_EASY_STANDARD_MEDIA_PLAYER + +globals: + - id: last_media_player_volume + type: uint8_t + restore_value: false + initial_value: '100' + - id: persistent_media_player_volume + type: uint8_t + restore_value: true + initial_value: '100' 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 + platform: speaker + codec_support_enabled: true + buffer_size: 250000 + task_stack_in_psram: false + announcement_pipeline: + speaker: announcement_spk_resampling_input + format: WAV + num_channels: 1 + sample_rate: 48000 + media_pipeline: + speaker: media_spk_resampling_input + format: FLAC + num_channels: 1 + sample_rate: 48000 + on_state: + then: + - lambda: |- + // Check if volume has changed and update number entity + id(persistent_media_player_volume) = static_cast(mp_media_player->volume * 100.0f); + if (id(persistent_media_player_volume) != id(last_media_player_volume)) { + id(last_media_player_volume) = id(persistent_media_player_volume); + ESP_LOGD("media_player_volume", "Media player volume changed to %" PRIu8 "%%, updating number entity", id(persistent_media_player_volume)); + } script: + - id: !extend boot_sequence + then: + - script.execute: sync_initial_volume + + - id: !extend dump_config + then: + - lambda: |- + // Volume sync configuration + ESP_LOGCONFIG("standard_media_player", "Media Player Volume Sync:"); + ESP_LOGCONFIG("standard_media_player", " Persistent volume: %" PRIu8 "%", id(persistent_media_player_volume)); + ESP_LOGCONFIG("standard_media_player", " Current volume: %.1f%%", mp_media_player->volume * 100.0f); + - id: !extend dump_config_list_packages then: - script.wait: dump_config @@ -42,23 +77,36 @@ script: // 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 + #endif // TX_ULTIMATE_EASY_CORE + #if !defined(TX_ULTIMATE_EASY_STANDARD_HW_SPEAKER) + #error "The package TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml is required." + #endif // TX_ULTIMATE_EASY_STANDARD_HW_SPEAKER // Identify itself - ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Add-on - Media Player"); + ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Standard - 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 + - id: sync_initial_volume + mode: restart + then: + - delay: 2s # Wait for media player to initialize + - media_player.volume_set: # Sync initial volume from persisted number entity to media player + id: mp_media_player + volume: !lambda return id(persistent_media_player_volume) / 100.0f; + - lambda: |- + id(last_media_player_volume) = id(persistent_media_player_volume); + ESP_LOGI("media_player_volume", "Initial volume sync: %.1f%% (restored from persistence)", id(persistent_media_player_volume)); + +speaker: + - platform: mixer + id: mixer_speaker_embedded + output_speaker: speaker_embedded + source_speakers: + - id: announcement_speaker_embedded + - id: media_speaker_embedded + - platform: resampler + id: announcement_spk_resampling_input + output_speaker: announcement_speaker_embedded + - platform: resampler + id: media_spk_resampling_input + output_speaker: media_speaker_embedded ... diff --git a/README.md b/README.md index c7f64d0..9a81137 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,45 @@ [buymeacoffee-shield]: https://img.shields.io/static/v1?label=Buy%20me%20an%20ice%20cream&message=❄&color=blue [buymeacoffee]: https://www.buymeacoffee.com/edwardfirmo +## Framework Migration to ESP-IDF + +> [!IMPORTANT] +> **ESP-IDF Framework Migration** +> +> Starting with version **2025.8.0**, TX Ultimate Easy will use **ESP-IDF** as the default framework, following ESPHome's direction towards ESP-IDF for better performance, stability, and feature support. +> +> **What this means for you:** +> - **New installations**: Will automatically use ESP-IDF (no action required) +> - **Existing Arduino users**: Can continue using Arduino but with limited support +> - **Migration recommended**: For better performance and full feature support +> +> **Arduino Framework Support:** +> - Still functional but **no longer actively tested** +> - **Limited support** will be provided for Arduino-specific issues +> - May miss out on new features optimized for ESP-IDF + +### Migration Guidelines + +#### For New Users +No action required - ESP-IDF will be used automatically. + +#### For Existing Arduino Users + +**Option 1: Migrate to ESP-IDF (Recommended)** +1. **Best practice**: Flash via serial/USB to ensure proper partition setup +2. **Alternative**: If serial flashing isn't possible, flash OTA twice consecutively to improve success rate + +**Option 2: Continue with Arduino** +Add this to your YAML configuration to force Arduino framework: +```yaml +esp32: + framework: + type: arduino +``` + +> [!WARNING] +> **Migration via OTA:** When switching frameworks via OTA, the partition table may not update correctly. Flash twice in succession to ensure both firmware partitions contain the latest firmware and prevent boot failures. + ## Integration with Home Assistant TX Ultimate Easy exposes your device's components (sensors, touch panel, relays, etc.) to Home Assistant, @@ -70,9 +109,10 @@ All device behaviors can be customized through Home Assistant automations withou - **Flexible Light Control**: Customize LED behavior and effects - **Touch Panel Support**: Full support for touch gestures and multi-touch capabilities - **Advanced Automations**: Create complex automations using Home Assistant's powerful automation engine -- **BLE Proxy Support**: Optional Bluetooth Low Energy proxy functionality +- **Bluetooth Proxy Support**: Compatible with ESPHome's bluetooth_proxy component for BLE device integration - **Audio Feedback**: Built-in speaker support for audible feedback - **Haptic Feedback**: Vibration motor support for tactile feedback +- **ESP-IDF Framework**: Enhanced performance and stability with ESP-IDF support ## Hardware Support @@ -126,7 +166,6 @@ Follow these steps to get your TX Ultimate device up and running with ESPHome. 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 @@ -151,6 +190,27 @@ Follow these steps to get your TX Ultimate device up and running with ESPHome. > ap: # Access point configuration > ``` +### Optional Features + +#### Bluetooth Proxy +TX Ultimate Easy is fully compatible with ESPHome's `bluetooth_proxy` component. +To enable Bluetooth proxy functionality, add the following to your device configuration: + +```yaml +bluetooth_proxy: + # Optional: Configure specific settings + # active: true +``` + +**Requirements for Bluetooth Proxy:** +- ESP-IDF framework (default framework, not recommended with Arduino framework) +- Sufficient memory (TX Ultimate Easy components are compatible, + but adding additional custom components may require memory optimization) + +> [!NOTE] +> Bluetooth proxy functionality is provided by ESPHome's native component. +> TX Ultimate Easy ensures compatibility but does not include it by default to maintain optimal memory usage. + ### Advanced Settings For more granular control over components, you can use our [advanced configuration template](TX-Ultimate-Easy-ESPHome_advanced.yaml). @@ -181,6 +241,9 @@ packages: # 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 + +# Optional: Add Bluetooth proxy support +bluetooth_proxy: ``` > [!NOTE] @@ -305,7 +368,7 @@ After installation, you can: 2. Customize touch behaviors 3. Set up LED patterns and effects 4. Create automations -5. Enable optional features like BLE proxy +5. Enable optional features like Bluetooth proxy ## Configuration Options @@ -316,6 +379,7 @@ TX Ultimate Easy offers extensive configuration options: - Relay modes and functions - Audio and haptic feedback settings - Network and connectivity options +- Optional Bluetooth proxy functionality ## Contributing