Compare commits

...

77 Commits

Author SHA1 Message Date
GitHub Actions
f79ed28364 Bump version to 2025.8.1 [skip-versioning] 2025-08-01 08:22:09 +00:00
Edward Firmo
11807ce892 Merge pull request #112 from edwardtfn/idf-as-default
Set ESP-IDF as default framework
2025-08-01 10:22:00 +02:00
Edward Firmo
526b257ad6 Use github.event.inputs.skip_dev 2025-08-01 09:28:42 +02:00
Edward Firmo
0a95a7f8d0 Fix typo on std::string 2025-08-01 09:10:58 +02:00
Edward Firmo
6687c5c6a5 Fix other references to gang_count_plural_suffix 2025-08-01 09:01:37 +02:00
Edward Firmo
ad92799035 Remove gang_count_plural_suffix and set audio channel to mono 2025-08-01 08:51:33 +02:00
Edward Firmo
8e4bbda412 Fix totals 2025-07-31 13:29:34 +02:00
Edward Firmo
8eaa60b5c0 Update totals 2025-07-31 13:14:11 +02:00
Edward Firmo
334932c6c8 Completely remove media player specific tests 2025-07-31 11:24:33 +02:00
Edward Firmo
0480f2ddf3 Media player is already part of standard package 2025-07-31 11:22:29 +02:00
Edward Firmo
720cf3ab36 Ensure tests call the right media player code 2025-07-31 11:18:40 +02:00
Edward Firmo
9edd43079b Use globals for persistence 2025-07-31 10:58:22 +02:00
Edward Firmo
a67f3dfd4a Removed initial value for volume control 2025-07-31 10:34:03 +02:00
Edward Firmo
796eb7620c Remember Media Player volume 2025-07-31 10:26:37 +02:00
Edward Firmo
e53334ac18 Clarify support to bluetooth_proxy 2025-07-31 07:21:48 +02:00
GitHub Actions
7d2080cd8d Bump version to 2025.7.3 [skip-versioning] 2025-07-31 03:20:55 +00:00
Edward Firmo
efd44fab02 Merge pull request #115 from MorghusDragon/correctly-looping-rainbow-effect
Fix rainbow effect loop by setting correct width per model.
2025-07-31 05:20:44 +02:00
Edward Firmo
8422168837 Remove effects from smaller segments 2025-07-30 19:34:56 +02:00
Edward Firmo
0b7f83ebca Add anchor per model 2025-07-30 19:15:39 +02:00
Edward Firmo
5aecb343f6 Return full audio settings 2025-07-30 19:00:54 +02:00
Edward Firmo
a4340da836 Lint 2025-07-30 07:31:17 +02:00
Edward Firmo
912607d1ec Refine speaker settings for esp-idf
Solves #95
2025-07-30 07:28:05 +02:00
Edward Firmo
ba041a9d50 Set audio channel to mono 2025-07-29 21:19:21 +02:00
Edward Firmo
b99a6b8c54 Fail-fast - Test basic before hardware 2025-07-29 16:06:11 +02:00
Edward Firmo
29b292bf45 Fix dependencies 2025-07-29 16:00:40 +02:00
Edward Firmo
4c0a83851e Test basic on dev 2025-07-29 15:54:34 +02:00
Edward Firmo
9663f295d5 Lint 2025-07-29 15:44:22 +02:00
Edward Firmo
4707506c74 Fix grouping 2025-07-29 15:40:49 +02:00
Edward Firmo
5b77f44ae2 Lint 2025-07-29 15:33:54 +02:00
Edward Firmo
efd4eaa6bb Detailed summary 2025-07-29 15:26:04 +02:00
Edward Firmo
bc0b775df2 A bit more reorg 2025-07-29 15:21:48 +02:00
Edward Firmo
ddfd4b3220 Add environment names 2025-07-29 15:12:35 +02:00
Edward Firmo
54ac959abb Org test back on platform-centric 2025-07-29 15:07:06 +02:00
Edward Firmo
9fdfd52ad4 Resolve conflict with PR#116 2025-07-29 14:58:48 +02:00
Edward Firmo
e326f03502 Merge branch 'main' into idf-as-default 2025-07-29 14:55:53 +02:00
GitHub Actions
754ad9cffe Bump version to 2025.7.2 [skip-versioning] 2025-07-29 12:54:52 +00:00
Edward Firmo
637f47583a Merge pull request #116 from MorghusDragon/fix-incorrect-multitouch-trigger-when-swiping
Fix incorrect triggering of multitouch event when swiping
2025-07-29 14:54:39 +02:00
Edward Firmo
bd86371453 Lint 2025-07-29 14:48:06 +02:00
Edward Firmo
54c9119a63 Test basic first 2025-07-29 14:45:52 +02:00
Morghus
2d1ef49ca9 Fix incorrect triggering of multitouch event when swiping 2025-07-29 20:58:44 +12:00
Morghus
1190802ccd Extract base light effect configuration so it can be customized per model. 2025-07-29 20:51:32 +12:00
Edward Firmo
2cc8199593 No limits on the core tests 2025-07-29 10:46:41 +02:00
Edward Firmo
669a78a427 Reorg tests 2025-07-29 10:39:06 +02:00
Edward Firmo
78d820d91e Remove BLE proxy addon 2025-07-29 10:35:11 +02:00
Edward Firmo
a8277e5b88 Fail-fast tests 2025-07-29 10:33:56 +02:00
Edward Firmo
458273206d Test idf first 2025-07-29 10:26:03 +02:00
Edward Firmo
982c64c1c1 Use latest (main) for all actions 2025-07-29 10:22:11 +02:00
Edward Firmo
66d1b27c0d Run tests on every push 2025-07-29 10:15:41 +02:00
Edward Firmo
f9da912777 Test Media player under IDF and unify ESPHome tests 2025-07-29 10:13:18 +02:00
Edward Firmo
6d663323e5 Simplify tests in a matrix
To make it easier to maintain
2025-07-29 10:06:46 +02:00
Edward Firmo
122cfff8db Fix compiler key name 2025-07-29 09:50:19 +02:00
Edward Firmo
70a054616c Remove old code 2025-07-29 09:39:49 +02:00
Edward Firmo
5957e277b7 Remove mapping on !lambda calls 2025-07-29 09:31:35 +02:00
Edward Firmo
7e070617ae Rebuild homeassistant.event calls
To support ESPHome 2025.8
2025-07-29 09:28:57 +02:00
Edward Firmo
50a11f61ff Removed allow_other_uses for pin 26 2025-07-29 09:20:05 +02:00
Edward Firmo
97b193d7c3 Add notice about migration to ESP-IDF 2025-07-29 09:15:49 +02:00
Edward Firmo
644ba8e711 Add test against ESPHome Dev 2025-07-29 09:05:29 +02:00
Edward Firmo
36b28a2475 Make media player dependent on speaker 2025-07-29 09:03:45 +02:00
Edward Firmo
1bd51f304d Deprecate BLE proxy addon package
This kind of solves #9

Replace TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml with compilation
error to force migration to direct bluetooth_proxy configuration.

BREAKING CHANGE: Configurations including this package will fail to
compile. Users must remove the package reference and add bluetooth_proxy
directly to their YAML.

Before:
  packages:
    addon_bluetooth_proxy: !include TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml

After:
  bluetooth_proxy:
2025-07-29 09:00:38 +02:00
Edward Firmo
680042a428 Replaces i2s_audio.media_player by i2s_audio.speaker.media_player 2025-07-29 08:44:46 +02:00
Edward Firmo
0a3ceb97f5 No special settings for IDF 2025-07-14 13:54:07 +02:00
Edward Firmo
daaffdb6ca Set ESP-IDF as default framework 2025-07-14 13:51:21 +02:00
GitHub Actions
ffdb3a22b5 Bump version to 2025.7.1 [skip-versioning] 2025-07-09 22:42:27 +00:00
Edward Firmo
b426bdd5dc Merge pull request #111 from edwardtfn/remove-duplicated-names
Support to ESPHome 2025.7.0
2025-07-10 00:42:19 +02:00
Edward Firmo
3cdd9f87af Standardize std::to_string 2025-07-10 00:29:34 +02:00
Edward Firmo
ddb26cd833 Test with recommended IDF only 2025-07-10 00:13:56 +02:00
Edward Firmo
5ea4f2015b Support to ESPHome 2025.7.0
- Resolve duplicated names
- Rebuilt HA event calls
2025-07-09 23:36:54 +02:00
GitHub Actions
ddb5e0f783 Bump version to 2025.5.1 [skip-versioning] 2025-05-14 19:19:50 +00:00
Edward Firmo
ab078f597a Merge pull request #106 from edwardtfn/dev
Remove enforcing psram mode to octal
2025-05-14 21:19:39 +02:00
Edward Firmo
5eb42082db Remove rmt_channel
Not supported with IDF 5
2025-05-14 21:07:07 +02:00
Edward Firmo
b1a978b3f3 Remove rmt_channel
Not supported with IDF 5
2025-05-14 20:57:58 +02:00
Edward Firmo
4ec44e611f Merge branch 'main' into dev 2025-05-02 18:30:35 +02:00
Edward Firmo
4d7895a2e9 Remove enforcing psram mode to octal
Solves #105
2025-05-02 18:29:07 +02:00
GitHub Actions
be76ebd603 Bump version to 2025.3.1 [skip-versioning] 2025-03-21 19:08:53 +00:00
Edward Firmo
49a0f088e7 Merge pull request #101 from edwardtfn/edwardtfn-patch-1
Remove reference to tj-actions
2025-03-21 20:08:45 +01:00
Edward Firmo
ace945a4ea Update validate_yamllint.yml 2025-03-15 18:23:25 +01:00
Edward Firmo
e944cd2c21 Remove reference to tj-actions
Security reasons
2025-03-15 18:19:32 +01:00
30 changed files with 733 additions and 846 deletions

View File

@@ -1,12 +1,36 @@
--- ---
name: Validate ESPHome (Latest) name: Validate ESPHome
permissions: permissions:
contents: read contents: read
pull-requests: read pull-requests: read
on: # yamllint disable-line rule:truthy 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: workflow_dispatch:
inputs:
skip_dev:
description: 'Skip dev testing (test only on latest)'
required: false
default: false
type: boolean
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
@@ -15,250 +39,383 @@ concurrency:
jobs: jobs:
code_scan: code_scan:
name: Code scan (YAML) name: Code scan (YAML)
runs-on: "ubuntu-latest" runs-on: ubuntu-latest
steps: steps:
- name: Checkout Code - name: Checkout Code
uses: actions/checkout@main uses: actions/checkout@main
- name: Setup Python - name: Setup Python
uses: actions/setup-python@main uses: actions/setup-python@main
with: with:
python-version: '3.8' python-version: '3.11'
- name: Install Yamllint - name: Install Yamllint
run: pip install yamllint run: pip install yamllint
- name: Validate YAML files - name: Validate YAML files
run: find . -name "*.yaml" -exec yamllint -c ./.rules/yamllint.yml {} + run: find . -name "*.yaml" -exec yamllint -c ./.rules/yamllint.yml {} +
# Arduino Framework - Foundation (latest)
build_ard_core: build_ard_core:
name: Core (Arduino) name: "🏗️ Arduino Core (latest)"
needs: code_scan needs: code_scan
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@main - uses: actions/checkout@main
- name: Build Core (Arduino) - name: Build Arduino Core - latest
uses: esphome/build-action@main uses: esphome/build-action@main
with: with:
yaml-file: ".test/esphome_ard_core.yaml" yaml-file: ".test/esphome_ard_core.yaml"
version: latest 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_idf53_core:
name: Core (IDF v5.3)
needs: code_scan
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- name: Build Core (IDF v5.3)
uses: esphome/build-action@main
with:
yaml-file: ".test/esphome_idf53_core.yaml"
version: latest
build_ard_basic: build_ard_basic:
name: Basic (Arduino) name: "📦 Arduino Basic (latest)"
needs: build_ard_core needs: build_ard_core
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@main - uses: actions/checkout@main
- name: Build Basic (Arduino) - name: Build Arduino Basic - latest
uses: esphome/build-action@main uses: esphome/build-action@main
with: with:
yaml-file: ".test/esphome_ard_basic.yaml" yaml-file: ".test/esphome_ard_basic.yaml"
version: latest version: latest
build_idf_basic: build_ard_basic_dev:
name: Basic (IDF) name: "📦 Arduino Basic (dev)"
needs: build_idf_core needs: build_ard_core
if: success() && !github.event.inputs.skip_dev
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@main - uses: actions/checkout@main
- name: Build Basic (IDF) - name: Build Arduino Basic - dev
uses: esphome/build-action@main uses: esphome/build-action@main
with: with:
yaml-file: ".test/esphome_idf_basic.yaml" yaml-file: ".test/esphome_ard_basic.yaml"
version: latest version: dev
build_idf53_basic:
name: Basic (IDF v5.3)
needs: build_idf53_core
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- name: Build Basic (IDF v5.3)
uses: esphome/build-action@main
with:
yaml-file: ".test/esphome_idf53_basic.yaml"
version: latest
build_ard_hw_relays: build_ard_hw_relays:
name: HW Relays (Arduino) name: "🔌 Arduino HW Relays (latest)"
needs: build_ard_core needs: build_ard_basic
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@main - uses: actions/checkout@main
- name: Build HW Relays (Arduino) - name: Build Arduino HW Relays - latest
uses: esphome/build-action@main uses: esphome/build-action@main
with: with:
yaml-file: ".test/esphome_ard_hw_relays.yaml" yaml-file: ".test/esphome_ard_hw_relays.yaml"
version: latest 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_idf53_hw_relays:
name: HW Relays (IDF v5.3)
needs: build_idf53_core
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- name: Build HW Relays (IDF v5.3)
uses: esphome/build-action@main
with:
yaml-file: ".test/esphome_idf53_hw_relays.yaml"
version: latest
build_ard_hw_speaker: build_ard_hw_speaker:
name: HW Speaker (Arduino) name: "🔌 Arduino HW Speaker (latest)"
needs: build_ard_core needs: build_ard_basic
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@main - uses: actions/checkout@main
- name: Build HW Speaker (Arduino) - name: Build Arduino HW Speaker - latest
uses: esphome/build-action@main uses: esphome/build-action@main
with: with:
yaml-file: ".test/esphome_ard_hw_speaker.yaml" yaml-file: ".test/esphome_ard_hw_speaker.yaml"
version: latest 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_idf53_hw_speaker:
name: HW Speaker (IDF v5.3)
needs: build_idf53_core
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- name: Build HW Speaker (IDF v5.3)
uses: esphome/build-action@main
with:
yaml-file: ".test/esphome_idf53_hw_speaker.yaml"
version: latest
build_ard_hw_vibration: build_ard_hw_vibration:
name: HW Vibration (Arduino) name: "🔌 Arduino HW Vibration (latest)"
needs: build_ard_core needs: build_ard_basic
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@main - uses: actions/checkout@main
- name: Build HW Vibration (Arduino) - name: Build Arduino HW Vibration - latest
uses: esphome/build-action@main uses: esphome/build-action@main
with: with:
yaml-file: ".test/esphome_ard_hw_vibration.yaml" yaml-file: ".test/esphome_ard_hw_vibration.yaml"
version: latest version: latest
build_idf_hw_vibration: build_ard_ble_proxy_latest:
name: HW Vibration (IDF) name: "⚡ Arduino BLE Proxy (latest)"
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_idf53_hw_vibration:
name: HW Vibration (IDF v5.3)
needs: build_idf53_core
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- name: Build HW Vibration (IDF v5.3)
uses: esphome/build-action@main
with:
yaml-file: ".test/esphome_idf53_hw_vibration.yaml"
version: latest
build_ard_ble_proxy:
name: Bluetooth Proxy (Ard)
needs: build_ard_basic needs: build_ard_basic
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@main - uses: actions/checkout@main
- name: Build BLE Proxy (Ard) - name: Build Arduino BLE Proxy - latest
uses: esphome/build-action@main uses: esphome/build-action@main
with: with:
yaml-file: ".test/esphome_ard_ble_proxy.yaml" yaml-file: ".test/esphome_ard_ble_proxy.yaml"
version: latest version: latest
build_idf_ble_proxy: build_ard_ble_proxy_dev:
name: Bluetooth Proxy (IDF) 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 needs: build_idf_basic
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@main - 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 uses: esphome/build-action@main
with: with:
yaml-file: ".test/esphome_idf_ble_proxy.yaml" yaml-file: ".test/esphome_idf_ble_proxy.yaml"
version: latest version: latest
build_idf53_ble_proxy: build_idf_ble_proxy_dev:
name: Bluetooth Proxy (IDF v5.3) name: "⚡ IDF BLE Proxy (dev)"
needs: build_idf53_basic needs: build_idf_basic_dev
if: success() && !github.event.inputs.skip_dev
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@main - uses: actions/checkout@main
- name: Build BLE Proxy (IDF v5.3) - name: Build IDF BLE Proxy - dev
uses: esphome/build-action@main uses: esphome/build-action@main
with: with:
yaml-file: ".test/esphome_idf53_ble_proxy.yaml" yaml-file: ".test/esphome_idf_ble_proxy.yaml"
version: latest version: dev
build_ard_media_player: # Summary Jobs - Grouped by framework and environment
name: Media Player (Ard) summary_arduino:
name: "📊 Arduino Framework"
needs: 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_basic
- build_ard_hw_relays - build_ard_hw_relays
- build_ard_hw_speaker
- build_ard_hw_vibration - 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 runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@main - name: Latest ESPHome Results
- name: Build Media Player (Ard) run: |
uses: esphome/build-action@main SUCCESS=0
with: TOTAL=12
yaml-file: ".test/esphome_ard_media_player.yaml"
version: latest # 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
... ...

View File

@@ -1,282 +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_idf53_core:
name: Core (IDF v5.3)
needs: code_scan
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- name: Build Core (IDF v5.3)
uses: esphome/build-action@main
with:
yaml-file: ".test/esphome_idf53_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_idf53_basic:
name: Basic (IDF v5.3)
needs: build_idf53_core
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- name: Build Basic (IDF v5.3)
uses: esphome/build-action@main
with:
yaml-file: ".test/esphome_idf53_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_idf53_hw_relays:
name: HW Relays (IDF v5.3)
needs: build_idf53_core
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- name: Build HW Relays (IDF v5.3)
uses: esphome/build-action@main
with:
yaml-file: ".test/esphome_idf53_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_idf53_hw_speaker:
name: HW Speaker (IDF v5.3)
needs: build_idf53_core
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- name: Build HW Speaker (IDF v5.3)
uses: esphome/build-action@main
with:
yaml-file: ".test/esphome_idf53_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_idf53_hw_vibration:
name: HW Vibration (IDF v5.3)
needs: build_idf53_core
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- name: Build HW Vibration (IDF v5.3)
uses: esphome/build-action@main
with:
yaml-file: ".test/esphome_idf53_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_idf53_ble_proxy:
name: Bluetooth Proxy (IDF v5.3)
needs: build_idf53_basic
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- name: Build BLE Proxy (IDF v5.3)
uses: esphome/build-action@main
with:
yaml-file: ".test/esphome_idf53_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
...

View File

@@ -17,23 +17,28 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Check out code - name: Check out code
uses: actions/checkout@main uses: actions/checkout@v4
with: with:
fetch-depth: '0' fetch-depth: 0 # Ensures full commit history for diff
# https://github.com/marketplace/actions/markdownlint-cli2-action
- name: Identify changed files - name: Identify changed files
uses: tj-actions/changed-files@v41
id: changed-files id: changed-files
with: run: |
files: '**/*.md' BASE=${{ github.event.before }}
separator: "," HEAD=${{ github.sha }}
# https://github.com/marketplace/actions/markdownlint-cli2-action FILES=$(git diff --name-only $BASE $HEAD -- '**/*.md' | tr '\n' ',')
echo "changed_files=$FILES" >> $GITHUB_ENV
if [[ -n "$FILES" ]]; then
echo "any_changed=true" >> $GITHUB_ENV
else
echo "any_changed=false" >> $GITHUB_ENV
fi
- name: Markdown Lint - name: Markdown Lint
uses: DavidAnson/markdownlint-cli2-action@v14 uses: DavidAnson/markdownlint-cli2-action@v14
if: steps.changed-files.outputs.any_changed == 'true' if: env.any_changed == 'true'
with: with:
globs: ${{ steps.changed-files.outputs.all_changed_files }} globs: ${{ env.changed_files }}
separator: "," separator: ","
config: '.rules/.markdownlint.jsonc' config: '.rules/.markdownlint.jsonc'
fix: true fix: true
@@ -43,15 +48,27 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Check out code - name: Check out code
uses: actions/checkout@main uses: actions/checkout@v4
with: with:
fetch-depth: '0' fetch-depth: 0
- name: Identify changed files
id: changed-files
run: |
BASE=${{ github.event.before }}
HEAD=${{ github.sha }}
FILES=$(git diff --name-only $BASE $HEAD -- '**/*.md' | tr '\n' ',')
echo "changed_files=$FILES" >> $GITHUB_ENV
if [[ -n "$FILES" ]]; then
echo "any_changed=true" >> $GITHUB_ENV
else
echo "any_changed=false" >> $GITHUB_ENV
fi
# https://github.com/gaurav-nelson/github-action-markdown-link-check
- name: Markdown links - name: Markdown links
uses: gaurav-nelson/github-action-markdown-link-check@v1 uses: gaurav-nelson/github-action-markdown-link-check@v1
if: env.any_changed == 'true'
with: with:
# yamllint disable-line rule:truthy
check-modified-files-only: yes check-modified-files-only: yes
config-file: '.rules/mlc_config.json' config-file: '.rules/mlc_config.json'
base-branch: 'main' base-branch: 'main'

View File

@@ -19,24 +19,29 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Check out code - name: Check out code
uses: actions/checkout@main uses: actions/checkout@v4
with: with:
fetch-depth: '0' fetch-depth: 0 # Ensures full commit history for diff
- name: Identify changed files - name: Identify changed files
uses: tj-actions/changed-files@v41
id: changed-files id: changed-files
with: run: |
files: '**/*.y*ml' BASE=${{ github.event.before }}
separator: "," HEAD=${{ github.sha }}
FILES=$(git diff --name-only $BASE $HEAD -- '**/*.yml' '**/*.yaml' | tr '\n' ',')
echo "changed_files=$FILES" >> $GITHUB_ENV
if [[ -n "$FILES" ]]; then
echo "any_changed=true" >> $GITHUB_ENV
else
echo "any_changed=false" >> $GITHUB_ENV
fi
- name: Validate YAML - name: Validate YAML
if: steps.changed-files.outputs.any_changed == 'true' if: env.any_changed == 'true'
run: | run: |
IFS=',' read -ra FILES <<< "${{ steps.changed-files.outputs.all_changed_files }}" IFS=',' read -ra FILES <<< "${{ env.changed_files }}"
for file in "${FILES[@]}"; do for file in "${FILES[@]}"; do
if [[ "$file" =~ ^*\.yaml$ ]] || \ if [[ "$file" =~ ^.*\.yaml$ ]] || [[ "$file" =~ ^ESPHome/.*\.yaml$ ]]; then
[[ "$file" =~ ^ESPHome/*\.yaml$ ]]; then
echo "Skipping $file" echo "Skipping $file"
continue continue
fi fi

View File

@@ -5,15 +5,4 @@ packages:
esp32: esp32:
framework: framework:
type: esp-idf 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
... ...

View File

@@ -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
...

View File

@@ -3,5 +3,6 @@ packages:
common_arduino: !include common_ard.yaml common_arduino: !include common_ard.yaml
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
standard_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard.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:
... ...

View File

@@ -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
...

View File

@@ -1,11 +0,0 @@
---
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
media_player: !remove
switch:
- id: !remove sw_speaker_amplifier
...

View File

@@ -1,13 +0,0 @@
---
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
version: 5.3.1
platform_version: 6.9.0
...

View File

@@ -1,5 +0,0 @@
---
packages:
common_idf53: !include common_idf53.yaml
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
...

View File

@@ -1,6 +0,0 @@
---
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
...

View File

@@ -1,6 +0,0 @@
---
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
...

View File

@@ -1,6 +0,0 @@
---
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
...

View File

@@ -3,9 +3,4 @@ packages:
common_idf: !include common_idf.yaml common_idf: !include common_idf.yaml
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
standard_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml standard_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml
media_player: !remove
switch:
- id: !remove sw_speaker_amplifier
... ...

View File

@@ -3,5 +3,6 @@ packages:
common: !include common.yaml common: !include common.yaml
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
standard_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard.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:
... ...

View File

@@ -2,57 +2,22 @@
##### TX Ultimate Easy for ESPHome ##### ##### TX Ultimate Easy for ESPHome #####
##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy ##### ##### 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 ##### ##### Author: edwardtfn - https://github.com/edwardtfn - https://buymeacoffee.com/edwardfirmo #####
#################################################################################################### ####################################################################################################
##### NOTE: ##### ##### REMOVAL NOTICE: #####
##### - Make changes ONLY if absolutely necessary and you have the required knowledge. ##### ##### This package has been removed. Please update your configuration. #####
##### - For normal system use, modifications to this file are NOT required. ##### ##### Add BLE proxy functionality directly in your YAML configuration instead: #####
##### bluetooth_proxy: #####
#################################################################################################### ####################################################################################################
--- ---
packages: # Trigger the error at compile time
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: script:
- id: !extend dump_config_list_packages - id: force_compilation_error
then: then:
- script.wait: dump_config
- lambda: |- - lambda: |-
// Check for requirements #error "The package TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml has been removed." \
#if !defined(TX_ULTIMATE_EASY_CORE) "Please remove this package from your configuration and add" \
#error "The package TX-Ultimate-Easy-ESPHome_core.yaml is required." "'bluetooth_proxy:' directly to your YAML instead."
#endif
// Identify itself
ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Add-on - BLE Proxy");
switch:
- id: !remove sw_speaker_amplifier
... ...

View File

@@ -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
...

View File

@@ -17,6 +17,8 @@ substitutions:
<<: !include ../versioning/VERSION_YAML <<: !include ../versioning/VERSION_YAML
EVENT_NAME: esphome.tx_ultimate_easy
TX_MODEL_FORMAT_EU_TEXT: "EU (Square, T5-xC-86)" TX_MODEL_FORMAT_EU_TEXT: "EU (Square, T5-xC-86)"
TX_MODEL_FORMAT_US_TEXT: "US (Rectangle, T5-xC-120)" TX_MODEL_FORMAT_US_TEXT: "US (Rectangle, T5-xC-120)"
@@ -27,7 +29,6 @@ substitutions:
DUMP_CONFIG_CALLER_DELAY: 10s # Delay to dump config after requested DUMP_CONFIG_CALLER_DELAY: 10s # Delay to dump config after requested
api: api:
id: api_server id: api_server
on_client_connected: on_client_connected:
@@ -61,6 +62,8 @@ button:
esp32: esp32:
board: esp32dev board: esp32dev
flash_size: 8MB flash_size: 8MB
framework:
type: esp-idf
esphome: esphome:
name: ${name} name: ${name}
@@ -97,11 +100,6 @@ globals:
restore_value: true restore_value: true
initial_value: '0' initial_value: '0'
- id: gang_count_plural_suffix
type: std::string
restore_value: true
max_restore_data_length: 3
logger: logger:
level: DEBUG level: DEBUG
@@ -109,8 +107,6 @@ ota:
platform: esphome platform: esphome
psram: psram:
mode: octal
speed: 80MHz
script: script:
- id: api_send_ha_event_boot - id: api_send_ha_event_boot
@@ -118,13 +114,15 @@ script:
parameters: parameters:
type: string type: string
then: then:
- homeassistant.event: - lambda: |-
event: esphome.tx_ultimate_easy // Send event to Home Assistant
data: esphome::api::CustomAPIDevice ha_event;
device_name: !lambda return tx_device_name->state.c_str(); ha_event.fire_homeassistant_event("${EVENT_NAME}", {
firmware: ${version} {"device_name", id(tx_device_name).state.c_str()},
domain: boot {"firmware", "${version}"},
type: !lambda return type.c_str(); {"domain", "boot"},
{"type", type.c_str()}
});
- id: boot_done - id: boot_done
mode: restart mode: restart
@@ -153,7 +151,6 @@ script:
if (id(gang_count) < 1 || id(gang_count) > 4) { if (id(gang_count) < 1 || id(gang_count) > 4) {
ESP_LOGE("core_hw_leds", "Invalid number of gangs: %" PRIu8, id(gang_count)); 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 - id: boot_sequence
mode: restart mode: restart
@@ -189,7 +186,7 @@ script:
ESP_LOGCONFIG("core", "Model format (selected): %s", sl_tx_model_format->state.c_str()); 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", "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 (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 // System state
if (bs_pending_restart->state) if (bs_pending_restart->state)

View File

@@ -112,18 +112,19 @@ script:
action: string action: string
count: uint8_t count: uint8_t
then: then:
- homeassistant.event:
event: esphome.tx_ultimate_easy
data:
device_name: !lambda return tx_device_name->state.c_str();
firmware: ${version}
domain: touch
type: button
action: !lambda return action.c_str();
button_id: !lambda return button;
count: !lambda return count;
position: !lambda return id(button_press_position);
- lambda: |- - 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", "button"},
{"action", action.c_str()},
{"button_id", std::to_string(button)},
{"count", std::to_string(count)},
{"position", std::to_string(id(button_press_position))}
});
ESP_LOGI("core_hw_buttons", "Button %" PRIu8 " action: '%s'", button, action.c_str()); ESP_LOGI("core_hw_buttons", "Button %" PRIu8 " action: '%s'", button, action.c_str());
if (action == "click") { if (action == "click") {
switch (button) { switch (button) {
@@ -208,10 +209,11 @@ script:
- id: !extend dump_config - id: !extend dump_config
then: then:
- lambda: |- - lambda: |-
std::string gang_count_plural_suffix = id(gang_count) > 1 ? "s" : "";
// Button's actions // Button's actions
ESP_LOGCONFIG("core_hw_buttons", "Button%s action%s:", ESP_LOGCONFIG("core_hw_buttons", "Button%s action%s:",
id(gang_count_plural_suffix).c_str(), gang_count_plural_suffix.c_str(),
id(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() ESP_LOGCONFIG("core_hw_buttons", " Relay 1: %s", sl_button_1_action->has_state()
? sl_button_1_action->state.c_str() ? sl_button_1_action->state.c_str()
: "Unknown"); : "Unknown");

View File

@@ -50,14 +50,19 @@ light:
num_leds: 32 num_leds: 32
pin: GPIO13 pin: GPIO13
restore_mode: ${LIGHT_FULL_RESTORE_MODE} restore_mode: ${LIGHT_FULL_RESTORE_MODE}
platform: neopixelbus platform: esp32_rmt_led_strip
type: GRB rgb_order: GRB
variant: WS2811 chipset: ws2812
max_refresh_rate: 33ms
use_psram: false
# platform: neopixelbus
# type: GRB
# variant: WS2811
# Those lights are available based on the model selections # Those lights are available based on the model selections
- &light_partition_with_effects - &light_partition_with_effects_eu
id: light_eu id: light_eu
name: Light name: Light EU
platform: partition platform: partition
default_transition_length: ${default_transition_length} default_transition_length: ${default_transition_length}
internal: true internal: true
@@ -65,8 +70,10 @@ light:
effects: effects:
- addressable_rainbow: - addressable_rainbow:
name: "Rainbow" name: "Rainbow"
width: 28
- addressable_rainbow: - addressable_rainbow:
name: "Rainbow - Fast" name: "Rainbow - Fast"
width: 28
speed: 50 speed: 50
- pulse: - pulse:
name: "Pulse" name: "Pulse"
@@ -105,35 +112,82 @@ light:
from: 0 from: 0
to: 27 to: 27
- id: light_us - &light_partition_with_effects_us
name: Light id: light_us
<<: *light_partition_with_effects name: Light US
platform: partition
default_transition_length: ${default_transition_length}
internal: true
restore_mode: ${LIGHT_SIDES_RESTORE_MODE}
effects:
- addressable_rainbow:
name: "Rainbow"
width: 32
- addressable_rainbow:
name: "Rainbow - Fast"
width: 32
speed: 50
- pulse:
name: "Pulse"
transition_length: 1s
update_interval: 1s
- pulse:
name: "Pulse - Slow"
transition_length: 2s
update_interval: 2s
- addressable_scan:
name: "Scan"
move_interval: 100ms
scan_width: 3
- addressable_twinkle:
name: "Twinkle"
twinkle_probability: 5%
progress_interval: 4ms
- addressable_random_twinkle:
name: "Random Twinkle"
twinkle_probability: 20%
progress_interval: 32ms
- addressable_fireworks:
name: "Fireworks"
update_interval: 32ms
spark_probability: 10%
use_random_color: false
fade_out_rate: 120
- addressable_flicker:
name: "Flicker"
update_interval: 16ms
intensity: 5%
- random:
name: "Random"
segments: segments:
- id: light_full - id: light_full
from: 0 from: 0
to: 31 to: 31
- &light_partition_with_effects_disabled - &light_partition_no_effects_disabled
id: light_eu_bottom id: light_eu_bottom
name: Light - Bottom name: Light - Bottom EU
platform: partition
disabled_by_default: true disabled_by_default: true
<<: *light_partition_with_effects default_transition_length: ${default_transition_length}
restore_mode: ${LIGHT_SIDES_RESTORE_MODE}
internal: true
segments: segments:
- id: light_full - id: light_full
from: 6 from: 6
to: 12 to: 12
reversed: true reversed: true
- id: light_eu_left - id: light_eu_left
name: Light - Left name: Light - Left EU
<<: *light_partition_with_effects_disabled <<: *light_partition_no_effects_disabled
segments: segments:
- id: light_full - id: light_full
from: 13 from: 13
to: 19 to: 19
reversed: true reversed: true
- id: light_eu_right - id: light_eu_right
name: Light - Right name: Light - Right EU
<<: *light_partition_with_effects_disabled <<: *light_partition_no_effects_disabled
segments: segments:
- id: light_full - id: light_full
from: 27 from: 27
@@ -144,32 +198,32 @@ light:
to: 5 to: 5
reversed: false reversed: false
- id: light_eu_top - id: light_eu_top
name: Light - Top name: Light - Top EU
<<: *light_partition_with_effects_disabled <<: *light_partition_no_effects_disabled
segments: segments:
- id: light_full - id: light_full
from: 20 from: 20
to: 26 to: 26
reversed: false reversed: false
- id: light_us_bottom - id: light_us_bottom
name: Light - Bottom name: Light - Bottom US
<<: *light_partition_with_effects_disabled <<: *light_partition_no_effects_disabled
segments: segments:
- id: light_full - id: light_full
from: 9 from: 9
to: 14 to: 14
reversed: true reversed: true
- id: light_us_left - id: light_us_left
name: Light - Left name: Light - Left US
<<: *light_partition_with_effects_disabled <<: *light_partition_no_effects_disabled
segments: segments:
- id: light_full - id: light_full
from: 15 from: 15
to: 24 to: 24
reversed: true reversed: true
- id: light_us_right - id: light_us_right
name: Light - Right name: Light - Right US
<<: *light_partition_with_effects_disabled <<: *light_partition_no_effects_disabled
segments: segments:
- id: light_full - id: light_full
from: 31 from: 31
@@ -180,8 +234,8 @@ light:
to: 8 to: 8
reversed: false reversed: false
- id: light_us_top - id: light_us_top
name: Light - Top name: Light - Top US
<<: *light_partition_with_effects_disabled <<: *light_partition_no_effects_disabled
segments: segments:
- id: light_full - id: light_full
from: 25 from: 25
@@ -443,10 +497,11 @@ script:
- id: !extend dump_config - id: !extend dump_config
then: then:
- lambda: |- - lambda: |-
std::string gang_count_plural_suffix = id(gang_count) > 1 ? "s" : "";
// Relay's LEDs modes // Relay's LEDs modes
ESP_LOGCONFIG("core_hw_leds", "Relay%s LEDs mode%s:", ESP_LOGCONFIG("core_hw_leds", "Relay%s LEDs mode%s:",
id(gang_count_plural_suffix).c_str(), gang_count_plural_suffix.c_str(),
id(gang_count_plural_suffix).c_str()); gang_count_plural_suffix.c_str());
ESP_LOGCONFIG("core_hw_leds", " Relay 1: %s", id(is_us_model) 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_us->state.c_str()
: sl_relay_1_light_mode_eu->state.c_str()); : sl_relay_1_light_mode_eu->state.c_str());
@@ -567,7 +622,7 @@ select:
# EU relay light mode template # EU relay light mode template
- &relay_light_mode_eu - &relay_light_mode_eu
id: sl_relay_1_light_mode_eu id: sl_relay_1_light_mode_eu
name: Relay 1 light mode name: Relay 1 light mode EU
platform: template platform: template
options: options:
- "${LIGHT_MODE_DISABLED_TEXT}" - "${LIGHT_MODE_DISABLED_TEXT}"
@@ -582,19 +637,19 @@ select:
disabled_by_default: false disabled_by_default: false
icon: mdi:dots-square icon: mdi:dots-square
- id: sl_relay_2_light_mode_eu - id: sl_relay_2_light_mode_eu
name: Relay 2 light mode name: Relay 2 light mode EU
<<: *relay_light_mode_eu <<: *relay_light_mode_eu
- id: sl_relay_3_light_mode_eu - id: sl_relay_3_light_mode_eu
name: Relay 3 light mode name: Relay 3 light mode EU
<<: *relay_light_mode_eu <<: *relay_light_mode_eu
- id: sl_relay_4_light_mode_eu - id: sl_relay_4_light_mode_eu
name: Relay 4 light mode name: Relay 4 light mode EU
<<: *relay_light_mode_eu <<: *relay_light_mode_eu
# US relay light mode template # US relay light mode template
- &relay_light_mode_us - &relay_light_mode_us
id: sl_relay_1_light_mode_us id: sl_relay_1_light_mode_us
name: Relay 1 light mode name: Relay 1 light mode US
platform: template platform: template
options: options:
- "${LIGHT_MODE_DISABLED_TEXT}" - "${LIGHT_MODE_DISABLED_TEXT}"
@@ -609,12 +664,12 @@ select:
disabled_by_default: false disabled_by_default: false
icon: mdi:dots-square icon: mdi:dots-square
- id: sl_relay_2_light_mode_us - id: sl_relay_2_light_mode_us
name: Relay 2 light mode name: Relay 2 light mode US
<<: *relay_light_mode_us <<: *relay_light_mode_us
- id: sl_relay_3_light_mode_us - id: sl_relay_3_light_mode_us
name: Relay 3 light mode name: Relay 3 light mode US
<<: *relay_light_mode_us <<: *relay_light_mode_us
- id: sl_relay_4_light_mode_us - id: sl_relay_4_light_mode_us
name: Relay 4 light mode name: Relay 4 light mode US
<<: *relay_light_mode_us <<: *relay_light_mode_us
... ...

View File

@@ -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
...

View File

@@ -386,69 +386,85 @@ tx_ultimate_easy:
} }
on_multi_touch_release: on_multi_touch_release:
- homeassistant.event: then:
event: esphome.tx_ultimate_easy - homeassistant.event:
data: event: ${EVENT_NAME}
device_name: !lambda return tx_device_name->state.c_str(); data:
firmware: ${version} device_name: !lambda return id(tx_device_name).state.c_str();
domain: touch firmware: ${version}
type: multi_touch domain: touch
action: release type: multi_touch
position: !lambda return touch.x; action: release
- lambda: ESP_LOGI("core_hw_touch", "Multi-touch released"); position: !lambda return std::to_string(touch.x);
- script.execute: touch_on_multi_touch_release - lambda: |-
ESP_LOGI("core_hw_touch", "Multi-touch released");
touch_on_multi_touch_release->execute();
on_press: on_press:
- lambda: |- then:
const uint8_t position = static_cast<uint8_t>(touch.x); - lambda: |-
if (position > ${TOUCH_POSITION_MAX_VALUE}) { // Check for valid range const uint8_t position = static_cast<uint8_t>(touch.x);
ESP_LOGE("core_hw_touch", "Invalid touch position: %" PRIu8, position); if (position > ${TOUCH_POSITION_MAX_VALUE}) { // Check for valid range
} else { ESP_LOGE("core_hw_touch", "Invalid touch position: %" PRIu8, position);
ESP_LOGI("core_hw_touch", "Pressed at position %" PRIu8, position); } else {
touch_on_press->execute(static_cast<uint8_t>(touch.button), position); ESP_LOGI("core_hw_touch", "Pressed at position %" PRIu8, position);
} touch_on_press->execute(static_cast<uint8_t>(touch.button), position);
}
on_release: on_release:
- lambda: ESP_LOGI("core_hw_touch", "Released"); then:
- script.execute: touch_on_release - lambda: ESP_LOGI("core_hw_touch", "Released");
- script.execute: touch_on_release
on_swipe_left: on_swipe_left:
- homeassistant.event: then:
event: esphome.tx_ultimate_easy - homeassistant.event:
data: event: ${EVENT_NAME}
device_name: !lambda return tx_device_name->state.c_str(); data:
firmware: ${version} device_name: !lambda return id(tx_device_name).state.c_str();
domain: touch firmware: ${version}
type: swipe domain: touch
action: !lambda |- type: swipe
return sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}" ? "left" : "down"; action: !lambda |-
swipe-direction: !lambda |- if (sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}")
return sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}" ? "left" : "down"; return "left";
position: !lambda return touch.x; else
- lambda: |- return "down";
ESP_LOGI("core_hw_touch", "Swipe %s", sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}" swipe-direction: !lambda |-
? "left" if (sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}")
: "down"); return "left";
- script.execute: touch_swipe_left else
return "down";
position: !lambda return std::to_string(touch.x);
- lambda: |-
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: on_swipe_right:
- homeassistant.event: then:
event: esphome.tx_ultimate_easy - homeassistant.event:
data: event: ${EVENT_NAME}
device_name: !lambda return tx_device_name->state.c_str(); data:
firmware: ${version} device_name: !lambda return id(tx_device_name).state.c_str();
domain: touch firmware: ${version}
type: swipe domain: touch
action: !lambda |- type: swipe
return sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}" ? "right" : "up"; action: !lambda |-
swipe-direction: !lambda |- if (sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}")
return sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}" ? "right" : "up"; return "right";
position: !lambda return touch.x; else
- lambda: |- return "up";
ESP_LOGI("core_hw_touch", "Swipe %s", sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}" swipe-direction: !lambda |-
? "right" if (sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}")
: "up"); return "right";
- script.execute: touch_swipe_right else
return "up";
position: !lambda return std::to_string(touch.x);
- lambda: |-
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: on_touch_event:
- lambda: |- - lambda: |-

View File

@@ -11,15 +11,18 @@
##### - For normal system use, modifications to this file are NOT required. ##### ##### - For normal system use, modifications to this file are NOT required. #####
#################################################################################################### ####################################################################################################
--- ---
substitutions:
SWITCH_AUDIO_AMPLIFIER_RESTORE_MODE: RESTORE_DEFAULT_ON
esphome: esphome:
platformio_options: platformio_options:
build_flags: build_flags:
- -D TX_ULTIMATE_EASY_STANDARD_HW_AUDIO - -D TX_ULTIMATE_EASY_STANDARD_HW_AUDIO
i2s_audio: i2s_audio:
id: if_i2s_audio - id: if_i2s_audio
i2s_bclk_pin: GPIO2 i2s_bclk_pin: GPIO2
i2s_lrclk_pin: GPIO4 i2s_lrclk_pin: GPIO4
script: script:
- id: !extend dump_config_list_packages - id: !extend dump_config_list_packages
@@ -33,4 +36,15 @@ script:
// Identify itself // Identify itself
ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Standard - Hardware - Audio"); 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
... ...

View File

@@ -703,10 +703,11 @@ script:
- id: !extend dump_config - id: !extend dump_config
then: then:
- lambda: |- - lambda: |-
std::string gang_count_plural_suffix = id(gang_count) > 1 ? "s" : "";
// Relay's modes // Relay's modes
ESP_LOGCONFIG("standard_hw_relays", "Relay%s mode%s:", ESP_LOGCONFIG("standard_hw_relays", "Relay%s mode%s:",
id(gang_count_plural_suffix).c_str(), gang_count_plural_suffix.c_str(),
id(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() ESP_LOGCONFIG("standard_hw_relays", " Relay 1: %s", sl_relay_1_mode->has_state()
? sl_relay_1_mode->state.c_str() ? sl_relay_1_mode->state.c_str()
: "Unknown"); : "Unknown");
@@ -725,8 +726,8 @@ script:
// Relay's states // Relay's states
ESP_LOGCONFIG("standard_hw_relays", "Relay%s state%s:", ESP_LOGCONFIG("standard_hw_relays", "Relay%s state%s:",
id(gang_count_plural_suffix).c_str(), gang_count_plural_suffix.c_str(),
id(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"); ESP_LOGCONFIG("standard_hw_relays", " Relay 1: %s", sw_relay_1->state ? "ON" : "OFF");
if (id(gang_count) >= 2) if (id(gang_count) >= 2)
ESP_LOGCONFIG("standard_hw_relays", " Relay 2: %s", sw_relay_2->state ? "ON" : "OFF"); ESP_LOGCONFIG("standard_hw_relays", " Relay 2: %s", sw_relay_2->state ? "ON" : "OFF");

View File

@@ -38,11 +38,11 @@ api:
esphome: esphome:
platformio_options: platformio_options:
build_flags: build_flags:
- -D TX_ULTIMATE_EASY_STANDARD_SPEAKER - -D TX_ULTIMATE_EASY_STANDARD_HW_SPEAKER
number: number:
- id: speaker_volume - id: speaker_volume
name: Sound - Volume name: Speaker Volume
platform: template platform: template
max_value: 100 max_value: 100
min_value: 0 min_value: 0
@@ -179,4 +179,8 @@ speaker:
i2s_audio_id: if_i2s_audio i2s_audio_id: if_i2s_audio
i2s_comm_fmt: stand_msb i2s_comm_fmt: stand_msb
channel: mono channel: mono
timeout: never
bits_per_sample: 16bit
sample_rate: 48000
buffer_duration: 500ms
... ...

View File

@@ -12,29 +12,64 @@
#################################################################################################### ####################################################################################################
--- ---
packages: 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: esphome:
platformio_options: platformio_options:
build_flags: 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: media_player:
- id: mp_media_player - id: mp_media_player
name: Media Player name: Media Player
internal: false internal: false
platform: i2s_audio platform: speaker
i2s_dout_pin: GPIO15 codec_support_enabled: true
i2s_audio_id: if_i2s_audio buffer_size: 250000
i2s_comm_fmt: msb task_stack_in_psram: false
dac_type: external announcement_pipeline:
mode: mono speaker: announcement_spk_resampling_input
mute_pin: format: WAV
number: GPIO26 num_channels: 1
inverted: true sample_rate: 48000
allow_other_uses: true 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<uint8_t>(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: 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 - id: !extend dump_config_list_packages
then: then:
- script.wait: dump_config - script.wait: dump_config
@@ -42,23 +77,36 @@ script:
// Check for requirements // Check for requirements
#if !defined(TX_ULTIMATE_EASY_CORE) #if !defined(TX_ULTIMATE_EASY_CORE)
#error "The package TX-Ultimate-Easy-ESPHome_core.yaml is required." #error "The package TX-Ultimate-Easy-ESPHome_core.yaml is required."
#endif #endif // TX_ULTIMATE_EASY_CORE
#if !defined(TX_ULTIMATE_EASY_STANDARD_HW_AUDIO) #if !defined(TX_ULTIMATE_EASY_STANDARD_HW_SPEAKER)
#error "The package TX-Ultimate-Easy-ESPHome_standard_hw_audio.yaml is required." #error "The package TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml is required."
#endif #endif // TX_ULTIMATE_EASY_STANDARD_HW_SPEAKER
// Identify itself // Identify itself
ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Add-on - Media Player"); ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Standard - Media Player");
switch: - id: sync_initial_volume
- id: sw_speaker_amplifier mode: restart
name: Speaker - Amplifier then:
platform: gpio - delay: 2s # Wait for media player to initialize
pin: - media_player.volume_set: # Sync initial volume from persisted number entity to media player
number: GPIO26 id: mp_media_player
inverted: true volume: !lambda return id(persistent_media_player_volume) / 100.0f;
allow_other_uses: true - lambda: |-
restore_mode: RESTORE_DEFAULT_ON id(last_media_player_volume) = id(persistent_media_player_volume);
internal: true ESP_LOGI("media_player_volume", "Initial volume sync: %.1f%% (restored from persistence)", id(persistent_media_player_volume));
entity_category: config
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
... ...

View File

@@ -27,6 +27,45 @@
[buymeacoffee-shield]: https://img.shields.io/static/v1?label=Buy%20me%20an%20ice%20cream&message=❄&color=blue [buymeacoffee-shield]: https://img.shields.io/static/v1?label=Buy%20me%20an%20ice%20cream&message=❄&color=blue
[buymeacoffee]: https://www.buymeacoffee.com/edwardfirmo [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 ## Integration with Home Assistant
TX Ultimate Easy exposes your device's components (sensors, touch panel, relays, etc.) to 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 - **Flexible Light Control**: Customize LED behavior and effects
- **Touch Panel Support**: Full support for touch gestures and multi-touch capabilities - **Touch Panel Support**: Full support for touch gestures and multi-touch capabilities
- **Advanced Automations**: Create complex automations using Home Assistant's powerful automation engine - **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 - **Audio Feedback**: Built-in speaker support for audible feedback
- **Haptic Feedback**: Vibration motor support for tactile feedback - **Haptic Feedback**: Vibration motor support for tactile feedback
- **ESP-IDF Framework**: Enhanced performance and stability with ESP-IDF support
## Hardware Support ## Hardware Support
@@ -126,7 +166,6 @@ Follow these steps to get your TX Ultimate device up and running with ESPHome.
files: files:
- ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml # Core (essential) packages - 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_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: You can also use a specific version tag for better control over updates:
```yaml ```yaml
@@ -151,6 +190,27 @@ Follow these steps to get your TX Ultimate device up and running with ESPHome.
> ap: # Access point configuration > 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 ### Advanced Settings
For more granular control over components, For more granular control over components,
you can use our [advanced configuration template](TX-Ultimate-Easy-ESPHome_advanced.yaml). 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) # 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_media_player.yaml # Media player (Recommended for most users)
# - ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml # Basic speaker # - ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml # Basic speaker
# Optional: Add Bluetooth proxy support
bluetooth_proxy:
``` ```
> [!NOTE] > [!NOTE]
@@ -305,7 +368,7 @@ After installation, you can:
2. Customize touch behaviors 2. Customize touch behaviors
3. Set up LED patterns and effects 3. Set up LED patterns and effects
4. Create automations 4. Create automations
5. Enable optional features like BLE proxy 5. Enable optional features like Bluetooth proxy
## Configuration Options ## Configuration Options
@@ -316,6 +379,7 @@ TX Ultimate Easy offers extensive configuration options:
- Relay modes and functions - Relay modes and functions
- Audio and haptic feedback settings - Audio and haptic feedback settings
- Network and connectivity options - Network and connectivity options
- Optional Bluetooth proxy functionality
## Contributing ## Contributing

View File

@@ -1 +1 @@
2025.1.4 2025.8.1

View File

@@ -1 +1 @@
version: 2025.1.4 version: 2025.8.1