Compare commits

..

60 Commits

Author SHA1 Message Date
GitHub Actions
f84b9af1ee Bump version to 2024.12.25 [skip-versioning] 2024-12-27 09:42:29 +00:00
Edward Firmo
9fa79bbde6 Merge pull request #79 from edwardtfn/install-instructions
Add install instructions
2024-12-27 10:42:19 +01:00
Edward Firmo
8a343ab8fe CodeRabbitAI 2024-12-27 10:39:51 +01:00
Edward Firmo
b5a96387cb Update README.md 2024-12-27 10:35:10 +01:00
Edward Firmo
8b7fad76c1 Update README.md 2024-12-27 10:34:45 +01:00
Edward Firmo
a224cd5f86 Indentation on note 2024-12-27 10:33:24 +01:00
Edward Firmo
da9dfbf808 Remove duplicated section label 2024-12-27 10:31:57 +01:00
Edward Firmo
bd5091293e Remove numbered sections 2024-12-27 10:29:50 +01:00
Edward Firmo
05c40cf7b5 Pinout in a table and test instructions 2024-12-27 10:24:39 +01:00
Edward Firmo
ebd8a5432a Minor changes as suggested by CodeRabbitAI 2024-12-27 10:20:24 +01:00
Edward Firmo
0779279d44 Add dynamic version example 2024-12-27 10:10:26 +01:00
Edward Firmo
09514e1331 Disable markdown lint 2024-12-27 10:04:14 +01:00
Edward Firmo
b7a66b2e87 Adding warnings 2024-12-27 10:02:05 +01:00
Edward Firmo
4266a7cdd8 Add a bit more of details
As suggested by CodeRabbitAI
2024-12-27 09:48:52 +01:00
Edward Firmo
40f8165d5c Fix link to reference in English 2024-12-27 09:30:55 +01:00
Edward Firmo
d3d5c21d38 Add install instructions 2024-12-27 09:27:13 +01:00
GitHub Actions
4b1aed33ef Bump version to 2024.12.24 [skip-versioning] 2024-12-27 02:53:35 +00:00
Edward Firmo
72a666cd3c Merge pull request #78 from edwardtfn/test-any-folder
Match any file with the extensions in any directory
2024-12-27 03:53:25 +01:00
Edward Firmo
5255912fcf Match any file with the extensions in any directory 2024-12-27 03:49:39 +01:00
GitHub Actions
c50bd5ca16 Bump version to 2024.12.23 [skip-versioning] 2024-12-27 02:40:01 +00:00
Edward Firmo
6313709fd5 Merge pull request #77 from edwardtfn/expose-relays-lights
Set relays lights to not be disabled when exposed
2024-12-27 03:39:51 +01:00
Edward Firmo
b431041b15 Set relays lights to not be disabled when exposed
Resolves #75
2024-12-27 03:37:09 +01:00
GitHub Actions
9fad193892 Bump version to 2024.12.22 [skip-versioning] 2024-12-27 02:32:14 +00:00
Edward Firmo
e6bf60555d Merge pull request #73 from edwardtfn/reorg-add-ons
Reorganize project's files
2024-12-27 03:32:03 +01:00
Edward Firmo
6a12074b71 Merge branch 'main' into reorg-add-ons 2024-12-27 03:29:36 +01:00
Edward Firmo
fee446c5e2 Specify permissions and trigger's files types 2024-12-27 03:12:29 +01:00
Edward Firmo
088213137f Do not try media player and speaker together 2024-12-27 02:55:27 +01:00
Edward Firmo
02c7c1aff1 Remove media player test with idf 5.3 2024-12-27 02:47:00 +01:00
Edward Firmo
3401aaf4a3 Add tests with hw_vibration 2024-12-27 02:42:36 +01:00
Edward Firmo
f154a483cc Run tests when test script changes 2024-12-27 02:36:47 +01:00
Edward Firmo
b69bc6916b Comments only 2024-12-27 02:33:52 +01:00
Edward Firmo
9d0fcf6bfa Test Media Player with Arduino 2024-12-27 02:30:52 +01:00
Edward Firmo
fa516a66cc Add HW Speaker tests 2024-12-27 02:27:48 +01:00
Edward Firmo
2811eedffb Bump version 2024-12-27 02:23:24 +01:00
Edward Firmo
0c9a5ac65e Rebuild tone_volume_change play on volume change
IDF v5.3 compatibility
2024-12-27 02:19:59 +01:00
Edward Firmo
9828b6ff8a Add tests core+hw_relays 2024-12-27 02:15:51 +01:00
Edward Firmo
6221e109e8 Rename speaker file 2024-12-27 02:08:11 +01:00
Edward Firmo
3d21c2ebcb Add cinttypes 2024-12-27 02:02:01 +01:00
Edward Firmo
7d12ddb0e5 Add WiFi SSID 2024-12-27 01:56:39 +01:00
Edward Firmo
ea12c1d422 Lint 2024-12-27 01:48:58 +01:00
Edward Firmo
c73cb950eb lint 2024-12-27 01:48:04 +01:00
Edward Firmo
e69873cab5 Create standard package 2024-12-27 01:42:41 +01:00
Edward Firmo
d4a18dc595 Play sound at volume change 2024-12-26 23:57:21 +01:00
Edward Firmo
45b30d30fa Removed reference to experimental i2s format 2024-12-26 22:17:45 +01:00
Edward Firmo
d656f4b73f Lint 2024-12-26 22:13:27 +01:00
Edward Firmo
493dcb0abb Lint 2024-12-26 22:09:48 +01:00
Edward Firmo
f8fa9a2363 Lint 2024-12-26 22:08:10 +01:00
Edward Firmo
47744c7144 More changes covered by build test 2024-12-26 22:06:09 +01:00
Edward Firmo
fa2c5dcc29 Lint 2024-12-26 22:01:56 +01:00
Edward Firmo
3cf6a11bc7 Add Speaker amplifier switch and removed click sound from substitutions 2024-12-26 21:59:31 +01:00
GitHub Actions
0109771731 Bump version to 2024.12.20 [skip-versioning] 2024-12-26 20:36:19 +00:00
Edward Firmo
b7df1686b6 Merge pull request #76 from arnonh/main
Fix for 4 gang button position
2024-12-26 21:36:10 +01:00
arnonh
c22d8eb847 Update tx_ultimate_easy.cpp
Fix for 4 gang button position
calculation reflects better the old positions
2024-12-26 21:13:22 +02:00
Edward Firmo
f3b84e9d4e Fix calls to speaker_play_click 2024-12-26 00:27:48 +01:00
Edward Firmo
81c6620fbf Split files even more 2024-12-25 23:01:33 +01:00
GitHub Actions
4378952d97 Bump version to 2024.12.19 [skip-versioning] 2024-12-25 02:06:44 +00:00
Edward Firmo
876d03ace5 Merge pull request #72 from edwardtfn/dump-config
Add dump config
2024-12-25 03:06:35 +01:00
Edward Firmo
5ddf5388bd Handle unknown states 2024-12-25 03:00:56 +01:00
Edward Firmo
7aee88c38f CodeRabbitAI suggestions 2024-12-25 02:34:18 +01:00
Edward Firmo
e546fedf08 Add dump config
To help troubleshooting
2024-12-25 02:11:10 +01:00
39 changed files with 1595 additions and 245 deletions

View File

@@ -1,6 +1,10 @@
---
name: Validate ESPHome (Latest)
permissions:
contents: read
pull-requests: read
on: # yamllint disable-line rule:truthy
workflow_dispatch:
@@ -27,36 +31,234 @@ jobs:
- name: Validate YAML files
run: find . -name "*.yaml" -exec yamllint -c ./.rules/yamllint.yml {} +
build_basic:
name: Basic
build_ard_core:
name: Core (Arduino)
needs: code_scan
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- name: Build core
- name: Build Core (Arduino)
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_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:
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: latest
build_bluetooth_proxy_4:
name: Bluetooth Proxy (IDF)
build_idf_basic:
name: Basic (IDF)
needs: build_idf_core
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- name: Build core
- name: Build Basic (IDF)
uses: esphome/build-action@main
with:
yaml-file: ".test/esphome_idf_bluetooth_proxy.yaml"
yaml-file: ".test/esphome_idf_basic.yaml"
version: latest
build_bluetooth_proxy_53:
name: Bluetooth Proxy (IDF v5.3)
build_idf53_basic:
name: Basic (IDF v5.3)
needs: build_idf53_core
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- name: Build core
- name: Build Basic (IDF v5.3)
uses: esphome/build-action@main
with:
yaml-file: ".test/esphome_idf53_bluetooth_proxy.yaml"
yaml-file: ".test/esphome_idf53_basic.yaml"
version: latest
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: 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:
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: 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:
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: 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_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
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: latest
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: latest
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: latest
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: latest
...

View File

@@ -1,27 +1,17 @@
---
name: Validate ESPHome (Beta)
permissions:
contents: read
pull-requests: read
on: # yamllint disable-line rule:truthy
push:
paths:
- "*.yaml"
- "ESPHome/*.yaml"
- ".test/*.yaml"
- "*.h"
- "*.c"
- "*.cpp"
- "*.py"
branches:
- main
- "**/*.{yml,yaml,h,cpp,c,py}" # Match any file with the extensions in any directory
pull_request:
paths:
- "*.yaml"
- "ESPHome/*.yaml"
- ".test/*.yaml"
- "*.h"
- "*.c"
- "*.cpp"
- "*.py"
- "**/*.{yml,yaml,h,cpp,c,py}" # Match any file with the extensions in any directory
workflow_dispatch:
concurrency:
@@ -47,36 +37,234 @@ jobs:
- name: Validate YAML files
run: find . -name "*.yaml" -exec yamllint -c ./.rules/yamllint.yml {} +
build_basic:
name: Basic
build_ard_core:
name: Core (Arduino)
needs: code_scan
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- name: Build core
- 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_bluetooth_proxy_4:
name: Bluetooth Proxy (IDF)
build_idf_basic:
name: Basic (IDF)
needs: build_idf_core
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- name: Build core
- name: Build Basic (IDF)
uses: esphome/build-action@main
with:
yaml-file: ".test/esphome_idf_bluetooth_proxy.yaml"
yaml-file: ".test/esphome_idf_basic.yaml"
version: beta
build_bluetooth_proxy_53:
name: Bluetooth Proxy (IDF v5.3)
build_idf53_basic:
name: Basic (IDF v5.3)
needs: build_idf53_core
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- name: Build core
- name: Build Basic (IDF v5.3)
uses: esphome/build-action@main
with:
yaml-file: ".test/esphome_idf53_bluetooth_proxy.yaml"
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

@@ -1,8 +1,13 @@
---
packages:
basic_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml # Basic package
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
standard_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml
esp32:
framework:
type: arduino
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
...

View File

@@ -0,0 +1,14 @@
---
packages:
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
standard_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml
addon_bluetooth_proxy: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml
esp32:
framework:
type: arduino
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
...

View File

@@ -0,0 +1,12 @@
---
packages:
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
esp32:
framework:
type: arduino
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
...

View File

@@ -0,0 +1,13 @@
---
packages:
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
standard_hw_relays_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml
esp32:
framework:
type: arduino
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
...

View File

@@ -0,0 +1,13 @@
---
packages:
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
standard_hw_speaker_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml
esp32:
framework:
type: arduino
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
...

View File

@@ -0,0 +1,13 @@
---
packages:
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
standard_hw_vibration_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml
esp32:
framework:
type: arduino
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
...

View File

@@ -0,0 +1,15 @@
---
packages:
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
standard_hw_relays_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml
standard_hw_vibration_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml
addon_media_player: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_addon_media_player.yaml
esp32:
framework:
type: arduino
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
...

View File

@@ -0,0 +1,15 @@
---
packages:
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
standard_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml
esp32:
framework:
type: esp-idf
version: 5.3.1
platform_version: 6.9.0
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
...

View File

@@ -0,0 +1,16 @@
---
packages:
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
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
...

View File

@@ -1,11 +1,14 @@
---
packages:
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.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
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
...

View File

@@ -0,0 +1,15 @@
---
packages:
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
standard_hw_relays_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml
esp32:
framework:
type: esp-idf
version: 5.3.1
platform_version: 6.9.0
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
...

View File

@@ -0,0 +1,15 @@
---
packages:
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
standard_hw_speaker_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml
esp32:
framework:
type: esp-idf
version: 5.3.1
platform_version: 6.9.0
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
...

View File

@@ -0,0 +1,15 @@
---
packages:
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
standard_hw_vibration_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml
esp32:
framework:
type: esp-idf
version: 5.3.1
platform_version: 6.9.0
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
...

View File

@@ -0,0 +1,13 @@
---
packages:
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
standard_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml
esp32:
framework:
type: esp-idf
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
...

View File

@@ -0,0 +1,14 @@
---
packages:
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
standard_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml
addon_bluetooth_proxy: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml
esp32:
framework:
type: esp-idf
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
...

View File

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

View File

@@ -0,0 +1,12 @@
---
packages:
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
esp32:
framework:
type: esp-idf
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
...

View File

@@ -0,0 +1,13 @@
---
packages:
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
standard_hw_relays_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml
esp32:
framework:
type: esp-idf
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
...

View File

@@ -0,0 +1,13 @@
---
packages:
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
standard_hw_speaker_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml
esp32:
framework:
type: esp-idf
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
...

View File

@@ -0,0 +1,13 @@
---
packages:
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
standard_hw_vibration_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml
esp32:
framework:
type: esp-idf
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
...

View File

@@ -11,97 +11,23 @@
##### - For normal system use, modifications to this file are NOT required. #####
####################################################################################################
---
substitutions:
# RTTTL format: name:d=duration,o=octave,b=tempo:notes
# d=32 (32nd note), o=5 (octave 5), b=100 (tempo 100)
tone_volume_change: "scale_up:d=32,o=5,b=100:c,c#,d#,e,f#,g#,a#,b" # Use "none" to disable sound
api:
actions:
- action: rtttl_play
variables:
# The RTTTL string for the melody to be played.
# It should follow the RTTTL format, including the melody's name,
# default settings, and a sequence of notes.
tone: string
then:
- lambda: |-
rtttl_speaker->stop();
if (rtttl_speaker_gain->state > 0) {
ESP_LOGI("api", "Play tone: '%s'", tone.c_str());
rtttl_speaker->play(tone.c_str());
}
bluetooth_proxy:
esp32:
framework:
type: esp-idf
sdkconfig_options:
CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST: "y"
CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY: "y"
CONFIG_ESP32_REV_MIN_3: "y"
CONFIG_MBEDTLS_DYNAMIC_BUFFER: "y"
CONFIG_MBEDTLS_DYNAMIC_FREE_CA_CERT: "y"
CONFIG_MBEDTLS_DYNAMIC_FREE_CONFIG_DATA: "y"
CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC: "y"
CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY: "y"
CONFIG_SPIRAM_RODATA: "y"
CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP: "y"
esphome:
platformio_options:
build_flags:
- -D TX_ULTIMATE_EASY_ADDON_BLE_PROXY
light:
- id: !extend light_full
platform: esp32_rmt_led_strip
rgb_order: GRB
rmt_channel: 1
chipset: ws2812
type: !remove
variant: !remove
max_refresh_rate: 33ms
use_psram: true
media_player: !remove
number:
- id: rtttl_speaker_gain
name: Sound - Volume
platform: template
max_value: 100
min_value: 0
step: 1
initial_value: 100
unit_of_measurement: "%"
internal: false
disabled_by_default: true
entity_category: config
device_class: sound_pressure
restore_value: true
optimistic: true
set_action:
script:
- id: !extend dump_config_list_packages
then:
- script.wait: dump_config
- lambda: |-
rtttl_speaker->set_gain((100-(x/10.0f))/100.0f);
std::string tone_volume_change = "${tone_volume_change}";
// Play sound if tone_volume_change is not "none"
if (x > 0 and !tone_volume_change.empty() and tone_volume_change != "none")
rtttl_speaker->play(tone_volume_change);
rtttl_speaker->dump_config();
// Check for requirements
#if !defined(TX_ULTIMATE_EASY_CORE)
#error "The package TX-Ultimate-Easy-ESPHome_core.yaml is required."
#endif
rtttl:
- id: rtttl_speaker
speaker: mp_speaker
speaker:
- id: mp_speaker
platform: i2s_audio
dac_type: external
i2s_dout_pin: GPIO15
i2s_audio_id: if_i2s_audio
i2s_comm_fmt: stand_msb
channel: mono
// Identify itself
ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Add-on - BLE Proxy");
...

View File

@@ -0,0 +1,68 @@
####################################################################################################
##### 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

@@ -25,20 +25,20 @@ substitutions:
TX_MODEL_3_GANG_TEXT: "3 Gang"
TX_MODEL_4_GANG_TEXT: "4 Gang"
DUMP_CONFIG_CALLER_DELAY: 10s # Delay to dump config after requested
packages:
# yamllint disable rule:colons
core_hw_buttons: !include TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml
core_hw_leds: !include TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml
core_hw_relays: !include TX-Ultimate-Easy-ESPHome_core_hw_relays.yaml
core_hw_speaker: !include TX-Ultimate-Easy-ESPHome_core_hw_speaker.yaml
core_hw_touch: !include TX-Ultimate-Easy-ESPHome_core_hw_touch.yaml
core_hw_vibration: !include TX-Ultimate-Easy-ESPHome_core_hw_vibration.yaml
# yamllint enable rule:colons
api:
id: api_server
on_client_connected:
then:
- script.execute: dump_config_caller
- script.execute: publish_device_info
binary_sensor:
@@ -49,24 +49,28 @@ binary_sensor:
platform: template
entity_category: diagnostic
device_class: problem
button:
- id: bt_restart
name: Restart
internal: false
platform: restart
captive_portal:
id: ap_captive_portal
on_state:
then:
- lambda: |-
if (x)
ESP_LOGW("core", "Pending restart: YES");
else
ESP_LOGCONFIG("core", "Pending restart: No");
- script.execute: dump_config_caller
esp32:
board: esp32dev
board: esp32dev # adafruit_feather_esp32_v2 # esp32dev
flash_size: 8MB
framework:
type: esp-idf
esphome:
name: ${name}
friendly_name: ${friendly_name}
comment: TX Ultimate Easy
project:
name: "edwardtfn.tx_ultimate_easy"
version: ${version}
platformio_options:
build_flags:
- -D TX_ULTIMATE_EASY_CORE
@@ -95,8 +99,11 @@ globals:
restore_value: true
initial_value: '0'
improv_serial:
id: serial_improv
- id: gang_count_plural_suffix
type: std::string
restore_value: true
max_restore_data_length: 3
# initial_value: "''"
logger:
level: DEBUG
@@ -149,6 +156,7 @@ 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
@@ -158,6 +166,65 @@ script:
id: bs_pending_restart
state: false
- id: dump_config
mode: restart
then:
# Extended by all modules
- lambda: |-
// Device identification
ESP_LOGCONFIG("core", "Device friendly name: ${friendly_name}");
ESP_LOGCONFIG("core", "Device name: ${name}");
ESP_LOGCONFIG("core", "Device name (HA): %s", tx_device_name->state.c_str());
ESP_LOGCONFIG("core", "Device hostname: %s", App.get_name().c_str());
dump_config_versions->execute();
// Framework detection
#ifdef USE_ARDUINO
ESP_LOGCONFIG("core", "Framework: Arduino");
#elif defined(USE_ESP_IDF)
ESP_LOGCONFIG("core", "Framework: ESP-IDF");
#else
ESP_LOGW("core", "Framework: UNKNOWN");
#endif
// Model configuration
ESP_LOGCONFIG("core", "Model format (selected): %s", sl_tx_model_format->state.c_str());
ESP_LOGCONFIG("core", "Model format (detected): %s", id(is_us_model) ? "US" : "EU");
ESP_LOGCONFIG("core", "Gangs (selected): %s", sl_tx_model_gang->state.c_str());
ESP_LOGCONFIG("core", "Gangs (detected): %" PRIu8 "-Gang%s", id(gang_count), id(gang_count_plural_suffix).c_str());
// System state
if (bs_pending_restart->state)
ESP_LOGW("core", "Pending restart: YES");
else
ESP_LOGCONFIG("core", "Pending restart: No");
- id: dump_config_caller
mode: restart
then:
- delay: ${DUMP_CONFIG_CALLER_DELAY}
- script.execute: dump_config
- script.wait: dump_config
- script.execute: dump_config_list_packages
- id: dump_config_list_packages
mode: restart
then:
- script.wait: dump_config
- lambda: |-
ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, "Installed packages:");
// Identify itself
ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Core");
- id: dump_config_versions
mode: restart
then:
- lambda: |-
// Version information
ESP_LOGCONFIG("core", "TX Ultimate firmware version: ${version}");
- id: publish_device_info
mode: restart
then:
@@ -214,12 +281,6 @@ select:
tx_ultimate->set_gang_count(id(gang_count));
text_sensor:
- id: esphome_fw_version
name: ESPHome Version
platform: version
entity_category: diagnostic
internal: false
- id: tx_fw_version
name: TX Ultimate Easy Firmware Version
platform: template
@@ -256,13 +317,6 @@ text_sensor:
}
return result;
time:
- id: time_source
platform: homeassistant
web_server:
wifi:
id: wifi_component
ap:
...

View File

@@ -57,6 +57,11 @@ binary_sensor:
internal: false
<<: *binary_sensor_button_base
esphome:
platformio_options:
build_flags:
- -D TX_ULTIMATE_EASY_CORE_HW_BUTTONS
globals:
- id: button_press_button
type: uint8_t
@@ -200,6 +205,41 @@ script:
}
}
- id: !extend dump_config
then:
- lambda: |-
// 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());
ESP_LOGCONFIG("core_hw_buttons", " Relay 1: %s", sl_button_1_action->has_state()
? sl_button_1_action->state.c_str()
: "Unknown");
if (id(gang_count) >= 2)
ESP_LOGCONFIG("core_hw_buttons", " Relay 2: %s", sl_button_2_action->has_state()
? sl_button_2_action->state.c_str()
: "Unknown");
if (id(gang_count) >= 3)
ESP_LOGCONFIG("core_hw_buttons", " Relay 3: %s", sl_button_3_action->has_state()
? sl_button_3_action->state.c_str()
: "Unknown");
if (id(gang_count) >= 4)
ESP_LOGCONFIG("core_hw_buttons", " Relay 4: %s", sl_button_4_action->has_state()
? sl_button_4_action->state.c_str()
: "Unknown");
- id: !extend dump_config_list_packages
then:
- script.wait: dump_config
- lambda: |-
// Check for requirements
#if !defined(TX_ULTIMATE_EASY_CORE)
#error "The package TX-Ultimate-Easy-ESPHome_core.yaml is required."
#endif
// Identify itself
ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Core - Hardware - Buttons");
- id: !extend touch_on_multi_touch_release
then:
- script.execute: buttons_release

View File

@@ -29,6 +29,11 @@ substitutions:
LIGHT_SIDES_RESTORE_MODE: RESTORE_DEFAULT_OFF
LIGHT_INDIVIDUAL_RESTORE_MODE: RESTORE_DEFAULT_OFF
esphome:
platformio_options:
build_flags:
- -D TX_ULTIMATE_EASY_CORE_HW_LEDS
globals:
- id: gb_lights_1
type: std::vector<light::LightState*>
@@ -42,13 +47,15 @@ light:
- id: light_full
name: Light - All
internal: true
platform: neopixelbus
type: GRB
variant: WS2811
# method: esp32_rmt
platform: esp32_rmt_led_strip
rgb_order: GRB
rmt_channel: 1
chipset: ws2812
num_leds: 32
pin: GPIO13
restore_mode: ${LIGHT_FULL_RESTORE_MODE}
max_refresh_rate: 33ms
use_psram: true
# Those lights are available based on the model selections
- &light_partition_with_effects
@@ -436,52 +443,58 @@ script:
light_us_right->set_internal(!id(is_us_model));
light_us_top->set_internal(!id(is_us_model));
// LED Group Assignment:
// - For US model: gb_lights_1 = left side LEDs, gb_lights_2 = right side LEDs
// - For EU model: gb_lights_1 = bottom LEDs, gb_lights_2 = top LEDs
// Gang configurations determine which LED segments are active
switch (id(gang_count)) {
case 1: // 1 Gang
if (id(is_us_model)) {
id(gb_lights_1) = { light_us_rl_1_1_left };
id(gb_lights_2) = { light_us_rl_1_1_right };
} else {
id(gb_lights_1) = { light_eu_rl_1_1_bottom };
id(gb_lights_2) = { light_eu_rl_1_1_top };
}
break;
case 2: // 2 Gang
if (id(is_us_model)) {
id(gb_lights_1) = { light_us_rl_1_2_left, light_us_rl_2_2_left };
id(gb_lights_2) = { light_us_rl_1_2_right, light_us_rl_2_2_right };
} else {
id(gb_lights_1) = { light_eu_rl_1_2_bottom, light_eu_rl_2_2_bottom };
id(gb_lights_2) = { light_eu_rl_1_2_top, light_eu_rl_2_2_top };
}
break;
case 3: // 3 Gang
if (id(is_us_model)) {
id(gb_lights_1) = { light_us_rl_1_3_left, light_us_rl_2_3_left, light_us_rl_3_3_left };
id(gb_lights_2) = { light_us_rl_1_3_right, light_us_rl_2_3_right, light_us_rl_3_3_right };
} else {
id(gb_lights_1) = { light_eu_rl_1_3_bottom, light_eu_rl_2_3_bottom, light_eu_rl_3_3_bottom };
id(gb_lights_2) = { light_eu_rl_1_3_top, light_eu_rl_2_3_top, light_eu_rl_3_3_top };
}
break;
case 4: // 4 Gang
if (id(is_us_model)) {
id(gb_lights_1) = { light_us_rl_1_4_left, light_us_rl_2_4_left,
light_us_rl_3_4_left, light_us_rl_4_4_left };
id(gb_lights_2) = { light_us_rl_1_4_right, light_us_rl_2_4_right,
light_us_rl_3_4_right, light_us_rl_4_4_right };
} else {
id(gb_lights_1) = { light_eu_rl_1_4_bottom, light_eu_rl_2_4_bottom,
light_eu_rl_3_4_bottom, light_eu_rl_4_4_bottom };
id(gb_lights_2) = { light_eu_rl_1_4_top, light_eu_rl_2_4_top,
light_eu_rl_3_4_top, light_eu_rl_4_4_top };
}
break;
}
- id: !extend dump_config
then:
- lambda: |-
// 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());
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());
if (id(gang_count) >= 2)
ESP_LOGCONFIG("core_hw_leds", " Relay 2: %s", id(is_us_model)
? sl_relay_2_light_mode_us->state.c_str()
: sl_relay_2_light_mode_eu->state.c_str());
if (id(gang_count) >= 3)
ESP_LOGCONFIG("core_hw_leds", " Relay 3: %s", id(is_us_model)
? sl_relay_3_light_mode_us->state.c_str()
: sl_relay_3_light_mode_eu->state.c_str());
if (id(gang_count) >= 4)
ESP_LOGCONFIG("core_hw_leds", " Relay 4: %s", id(is_us_model)
? sl_relay_4_light_mode_us->state.c_str()
: sl_relay_4_light_mode_eu->state.c_str());
// Transition times
ESP_LOGCONFIG("core_hw_leds", "Transition times:");
ESP_LOGCONFIG("core_hw_leds", " Default: ${default_transition_length}");
if (${LIGHT_TRANSITION_TURN_ON} > 0)
ESP_LOGCONFIG("core_hw_leds", " Turning on: ${LIGHT_TRANSITION_TURN_ON}ms");
else
ESP_LOGCONFIG("core_hw_leds", " Turning on: Disabled");
if (${LIGHT_TRANSITION_TURN_OFF} > 0)
ESP_LOGCONFIG("core_hw_leds", " Turning off: ${LIGHT_TRANSITION_TURN_OFF}ms");
else
ESP_LOGCONFIG("core_hw_leds", " Turning off: Disabled");
// Restore modes
ESP_LOGCONFIG("core_hw_leds", "LED restore modes:");
ESP_LOGCONFIG("core_hw_leds", " Light - All: ${LIGHT_FULL_RESTORE_MODE}");
ESP_LOGCONFIG("core_hw_leds", " Sides: ${LIGHT_SIDES_RESTORE_MODE}");
ESP_LOGCONFIG("core_hw_leds", " Individual: ${LIGHT_INDIVIDUAL_RESTORE_MODE}");
- id: !extend dump_config_list_packages
then:
- script.wait: dump_config
- lambda: |-
// Check for requirements
#if !defined(TX_ULTIMATE_EASY_CORE)
#error "The package TX-Ultimate-Easy-ESPHome_core.yaml is required."
#endif
// Identify itself
ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Core - Hardware - LEDs");
- id: light_set_state
mode: parallel
@@ -571,15 +584,12 @@ select:
entity_category: config
disabled_by_default: false
icon: mdi:dots-square
- id: sl_relay_2_light_mode_eu
name: Relay 2 light mode
<<: *relay_light_mode_eu
- id: sl_relay_3_light_mode_eu
name: Relay 3 light mode
<<: *relay_light_mode_eu
- id: sl_relay_4_light_mode_eu
name: Relay 4 light mode
<<: *relay_light_mode_eu
@@ -601,15 +611,12 @@ select:
entity_category: config
disabled_by_default: false
icon: mdi:dots-square
- id: sl_relay_2_light_mode_us
name: Relay 2 light mode
<<: *relay_light_mode_us
- id: sl_relay_3_light_mode_us
name: Relay 3 light mode
<<: *relay_light_mode_us
- id: sl_relay_4_light_mode_us
name: Relay 4 light mode
<<: *relay_light_mode_us

View File

@@ -198,6 +198,11 @@ binary_sensor:
id: bs_swipe_down
state: OFF # yamllint disable-line rule:truthy
esphome:
platformio_options:
build_flags:
- -D TX_ULTIMATE_EASY_CORE_HW_TOUCH
external_components:
- source:
type: git
@@ -283,6 +288,28 @@ script:
bs_button_3_long_press_event->set_internal(id(gang_count) < 3);
bs_button_4_long_press_event->set_internal(id(gang_count) < 4);
- id: !extend dump_config
then:
- lambda: |-
// Touch panel's state
if (sw_touch_panel_power->state)
ESP_LOGCONFIG("core_hw_touch", "Touch panel - Power: On");
else
ESP_LOGW("core_hw_touch", "Touch panel - Power: OFF");
ESP_LOGCONFIG("core_hw_touch", "Touch event duration: %.0fms", nr_touch_duration->state);
- id: !extend dump_config_list_packages
then:
- script.wait: dump_config
- lambda: |-
// Check for requirements
#if !defined(TX_ULTIMATE_EASY_CORE)
#error "The package TX-Ultimate-Easy-ESPHome_core.yaml is required."
#endif
// Identify itself
ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Core - Hardware - Touchpad");
- id: touch_on_multi_touch_release
mode: restart
then:

View File

@@ -0,0 +1,72 @@
####################################################################################################
##### TX Ultimate Easy for ESPHome #####
##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy #####
####################################################################################################
##### Purpose: ESPHome Standard (non-essential, but recommended packages) #####
####################################################################################################
##### Author: edwardtfn - https://github.com/edwardtfn - https://buymeacoffee.com/edwardfirmo #####
####################################################################################################
##### NOTE: #####
##### - Make changes ONLY if absolutely necessary and you have the required knowledge. #####
##### - For normal system use, modifications to this file are NOT required. #####
####################################################################################################
---
packages:
# yamllint disable rule:colons
core_hw_relays: !include TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml
core_hw_speaker: !include TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml
core_hw_vibration: !include TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml
# yamllint enable rule:colons
button:
- id: bt_restart
name: Restart
internal: false
platform: restart
captive_portal:
id: ap_captive_portal
esphome:
platformio_options:
build_flags:
- -D TX_ULTIMATE_EASY_STANDARD
script:
- id: !extend dump_config_list_packages
then:
- script.wait: dump_config
- lambda: |-
// Check for requirements
#if !defined(TX_ULTIMATE_EASY_CORE)
#error "The package TX-Ultimate-Easy-ESPHome_core.yaml is required."
#endif
// Identify itself
ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Standard");
- id: !extend dump_config_versions
then:
- lambda: |-
// Version information
ESP_LOGCONFIG("standard", "ESPHome builder: %s", esphome_fw_version->state.c_str());
improv_serial:
id: serial_improv
text_sensor:
- id: esphome_fw_version
name: ESPHome Version
platform: version
entity_category: diagnostic
internal: false
time:
- id: time_source
platform: homeassistant
web_server:
wifi:
ap:
...

View File

@@ -0,0 +1,36 @@
####################################################################################################
##### TX Ultimate Easy for ESPHome #####
##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy #####
####################################################################################################
##### Purpose: ESPHome - Standard - I2S Audio #####
####################################################################################################
##### 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. #####
####################################################################################################
---
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
script:
- id: !extend dump_config_list_packages
then:
- script.wait: dump_config
- lambda: |-
// Check for requirements
#if !defined(TX_ULTIMATE_EASY_CORE)
#error "The package TX-Ultimate-Easy-ESPHome_core.yaml is required."
#endif
// Identify itself
ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Standard - Hardware - Audio");
...

View File

@@ -2,7 +2,7 @@
##### TX Ultimate Easy for ESPHome #####
##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy #####
####################################################################################################
##### Purpose: ESPHome Core - Hardware - Relays #####
##### Purpose: ESPHome - Standard - Hardware - Relays #####
####################################################################################################
##### Author: edwardtfn - https://github.com/edwardtfn - https://buymeacoffee.com/edwardfirmo #####
####################################################################################################
@@ -19,12 +19,20 @@ substitutions:
RELAY_RESTORE_MODE: RESTORE_DEFAULT_OFF
LIGHT_RELAYS_RESTORE_MODE: RESTORE_DEFAULT_OFF
esphome:
platformio_options:
build_flags:
- -D TX_ULTIMATE_EASY_STANDARD_HW_RELAYS
globals:
- id: boot_initialization_relays
type: bool
restore_value: false
initial_value: 'false'
- id: boot_initialization_relays_group_assignments
type: bool
restore_value: false
initial_value: 'false'
- id: boot_initialization_relays_light_modes
type: bool
restore_value: false
@@ -124,7 +132,7 @@ light:
name: Light - Relay 1 of 1 (bottom)
platform: partition
internal: true
disabled_by_default: true
disabled_by_default: false
default_transition_length: ${default_transition_length}
restore_mode: ${LIGHT_RELAYS_RESTORE_MODE}
segments:
@@ -436,14 +444,17 @@ script:
- id: boot_initialize_relays
mode: restart
then:
- script.execute: boot_initialize_relays_group_assignments
- script.execute: boot_initialize_relays_light_modes
- script.execute: boot_initialize_relays_relay_leds
- script.execute: boot_initialize_relays_relay_modes
- script.wait: boot_initialize_relays_group_assignments
- script.wait: boot_initialize_relays_light_modes
- script.wait: boot_initialize_relays_relay_leds
- script.wait: boot_initialize_relays_relay_modes
- wait_until:
condition:
- lambda: return id(boot_initialization_relays_group_assignments);
- lambda: return id(boot_initialization_relays_light_modes);
- lambda: return id(boot_initialization_relays_relay_leds);
- lambda: return id(boot_initialization_relays_relay_modes);
@@ -451,6 +462,61 @@ script:
id: boot_initialization_relays
value: 'true'
- id: boot_initialize_relays_group_assignments
mode: restart
then:
- lambda: |-
// LED Group Assignment:
// - For US model: gb_lights_1 = left side LEDs, gb_lights_2 = right side LEDs
// - For EU model: gb_lights_1 = bottom LEDs, gb_lights_2 = top LEDs
// Gang configurations determine which LED segments are active
switch (id(gang_count)) {
case 1: // 1 Gang
if (id(is_us_model)) {
id(gb_lights_1) = { light_us_rl_1_1_left };
id(gb_lights_2) = { light_us_rl_1_1_right };
} else {
id(gb_lights_1) = { light_eu_rl_1_1_bottom };
id(gb_lights_2) = { light_eu_rl_1_1_top };
}
break;
case 2: // 2 Gang
if (id(is_us_model)) {
id(gb_lights_1) = { light_us_rl_1_2_left, light_us_rl_2_2_left };
id(gb_lights_2) = { light_us_rl_1_2_right, light_us_rl_2_2_right };
} else {
id(gb_lights_1) = { light_eu_rl_1_2_bottom, light_eu_rl_2_2_bottom };
id(gb_lights_2) = { light_eu_rl_1_2_top, light_eu_rl_2_2_top };
}
break;
case 3: // 3 Gang
if (id(is_us_model)) {
id(gb_lights_1) = { light_us_rl_1_3_left, light_us_rl_2_3_left, light_us_rl_3_3_left };
id(gb_lights_2) = { light_us_rl_1_3_right, light_us_rl_2_3_right, light_us_rl_3_3_right };
} else {
id(gb_lights_1) = { light_eu_rl_1_3_bottom, light_eu_rl_2_3_bottom, light_eu_rl_3_3_bottom };
id(gb_lights_2) = { light_eu_rl_1_3_top, light_eu_rl_2_3_top, light_eu_rl_3_3_top };
}
break;
case 4: // 4 Gang
if (id(is_us_model)) {
id(gb_lights_1) = { light_us_rl_1_4_left, light_us_rl_2_4_left,
light_us_rl_3_4_left, light_us_rl_4_4_left };
id(gb_lights_2) = { light_us_rl_1_4_right, light_us_rl_2_4_right,
light_us_rl_3_4_right, light_us_rl_4_4_right };
} else {
id(gb_lights_1) = { light_eu_rl_1_4_bottom, light_eu_rl_2_4_bottom,
light_eu_rl_3_4_bottom, light_eu_rl_4_4_bottom };
id(gb_lights_2) = { light_eu_rl_1_4_top, light_eu_rl_2_4_top,
light_eu_rl_3_4_top, light_eu_rl_4_4_top };
}
break;
default:
ESP_LOGE("standard_hw_relays", "Invalid gang count: %" PRIu8, id(gang_count));
break;
}
id(boot_initialization_relays_group_assignments) = true;
- id: boot_initialize_relays_light_modes
mode: restart
then:
@@ -587,13 +653,13 @@ script:
std::string select_state;
bool toggle_relay = false;
if (api_disconnected) {
ESP_LOGW("core_hw_relays", "Toggle relays:");
ESP_LOGW("core_hw_relays", " API state: DISCONNECTED");
ESP_LOGW("core_hw_relays", " Button: %" PRIu8, button);
ESP_LOGW("standard_hw_relays", "Toggle relays:");
ESP_LOGW("standard_hw_relays", " API state: DISCONNECTED");
ESP_LOGW("standard_hw_relays", " Button: %" PRIu8, button);
} else {
ESP_LOGVV("core_hw_relays", "Toggle relays:");
ESP_LOGVV("core_hw_relays", " API state: Connected");
ESP_LOGVV("core_hw_relays", " Button: %" PRIu8, button);
ESP_LOGVV("standard_hw_relays", "Toggle relays:");
ESP_LOGVV("standard_hw_relays", " API state: Connected");
ESP_LOGVV("standard_hw_relays", " Button: %" PRIu8, button);
}
switch (button) {
case ${BUTTON_1_ID}:
@@ -626,21 +692,84 @@ script:
break;
}
if (toggle_relay) {
ESP_LOGI("core_hw_relays", "Toggle relay %" PRIu8 ": (%s)", button, select_state.c_str());
ESP_LOGI("standard_hw_relays", "Toggle relay %" PRIu8 ": (%s)", button, select_state.c_str());
} else if (not select_state.empty()) {
ESP_LOGV("core_hw_relays", "Ignoring toggle for relay %" PRIu8 ": action is '%s'",
ESP_LOGV("standard_hw_relays", "Ignoring toggle for relay %" PRIu8 ": action is '%s'",
button, select_state.c_str());
} else {
ESP_LOGE("core_hw_relays", "No button action selected for button %" PRIu8, button);
ESP_LOGE("standard_hw_relays", "No button action selected for button %" PRIu8, button);
}
- id: !extend dump_config
then:
- lambda: |-
// 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());
ESP_LOGCONFIG("standard_hw_relays", " Relay 1: %s", sl_relay_1_mode->has_state()
? sl_relay_1_mode->state.c_str()
: "Unknown");
if (id(gang_count) >= 2)
ESP_LOGCONFIG("standard_hw_relays", " Relay 2: %s", sl_relay_2_mode->has_state()
? sl_relay_2_mode->state.c_str()
: "Unknown");
if (id(gang_count) >= 3)
ESP_LOGCONFIG("standard_hw_relays", " Relay 3: %s", sl_relay_3_mode->has_state()
? sl_relay_3_mode->state.c_str()
: "Unknown");
if (id(gang_count) >= 4)
ESP_LOGCONFIG("standard_hw_relays", " Relay 4: %s", sl_relay_4_mode->has_state()
? sl_relay_4_mode->state.c_str()
: "Unknown");
// 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());
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");
if (id(gang_count) >= 3)
ESP_LOGCONFIG("standard_hw_relays", " Relay 3: %s", sw_relay_3->state ? "ON" : "OFF");
if (id(gang_count) >= 4)
ESP_LOGCONFIG("standard_hw_relays", " Relay 4: %s", sw_relay_4->state ? "ON" : "OFF");
ESP_LOGCONFIG("standard_hw_relays", "Expose Relay's LEDs to Home Assistant: %s",
YESNO(sw_expose_relays_leds_to_ha->state));
// Boot initialization statuses
ESP_LOGCONFIG("standard_hw_relays", "Boot initialization flags:");
ESP_LOGCONFIG("standard_hw_relays", " Overall: %s", YESNO(id(boot_initialization_relays)));
ESP_LOGCONFIG("standard_hw_relays", " Groups: %s",
YESNO(id(boot_initialization_relays_group_assignments)));
ESP_LOGCONFIG("standard_hw_relays", " Light modes: %s", YESNO(id(boot_initialization_relays_light_modes)));
ESP_LOGCONFIG("standard_hw_relays", " Relay modes: %s", YESNO(id(boot_initialization_relays_relay_modes)));
ESP_LOGCONFIG("standard_hw_relays", " Status LEDs: %s", YESNO(id(boot_initialization_relays_relay_leds)));
// Substitutions
ESP_LOGCONFIG("standard_hw_relays", "Restore modes:");
ESP_LOGCONFIG("standard_hw_relays", " Relays: ${RELAY_RESTORE_MODE}");
ESP_LOGCONFIG("standard_hw_relays", " Status LEDs: ${LIGHT_RELAYS_RESTORE_MODE}");
- id: !extend dump_config_list_packages
then:
- script.wait: dump_config
- lambda: |-
// Check for requirements
#if !defined(TX_ULTIMATE_EASY_CORE)
#error "The package TX-Ultimate-Easy-ESPHome_core.yaml is required."
#endif
// Identify itself
ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Standard - Hardware - Relays");
- id: show_relay_status
mode: restart
then:
- script.wait: boot_initialize_relays
- lambda: |-
if (not id(boot_initialization_relays)) {
ESP_LOGW("core_hw_relays", "Relays not initialized yet");
ESP_LOGW("standard_hw_relays", "Relays not initialized yet");
if (not boot_initialize_relays->is_running())
boot_initialize_relays->execute();
return;
@@ -683,8 +812,8 @@ script:
break;
}
ESP_LOGV("core_hw_relays", "Relay %" PRIu8 " is %s", i + 1, relay_state ? "ON" : "OFF");
ESP_LOGV("core_hw_relays", "Light Mode for Relay %" PRIu8 ": %s", i + 1, light_mode.c_str());
ESP_LOGV("standard_hw_relays", "Relay %" PRIu8 " is %s", i + 1, relay_state ? "ON" : "OFF");
ESP_LOGV("standard_hw_relays", "Light Mode for Relay %" PRIu8 ": %s", i + 1, light_mode.c_str());
// Use light_set_state for light updates
if (relay_state) {

View File

@@ -0,0 +1,182 @@
####################################################################################################
##### TX Ultimate Easy for ESPHome #####
##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy #####
####################################################################################################
##### Purpose: ESPHome - Standard - Hardware - Speaker #####
####################################################################################################
##### Author: edwardtfn - https://github.com/edwardtfn - https://buymeacoffee.com/edwardfirmo #####
####################################################################################################
##### NOTE: #####
##### - Make changes ONLY if absolutely necessary and you have the required knowledge. #####
##### - For normal system use, modifications to this file are NOT required. #####
####################################################################################################
---
substitutions:
# RTTTL format: name:d=duration,o=octave,b=tempo:notes
# d=32 (32nd note), o=5 (octave 5), b=100 (tempo 100)
tone_volume_change: "scale_up:d=32,o=5,b=100:c,c#,d#,e,f#,g#,a#,b" # Use "none" to disable sound
packages:
standard_hw_audio: !include TX-Ultimate-Easy-ESPHome_standard_hw_audio.yaml
api:
actions:
- action: rtttl_play
variables:
# The RTTTL string for the melody to be played.
# It should follow the RTTTL format, including the melody's name,
# default settings, and a sequence of notes.
tone: string
then:
- lambda: |-
rtttl_speaker->stop();
if (speaker_volume->state > 0) {
ESP_LOGI("standard_speaker", "Play tone: '%s'", tone.c_str());
rtttl_speaker->play(tone.c_str());
}
esphome:
platformio_options:
build_flags:
- -D TX_ULTIMATE_EASY_STANDARD_SPEAKER
number:
- id: speaker_volume
name: Sound - Volume
platform: template
max_value: 100
min_value: 0
step: 1
initial_value: 100
unit_of_measurement: "%"
internal: false
disabled_by_default: true
entity_category: config
device_class: sound_pressure
restore_value: true
optimistic: true
set_action:
then:
- speaker.volume_set:
id: speaker_embedded
volume: !lambda return x/100.0f;
- lambda: |-
static const std::string tone_volume_change = "${tone_volume_change}";
// Play sound if tone_volume_change is not "none"
if (x > 0 and !tone_volume_change.empty() and tone_volume_change != "none")
rtttl_speaker->play(tone_volume_change);
rtttl:
- id: rtttl_speaker
speaker: speaker_embedded
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, " - Standard - Hardware - Speaker");
- id: speaker_play_click
then:
- if:
condition:
not:
- speaker.is_playing: speaker_embedded
then:
- speaker.play:
id: speaker_embedded
data: [
0x01, 0x02, 0x04, 0x06, 0x07, 0x08, 0x08, 0x06, 0x01, 0xFA, 0xF4,
0xEF, 0xEE, 0xF1, 0xF7, 0xFF, 0x07, 0x0E, 0x11, 0x11, 0x10, 0x0C,
0x06, 0xFF, 0xF8, 0xF1, 0xEC, 0xEA, 0xEC, 0xF2, 0xF9, 0xFF, 0x05,
0x0A, 0x10, 0x14, 0x17, 0x17, 0x14, 0x0B, 0xFD, 0xED, 0xE0, 0xD9,
0xDB, 0xE6, 0xF7, 0x0A, 0x19, 0x20, 0x1E, 0x14, 0x05, 0xF4, 0xE5,
0xDF, 0xE4, 0xF4, 0x0C, 0x24, 0x36, 0x3D, 0x35, 0x20, 0xFF, 0xDD,
0xC0, 0xAE, 0xA9, 0xB0, 0xC4, 0xE0, 0x03, 0x26, 0x48, 0x62, 0x70,
0x6D, 0x59, 0x35, 0x08, 0xD8, 0xAC, 0x8D, 0x80, 0x85, 0x9C, 0xC1,
0xF0, 0x21, 0x4E, 0x6F, 0x7F, 0x7A, 0x63, 0x3D, 0x0F, 0xE0, 0xB7,
0x9B, 0x90, 0x96, 0xAC, 0xCE, 0xF6, 0x1D, 0x3C, 0x50, 0x55, 0x4D,
0x3A, 0x20, 0x04, 0xEC, 0xD8, 0xCC, 0xC9, 0xCD, 0xD8, 0xE8, 0xF9,
0x0A, 0x17, 0x1F, 0x20, 0x1C, 0x12, 0x07, 0xFC, 0xF2, 0xEC, 0xEB,
0xED, 0xF3, 0xFA, 0x02, 0x0A, 0x10, 0x12, 0x12, 0x0E, 0x07, 0xFE,
0xF5, 0xED, 0xEA, 0xEB, 0xEF, 0xF7, 0x00, 0x0A, 0x10, 0x13, 0x12,
0x0F, 0x09, 0x02, 0xFB, 0xF5, 0xF3, 0xF2, 0xF3, 0xF6, 0xFB, 0xFF,
0x03, 0x05, 0x07, 0x08, 0x07, 0x05, 0x03, 0x01, 0xFF, 0xFE, 0xFC,
0xFB, 0xFB, 0xFC, 0xFC, 0xFD, 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x02,
0x01]
- wait_until:
condition:
not:
- speaker.is_playing: speaker_embedded
- speaker.stop: speaker_embedded
- id: !extend touch_on_multi_touch_release
then:
- script.execute: touch_on_multi_touch_release_speaker
- id: touch_on_multi_touch_release_speaker
mode: restart
then:
- lambda: |-
if (sl_touch_speaker_feedback->state != "Disabled")
speaker_play_click->execute();
- id: !extend touch_on_press
then:
- script.execute: touch_on_press_speaker
- id: touch_on_press_speaker
mode: restart
then:
- lambda: |-
if (sl_touch_speaker_feedback->state == "On press" or sl_touch_speaker_feedback->state == "Always")
speaker_play_click->execute();
- id: !extend touch_on_release
then:
- script.execute: touch_on_release_speaker
- id: touch_on_release_speaker
mode: restart
then:
- lambda: |-
if (sl_touch_speaker_feedback->state == "On release" or sl_touch_speaker_feedback->state == "Always")
speaker_play_click->execute();
select:
- id: sl_touch_speaker_feedback
name: Touch - Speaker feedback
platform: template
options:
- "Disabled"
- "On press"
- "On release"
- "Always"
initial_option: "Disabled"
optimistic: true
restore_value: true
internal: false
entity_category: config
disabled_by_default: false
icon: mdi:vibrate
speaker:
- id: speaker_embedded
platform: i2s_audio
dac_type: external
i2s_dout_pin: GPIO15
i2s_audio_id: if_i2s_audio
i2s_comm_fmt: stand_msb
channel: mono
...

View File

@@ -2,7 +2,7 @@
##### TX Ultimate Easy for ESPHome #####
##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy #####
####################################################################################################
##### Purpose: ESPHome Core - Hardware - Vibration system #####
##### Purpose: ESPHome - Standard - Hardware - Vibration system #####
####################################################################################################
##### Author: edwardtfn - https://github.com/edwardtfn - https://buymeacoffee.com/edwardfirmo #####
####################################################################################################
@@ -32,6 +32,11 @@ button:
then:
- script.execute: vibrate
esphome:
platformio_options:
build_flags:
- -D TX_ULTIMATE_EASY_STANDARD_HW_VIBRATION
number:
- id: nr_vibrating_duration
name: Vibrate duration
@@ -53,6 +58,33 @@ ota:
- switch.turn_off: sw_vibration_motor
script:
- id: !extend dump_config
then:
- lambda: |-
// Configuration
ESP_LOGCONFIG("standard_hw_vibration", "Touch - Vibration feedback: %s",
sl_touch_vibration_feedback->state.c_str());
ESP_LOGCONFIG("standard_hw_vibration", "Vibrate duration: %.0fms", nr_vibrating_duration->state);
ESP_LOGCONFIG("standard_hw_vibration", "Vibrate max duration: ${vibration_max_duration}");
// State
if (bs_vibrating->state)
ESP_LOGW("standard_hw_vibration", "Vibrating now: YES");
else
ESP_LOGCONFIG("standard_hw_vibration", "Vibrating now: No");
- id: !extend dump_config_list_packages
then:
- script.wait: dump_config
- lambda: |-
// Check for requirements
#if !defined(TX_ULTIMATE_EASY_CORE)
#error "The package TX-Ultimate-Easy-ESPHome_core.yaml is required."
#endif
// Identify itself
ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Standard - Hardware - Vibration");
- id: !extend touch_on_multi_touch_release
then:
- script.execute: touch_on_multi_touch_release_vibration
@@ -133,5 +165,4 @@ switch:
- binary_sensor.template.publish:
id: bs_vibrating
state: OFF # yamllint disable-line rule:truthy
...

158
README.md
View File

@@ -92,12 +92,157 @@ Before getting started, ensure you have:
## Installation
Detailed installation instructions coming soon. The process will include:
Follow these steps to get your TX Ultimate device up and running with ESPHome.
1. Initial ESPHome setup
2. Device flashing
3. Home Assistant integration
4. Basic configuration
### ESPHome Integration Setup
1. Install the ESPHome add-on in Home Assistant if not already installed:
- Go to Settings → Add-ons → Add-on Store
- Search for "ESPHome"
- Click Install
2. Start the ESPHome add-on and verify it's running
3. Access ESPHome dashboard through Home Assistant
### Setup Device
1. In the ESPHome dashboard, click "+ New Device"
2. Name your device (e.g., "tx-ultimate-living-room")
3. Select ESP32 as your device type
4. Copy this basic configuration to your new device:
```yaml
substitutions:
name: tx-ultimate-easy # Change this to your device name
friendly_name: TX Ultimate Easy
packages:
remote_package:
url: https://github.com/edwardtfn/TX-Ultimate-Easy
ref: main # For latest stable release
files:
- ESPHome/TX-Ultimate-Easy-ESPHome.yaml
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
```
You can also use a specific version tag for better control over updates:
```yaml
ref: v2024.12.2 # Using specific version for controlled updates
```
**Note:** [Click here](https://github.com/edwardtfn/TX-Ultimate-Easy/tags) for a full list of versions available.
5. Click "Save" and then "Install"
### Device Flashing
Initial flashing must be done via serial connection.
We recommend using [ESPHome Web](https://web.esphome.io) for the simplest experience.
<!-- markdownlint-disable MD028 -->
> [!IMPORTANT]
> **SAFETY WARNINGS**
> - ALWAYS disconnect the device from mains power before opening
> - NEVER work on the device while connected to mains power
> - Ensure the device is completely powered off before making any connections
> - Keep your workspace clean, dry, and static-free
> - Use proper insulated tools when working with electronics
> - If unsure about any step, seek help from an experienced person
> [!CAUTION]
>⚡ **CRITICAL: VOLTAGE WARNING**
> Using a UART adapter with voltage higher than 3.3V WILL DAMAGE YOUR DEVICE.
> Double-check your adapter's voltage before connecting - many common FTDI adapters
> default to 5V which will permanently damage the ESP32 chip.
<!-- markdownlint-enable MD028 -->
#### Required Hardware
- USB-to-UART adapter:
- 3.3V logic level ONLY (DO NOT use 5V adapters)
- Must be capable of supplying at least 500mA
- Common adapters: CP2102, CH340, FTDI (ensure 3.3V setting)
- Small Phillips screwdriver
- 5 wires for connections (including one for BOOT to GND)
#### Flashing Process
1. Open your TX Ultimate device carefully
2. Locate the programming header pins
3. Connect your USB-to-UART adapter:
| Adapter | Device |
|---------|--------|
| GND | GND |
| 3.3V | 3.3V |
| TX | RX |
| RX | TX |
4. Put device in flash mode:
- Temporarily connect the BOOT pin to GND using a jumper wire
- While holding BOOT to GND, power up the device
- After device powers up (wait a couple of seconds), remove the BOOT to GND connection
5. Visit [ESPHome Web](https://web.esphome.io)
6. Connect to your device and flash the firmware
7. After successful flash, device will restart and be ready for OTA updates
#### Detailed Visual Guides
<!-- markdownlint-disable MD013 -->
For step-by-step visual instructions, you can reference these existing guides:
- 🇬🇧 [WirelessThings Guide](https://wirelessthings.io/index.php/2023/12/19/how-to-flash-sonoff-tx-ultimate-with-esphome/) - English guide with detailed photos
- 🇪🇸 [Un loco y su tecnología](https://youtu.be/58v8oqSQgXQ?t=143) - Spanish video tutorial
- 🇩🇪 [SmartHome yourself](https://youtu.be/naDLhX89enQ?t=465) - German video tutorial
<!-- markdownlint-enable MD013 -->
Note: While these guides may use different firmware, the physical flashing process remains the same.
#### Subsequent Updates
After initial flashing, all future updates can be done wirelessly (OTA)
through the ESPHome dashboard in your ESPHome add-on.
### Home Assistant Integration
After successful flashing:
1. Ensure your device and Home Assistant are on the same network
2. Device should be automatically discovered within 12 minutes
3. Accept the discovery notification in Home Assistant to add device
Note: If discovery takes longer than 5 minutes, proceed to troubleshooting steps
4. Device will appear in your Home Assistant Devices dashboard
#### Troubleshooting Integration
If the device isn't discovered automatically:
1. Verify your device is powered and connected to your network:
- Look for the device in your router's client list
- Consider using [manual IP](https://esphome.io/components/wifi.html#manual-ips) in your device
2. If you missed the discovery notification:
- Go to Settings → Devices & Services
- Click "Add Integration"
- Search for "ESPHome" and enter your device's IP address
3. Still having issues?
- Check your network allows mDNS/discovery traffic
- Verify there are no VLANs or network isolation preventing communication
- Try rebooting both the device and Home Assistant
### Initial Configuration
1. In Home Assistant, navigate to:
- Settings → Devices & Services → ESPHome
- Click on your device to access its configuration page
2. Set basic device parameters:
- Model format (EU/US)
- Number of gangs (1-4)
- Relay modes (switch/light)
- Button actions
3. Optional: Configure advanced features
- LED behaviors
- Touch sensitivity
- Haptic feedback
- Audio feedback
4. Test your configuration:
- Verify each relay responds to controls
- Test configured button actions
- Confirm LED behavior matches settings
- Check haptic/audio feedback if enabled
> [!NOTE]
> Some changes may require a device restart
## Usage
@@ -154,8 +299,11 @@ Note: For proper tracking and resolution:
This project builds upon the work of several amazing projects and contributors:
<!-- markdownlint-disable MD013 -->
- [SmartHome yourself - SONOFF TX Ultimate for ESPHome](https://github.com/SmartHome-yourself/sonoff-tx-ultimate-for-esphome)
- [Un loco y su tecnología - Sonoff TX Ultimate with ESPHome](https://www.youtube.com/watch?v=58v8oqSQgXQ)
- [@PxPert](https://github.com/PxPert) - [Sonoff TX Ultimate and Voice Assistant](https://community.home-assistant.io/t/sonoff-tx-ultimate-and-voice-assistant/682214?u=edwardtfn)
<!-- markdownlint-enable MD013 -->
Special thanks to all contributors and community members who help make this project better.

View File

@@ -19,6 +19,8 @@ packages:
ref: latest # Or you can specify a version, like `ref: v2024.12.6`
refresh: 5min
files:
- ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
# - ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml # Adds experimental BLE proxy support (limited)
- ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml # Core (essential) packages
- ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml # Non-essential, but recommended packages
# - ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml # Adds BLE proxy support
# - ESPHome/TX-Ultimate-Easy-ESPHome_addon_media_player.yaml # Adds experimental Media Player (limited)
...

View File

@@ -2,6 +2,7 @@
#include "esphome/core/log.h"
#include "tx_ultimate_easy.h"
#include <cinttypes>
#include <string>
namespace esphome {
@@ -68,9 +69,9 @@ namespace esphome {
if (this->gang_count_ == 1)
return 1;
// Calculate button number
const uint8_t width = (TOUCH_MAX_POSITION + 1) / this->gang_count_; // Width of each button region
if (width < 1 or width > this->gang_count_) // Invalid width - and prevents division by zero
//Calculate button number Change to round up insted of truncate (integer division)
const uint8_t width = (TOUCH_MAX_POSITION + gang_count_) / this->gang_count_; // Width of each button region
if (width < 1) // Invalid width - and prevents division by zero removed "width > gang_count_" issue with 2 gang
return 0;
const uint8_t button = std::min(
static_cast<uint8_t>((position / width) + 1), // Convert position to button index

View File

@@ -1 +1 @@
2024.12.18
2024.12.25

View File

@@ -1 +1 @@
version: 2024.12.18
version: 2024.12.25