Compare commits
266 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ba3fc89032 | ||
|
|
fcbc92aaec | ||
|
|
a59f667e7d | ||
|
|
ff3bf05ed1 | ||
|
|
8a4009dd7e | ||
|
|
6bdf6e97b7 | ||
|
|
acb602c4ca | ||
|
|
9bae016573 | ||
|
|
e47726dc47 | ||
|
|
5988681132 | ||
|
|
5d80ce1117 | ||
|
|
036e62b277 | ||
|
|
56c613a70f | ||
|
|
12fd2d3747 | ||
|
|
81f0420987 | ||
|
|
e89adca5cb | ||
|
|
a64c45b37b | ||
|
|
95291c0381 | ||
|
|
39cf0f2b10 | ||
|
|
8d03105caf | ||
|
|
e911482deb | ||
|
|
ef4f412223 | ||
|
|
9d64b099a4 | ||
|
|
037801e961 | ||
|
|
79b57304c7 | ||
|
|
48ddfbf8b0 | ||
|
|
2e43160acb | ||
|
|
8656d0c4ca | ||
|
|
133d571874 | ||
|
|
1489bc5237 | ||
|
|
11b21de8a9 | ||
|
|
e8346e4436 | ||
|
|
e3abc6c6d5 | ||
|
|
3e847bbd4a | ||
|
|
ba69b43688 | ||
|
|
f84b9af1ee | ||
|
|
9fa79bbde6 | ||
|
|
8a343ab8fe | ||
|
|
b5a96387cb | ||
|
|
8b7fad76c1 | ||
|
|
a224cd5f86 | ||
|
|
da9dfbf808 | ||
|
|
bd5091293e | ||
|
|
05c40cf7b5 | ||
|
|
ebd8a5432a | ||
|
|
0779279d44 | ||
|
|
09514e1331 | ||
|
|
b7a66b2e87 | ||
|
|
4266a7cdd8 | ||
|
|
40f8165d5c | ||
|
|
d3d5c21d38 | ||
|
|
4b1aed33ef | ||
|
|
72a666cd3c | ||
|
|
5255912fcf | ||
|
|
c50bd5ca16 | ||
|
|
6313709fd5 | ||
|
|
b431041b15 | ||
|
|
9fad193892 | ||
|
|
e6bf60555d | ||
|
|
6a12074b71 | ||
|
|
fee446c5e2 | ||
|
|
088213137f | ||
|
|
02c7c1aff1 | ||
|
|
3401aaf4a3 | ||
|
|
f154a483cc | ||
|
|
b69bc6916b | ||
|
|
9d0fcf6bfa | ||
|
|
fa516a66cc | ||
|
|
2811eedffb | ||
|
|
0c9a5ac65e | ||
|
|
9828b6ff8a | ||
|
|
6221e109e8 | ||
|
|
3d21c2ebcb | ||
|
|
7d12ddb0e5 | ||
|
|
ea12c1d422 | ||
|
|
c73cb950eb | ||
|
|
e69873cab5 | ||
|
|
d4a18dc595 | ||
|
|
45b30d30fa | ||
|
|
d656f4b73f | ||
|
|
493dcb0abb | ||
|
|
f8fa9a2363 | ||
|
|
47744c7144 | ||
|
|
fa2c5dcc29 | ||
|
|
3cf6a11bc7 | ||
|
|
0109771731 | ||
|
|
b7df1686b6 | ||
|
|
c22d8eb847 | ||
|
|
f3b84e9d4e | ||
|
|
81c6620fbf | ||
|
|
4378952d97 | ||
|
|
876d03ace5 | ||
|
|
5ddf5388bd | ||
|
|
7aee88c38f | ||
|
|
e546fedf08 | ||
|
|
cca59bbe2a | ||
|
|
aec1aa69d3 | ||
|
|
bcf4396c6f | ||
|
|
403cdce2b5 | ||
|
|
44b3586a17 | ||
|
|
93990e78c1 | ||
|
|
e8470f56e4 | ||
|
|
2429c9d616 | ||
|
|
7a5a537847 | ||
|
|
2aa036dc0e | ||
|
|
802acdc476 | ||
|
|
37b2e93896 | ||
|
|
695cca07a0 | ||
|
|
f258b8f783 | ||
|
|
7e055e7737 | ||
|
|
9fec812b66 | ||
|
|
269ba89bd3 | ||
|
|
a44e486411 | ||
|
|
c4b2b8917f | ||
|
|
ae87f025a3 | ||
|
|
303a3f1267 | ||
|
|
a716e8e9cf | ||
|
|
d77d761497 | ||
|
|
60a3248c6b | ||
|
|
ec528ec128 | ||
|
|
4ed98e533f | ||
|
|
1ef73d5cd0 | ||
|
|
420225b6ba | ||
|
|
8996cfbdf8 | ||
|
|
085250c471 | ||
|
|
6230e31323 | ||
|
|
248f7e9cd8 | ||
|
|
6343e6eb4a | ||
|
|
226d5db7c8 | ||
|
|
dbde1da920 | ||
|
|
f2ff037c82 | ||
|
|
82af8b6687 | ||
|
|
73ecbba3b2 | ||
|
|
eb1a3954a9 | ||
|
|
5d5a3d3e77 | ||
|
|
f9e9243de5 | ||
|
|
be6a4a51e2 | ||
|
|
2a8255b788 | ||
|
|
a00e15fa85 | ||
|
|
4ea7f1ee57 | ||
|
|
bd4f6836c9 | ||
|
|
98ea8810f8 | ||
|
|
552b83f065 | ||
|
|
ee6f565447 | ||
|
|
aa4e27ec35 | ||
|
|
8a509cedc8 | ||
|
|
ddea93af6a | ||
|
|
dc99319397 | ||
|
|
5ae45fff63 | ||
|
|
bbbaeeb0d4 | ||
|
|
a9f82d958f | ||
|
|
c07e4f195a | ||
|
|
f1f545198b | ||
|
|
d87b86bfca | ||
|
|
f11840d2bc | ||
|
|
42afe71365 | ||
|
|
09e9d340fc | ||
|
|
7850d16aeb | ||
|
|
1f2e60e7db | ||
|
|
dd25e5dbba | ||
|
|
75f4245fe1 | ||
|
|
3b7f811876 | ||
|
|
d403bc2aa9 | ||
|
|
5d780f162e | ||
|
|
0e53dfd3cd | ||
|
|
23b633cdcb | ||
|
|
b1187332fb | ||
|
|
669cc2f2c2 | ||
|
|
e5d941c460 | ||
|
|
9b134a786a | ||
|
|
be0fc353f6 | ||
|
|
fbc5cb79cc | ||
|
|
c65acc3298 | ||
|
|
4d8107faf2 | ||
|
|
65bbd901b1 | ||
|
|
8c610a406a | ||
|
|
696e3bf28d | ||
|
|
5ae4564e6a | ||
|
|
857c43940d | ||
|
|
8668fe8dc9 | ||
|
|
976a903118 | ||
|
|
35cc0c4a8e | ||
|
|
5c4581563e | ||
|
|
7f1c362a50 | ||
|
|
cf3018c95c | ||
|
|
360ae3123a | ||
|
|
6767b5e765 | ||
|
|
d5e5ebb3d6 | ||
|
|
46c04eb992 | ||
|
|
8558bc3650 | ||
|
|
f32e2eee4f | ||
|
|
5a993165cd | ||
|
|
d04c2aff2f | ||
|
|
2d79ee42c7 | ||
|
|
3f4fc7a505 | ||
|
|
be23a5a0fd | ||
|
|
a23a2db352 | ||
|
|
4e73a11528 | ||
|
|
3c98d81bb7 | ||
|
|
e63447984d | ||
|
|
1f1a8049e6 | ||
|
|
0dddc0747b | ||
|
|
86d1513c6a | ||
|
|
ac4d583b64 | ||
|
|
15830d4134 | ||
|
|
0c19ca1205 | ||
|
|
2d676036dc | ||
|
|
c8ffa9e224 | ||
|
|
1406ada53a | ||
|
|
f02f90c3fa | ||
|
|
f6169e3ea2 | ||
|
|
6774a1ac18 | ||
|
|
21720d8ba3 | ||
|
|
7727c968db | ||
|
|
dc9e19d43c | ||
|
|
737343e395 | ||
|
|
5569260f92 | ||
|
|
04ca752c3b | ||
|
|
23436428a4 | ||
|
|
26a244cbed | ||
|
|
ce8b4e700e | ||
|
|
35bf4bc0ec | ||
|
|
ee8ff66add | ||
|
|
96db05cc34 | ||
|
|
61a5d67082 | ||
|
|
ce9aefc7fe | ||
|
|
9bf6eff7d6 | ||
|
|
1d38ac282c | ||
|
|
9fbc499339 | ||
|
|
9646d5292a | ||
|
|
c01f8a4623 | ||
|
|
6f4d8ff611 | ||
|
|
82b6d8cb25 | ||
|
|
d0b8ba55ba | ||
|
|
8f4a2a9402 | ||
|
|
55cde35d31 | ||
|
|
e1b8469aa5 | ||
|
|
e0a5ea1cc8 | ||
|
|
2ae4d2abe8 | ||
|
|
da83c0749b | ||
|
|
ffe0d56576 | ||
|
|
b1b1a40d5e | ||
|
|
3543c0c088 | ||
|
|
0cc17b715f | ||
|
|
b1dbda4efe | ||
|
|
242325e556 | ||
|
|
cc5858be8b | ||
|
|
59da9bcb96 | ||
|
|
c62e7a689c | ||
|
|
62e4e3d511 | ||
|
|
e9890c937e | ||
|
|
81bf402e35 | ||
|
|
6d11d50e25 | ||
|
|
fa2c212efe | ||
|
|
3412e2389a | ||
|
|
a4eff7276a | ||
|
|
7c04d152a0 | ||
|
|
2e15149d3d | ||
|
|
818c6067e0 | ||
|
|
2f92e874b3 | ||
|
|
13722eccd0 | ||
|
|
51bf0dceab | ||
|
|
01293fd62d | ||
|
|
3f86f7dee9 | ||
|
|
b6d9ae5a96 | ||
|
|
7e46ecb1b3 |
32
.github/workflows/release_tag.yml
vendored
32
.github/workflows/release_tag.yml
vendored
@@ -1,32 +0,0 @@
|
|||||||
---
|
|
||||||
name: Update Tags
|
|
||||||
|
|
||||||
# yamllint disable-line rule:truthy
|
|
||||||
on:
|
|
||||||
release:
|
|
||||||
types: [published]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
update-tags:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@main
|
|
||||||
with:
|
|
||||||
fetch-depth: '0'
|
|
||||||
|
|
||||||
- name: Set up Git
|
|
||||||
run: |
|
|
||||||
git config --local user.email "action@github.com"
|
|
||||||
git config --local user.name "GitHub Action"
|
|
||||||
|
|
||||||
- name: Move and push stable tag
|
|
||||||
run: |
|
|
||||||
git tag -f stable ${{ github.event.release.tag_name }}
|
|
||||||
git push -f origin stable
|
|
||||||
|
|
||||||
- name: Move and push latest tag
|
|
||||||
run: |
|
|
||||||
git tag -f latest ${{ github.event.release.tag_name }}
|
|
||||||
git push -f origin latest
|
|
||||||
...
|
|
||||||
278
.github/workflows/validate_esphome.yml
vendored
278
.github/workflows/validate_esphome.yml
vendored
@@ -1,26 +1,11 @@
|
|||||||
---
|
---
|
||||||
name: Validate ESPHome
|
name: Validate ESPHome (Latest)
|
||||||
|
|
||||||
# yamllint disable-line rule:truthy
|
permissions:
|
||||||
on:
|
contents: read
|
||||||
push:
|
pull-requests: read
|
||||||
paths:
|
|
||||||
- "*.yaml"
|
on: # yamllint disable-line rule:truthy
|
||||||
- "prebuilt/*.yaml"
|
|
||||||
- ".test/*.yaml"
|
|
||||||
- "*.h"
|
|
||||||
- "*.c"
|
|
||||||
- "*.cpp"
|
|
||||||
- "*.py"
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- "*.yaml"
|
|
||||||
- "prebuilt/*.yaml"
|
|
||||||
- ".test/*.yaml"
|
|
||||||
- "*.h"
|
|
||||||
- "*.c"
|
|
||||||
- "*.cpp"
|
|
||||||
- "*.py"
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
@@ -46,37 +31,234 @@ jobs:
|
|||||||
- 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 {} +
|
||||||
|
|
||||||
build_basic:
|
build_ard_core:
|
||||||
name: Basic
|
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: 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_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: latest
|
||||||
|
|
||||||
|
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:
|
||||||
|
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:
|
needs:
|
||||||
- code_scan
|
- build_ard_basic
|
||||||
|
- build_ard_hw_relays
|
||||||
|
- build_ard_hw_vibration
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@main
|
- uses: actions/checkout@main
|
||||||
- name: Build core
|
- name: Build Media Player (Ard)
|
||||||
uses: esphome/build-action@main
|
uses: esphome/build-action@main
|
||||||
with:
|
with:
|
||||||
yaml_file: ".test/esphome_ard_basic.yaml"
|
yaml-file: ".test/esphome_ard_media_player.yaml"
|
||||||
|
version: latest
|
||||||
build_bluetooth_proxy_4:
|
|
||||||
name: Bluetooth Proxy (IDF v4)
|
|
||||||
needs: build_basic
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@main
|
|
||||||
- name: Build core
|
|
||||||
uses: esphome/build-action@main
|
|
||||||
with:
|
|
||||||
yaml_file: ".test/esphome_idf_bluetooth_proxy.yaml"
|
|
||||||
|
|
||||||
build_bluetooth_proxy_5:
|
|
||||||
name: Bluetooth Proxy (IDF v5)
|
|
||||||
needs: build_basic
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@main
|
|
||||||
- name: Build core
|
|
||||||
uses: esphome/build-action@main
|
|
||||||
with:
|
|
||||||
yaml_file: ".test/esphome_idf5_bluetooth_proxy.yaml"
|
|
||||||
...
|
...
|
||||||
|
|||||||
302
.github/workflows/validate_esphome_beta.yml
vendored
302
.github/workflows/validate_esphome_beta.yml
vendored
@@ -1,8 +1,29 @@
|
|||||||
---
|
---
|
||||||
name: Validate ESPHome (Beta)
|
name: Validate ESPHome (Beta)
|
||||||
|
|
||||||
# yamllint disable-line rule:truthy
|
permissions:
|
||||||
on:
|
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:
|
workflow_dispatch:
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
@@ -10,32 +31,9 @@ concurrency:
|
|||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
setup_dependencies:
|
|
||||||
name: Setup & Cache Dependencies
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
cache-hit-arduino: ${{ steps.cache-arduino.outputs.cache-hit }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@main
|
|
||||||
|
|
||||||
- name: Cache Arduino Dependencies
|
|
||||||
id: cache-arduino
|
|
||||||
uses: actions/cache@main
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.esphome/cache
|
|
||||||
~/.platformio/packages
|
|
||||||
~/.platformio/platforms
|
|
||||||
key: ${{ runner.os }}-arduino-${{ hashFiles('**/esphome_ard_basic.yaml') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-arduino-
|
|
||||||
|
|
||||||
code_scan:
|
code_scan:
|
||||||
name: Code scan (YAML)
|
name: Code scan (YAML)
|
||||||
runs-on: "ubuntu-latest"
|
runs-on: "ubuntu-latest"
|
||||||
needs: setup_dependencies
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Code
|
- name: Checkout Code
|
||||||
uses: actions/checkout@main
|
uses: actions/checkout@main
|
||||||
@@ -51,50 +49,234 @@ jobs:
|
|||||||
- 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 {} +
|
||||||
|
|
||||||
build_basic:
|
build_ard_core:
|
||||||
name: Basic
|
name: Core (Arduino)
|
||||||
needs: [code_scan, setup_dependencies]
|
needs: code_scan
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- id: ard
|
|
||||||
yaml_file: ".test/esphome_ard_basic.yaml"
|
|
||||||
cache-hit: ${{ needs.setup_dependencies.outputs.cache-hit-arduino }}
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- uses: actions/checkout@main
|
||||||
uses: actions/checkout@main
|
- name: Build Core (Arduino)
|
||||||
|
|
||||||
- name: Firmware
|
|
||||||
if: steps.matrix.outputs.cache-hit != 'true'
|
|
||||||
uses: esphome/build-action@main
|
uses: esphome/build-action@main
|
||||||
with:
|
with:
|
||||||
yaml_file: ${{ matrix.yaml_file }}
|
yaml-file: ".test/esphome_ard_core.yaml"
|
||||||
version: beta
|
version: beta
|
||||||
|
|
||||||
build_bluetooth_proxy:
|
build_idf_core:
|
||||||
name: Bluetooth Proxy
|
name: Core (IDF)
|
||||||
needs: build_basic
|
needs: code_scan
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- id: idf_v4
|
|
||||||
base: idf_v4
|
|
||||||
yaml_file: ".test/esphome_idf_bluetooth_proxy.yaml"
|
|
||||||
- id: idf_v5
|
|
||||||
base: idf_v5
|
|
||||||
yaml_file: ".test/esphome_idf5_bluetooth_proxy.yaml"
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- uses: actions/checkout@main
|
||||||
uses: actions/checkout@main
|
- name: Build Core (IDF)
|
||||||
|
|
||||||
- name: Build Bluetooth Proxy Firmware
|
|
||||||
uses: esphome/build-action@main
|
uses: esphome/build-action@main
|
||||||
with:
|
with:
|
||||||
yaml_file: ${{ matrix.yaml_file }}
|
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
|
version: beta
|
||||||
...
|
...
|
||||||
|
|||||||
104
.github/workflows/versioning.yml
vendored
Normal file
104
.github/workflows/versioning.yml
vendored
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
# This GitHub Actions workflow handles version bumping and tag updates.
|
||||||
|
# It can be triggered either by:
|
||||||
|
# 1. Pushing to main branch - automatically bumps version and updates tags
|
||||||
|
# 2. Manual dispatch - allows independent control over stable and latest tags
|
||||||
|
|
||||||
|
---
|
||||||
|
name: Version and Tags
|
||||||
|
|
||||||
|
on: # yamllint disable-line rule:truthy
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths-ignore:
|
||||||
|
- '**/VERSION'
|
||||||
|
- '**/VERSION_YAML'
|
||||||
|
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
update_stable:
|
||||||
|
description: "Update stable tag?"
|
||||||
|
required: true
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
update_latest:
|
||||||
|
description: "Update latest tag?"
|
||||||
|
required: true
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
version-and-tag:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Set up Git
|
||||||
|
run: |
|
||||||
|
git config user.name "GitHub Actions"
|
||||||
|
git config user.email "actions@github.com"
|
||||||
|
|
||||||
|
- name: Bump version
|
||||||
|
run: |
|
||||||
|
chmod +x ./versioning/bump_version.sh
|
||||||
|
./versioning/bump_version.sh
|
||||||
|
|
||||||
|
- name: Push Changes and Tags
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
git push origin main
|
||||||
|
git push origin --tags --force
|
||||||
|
|
||||||
|
- name: Update stable tag
|
||||||
|
if: |
|
||||||
|
success() &&
|
||||||
|
github.event_name == 'workflow_dispatch' &&
|
||||||
|
inputs.update_stable
|
||||||
|
run: |
|
||||||
|
# Verify version bump was successful
|
||||||
|
if [ ! -f "./versioning/VERSION" ]; then
|
||||||
|
echo "Error: VERSION file not found. Version bump may have failed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Backup existing tag
|
||||||
|
if git rev-parse --verify stable >/dev/null 2>&1; then
|
||||||
|
OLD_STABLE=$(git rev-parse stable)
|
||||||
|
echo "Backing up current stable tag ($OLD_STABLE)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Update tag
|
||||||
|
NEW_VERSION=$(cat ./versioning/VERSION)
|
||||||
|
echo "Updating stable tag to $NEW_VERSION"
|
||||||
|
git tag -fa stable -m "Update stable tag"
|
||||||
|
git push origin stable --force
|
||||||
|
|
||||||
|
- name: Update latest tag
|
||||||
|
if: |
|
||||||
|
success() && (
|
||||||
|
github.event_name == 'workflow_dispatch' && inputs.update_latest ||
|
||||||
|
github.event_name == 'push'
|
||||||
|
)
|
||||||
|
run: |
|
||||||
|
# Verify version bump was successful
|
||||||
|
if [ ! -f "./versioning/VERSION" ]; then
|
||||||
|
echo "Error: VERSION file not found. Version bump may have failed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Backup existing tag
|
||||||
|
if git rev-parse --verify latest >/dev/null 2>&1; then
|
||||||
|
OLD_LATEST=$(git rev-parse latest)
|
||||||
|
echo "Backing up current latest tag ($OLD_LATEST)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Update tag
|
||||||
|
NEW_VERSION=$(cat ./versioning/VERSION)
|
||||||
|
echo "Updating latest tag to $NEW_VERSION"
|
||||||
|
git tag -fa latest -m "Update latest tag"
|
||||||
|
git push origin latest --force
|
||||||
|
...
|
||||||
5
.test/common.yaml
Normal file
5
.test/common.yaml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
wifi:
|
||||||
|
ssid: !secret wifi_ssid
|
||||||
|
password: !secret wifi_password
|
||||||
|
...
|
||||||
8
.test/common_ard.yaml
Normal file
8
.test/common_ard.yaml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
common: !include common.yaml
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
framework:
|
||||||
|
type: arduino
|
||||||
|
...
|
||||||
19
.test/common_idf.yaml
Normal file
19
.test/common_idf.yaml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
common: !include common.yaml
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
framework:
|
||||||
|
type: esp-idf
|
||||||
|
|
||||||
|
light:
|
||||||
|
- id: !extend light_full
|
||||||
|
platform: esp32_rmt_led_strip
|
||||||
|
rgb_order: GRB
|
||||||
|
rmt_channel: 1
|
||||||
|
chipset: ws2812
|
||||||
|
max_refresh_rate: 33ms
|
||||||
|
use_psram: false
|
||||||
|
type: !remove
|
||||||
|
variant: !remove
|
||||||
|
...
|
||||||
10
.test/common_idf53.yaml
Normal file
10
.test/common_idf53.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
common_idf: !include common_idf.yaml
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
framework:
|
||||||
|
type: esp-idf
|
||||||
|
version: 5.3.1
|
||||||
|
platform_version: 6.9.0
|
||||||
|
...
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
---
|
---
|
||||||
packages:
|
packages:
|
||||||
basic_package: !include ../TX-Ultimate-Easy-ESPHome.yaml # Basic package
|
common_arduino: !include common_ard.yaml
|
||||||
|
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||||
esp32:
|
standard_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml
|
||||||
framework:
|
|
||||||
type: arduino
|
|
||||||
...
|
...
|
||||||
|
|||||||
7
.test/esphome_ard_ble_proxy.yaml
Normal file
7
.test/esphome_ard_ble_proxy.yaml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
common_arduino: !include common_ard.yaml
|
||||||
|
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||||
|
standard_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml
|
||||||
|
addon_bluetooth_proxy: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml
|
||||||
|
...
|
||||||
5
.test/esphome_ard_core.yaml
Normal file
5
.test/esphome_ard_core.yaml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
common_arduino: !include common_ard.yaml
|
||||||
|
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||||
|
...
|
||||||
6
.test/esphome_ard_hw_relays.yaml
Normal file
6
.test/esphome_ard_hw_relays.yaml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
common_arduino: !include common_ard.yaml
|
||||||
|
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||||
|
standard_hw_relays_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml
|
||||||
|
...
|
||||||
6
.test/esphome_ard_hw_speaker.yaml
Normal file
6
.test/esphome_ard_hw_speaker.yaml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
common_arduino: !include common_ard.yaml
|
||||||
|
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||||
|
standard_hw_speaker_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml
|
||||||
|
...
|
||||||
6
.test/esphome_ard_hw_vibration.yaml
Normal file
6
.test/esphome_ard_hw_vibration.yaml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
common_arduino: !include common_ard.yaml
|
||||||
|
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||||
|
standard_hw_vibration_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml
|
||||||
|
...
|
||||||
8
.test/esphome_ard_media_player.yaml
Normal file
8
.test/esphome_ard_media_player.yaml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
common_arduino: !include common_ard.yaml
|
||||||
|
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||||
|
standard_hw_relays_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml
|
||||||
|
standard_hw_vibration_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml
|
||||||
|
addon_media_player: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_addon_media_player.yaml
|
||||||
|
...
|
||||||
11
.test/esphome_idf53_basic.yaml
Normal file
11
.test/esphome_idf53_basic.yaml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
common_idf53: !include common_idf53.yaml
|
||||||
|
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||||
|
standard_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml
|
||||||
|
|
||||||
|
media_player: !remove
|
||||||
|
|
||||||
|
switch:
|
||||||
|
- id: !remove sw_speaker_amplifier
|
||||||
|
...
|
||||||
13
.test/esphome_idf53_ble_proxy.yaml
Normal file
13
.test/esphome_idf53_ble_proxy.yaml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
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
|
||||||
|
...
|
||||||
5
.test/esphome_idf53_core.yaml
Normal file
5
.test/esphome_idf53_core.yaml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
common_idf53: !include common_idf53.yaml
|
||||||
|
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||||
|
...
|
||||||
6
.test/esphome_idf53_hw_relays.yaml
Normal file
6
.test/esphome_idf53_hw_relays.yaml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
common_idf53: !include common_idf53.yaml
|
||||||
|
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||||
|
standard_hw_relays_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml
|
||||||
|
...
|
||||||
6
.test/esphome_idf53_hw_speaker.yaml
Normal file
6
.test/esphome_idf53_hw_speaker.yaml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
common_idf53: !include common_idf53.yaml
|
||||||
|
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||||
|
standard_hw_speaker_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml
|
||||||
|
...
|
||||||
6
.test/esphome_idf53_hw_vibration.yaml
Normal file
6
.test/esphome_idf53_hw_vibration.yaml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
common_idf53: !include common_idf53.yaml
|
||||||
|
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||||
|
standard_hw_vibration_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml
|
||||||
|
...
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
---
|
|
||||||
packages:
|
|
||||||
basic_package: !include ../TX-Ultimate-Easy-ESPHome.yaml # Core package
|
|
||||||
addon_bluetooth_proxy: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml
|
|
||||||
|
|
||||||
esp32:
|
|
||||||
framework:
|
|
||||||
type: esp-idf
|
|
||||||
version: 5.0.2
|
|
||||||
platform_version: 6.3.2
|
|
||||||
...
|
|
||||||
11
.test/esphome_idf_basic.yaml
Normal file
11
.test/esphome_idf_basic.yaml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
common_idf: !include common_idf.yaml
|
||||||
|
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||||
|
standard_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml
|
||||||
|
|
||||||
|
media_player: !remove
|
||||||
|
|
||||||
|
switch:
|
||||||
|
- id: !remove sw_speaker_amplifier
|
||||||
|
...
|
||||||
7
.test/esphome_idf_ble_proxy.yaml
Normal file
7
.test/esphome_idf_ble_proxy.yaml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
common: !include common.yaml
|
||||||
|
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||||
|
standard_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml
|
||||||
|
addon_bluetooth_proxy: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml
|
||||||
|
...
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
packages:
|
|
||||||
basic_package: !include ../TX-Ultimate-Easy-ESPHome.yaml # Core package
|
|
||||||
addon_bluetooth_proxy: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml
|
|
||||||
...
|
|
||||||
5
.test/esphome_idf_core.yaml
Normal file
5
.test/esphome_idf_core.yaml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
common_idf: !include common_idf.yaml
|
||||||
|
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||||
|
...
|
||||||
6
.test/esphome_idf_hw_relays.yaml
Normal file
6
.test/esphome_idf_hw_relays.yaml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
common_idf: !include common_idf.yaml
|
||||||
|
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||||
|
standard_hw_relays_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml
|
||||||
|
...
|
||||||
6
.test/esphome_idf_hw_speaker.yaml
Normal file
6
.test/esphome_idf_hw_speaker.yaml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
common_idf: !include common_idf.yaml
|
||||||
|
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||||
|
standard_hw_speaker_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml
|
||||||
|
...
|
||||||
6
.test/esphome_idf_hw_vibration.yaml
Normal file
6
.test/esphome_idf_hw_vibration.yaml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
common_idf: !include common_idf.yaml
|
||||||
|
core_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
||||||
|
standard_hw_vibration_package: !include ../ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml
|
||||||
|
...
|
||||||
BIN
Assets/Logo.png
Normal file
BIN
Assets/Logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 165 KiB |
BIN
Assets/Logo_dark.png
Normal file
BIN
Assets/Logo_dark.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 165 KiB |
BIN
Assets/Logo_dark.webp
Normal file
BIN
Assets/Logo_dark.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 261 KiB |
BIN
Assets/Logo_light.png
Normal file
BIN
Assets/Logo_light.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 107 KiB |
19
ESPHome/TX-Ultimate-Easy-ESPHome.yaml
Normal file
19
ESPHome/TX-Ultimate-Easy-ESPHome.yaml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
####################################################################################################
|
||||||
|
##### TX Ultimate Easy for ESPHome #####
|
||||||
|
##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy #####
|
||||||
|
####################################################################################################
|
||||||
|
##### Purpose: ESPHome Basic (includes core plus non-essential, but recommended packages) #####
|
||||||
|
####################################################################################################
|
||||||
|
##### Author: edwardtfn - https://github.com/edwardtfn - https://buymeacoffee.com/edwardfirmo #####
|
||||||
|
####################################################################################################
|
||||||
|
##### NOTE: #####
|
||||||
|
##### - Make changes ONLY if absolutely necessary and you have the required knowledge. #####
|
||||||
|
##### - For normal system use, modifications to this file are NOT required. #####
|
||||||
|
####################################################################################################
|
||||||
|
---
|
||||||
|
packages:
|
||||||
|
# yamllint disable rule:colons
|
||||||
|
core: !include TX-Ultimate-Easy-ESPHome_core.yaml
|
||||||
|
standard: !include TX-Ultimate-Easy-ESPHome_standard.yaml
|
||||||
|
# yamllint enable rule:colons
|
||||||
|
...
|
||||||
@@ -1,20 +1,24 @@
|
|||||||
|
####################################################################################################
|
||||||
|
##### TX Ultimate Easy for ESPHome #####
|
||||||
|
##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy #####
|
||||||
|
####################################################################################################
|
||||||
|
##### Purpose: ESPHome Core - Add-on - BLE Proxy #####
|
||||||
|
####################################################################################################
|
||||||
|
##### 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_speaker: !include TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml
|
||||||
|
|
||||||
bluetooth_proxy:
|
bluetooth_proxy:
|
||||||
|
|
||||||
esp32:
|
esp32:
|
||||||
framework:
|
framework:
|
||||||
type: esp-idf
|
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:
|
esphome:
|
||||||
platformio_options:
|
platformio_options:
|
||||||
@@ -27,11 +31,28 @@ light:
|
|||||||
- id: !extend light_full
|
- id: !extend light_full
|
||||||
platform: esp32_rmt_led_strip
|
platform: esp32_rmt_led_strip
|
||||||
rgb_order: GRB
|
rgb_order: GRB
|
||||||
rmt_channel: 0
|
rmt_channel: 1
|
||||||
chipset: ws2812
|
chipset: ws2812
|
||||||
|
max_refresh_rate: 33ms
|
||||||
|
use_psram: false
|
||||||
type: !remove
|
type: !remove
|
||||||
variant: !remove
|
variant: !remove
|
||||||
max_refresh_rate: 33ms
|
|
||||||
|
|
||||||
media_player: !remove
|
media_player: !remove
|
||||||
|
|
||||||
|
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, " - Add-on - BLE Proxy");
|
||||||
|
|
||||||
|
switch:
|
||||||
|
- id: !remove sw_speaker_amplifier
|
||||||
...
|
...
|
||||||
|
|||||||
68
ESPHome/TX-Ultimate-Easy-ESPHome_addon_media_player.yaml
Normal file
68
ESPHome/TX-Ultimate-Easy-ESPHome_addon_media_player.yaml
Normal 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
|
||||||
|
...
|
||||||
File diff suppressed because it is too large
Load Diff
323
ESPHome/TX-Ultimate-Easy-ESPHome_core_common.yaml
Normal file
323
ESPHome/TX-Ultimate-Easy-ESPHome_core_common.yaml
Normal file
@@ -0,0 +1,323 @@
|
|||||||
|
####################################################################################################
|
||||||
|
##### TX Ultimate Easy for ESPHome #####
|
||||||
|
##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy #####
|
||||||
|
####################################################################################################
|
||||||
|
##### Purpose: ESPHome Core - Common #####
|
||||||
|
####################################################################################################
|
||||||
|
##### Author: edwardtfn - https://github.com/edwardtfn - https://buymeacoffee.com/edwardfirmo #####
|
||||||
|
####################################################################################################
|
||||||
|
##### NOTE: #####
|
||||||
|
##### - Make changes ONLY if absolutely necessary and you have the required knowledge. #####
|
||||||
|
##### - For normal system use, modifications to this file are NOT required. #####
|
||||||
|
####################################################################################################
|
||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
name: tx-ultimate-easy
|
||||||
|
friendly_name: TX Ultimate Easy
|
||||||
|
|
||||||
|
<<: !include ../versioning/VERSION_YAML
|
||||||
|
|
||||||
|
TX_MODEL_FORMAT_EU_TEXT: "EU (Square, T5-xC-86)"
|
||||||
|
TX_MODEL_FORMAT_US_TEXT: "US (Rectangle, T5-xC-120)"
|
||||||
|
|
||||||
|
TX_MODEL_1_GANG_TEXT: "1 Gang"
|
||||||
|
TX_MODEL_2_GANG_TEXT: "2 Gang"
|
||||||
|
TX_MODEL_3_GANG_TEXT: "3 Gang"
|
||||||
|
TX_MODEL_4_GANG_TEXT: "4 Gang"
|
||||||
|
|
||||||
|
DUMP_CONFIG_CALLER_DELAY: 10s # Delay to dump config after requested
|
||||||
|
|
||||||
|
|
||||||
|
api:
|
||||||
|
id: api_server
|
||||||
|
on_client_connected:
|
||||||
|
then:
|
||||||
|
- script.execute: dump_config_caller
|
||||||
|
- script.execute: publish_device_info
|
||||||
|
|
||||||
|
binary_sensor:
|
||||||
|
- id: bs_pending_restart
|
||||||
|
name: Pending Restart Status
|
||||||
|
internal: false
|
||||||
|
disabled_by_default: false
|
||||||
|
platform: template
|
||||||
|
entity_category: diagnostic
|
||||||
|
device_class: problem
|
||||||
|
on_state:
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
if (x)
|
||||||
|
ESP_LOGW("core", "Pending restart: YES");
|
||||||
|
else
|
||||||
|
ESP_LOGCONFIG("core", "Pending restart: No");
|
||||||
|
- script.execute: dump_config_caller
|
||||||
|
|
||||||
|
button:
|
||||||
|
- id: bt_restart
|
||||||
|
name: Restart
|
||||||
|
internal: false
|
||||||
|
platform: restart
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
board: esp32dev
|
||||||
|
flash_size: 8MB
|
||||||
|
|
||||||
|
esphome:
|
||||||
|
name: ${name}
|
||||||
|
friendly_name: ${friendly_name}
|
||||||
|
comment: TX Ultimate Easy
|
||||||
|
project:
|
||||||
|
name: "edwardtfn.tx_ultimate_easy"
|
||||||
|
version: ${version}
|
||||||
|
platformio_options:
|
||||||
|
build_flags:
|
||||||
|
- -D TX_ULTIMATE_EASY_CORE
|
||||||
|
|
||||||
|
on_boot:
|
||||||
|
- priority: 700
|
||||||
|
then:
|
||||||
|
- script.execute: boot_initialize
|
||||||
|
|
||||||
|
- priority: 600 # This is where most sensors are set up.
|
||||||
|
then:
|
||||||
|
- script.execute: boot_sequence
|
||||||
|
|
||||||
|
- priority: -100 # At this priority, pretty much everything should already be initialized.
|
||||||
|
then:
|
||||||
|
- script.execute: boot_done
|
||||||
|
|
||||||
|
globals:
|
||||||
|
- id: is_us_model
|
||||||
|
type: bool
|
||||||
|
restore_value: true
|
||||||
|
initial_value: 'false'
|
||||||
|
|
||||||
|
- id: gang_count
|
||||||
|
type: uint8_t
|
||||||
|
restore_value: true
|
||||||
|
initial_value: '0'
|
||||||
|
|
||||||
|
- id: gang_count_plural_suffix
|
||||||
|
type: std::string
|
||||||
|
restore_value: true
|
||||||
|
max_restore_data_length: 3
|
||||||
|
# initial_value: "''"
|
||||||
|
|
||||||
|
logger:
|
||||||
|
level: DEBUG
|
||||||
|
|
||||||
|
ota:
|
||||||
|
platform: esphome
|
||||||
|
|
||||||
|
psram:
|
||||||
|
mode: octal
|
||||||
|
speed: 80MHz
|
||||||
|
|
||||||
|
script:
|
||||||
|
- id: api_send_ha_event_boot
|
||||||
|
mode: queued
|
||||||
|
parameters:
|
||||||
|
type: string
|
||||||
|
then:
|
||||||
|
- homeassistant.event:
|
||||||
|
event: esphome.tx_ultimate_easy
|
||||||
|
data:
|
||||||
|
device_name: !lambda return tx_device_name->state.c_str();
|
||||||
|
firmware: ${version}
|
||||||
|
domain: boot
|
||||||
|
type: !lambda return type.c_str();
|
||||||
|
|
||||||
|
- id: boot_done
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
- script.execute:
|
||||||
|
id: api_send_ha_event_boot
|
||||||
|
type: done
|
||||||
|
|
||||||
|
- id: boot_initialize
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
# Extended by:
|
||||||
|
# - HW Buttons
|
||||||
|
# - HW Relays
|
||||||
|
# - HW Touch
|
||||||
|
- script.execute:
|
||||||
|
id: api_send_ha_event_boot
|
||||||
|
type: start
|
||||||
|
- wait_until:
|
||||||
|
condition:
|
||||||
|
- lambda: return sl_tx_model_format->active_index().has_value();
|
||||||
|
- lambda: return sl_tx_model_gang->active_index().has_value();
|
||||||
|
- lambda: |-
|
||||||
|
id(is_us_model) = (sl_tx_model_format->state == "${TX_MODEL_FORMAT_US_TEXT}");
|
||||||
|
id(gang_count) = sl_tx_model_gang->active_index().value() + 1;
|
||||||
|
if (id(gang_count) < 1 || id(gang_count) > 4) {
|
||||||
|
ESP_LOGE("core_hw_leds", "Invalid number of gangs: %" PRIu8, id(gang_count));
|
||||||
|
}
|
||||||
|
id(gang_count_plural_suffix) = id(gang_count) > 1 ? "s" : "";
|
||||||
|
|
||||||
|
- id: boot_sequence
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
- script.execute: publish_device_info
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_pending_restart
|
||||||
|
state: false
|
||||||
|
|
||||||
|
- id: dump_config
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
# Extended by all modules
|
||||||
|
- lambda: |-
|
||||||
|
// Device identification
|
||||||
|
ESP_LOGCONFIG("core", "Device friendly name: ${friendly_name}");
|
||||||
|
ESP_LOGCONFIG("core", "Device name: ${name}");
|
||||||
|
ESP_LOGCONFIG("core", "Device name (HA): %s", tx_device_name->state.c_str());
|
||||||
|
ESP_LOGCONFIG("core", "Device hostname: %s", App.get_name().c_str());
|
||||||
|
|
||||||
|
dump_config_versions->execute();
|
||||||
|
|
||||||
|
// Framework detection
|
||||||
|
#ifdef USE_ARDUINO
|
||||||
|
ESP_LOGCONFIG("core", "Framework: Arduino");
|
||||||
|
#elif defined(USE_ESP_IDF)
|
||||||
|
ESP_LOGCONFIG("core", "Framework: ESP-IDF");
|
||||||
|
#else
|
||||||
|
ESP_LOGW("core", "Framework: UNKNOWN");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Model configuration
|
||||||
|
ESP_LOGCONFIG("core", "Model format (selected): %s", sl_tx_model_format->state.c_str());
|
||||||
|
ESP_LOGCONFIG("core", "Model format (detected): %s", id(is_us_model) ? "US" : "EU");
|
||||||
|
ESP_LOGCONFIG("core", "Gangs (selected): %s", sl_tx_model_gang->state.c_str());
|
||||||
|
ESP_LOGCONFIG("core", "Gangs (detected): %" PRIu8 "-Gang%s", id(gang_count), id(gang_count_plural_suffix).c_str());
|
||||||
|
|
||||||
|
// System state
|
||||||
|
if (bs_pending_restart->state)
|
||||||
|
ESP_LOGW("core", "Pending restart: YES");
|
||||||
|
else
|
||||||
|
ESP_LOGCONFIG("core", "Pending restart: No");
|
||||||
|
|
||||||
|
- id: dump_config_caller
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
- delay: ${DUMP_CONFIG_CALLER_DELAY}
|
||||||
|
- script.execute: dump_config
|
||||||
|
- script.wait: dump_config
|
||||||
|
- script.execute: dump_config_list_packages
|
||||||
|
|
||||||
|
- id: dump_config_list_packages
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
- script.wait: dump_config
|
||||||
|
- lambda: |-
|
||||||
|
ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, "Installed packages:");
|
||||||
|
|
||||||
|
// Identify itself
|
||||||
|
ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Core");
|
||||||
|
|
||||||
|
- id: dump_config_versions
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
// Version information
|
||||||
|
ESP_LOGCONFIG("core", "TX Ultimate firmware version: ${version}");
|
||||||
|
// ESPHome builder information
|
||||||
|
ESP_LOGCONFIG("core", "ESPHome builder: " ESPHOME_VERSION);
|
||||||
|
ESP_LOGCONFIG("core", "ESPHome build timestamp: %s", App.get_compilation_time().c_str());
|
||||||
|
|
||||||
|
- id: publish_device_info
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
tx_fw_version->publish_state("${version}");
|
||||||
|
tx_device_name->publish_state(App.get_name().c_str());
|
||||||
|
|
||||||
|
select:
|
||||||
|
- id: sl_tx_model_format
|
||||||
|
name: Model (Format)
|
||||||
|
platform: template
|
||||||
|
options:
|
||||||
|
- "${TX_MODEL_FORMAT_EU_TEXT}"
|
||||||
|
- "${TX_MODEL_FORMAT_US_TEXT}"
|
||||||
|
initial_option: "${TX_MODEL_FORMAT_EU_TEXT}"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true
|
||||||
|
internal: false
|
||||||
|
entity_category: config
|
||||||
|
disabled_by_default: false
|
||||||
|
icon: mdi:tablet-cellphone
|
||||||
|
on_value:
|
||||||
|
then:
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_pending_restart
|
||||||
|
state: true
|
||||||
|
- lambda: |-
|
||||||
|
id(is_us_model) = (x == "${TX_MODEL_FORMAT_US_TEXT}");
|
||||||
|
ESP_LOGI("core", "New model selected: %s", id(is_us_model) ? "US" : "EU");
|
||||||
|
|
||||||
|
- id: sl_tx_model_gang
|
||||||
|
name: Model (Gang)
|
||||||
|
platform: template
|
||||||
|
options:
|
||||||
|
- "${TX_MODEL_1_GANG_TEXT}"
|
||||||
|
- "${TX_MODEL_2_GANG_TEXT}"
|
||||||
|
- "${TX_MODEL_3_GANG_TEXT}"
|
||||||
|
- "${TX_MODEL_4_GANG_TEXT}"
|
||||||
|
initial_option: "${TX_MODEL_1_GANG_TEXT}"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true
|
||||||
|
internal: false
|
||||||
|
entity_category: config
|
||||||
|
disabled_by_default: false
|
||||||
|
icon: mdi:dip-switch
|
||||||
|
on_value:
|
||||||
|
then:
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_pending_restart
|
||||||
|
state: true
|
||||||
|
- lambda: |-
|
||||||
|
id(gang_count) = static_cast<uint8_t>(i) + 1;
|
||||||
|
ESP_LOGI("core", "New model selected: %" PRIu8 "-%s", id(gang_count), id(gang_count) > 1 ? "Gangs" : "Gang");
|
||||||
|
tx_ultimate->set_gang_count(id(gang_count));
|
||||||
|
|
||||||
|
text_sensor:
|
||||||
|
- id: tx_fw_version
|
||||||
|
name: TX Ultimate Easy Firmware Version
|
||||||
|
platform: template
|
||||||
|
entity_category: diagnostic
|
||||||
|
icon: mdi:tag-text-outline
|
||||||
|
internal: false
|
||||||
|
update_interval: never
|
||||||
|
lambda: |-
|
||||||
|
return {"${version}"};
|
||||||
|
|
||||||
|
- id: tx_device_name
|
||||||
|
name: Device Name
|
||||||
|
platform: template
|
||||||
|
icon: mdi:identifier
|
||||||
|
entity_category: diagnostic
|
||||||
|
internal: false
|
||||||
|
disabled_by_default: false
|
||||||
|
update_interval: never
|
||||||
|
lambda: |-
|
||||||
|
return {"${name}"};
|
||||||
|
filters:
|
||||||
|
- lambda: |-
|
||||||
|
const std::string raw_name = x;
|
||||||
|
std::string result;
|
||||||
|
bool last_was_underscore = false;
|
||||||
|
for (const char& c : raw_name) {
|
||||||
|
if (isalnum(c)) {
|
||||||
|
result += tolower(c); // Add alphanumeric characters as lowercase
|
||||||
|
last_was_underscore = false;
|
||||||
|
} else if (!last_was_underscore) { // Replace non-alphanumeric with '_' but avoid consecutive '_'
|
||||||
|
result += '_';
|
||||||
|
last_was_underscore = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
|
||||||
|
wifi:
|
||||||
|
id: wifi_component
|
||||||
|
...
|
||||||
365
ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml
Normal file
365
ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml
Normal file
@@ -0,0 +1,365 @@
|
|||||||
|
####################################################################################################
|
||||||
|
##### TX Ultimate Easy for ESPHome #####
|
||||||
|
##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy #####
|
||||||
|
####################################################################################################
|
||||||
|
##### Purpose: ESPHome Core - Hardware - Buttons #####
|
||||||
|
####################################################################################################
|
||||||
|
##### 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:
|
||||||
|
invalid_cooldown: 100ms
|
||||||
|
|
||||||
|
BUTTON_ACTION_NONE_TEXT: "None"
|
||||||
|
BUTTON_1_ACTION_TEXT: "Relay 1 (toggle)"
|
||||||
|
BUTTON_2_ACTION_TEXT: "Relay 2 (toggle)"
|
||||||
|
BUTTON_3_ACTION_TEXT: "Relay 3 (toggle)"
|
||||||
|
BUTTON_4_ACTION_TEXT: "Relay 4 (toggle)"
|
||||||
|
BUTTON_1_ACTION_FAILSAFE_TEXT: "Relay 1 (API failsafe only)"
|
||||||
|
BUTTON_2_ACTION_FAILSAFE_TEXT: "Relay 2 (API failsafe only)"
|
||||||
|
BUTTON_3_ACTION_FAILSAFE_TEXT: "Relay 3 (API failsafe only)"
|
||||||
|
BUTTON_4_ACTION_FAILSAFE_TEXT: "Relay 4 (API failsafe only)"
|
||||||
|
|
||||||
|
BUTTON_CLICK_MIN_LENGTH: '50' # The minimum duration the click should last, in msec
|
||||||
|
BUTTON_CLICK_MAX_LENGTH: '350' # The maximum duration the click should last, in msec
|
||||||
|
BUTTON_MULTI_CLICK_DELAY: '250' # The time to wait for another click, in msec
|
||||||
|
BUTTON_PRESS_TIMEOUT: '10000' # Ignore if button is pressed for longer than this time, in msec
|
||||||
|
BUTTON_LONG_PRESS_DELAY: '800' # The time to wait to consider a long press, in msec
|
||||||
|
|
||||||
|
# Button numbers constants
|
||||||
|
BUTTON_1_ID: '1'
|
||||||
|
BUTTON_2_ID: '2'
|
||||||
|
BUTTON_3_ID: '3'
|
||||||
|
BUTTON_4_ID: '4'
|
||||||
|
|
||||||
|
binary_sensor:
|
||||||
|
- &binary_sensor_button_base
|
||||||
|
id: bs_button_2
|
||||||
|
name: Button 2
|
||||||
|
icon: mdi:gesture-tap-box
|
||||||
|
platform: template
|
||||||
|
internal: true
|
||||||
|
|
||||||
|
- id: bs_button_3
|
||||||
|
name: Button 3
|
||||||
|
<<: *binary_sensor_button_base
|
||||||
|
|
||||||
|
- id: bs_button_4
|
||||||
|
name: Button 4
|
||||||
|
<<: *binary_sensor_button_base
|
||||||
|
|
||||||
|
- id: bs_button_1
|
||||||
|
name: Button 1
|
||||||
|
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
|
||||||
|
restore_value: false
|
||||||
|
initial_value: '0'
|
||||||
|
|
||||||
|
- id: button_press_position
|
||||||
|
type: uint8_t
|
||||||
|
restore_value: false
|
||||||
|
initial_value: '0'
|
||||||
|
|
||||||
|
- id: button_press_start_time
|
||||||
|
type: uint32_t
|
||||||
|
restore_value: false
|
||||||
|
initial_value: '0'
|
||||||
|
|
||||||
|
- id: click_counter
|
||||||
|
type: uint8_t
|
||||||
|
restore_value: false
|
||||||
|
initial_value: '0'
|
||||||
|
|
||||||
|
script:
|
||||||
|
- id: !extend boot_initialize
|
||||||
|
then:
|
||||||
|
- script.execute: boot_initialize_buttons
|
||||||
|
|
||||||
|
- id: boot_initialize_buttons
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
bs_button_1->publish_state(false);
|
||||||
|
bs_button_1->set_internal(id(gang_count) < 1);
|
||||||
|
sl_button_1_action->set_internal(id(gang_count) < 1);
|
||||||
|
bs_button_2->publish_state(false);
|
||||||
|
bs_button_2->set_internal(id(gang_count) < 2);
|
||||||
|
sl_button_2_action->set_internal(id(gang_count) < 2);
|
||||||
|
bs_button_3->publish_state(false);
|
||||||
|
bs_button_3->set_internal(id(gang_count) < 3);
|
||||||
|
sl_button_3_action->set_internal(id(gang_count) < 3);
|
||||||
|
bs_button_4->publish_state(false);
|
||||||
|
bs_button_4->set_internal(id(gang_count) < 4);
|
||||||
|
sl_button_4_action->set_internal(id(gang_count) < 4);
|
||||||
|
|
||||||
|
- id: button_action
|
||||||
|
mode: parallel
|
||||||
|
parameters:
|
||||||
|
button: uint8_t
|
||||||
|
action: string
|
||||||
|
count: uint8_t
|
||||||
|
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: |-
|
||||||
|
ESP_LOGI("core_hw_buttons", "Button %" PRIu8 " action: '%s'", button, action.c_str());
|
||||||
|
if (action == "click") {
|
||||||
|
switch (button) {
|
||||||
|
case ${BUTTON_1_ID}:
|
||||||
|
bs_button_1_click_event->publish_state(true);
|
||||||
|
break;
|
||||||
|
case ${BUTTON_2_ID}:
|
||||||
|
bs_button_2_click_event->publish_state(true);
|
||||||
|
break;
|
||||||
|
case ${BUTTON_3_ID}:
|
||||||
|
bs_button_3_click_event->publish_state(true);
|
||||||
|
break;
|
||||||
|
case ${BUTTON_4_ID}:
|
||||||
|
bs_button_4_click_event->publish_state(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (action == "double_click") {
|
||||||
|
switch (button) {
|
||||||
|
case ${BUTTON_1_ID}:
|
||||||
|
bs_button_1_double_click_event->publish_state(true);
|
||||||
|
break;
|
||||||
|
case ${BUTTON_2_ID}:
|
||||||
|
bs_button_2_double_click_event->publish_state(true);
|
||||||
|
break;
|
||||||
|
case ${BUTTON_3_ID}:
|
||||||
|
bs_button_3_double_click_event->publish_state(true);
|
||||||
|
break;
|
||||||
|
case ${BUTTON_4_ID}:
|
||||||
|
bs_button_4_double_click_event->publish_state(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (action == "long_press") {
|
||||||
|
switch (button) {
|
||||||
|
case ${BUTTON_1_ID}:
|
||||||
|
bs_button_1_long_press_event->publish_state(true);
|
||||||
|
break;
|
||||||
|
case ${BUTTON_2_ID}:
|
||||||
|
bs_button_2_long_press_event->publish_state(true);
|
||||||
|
break;
|
||||||
|
case ${BUTTON_3_ID}:
|
||||||
|
bs_button_3_long_press_event->publish_state(true);
|
||||||
|
break;
|
||||||
|
case ${BUTTON_4_ID}:
|
||||||
|
bs_button_4_long_press_event->publish_state(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
id(button_press_button) = 0;
|
||||||
|
id(button_press_position) = 0;
|
||||||
|
id(button_press_start_time) = 0;
|
||||||
|
id(click_counter) = 0;
|
||||||
|
buttons_release->execute();
|
||||||
|
|
||||||
|
- id: button_click_event
|
||||||
|
mode: restart
|
||||||
|
parameters:
|
||||||
|
button: uint8_t
|
||||||
|
click_count: uint8_t
|
||||||
|
then:
|
||||||
|
- delay:
|
||||||
|
milliseconds: ${BUTTON_MULTI_CLICK_DELAY}
|
||||||
|
- lambda: |-
|
||||||
|
std::string event_name;
|
||||||
|
if (click_count == 1) event_name = "click";
|
||||||
|
else if (click_count == 2) event_name = "double_click";
|
||||||
|
else event_name = "multiple_click";
|
||||||
|
button_action->execute(button, event_name.c_str(), click_count);
|
||||||
|
|
||||||
|
- id: buttons_release
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
std::vector<binary_sensor::BinarySensor*> buttons = {
|
||||||
|
bs_button_1, bs_button_2, bs_button_3, bs_button_4
|
||||||
|
};
|
||||||
|
for (auto* button : buttons) {
|
||||||
|
if (button->state) {
|
||||||
|
button->publish_state(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- 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
|
||||||
|
|
||||||
|
- id: !extend touch_on_press
|
||||||
|
then:
|
||||||
|
- script.execute:
|
||||||
|
id: touch_on_press_buttons
|
||||||
|
button: !lambda return button;
|
||||||
|
position: !lambda return position;
|
||||||
|
|
||||||
|
- id: touch_on_press_buttons
|
||||||
|
mode: restart
|
||||||
|
parameters:
|
||||||
|
button: uint8_t
|
||||||
|
position: uint8_t
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
id(button_press_start_time) = millis();
|
||||||
|
id(button_press_button) = button;
|
||||||
|
// Update counters
|
||||||
|
if (id(button_press_position) == position) {
|
||||||
|
id(click_counter)++;
|
||||||
|
} else {
|
||||||
|
id(click_counter) = 1;
|
||||||
|
id(button_press_position) = position;
|
||||||
|
}
|
||||||
|
// Update binary sensor
|
||||||
|
switch (button) {
|
||||||
|
case 1:
|
||||||
|
bs_button_1->publish_state(true);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
bs_button_2->publish_state(true);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
bs_button_3->publish_state(true);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
bs_button_4->publish_state(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- id: !extend touch_on_release
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
uint32_t current_time = millis();
|
||||||
|
buttons_release->execute();
|
||||||
|
if (id(button_press_start_time) > 0 and
|
||||||
|
id(button_press_start_time) < current_time) {
|
||||||
|
uint32_t press_duration = current_time - id(button_press_start_time);
|
||||||
|
// Handle overflow (optional, since it's unlikely to happen here)
|
||||||
|
ESP_LOGI("core_hw_buttons", "Button press duration: %" PRIu32 " ms", press_duration);
|
||||||
|
if (press_duration < ${BUTTON_CLICK_MIN_LENGTH}) {
|
||||||
|
ESP_LOGW("core_hw_buttons", "Ignoring button press (too short)");
|
||||||
|
} else if (press_duration >= ${BUTTON_CLICK_MIN_LENGTH} and
|
||||||
|
press_duration <= ${BUTTON_CLICK_MAX_LENGTH}) { // Short/normal click
|
||||||
|
button_click_event->execute(id(button_press_button), id(click_counter));
|
||||||
|
} else if (press_duration >= ${BUTTON_LONG_PRESS_DELAY} and press_duration <= ${BUTTON_PRESS_TIMEOUT}) {
|
||||||
|
button_action->execute(id(button_press_button), "long_press", 1);
|
||||||
|
} else if (press_duration > ${BUTTON_PRESS_TIMEOUT}) { // Timeout or invalid
|
||||||
|
ESP_LOGW("core_hw_buttons", "Button press cancelled or timed out after ${BUTTON_PRESS_TIMEOUT} ms");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ESP_LOGW("core_hw_buttons", "Press event timestamp not recorded yet");
|
||||||
|
}
|
||||||
|
id(button_press_start_time) = 0;
|
||||||
|
|
||||||
|
- id: !extend touch_swipe_left
|
||||||
|
then:
|
||||||
|
- script.execute: buttons_release
|
||||||
|
|
||||||
|
- id: !extend touch_swipe_right
|
||||||
|
then:
|
||||||
|
- script.execute: buttons_release
|
||||||
|
|
||||||
|
select:
|
||||||
|
- &button_select_action_base
|
||||||
|
id: sl_button_1_action
|
||||||
|
name: Button 1 action
|
||||||
|
platform: template
|
||||||
|
options:
|
||||||
|
- "${BUTTON_ACTION_NONE_TEXT}"
|
||||||
|
- "${BUTTON_1_ACTION_TEXT}"
|
||||||
|
- "${BUTTON_1_ACTION_FAILSAFE_TEXT}"
|
||||||
|
initial_option: "${BUTTON_1_ACTION_TEXT}"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true
|
||||||
|
internal: true
|
||||||
|
entity_category: config
|
||||||
|
disabled_by_default: false
|
||||||
|
icon: mdi:dip-switch
|
||||||
|
|
||||||
|
- id: sl_button_2_action
|
||||||
|
name: Button 2 action
|
||||||
|
platform: template
|
||||||
|
options:
|
||||||
|
- "${BUTTON_ACTION_NONE_TEXT}"
|
||||||
|
- "${BUTTON_2_ACTION_TEXT}"
|
||||||
|
- "${BUTTON_2_ACTION_FAILSAFE_TEXT}"
|
||||||
|
initial_option: "${BUTTON_2_ACTION_TEXT}"
|
||||||
|
<<: *button_select_action_base
|
||||||
|
|
||||||
|
- id: sl_button_3_action
|
||||||
|
name: Button 3 action
|
||||||
|
platform: template
|
||||||
|
options:
|
||||||
|
- "${BUTTON_ACTION_NONE_TEXT}"
|
||||||
|
- "${BUTTON_3_ACTION_TEXT}"
|
||||||
|
- "${BUTTON_3_ACTION_FAILSAFE_TEXT}"
|
||||||
|
initial_option: "${BUTTON_3_ACTION_TEXT}"
|
||||||
|
<<: *button_select_action_base
|
||||||
|
|
||||||
|
- id: sl_button_4_action
|
||||||
|
name: Button 4 action
|
||||||
|
platform: template
|
||||||
|
options:
|
||||||
|
- "${BUTTON_ACTION_NONE_TEXT}"
|
||||||
|
- "${BUTTON_4_ACTION_TEXT}"
|
||||||
|
- "${BUTTON_4_ACTION_FAILSAFE_TEXT}"
|
||||||
|
initial_option: "${BUTTON_4_ACTION_TEXT}"
|
||||||
|
<<: *button_select_action_base
|
||||||
|
...
|
||||||
620
ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml
Normal file
620
ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml
Normal file
@@ -0,0 +1,620 @@
|
|||||||
|
####################################################################################################
|
||||||
|
##### TX Ultimate Easy for ESPHome #####
|
||||||
|
##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy #####
|
||||||
|
####################################################################################################
|
||||||
|
##### Purpose: ESPHome Core - Hardware - LEDs #####
|
||||||
|
####################################################################################################
|
||||||
|
##### 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:
|
||||||
|
default_transition_length: 500ms
|
||||||
|
|
||||||
|
LIGHT_MODE_BOTH_TEXT: "Both"
|
||||||
|
LIGHT_MODE_DISABLED_TEXT: "Disabled"
|
||||||
|
LIGHT_MODE_LEFT_TEXT: "Left"
|
||||||
|
LIGHT_MODE_RIGHT_TEXT: "Right"
|
||||||
|
LIGHT_MODE_BOTTOM_TEXT: "Bottom"
|
||||||
|
LIGHT_MODE_TOP_TEXT: "Top"
|
||||||
|
|
||||||
|
LIGHT_TRANSITION_TURN_ON: '0' # Transition time in msec
|
||||||
|
LIGHT_TRANSITION_TURN_OFF: '0' # Transition time in msec
|
||||||
|
LIGHT_BRIGHTNESS_TURN_ON: '0' # Brightness (1 to 100%, 0 to not set it)
|
||||||
|
|
||||||
|
LIGHT_FULL_RESTORE_MODE: RESTORE_DEFAULT_OFF
|
||||||
|
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*>
|
||||||
|
restore_value: false
|
||||||
|
- id: gb_lights_2
|
||||||
|
type: std::vector<light::LightState*>
|
||||||
|
restore_value: false
|
||||||
|
|
||||||
|
light:
|
||||||
|
# These lights are controlling the LEDs on the device
|
||||||
|
- id: light_full
|
||||||
|
name: Light - All
|
||||||
|
internal: true
|
||||||
|
num_leds: 32
|
||||||
|
pin: GPIO13
|
||||||
|
restore_mode: ${LIGHT_FULL_RESTORE_MODE}
|
||||||
|
platform: neopixelbus
|
||||||
|
type: GRB
|
||||||
|
variant: WS2811
|
||||||
|
|
||||||
|
# Those lights are available based on the model selections
|
||||||
|
- &light_partition_with_effects
|
||||||
|
id: light_eu
|
||||||
|
name: Light
|
||||||
|
platform: partition
|
||||||
|
default_transition_length: ${default_transition_length}
|
||||||
|
internal: true
|
||||||
|
restore_mode: ${LIGHT_SIDES_RESTORE_MODE}
|
||||||
|
effects:
|
||||||
|
- addressable_rainbow:
|
||||||
|
name: "Rainbow"
|
||||||
|
- addressable_rainbow:
|
||||||
|
name: "Rainbow - Fast"
|
||||||
|
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:
|
||||||
|
- id: light_full
|
||||||
|
from: 0
|
||||||
|
to: 27
|
||||||
|
|
||||||
|
- id: light_us
|
||||||
|
name: Light
|
||||||
|
<<: *light_partition_with_effects
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 0
|
||||||
|
to: 31
|
||||||
|
|
||||||
|
- &light_partition_with_effects_disabled
|
||||||
|
id: light_eu_bottom
|
||||||
|
name: Light - Bottom
|
||||||
|
disabled_by_default: true
|
||||||
|
<<: *light_partition_with_effects
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 6
|
||||||
|
to: 12
|
||||||
|
reversed: true
|
||||||
|
- id: light_eu_left
|
||||||
|
name: Light - Left
|
||||||
|
<<: *light_partition_with_effects_disabled
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 13
|
||||||
|
to: 19
|
||||||
|
reversed: true
|
||||||
|
- id: light_eu_right
|
||||||
|
name: Light - Right
|
||||||
|
<<: *light_partition_with_effects_disabled
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 27
|
||||||
|
to: 27
|
||||||
|
reversed: false
|
||||||
|
- id: light_full
|
||||||
|
from: 0
|
||||||
|
to: 5
|
||||||
|
reversed: false
|
||||||
|
- id: light_eu_top
|
||||||
|
name: Light - Top
|
||||||
|
<<: *light_partition_with_effects_disabled
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 20
|
||||||
|
to: 26
|
||||||
|
reversed: false
|
||||||
|
- id: light_us_bottom
|
||||||
|
name: Light - Bottom
|
||||||
|
<<: *light_partition_with_effects_disabled
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 9
|
||||||
|
to: 14
|
||||||
|
reversed: true
|
||||||
|
- id: light_us_left
|
||||||
|
name: Light - Left
|
||||||
|
<<: *light_partition_with_effects_disabled
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 15
|
||||||
|
to: 24
|
||||||
|
reversed: true
|
||||||
|
- id: light_us_right
|
||||||
|
name: Light - Right
|
||||||
|
<<: *light_partition_with_effects_disabled
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 31
|
||||||
|
to: 31
|
||||||
|
reversed: false
|
||||||
|
- id: light_full
|
||||||
|
from: 0
|
||||||
|
to: 8
|
||||||
|
reversed: false
|
||||||
|
- id: light_us_top
|
||||||
|
name: Light - Top
|
||||||
|
<<: *light_partition_with_effects_disabled
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 25
|
||||||
|
to: 30
|
||||||
|
reversed: false
|
||||||
|
|
||||||
|
- &light_partition_individual_led
|
||||||
|
id: light_00
|
||||||
|
name: Light - LED 00
|
||||||
|
platform: partition
|
||||||
|
disabled_by_default: true
|
||||||
|
default_transition_length: ${default_transition_length}
|
||||||
|
restore_mode: ${LIGHT_INDIVIDUAL_RESTORE_MODE}
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 0
|
||||||
|
to: 0
|
||||||
|
- id: light_01
|
||||||
|
name: Light - LED 01
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 1
|
||||||
|
to: 1
|
||||||
|
- id: light_02
|
||||||
|
name: Light - LED 02
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 2
|
||||||
|
to: 2
|
||||||
|
- id: light_03
|
||||||
|
name: Light - LED 03
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 3
|
||||||
|
to: 3
|
||||||
|
- id: light_04
|
||||||
|
name: Light - LED 04
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 4
|
||||||
|
to: 4
|
||||||
|
- id: light_05
|
||||||
|
name: Light - LED 05
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 5
|
||||||
|
to: 5
|
||||||
|
- id: light_06
|
||||||
|
name: Light - LED 06
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 6
|
||||||
|
to: 6
|
||||||
|
- id: light_07
|
||||||
|
name: Light - LED 07
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 7
|
||||||
|
to: 7
|
||||||
|
- id: light_08
|
||||||
|
name: Light - LED 08
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 8
|
||||||
|
to: 8
|
||||||
|
- id: light_09
|
||||||
|
name: Light - LED 09
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 9
|
||||||
|
to: 9
|
||||||
|
- id: light_10
|
||||||
|
name: Light - LED 10
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 10
|
||||||
|
to: 10
|
||||||
|
- id: light_11
|
||||||
|
name: Light - LED 11
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 11
|
||||||
|
to: 11
|
||||||
|
- id: light_12
|
||||||
|
name: Light - LED 12
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 12
|
||||||
|
to: 12
|
||||||
|
- id: light_13
|
||||||
|
name: Light - LED 13
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 13
|
||||||
|
to: 13
|
||||||
|
- id: light_14
|
||||||
|
name: Light - LED 14
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 14
|
||||||
|
to: 14
|
||||||
|
- id: light_15
|
||||||
|
name: Light - LED 15
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 15
|
||||||
|
to: 15
|
||||||
|
- id: light_16
|
||||||
|
name: Light - LED 16
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 16
|
||||||
|
to: 16
|
||||||
|
- id: light_17
|
||||||
|
name: Light - LED 17
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 17
|
||||||
|
to: 17
|
||||||
|
- id: light_18
|
||||||
|
name: Light - LED 18
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 18
|
||||||
|
to: 18
|
||||||
|
- id: light_19
|
||||||
|
name: Light - LED 19
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 19
|
||||||
|
to: 19
|
||||||
|
- id: light_20
|
||||||
|
name: Light - LED 20
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 20
|
||||||
|
to: 20
|
||||||
|
- id: light_21
|
||||||
|
name: Light - LED 21
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 21
|
||||||
|
to: 21
|
||||||
|
- id: light_22
|
||||||
|
name: Light - LED 22
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 22
|
||||||
|
to: 22
|
||||||
|
- id: light_23
|
||||||
|
name: Light - LED 23
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 23
|
||||||
|
to: 23
|
||||||
|
- id: light_24
|
||||||
|
name: Light - LED 24
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 24
|
||||||
|
to: 24
|
||||||
|
- id: light_25
|
||||||
|
name: Light - LED 25
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 25
|
||||||
|
to: 25
|
||||||
|
- id: light_26
|
||||||
|
name: Light - LED 26
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 26
|
||||||
|
to: 26
|
||||||
|
- id: light_27
|
||||||
|
name: Light - LED 27
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 27
|
||||||
|
to: 27
|
||||||
|
- id: light_28 # US Model only
|
||||||
|
name: Light - LED 28
|
||||||
|
internal: true
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 28
|
||||||
|
to: 28
|
||||||
|
- id: light_29 # US Model only
|
||||||
|
name: Light - LED 29
|
||||||
|
internal: true
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 29
|
||||||
|
to: 29
|
||||||
|
- id: light_30 # US Model only
|
||||||
|
name: Light - LED 30
|
||||||
|
internal: true
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 30
|
||||||
|
to: 30
|
||||||
|
- id: light_31 # US Model only
|
||||||
|
name: Light - LED 31
|
||||||
|
internal: true
|
||||||
|
<<: *light_partition_individual_led
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 31
|
||||||
|
to: 31
|
||||||
|
|
||||||
|
script:
|
||||||
|
- id: !extend boot_initialize
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
light_28->set_internal(!id(is_us_model));
|
||||||
|
light_29->set_internal(!id(is_us_model));
|
||||||
|
light_30->set_internal(!id(is_us_model));
|
||||||
|
light_31->set_internal(!id(is_us_model));
|
||||||
|
light_eu->set_internal(id(is_us_model));
|
||||||
|
light_eu_bottom->set_internal(id(is_us_model));
|
||||||
|
light_eu_left->set_internal(id(is_us_model));
|
||||||
|
light_eu_right->set_internal(id(is_us_model));
|
||||||
|
light_eu_top->set_internal(id(is_us_model));
|
||||||
|
light_us->set_internal(!id(is_us_model));
|
||||||
|
light_us_bottom->set_internal(!id(is_us_model));
|
||||||
|
light_us_left->set_internal(!id(is_us_model));
|
||||||
|
light_us_right->set_internal(!id(is_us_model));
|
||||||
|
light_us_top->set_internal(!id(is_us_model));
|
||||||
|
|
||||||
|
- 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
|
||||||
|
parameters:
|
||||||
|
light_group: uint8_t
|
||||||
|
light_index: uint8_t
|
||||||
|
state: bool
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
static const uint32_t LIGHT_TRANSITION_TURN_ON = ${LIGHT_TRANSITION_TURN_ON};
|
||||||
|
static const uint32_t LIGHT_TRANSITION_TURN_OFF = ${LIGHT_TRANSITION_TURN_OFF};
|
||||||
|
static const uint8_t LIGHT_BRIGHTNESS_TURN_ON = ${LIGHT_BRIGHTNESS_TURN_ON};
|
||||||
|
|
||||||
|
const std::string light_mode_group_1 = id(is_us_model)
|
||||||
|
? "${LIGHT_MODE_LEFT_TEXT}"
|
||||||
|
: "${LIGHT_MODE_BOTTOM_TEXT}";
|
||||||
|
const std::string light_mode_group_2 = id(is_us_model)
|
||||||
|
? "${LIGHT_MODE_RIGHT_TEXT}"
|
||||||
|
: "${LIGHT_MODE_TOP_TEXT}";
|
||||||
|
|
||||||
|
switch (light_group) {
|
||||||
|
case 1:
|
||||||
|
if (light_index >= id(gb_lights_1).size()) {
|
||||||
|
ESP_LOGE("core_hw_leds", "Invalid set with %s light for Relay %" PRIu8,
|
||||||
|
light_mode_group_1.c_str(), light_index+1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (state and !id(gb_lights_1)[light_index]->current_values.is_on()) {
|
||||||
|
ESP_LOGI("core_hw_leds", "Turn-on %s light for Relay %" PRIu8,
|
||||||
|
light_mode_group_1.c_str(), light_index+1);
|
||||||
|
auto call = id(gb_lights_1)[light_index]->turn_on();
|
||||||
|
if (LIGHT_TRANSITION_TURN_ON > 0)
|
||||||
|
call.set_transition_length(LIGHT_TRANSITION_TURN_ON); // in ms
|
||||||
|
if (LIGHT_BRIGHTNESS_TURN_ON > 0 and LIGHT_BRIGHTNESS_TURN_ON <= 100)
|
||||||
|
call.set_brightness(LIGHT_BRIGHTNESS_TURN_ON / 100.0f);
|
||||||
|
call.perform();
|
||||||
|
} else if (!state and id(gb_lights_1)[light_index]->current_values.is_on()) {
|
||||||
|
ESP_LOGI("core_hw_leds", "Turn-off %s light for Relay %" PRIu8,
|
||||||
|
light_mode_group_1.c_str(), light_index+1);
|
||||||
|
auto call = id(gb_lights_1)[light_index]->turn_off();
|
||||||
|
if (LIGHT_TRANSITION_TURN_OFF > 0)
|
||||||
|
call.set_transition_length(LIGHT_TRANSITION_TURN_OFF); // in ms
|
||||||
|
call.perform();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (light_index >= id(gb_lights_2).size()) {
|
||||||
|
ESP_LOGE("core_hw_leds", "Invalid set with %s light for Relay %" PRIu8,
|
||||||
|
light_mode_group_2.c_str(), light_index+1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (state and !id(gb_lights_2)[light_index]->current_values.is_on()) {
|
||||||
|
ESP_LOGI("core_hw_leds", "Turn-on %s light for Relay %" PRIu8,
|
||||||
|
light_mode_group_2.c_str(), light_index+1);
|
||||||
|
auto call = id(gb_lights_2)[light_index]->turn_on();
|
||||||
|
if (LIGHT_TRANSITION_TURN_ON > 0)
|
||||||
|
call.set_transition_length(LIGHT_TRANSITION_TURN_ON); // in ms
|
||||||
|
if (LIGHT_BRIGHTNESS_TURN_ON > 0 and LIGHT_BRIGHTNESS_TURN_ON <= 100)
|
||||||
|
call.set_brightness(LIGHT_BRIGHTNESS_TURN_ON / 100.0f);
|
||||||
|
call.perform();
|
||||||
|
} else if (!state and id(gb_lights_2)[light_index]->current_values.is_on()) {
|
||||||
|
ESP_LOGI("core_hw_leds", "Turn-off %s light for Relay %" PRIu8,
|
||||||
|
light_mode_group_2.c_str(), light_index+1);
|
||||||
|
auto call = id(gb_lights_2)[light_index]->turn_off();
|
||||||
|
if (LIGHT_TRANSITION_TURN_OFF > 0)
|
||||||
|
call.set_transition_length(LIGHT_TRANSITION_TURN_OFF); // in ms
|
||||||
|
call.perform();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
select:
|
||||||
|
# EU relay light mode template
|
||||||
|
- &relay_light_mode_eu
|
||||||
|
id: sl_relay_1_light_mode_eu
|
||||||
|
name: Relay 1 light mode
|
||||||
|
platform: template
|
||||||
|
options:
|
||||||
|
- "${LIGHT_MODE_DISABLED_TEXT}"
|
||||||
|
- "${LIGHT_MODE_BOTTOM_TEXT}"
|
||||||
|
- "${LIGHT_MODE_TOP_TEXT}"
|
||||||
|
- "${LIGHT_MODE_BOTH_TEXT}"
|
||||||
|
initial_option: "${LIGHT_MODE_BOTTOM_TEXT}"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true
|
||||||
|
internal: true
|
||||||
|
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
|
||||||
|
|
||||||
|
# US relay light mode template
|
||||||
|
- &relay_light_mode_us
|
||||||
|
id: sl_relay_1_light_mode_us
|
||||||
|
name: Relay 1 light mode
|
||||||
|
platform: template
|
||||||
|
options:
|
||||||
|
- "${LIGHT_MODE_DISABLED_TEXT}"
|
||||||
|
- "${LIGHT_MODE_LEFT_TEXT}"
|
||||||
|
- "${LIGHT_MODE_RIGHT_TEXT}"
|
||||||
|
- "${LIGHT_MODE_BOTH_TEXT}"
|
||||||
|
initial_option: "${LIGHT_MODE_RIGHT_TEXT}"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true
|
||||||
|
internal: true
|
||||||
|
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
|
||||||
|
...
|
||||||
29
ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_media_player.yaml
Normal file
29
ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_media_player.yaml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
####################################################################################################
|
||||||
|
##### 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
|
||||||
|
...
|
||||||
464
ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_touch.yaml
Normal file
464
ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_touch.yaml
Normal file
@@ -0,0 +1,464 @@
|
|||||||
|
####################################################################################################
|
||||||
|
##### TX Ultimate Easy for ESPHome #####
|
||||||
|
##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy #####
|
||||||
|
####################################################################################################
|
||||||
|
##### Purpose: ESPHome Core - Hardware - Touch panel #####
|
||||||
|
####################################################################################################
|
||||||
|
##### 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:
|
||||||
|
TOUCH_POSITION_MAX_VALUE: '10' # Maximum touch position value returned by the touch pad via uart
|
||||||
|
|
||||||
|
binary_sensor:
|
||||||
|
- &bs_button_event_template
|
||||||
|
id: bs_button_event_template
|
||||||
|
icon: mdi:gesture-tap-box
|
||||||
|
internal: true
|
||||||
|
disabled_by_default: true
|
||||||
|
platform: template
|
||||||
|
|
||||||
|
- id: bs_button_1_click_event
|
||||||
|
name: Button 1 - Click event
|
||||||
|
internal: false
|
||||||
|
<<: *bs_button_event_template
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- delay: !lambda return nr_touch_duration->state;
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_button_1_click_event
|
||||||
|
state: OFF # yamllint disable-line rule:truthy
|
||||||
|
- id: bs_button_2_click_event
|
||||||
|
name: Button 2 - Click event
|
||||||
|
internal: false
|
||||||
|
<<: *bs_button_event_template
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- delay: !lambda return nr_touch_duration->state;
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_button_2_click_event
|
||||||
|
state: OFF # yamllint disable-line rule:truthy
|
||||||
|
- id: bs_button_3_click_event
|
||||||
|
name: Button 3 - Click event
|
||||||
|
internal: false
|
||||||
|
<<: *bs_button_event_template
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- delay: !lambda return nr_touch_duration->state;
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_button_3_click_event
|
||||||
|
state: OFF # yamllint disable-line rule:truthy
|
||||||
|
- id: bs_button_4_click_event
|
||||||
|
name: Button 4 - Click event
|
||||||
|
internal: false
|
||||||
|
<<: *bs_button_event_template
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- delay: !lambda return nr_touch_duration->state;
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_button_4_click_event
|
||||||
|
state: OFF # yamllint disable-line rule:truthy
|
||||||
|
|
||||||
|
- id: bs_button_1_double_click_event
|
||||||
|
name: Button 1 - Double-click event
|
||||||
|
internal: false
|
||||||
|
<<: *bs_button_event_template
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- delay: !lambda return nr_touch_duration->state;
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_button_1_double_click_event
|
||||||
|
state: OFF # yamllint disable-line rule:truthy
|
||||||
|
- id: bs_button_2_double_click_event
|
||||||
|
name: Button 2 - Double-click event
|
||||||
|
internal: false
|
||||||
|
<<: *bs_button_event_template
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- delay: !lambda return nr_touch_duration->state;
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_button_2_double_click_event
|
||||||
|
state: OFF # yamllint disable-line rule:truthy
|
||||||
|
- id: bs_button_3_double_click_event
|
||||||
|
name: Button 3 - Double-click event
|
||||||
|
internal: false
|
||||||
|
<<: *bs_button_event_template
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- delay: !lambda return nr_touch_duration->state;
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_button_3_double_click_event
|
||||||
|
state: OFF # yamllint disable-line rule:truthy
|
||||||
|
- id: bs_button_4_double_click_event
|
||||||
|
name: Button 4 - Double-click event
|
||||||
|
internal: false
|
||||||
|
<<: *bs_button_event_template
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- delay: !lambda return nr_touch_duration->state;
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_button_4_double_click_event
|
||||||
|
state: OFF # yamllint disable-line rule:truthy
|
||||||
|
|
||||||
|
- id: bs_button_1_long_press_event
|
||||||
|
name: Button 1 - Long-press event
|
||||||
|
internal: false
|
||||||
|
<<: *bs_button_event_template
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- delay: !lambda return nr_touch_duration->state;
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_button_1_long_press_event
|
||||||
|
state: OFF # yamllint disable-line rule:truthy
|
||||||
|
- id: bs_button_2_long_press_event
|
||||||
|
name: Button 2 - Long-press event
|
||||||
|
internal: false
|
||||||
|
<<: *bs_button_event_template
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- delay: !lambda return nr_touch_duration->state;
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_button_2_long_press_event
|
||||||
|
state: OFF # yamllint disable-line rule:truthy
|
||||||
|
- id: bs_button_3_long_press_event
|
||||||
|
name: Button 3 - Long-press event
|
||||||
|
internal: false
|
||||||
|
<<: *bs_button_event_template
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- delay: !lambda return nr_touch_duration->state;
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_button_3_long_press_event
|
||||||
|
state: OFF # yamllint disable-line rule:truthy
|
||||||
|
- id: bs_button_4_long_press_event
|
||||||
|
name: Button 4 - Long-press event
|
||||||
|
internal: false
|
||||||
|
<<: *bs_button_event_template
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- delay: !lambda return nr_touch_duration->state;
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_button_4_long_press_event
|
||||||
|
state: OFF # yamllint disable-line rule:truthy
|
||||||
|
|
||||||
|
- id: bs_multi_touch
|
||||||
|
name: Multi-touch event
|
||||||
|
icon: mdi:gesture-two-tap
|
||||||
|
internal: false
|
||||||
|
<<: *bs_button_event_template
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- delay: !lambda return nr_touch_duration->state;
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_multi_touch
|
||||||
|
state: OFF # yamllint disable-line rule:truthy
|
||||||
|
|
||||||
|
- id: bs_swipe_left
|
||||||
|
name: Swipe left event
|
||||||
|
icon: mdi:gesture-swipe-left
|
||||||
|
<<: *bs_button_event_template
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- delay: !lambda return nr_touch_duration->state;
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_swipe_left
|
||||||
|
state: OFF # yamllint disable-line rule:truthy
|
||||||
|
- id: bs_swipe_right
|
||||||
|
name: Swipe right event
|
||||||
|
icon: mdi:gesture-swipe-right
|
||||||
|
<<: *bs_button_event_template
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- delay: !lambda return nr_touch_duration->state;
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_swipe_right
|
||||||
|
state: OFF # yamllint disable-line rule:truthy
|
||||||
|
- id: bs_swipe_up
|
||||||
|
name: Swipe up event
|
||||||
|
icon: mdi:gesture-swipe-up
|
||||||
|
<<: *bs_button_event_template
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- delay: !lambda return nr_touch_duration->state;
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_swipe_up
|
||||||
|
state: OFF # yamllint disable-line rule:truthy
|
||||||
|
- id: bs_swipe_down
|
||||||
|
name: Swipe down event
|
||||||
|
icon: mdi:gesture-swipe-down
|
||||||
|
<<: *bs_button_event_template
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- delay: !lambda return nr_touch_duration->state;
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
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
|
||||||
|
url: https://github.com/edwardtfn/TX-Ultimate-Easy
|
||||||
|
ref: v${version}
|
||||||
|
refresh: 1h
|
||||||
|
components:
|
||||||
|
- tx_ultimate_easy
|
||||||
|
|
||||||
|
number:
|
||||||
|
- id: nr_touch_duration
|
||||||
|
name: Touch event duration
|
||||||
|
icon: mdi:timer-cog-outline
|
||||||
|
unit_of_measurement: ms
|
||||||
|
# mode: box
|
||||||
|
internal: false
|
||||||
|
entity_category: config
|
||||||
|
platform: template
|
||||||
|
min_value: 10
|
||||||
|
max_value: 1500
|
||||||
|
step: 1
|
||||||
|
initial_value: 250
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true
|
||||||
|
|
||||||
|
script:
|
||||||
|
- id: !extend boot_initialize
|
||||||
|
then:
|
||||||
|
- script.execute: boot_initialize_touch
|
||||||
|
|
||||||
|
- id: boot_initialize_touch
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
- script.execute: boot_initialize_touch_format
|
||||||
|
- script.execute: boot_initialize_touch_gang
|
||||||
|
|
||||||
|
- id: boot_initialize_touch_format
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
- wait_until:
|
||||||
|
condition:
|
||||||
|
- lambda: return sl_tx_model_format->active_index().has_value();
|
||||||
|
- lambda: |-
|
||||||
|
const bool is_model_us = sl_tx_model_format->active_index().has_value() and
|
||||||
|
sl_tx_model_format->active_index().value() == 1;
|
||||||
|
bs_multi_touch->publish_state(false);
|
||||||
|
bs_swipe_down->publish_state(false);
|
||||||
|
bs_swipe_down->set_internal(!is_model_us);
|
||||||
|
bs_swipe_left->publish_state(false);
|
||||||
|
bs_swipe_left->set_internal(is_model_us);
|
||||||
|
bs_swipe_right->publish_state(false);
|
||||||
|
bs_swipe_right->set_internal(is_model_us);
|
||||||
|
bs_swipe_up->publish_state(false);
|
||||||
|
bs_swipe_up->set_internal(!is_model_us);
|
||||||
|
|
||||||
|
- id: boot_initialize_touch_gang
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
tx_ultimate->set_gang_count(id(gang_count));
|
||||||
|
bs_button_1_click_event->publish_state(false);
|
||||||
|
bs_button_2_click_event->publish_state(false);
|
||||||
|
bs_button_3_click_event->publish_state(false);
|
||||||
|
bs_button_4_click_event->publish_state(false);
|
||||||
|
bs_button_1_double_click_event->publish_state(false);
|
||||||
|
bs_button_2_double_click_event->publish_state(false);
|
||||||
|
bs_button_3_double_click_event->publish_state(false);
|
||||||
|
bs_button_4_double_click_event->publish_state(false);
|
||||||
|
bs_button_1_long_press_event->publish_state(false);
|
||||||
|
bs_button_2_long_press_event->publish_state(false);
|
||||||
|
bs_button_3_long_press_event->publish_state(false);
|
||||||
|
bs_button_4_long_press_event->publish_state(false);
|
||||||
|
bs_button_1_click_event->set_internal(id(gang_count) < 1);
|
||||||
|
bs_button_2_click_event->set_internal(id(gang_count) < 2);
|
||||||
|
bs_button_3_click_event->set_internal(id(gang_count) < 3);
|
||||||
|
bs_button_4_click_event->set_internal(id(gang_count) < 4);
|
||||||
|
bs_button_1_double_click_event->set_internal(id(gang_count) < 1);
|
||||||
|
bs_button_2_double_click_event->set_internal(id(gang_count) < 2);
|
||||||
|
bs_button_3_double_click_event->set_internal(id(gang_count) < 3);
|
||||||
|
bs_button_4_double_click_event->set_internal(id(gang_count) < 4);
|
||||||
|
bs_button_1_long_press_event->set_internal(id(gang_count) < 1);
|
||||||
|
bs_button_2_long_press_event->set_internal(id(gang_count) < 2);
|
||||||
|
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:
|
||||||
|
# Extended by:
|
||||||
|
# - HW Buttons
|
||||||
|
# - HW Vibration
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_multi_touch
|
||||||
|
state: ON # yamllint disable-line rule:truthy
|
||||||
|
|
||||||
|
- id: touch_on_press
|
||||||
|
mode: restart
|
||||||
|
parameters:
|
||||||
|
button: uint8_t
|
||||||
|
position: uint8_t
|
||||||
|
then:
|
||||||
|
# Extended by:
|
||||||
|
# - HW Buttons
|
||||||
|
# - HW Vibration
|
||||||
|
|
||||||
|
- id: touch_on_release
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
# Extended by:
|
||||||
|
# - HW Buttons
|
||||||
|
# - HW Vibration
|
||||||
|
|
||||||
|
- id: touch_swipe_left
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
# Extended by:
|
||||||
|
# - HW Buttons
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_swipe_left
|
||||||
|
state: ON # yamllint disable-line rule:truthy
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_swipe_down
|
||||||
|
state: ON # yamllint disable-line rule:truthy
|
||||||
|
|
||||||
|
- id: touch_swipe_right
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
# Extended by:
|
||||||
|
# - HW Buttons
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_swipe_right
|
||||||
|
state: ON # yamllint disable-line rule:truthy
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_swipe_up
|
||||||
|
state: ON # yamllint disable-line rule:truthy
|
||||||
|
|
||||||
|
switch:
|
||||||
|
- id: sw_touch_panel_power
|
||||||
|
name: Touch panel - Power
|
||||||
|
platform: gpio
|
||||||
|
pin:
|
||||||
|
number: GPIO5
|
||||||
|
inverted: true
|
||||||
|
restore_mode: ALWAYS_ON
|
||||||
|
internal: false
|
||||||
|
entity_category: config
|
||||||
|
|
||||||
|
tx_ultimate_easy:
|
||||||
|
id: tx_ultimate
|
||||||
|
uart: uart_touch
|
||||||
|
|
||||||
|
on_long_touch_release:
|
||||||
|
- lambda: |-
|
||||||
|
const uint8_t touch_position = static_cast<uint8_t>(touch.x);
|
||||||
|
if (touch_position > ${TOUCH_POSITION_MAX_VALUE}) { // Check for valid range
|
||||||
|
ESP_LOGE("core_hw_touch", "Invalid long-touch position: %" PRIu8, touch_position);
|
||||||
|
} else {
|
||||||
|
ESP_LOGI("core_hw_touch", "Long-touch released at position %" PRIu8, touch_position);
|
||||||
|
}
|
||||||
|
|
||||||
|
on_multi_touch_release:
|
||||||
|
- homeassistant.event:
|
||||||
|
event: esphome.tx_ultimate_easy
|
||||||
|
data:
|
||||||
|
device_name: !lambda return tx_device_name->state.c_str();
|
||||||
|
firmware: ${version}
|
||||||
|
domain: touch
|
||||||
|
type: multi_touch
|
||||||
|
action: release
|
||||||
|
position: !lambda return touch.x;
|
||||||
|
- lambda: ESP_LOGI("core_hw_touch", "Multi-touch released");
|
||||||
|
- script.execute: touch_on_multi_touch_release
|
||||||
|
|
||||||
|
on_press:
|
||||||
|
- lambda: |-
|
||||||
|
const uint8_t position = static_cast<uint8_t>(touch.x);
|
||||||
|
if (position > ${TOUCH_POSITION_MAX_VALUE}) { // Check for valid range
|
||||||
|
ESP_LOGE("core_hw_touch", "Invalid touch position: %" PRIu8, position);
|
||||||
|
} else {
|
||||||
|
ESP_LOGI("core_hw_touch", "Pressed at position %" PRIu8, position);
|
||||||
|
touch_on_press->execute(static_cast<uint8_t>(touch.button), position);
|
||||||
|
}
|
||||||
|
|
||||||
|
on_release:
|
||||||
|
- lambda: ESP_LOGI("core_hw_touch", "Released");
|
||||||
|
- script.execute: touch_on_release
|
||||||
|
|
||||||
|
on_swipe_left:
|
||||||
|
- homeassistant.event:
|
||||||
|
event: esphome.tx_ultimate_easy
|
||||||
|
data:
|
||||||
|
device_name: !lambda return tx_device_name->state.c_str();
|
||||||
|
firmware: ${version}
|
||||||
|
domain: touch
|
||||||
|
type: swipe
|
||||||
|
action: !lambda |-
|
||||||
|
return sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}" ? "left" : "down";
|
||||||
|
swipe-direction: !lambda |-
|
||||||
|
return sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}" ? "left" : "down";
|
||||||
|
position: !lambda return touch.x;
|
||||||
|
- lambda: |-
|
||||||
|
ESP_LOGI("core_hw_touch", "Swipe %s", sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}"
|
||||||
|
? "left"
|
||||||
|
: "down");
|
||||||
|
- script.execute: touch_swipe_left
|
||||||
|
|
||||||
|
on_swipe_right:
|
||||||
|
- homeassistant.event:
|
||||||
|
event: esphome.tx_ultimate_easy
|
||||||
|
data:
|
||||||
|
device_name: !lambda return tx_device_name->state.c_str();
|
||||||
|
firmware: ${version}
|
||||||
|
domain: touch
|
||||||
|
type: swipe
|
||||||
|
action: !lambda |-
|
||||||
|
return sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}" ? "right" : "up";
|
||||||
|
swipe-direction: !lambda |-
|
||||||
|
return sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}" ? "right" : "up";
|
||||||
|
position: !lambda return touch.x;
|
||||||
|
- lambda: |-
|
||||||
|
ESP_LOGI("core_hw_touch", "Swipe %s", sl_tx_model_format->state == "${TX_MODEL_FORMAT_EU_TEXT}"
|
||||||
|
? "right"
|
||||||
|
: "up");
|
||||||
|
- script.execute: touch_swipe_right
|
||||||
|
|
||||||
|
on_touch_event:
|
||||||
|
- lambda: |-
|
||||||
|
ESP_LOGD("core_hw_touch", "Touch event:");
|
||||||
|
ESP_LOGD("core_hw_touch", " State: %i (%s)", touch.state, touch.state_str.c_str());
|
||||||
|
ESP_LOGD("core_hw_touch", " Position: %i", touch.x);
|
||||||
|
|
||||||
|
uart:
|
||||||
|
- id: uart_touch
|
||||||
|
tx_pin: GPIO19
|
||||||
|
rx_pin: GPIO22
|
||||||
|
baud_rate: 115200
|
||||||
|
...
|
||||||
20
ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml
Normal file
20
ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
####################################################################################################
|
||||||
|
##### 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
|
||||||
|
standard_hw_relays: !include TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml
|
||||||
|
standard_hw_vibration: !include TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml
|
||||||
|
standard_media_player: !include TX-Ultimate-Easy-ESPHome_standard_media_player.yaml
|
||||||
|
# yamllint enable rule:colons
|
||||||
|
...
|
||||||
36
ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_audio.yaml
Normal file
36
ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_audio.yaml
Normal 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");
|
||||||
|
...
|
||||||
970
ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml
Normal file
970
ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml
Normal file
@@ -0,0 +1,970 @@
|
|||||||
|
####################################################################################################
|
||||||
|
##### TX Ultimate Easy for ESPHome #####
|
||||||
|
##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy #####
|
||||||
|
####################################################################################################
|
||||||
|
##### Purpose: ESPHome - Standard - Hardware - Relays #####
|
||||||
|
####################################################################################################
|
||||||
|
##### 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:
|
||||||
|
RELAY_MODE_TEXT_SWITCH: "Switch"
|
||||||
|
RELAY_MODE_TEXT_LIGHT: "Light"
|
||||||
|
RELAY_MODE_TEXT_NOT_USED: "Not in use"
|
||||||
|
|
||||||
|
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
|
||||||
|
initial_value: 'false'
|
||||||
|
- id: boot_initialization_relays_relay_leds
|
||||||
|
type: bool
|
||||||
|
restore_value: false
|
||||||
|
initial_value: 'false'
|
||||||
|
- id: boot_initialization_relays_relay_modes
|
||||||
|
type: bool
|
||||||
|
restore_value: false
|
||||||
|
initial_value: 'false'
|
||||||
|
|
||||||
|
light:
|
||||||
|
# These lights are used for the physical relays to be shown as lights
|
||||||
|
- id: light_output_1
|
||||||
|
name: Light output 1
|
||||||
|
output: output_relay_1
|
||||||
|
platform: binary
|
||||||
|
internal: true
|
||||||
|
restore_mode: ${RELAY_RESTORE_MODE}
|
||||||
|
on_turn_on:
|
||||||
|
then:
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
- switch.is_off: sw_relay_1
|
||||||
|
then:
|
||||||
|
- switch.turn_on: sw_relay_1
|
||||||
|
on_turn_off:
|
||||||
|
then:
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
- switch.is_on: sw_relay_1
|
||||||
|
then:
|
||||||
|
- switch.turn_off: sw_relay_1
|
||||||
|
- id: light_output_2
|
||||||
|
name: Light output 2
|
||||||
|
output: output_relay_2
|
||||||
|
platform: binary
|
||||||
|
internal: true
|
||||||
|
on_turn_on:
|
||||||
|
then:
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
- switch.is_off: sw_relay_2
|
||||||
|
then:
|
||||||
|
- switch.turn_on: sw_relay_2
|
||||||
|
on_turn_off:
|
||||||
|
then:
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
- switch.is_on: sw_relay_2
|
||||||
|
then:
|
||||||
|
- switch.turn_off: sw_relay_2
|
||||||
|
- id: light_output_3
|
||||||
|
name: Light output 3
|
||||||
|
output: output_relay_3
|
||||||
|
platform: binary
|
||||||
|
internal: true
|
||||||
|
on_turn_on:
|
||||||
|
then:
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
- switch.is_off: sw_relay_3
|
||||||
|
then:
|
||||||
|
- switch.turn_on: sw_relay_3
|
||||||
|
on_turn_off:
|
||||||
|
then:
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
- switch.is_on: sw_relay_3
|
||||||
|
then:
|
||||||
|
- switch.turn_off: sw_relay_3
|
||||||
|
- id: light_output_4
|
||||||
|
name: Light output 4
|
||||||
|
output: output_relay_4
|
||||||
|
platform: binary
|
||||||
|
internal: true
|
||||||
|
on_turn_on:
|
||||||
|
then:
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
- switch.is_off: sw_relay_4
|
||||||
|
then:
|
||||||
|
- switch.turn_on: sw_relay_4
|
||||||
|
on_turn_off:
|
||||||
|
then:
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
- switch.is_on: sw_relay_4
|
||||||
|
then:
|
||||||
|
- switch.turn_off: sw_relay_4
|
||||||
|
|
||||||
|
# These lights are used to indicate relay's statuses
|
||||||
|
- &light_partition_relays
|
||||||
|
id: light_eu_rl_1_1_bottom
|
||||||
|
name: Light - Relay 1 of 1 (bottom)
|
||||||
|
platform: partition
|
||||||
|
internal: true
|
||||||
|
disabled_by_default: false
|
||||||
|
default_transition_length: ${default_transition_length}
|
||||||
|
restore_mode: ${LIGHT_RELAYS_RESTORE_MODE}
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 9
|
||||||
|
to: 9
|
||||||
|
- id: light_eu_rl_1_1_top
|
||||||
|
name: Light - Relay 1 of 1 (top)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 23
|
||||||
|
to: 23
|
||||||
|
- id: light_eu_rl_1_2_bottom
|
||||||
|
name: Light - Relay 1 of 2 (bottom)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 11
|
||||||
|
to: 11
|
||||||
|
- id: light_eu_rl_1_2_top
|
||||||
|
name: Light - Relay 1 of 2 (top)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 21
|
||||||
|
to: 21
|
||||||
|
- id: light_eu_rl_2_2_bottom
|
||||||
|
name: Light - Relay 2 of 2 (bottom)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 7
|
||||||
|
to: 7
|
||||||
|
- id: light_eu_rl_2_2_top
|
||||||
|
name: Light - Relay 2 of 2 (top)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 25
|
||||||
|
to: 25
|
||||||
|
- id: light_eu_rl_1_3_bottom
|
||||||
|
name: Light - Relay 1 of 3 (bottom)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 12
|
||||||
|
to: 12
|
||||||
|
- id: light_eu_rl_1_3_top
|
||||||
|
name: Light - Relay 1 of 3 (top)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 20
|
||||||
|
to: 20
|
||||||
|
- id: light_eu_rl_2_3_bottom
|
||||||
|
name: Light - Relay 2 of 3 (bottom)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 9
|
||||||
|
to: 9
|
||||||
|
- id: light_eu_rl_2_3_top
|
||||||
|
name: Light - Relay 2 of 3 (top)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 23
|
||||||
|
to: 23
|
||||||
|
- id: light_eu_rl_3_3_bottom
|
||||||
|
name: Light - Relay 3 of 3 (bottom)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 6
|
||||||
|
to: 6
|
||||||
|
- id: light_eu_rl_3_3_top
|
||||||
|
name: Light - Relay 3 of 3 (top)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 26
|
||||||
|
to: 26
|
||||||
|
- id: light_eu_rl_1_4_bottom
|
||||||
|
name: Light - Relay 1 of 4 (bottom)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 12
|
||||||
|
to: 12
|
||||||
|
- id: light_eu_rl_1_4_top
|
||||||
|
name: Light - Relay 1 of 4 (top)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 20
|
||||||
|
to: 20
|
||||||
|
- id: light_eu_rl_2_4_bottom
|
||||||
|
name: Light - Relay 2 of 4 (bottom)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 10
|
||||||
|
to: 10
|
||||||
|
- id: light_eu_rl_2_4_top
|
||||||
|
name: Light - Relay 2 of 4 (top)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 22
|
||||||
|
to: 22
|
||||||
|
- id: light_eu_rl_3_4_bottom
|
||||||
|
name: Light - Relay 3 of 4 (bottom)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 8
|
||||||
|
to: 8
|
||||||
|
- id: light_eu_rl_3_4_top
|
||||||
|
name: Light - Relay 3 of 4 (top)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 24
|
||||||
|
to: 24
|
||||||
|
- id: light_eu_rl_4_4_bottom
|
||||||
|
name: Light - Relay 4 of 4 (bottom)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 6
|
||||||
|
to: 6
|
||||||
|
- id: light_eu_rl_4_4_top
|
||||||
|
name: Light - Relay 4 of 4 (top)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 26
|
||||||
|
to: 26
|
||||||
|
- id: light_us_rl_1_1_left
|
||||||
|
name: Light - Relay 1 of 1 (left)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 15
|
||||||
|
to: 24
|
||||||
|
- id: light_us_rl_1_1_right
|
||||||
|
name: Light - Relay 1 of 1 (right)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 31
|
||||||
|
to: 31
|
||||||
|
- id: light_full
|
||||||
|
from: 0
|
||||||
|
to: 8
|
||||||
|
- id: light_us_rl_1_2_left
|
||||||
|
name: Light - Relay 1 of 2 (left)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 20
|
||||||
|
to: 24
|
||||||
|
- id: light_us_rl_1_2_right
|
||||||
|
name: Light - Relay 1 of 2 (right)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 31
|
||||||
|
to: 31
|
||||||
|
- id: light_full
|
||||||
|
from: 0
|
||||||
|
to: 3
|
||||||
|
- id: light_us_rl_2_2_left
|
||||||
|
name: Light - Relay 2 of 2 (left)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 15
|
||||||
|
to: 19
|
||||||
|
- id: light_us_rl_2_2_right
|
||||||
|
name: Light - Relay 2 of 2 (right)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 4
|
||||||
|
to: 8
|
||||||
|
- id: light_us_rl_1_3_left
|
||||||
|
name: Light - Relay 1 of 3 (left)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 22
|
||||||
|
to: 23
|
||||||
|
- id: light_us_rl_1_3_right
|
||||||
|
name: Light - Relay 1 of 3 (right)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 0
|
||||||
|
to: 1
|
||||||
|
- id: light_us_rl_2_3_left
|
||||||
|
name: Light - Relay 2 of 3 (left)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 19
|
||||||
|
to: 20
|
||||||
|
- id: light_us_rl_2_3_right
|
||||||
|
name: Light - Relay 2 of 3 (right)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 3
|
||||||
|
to: 4
|
||||||
|
- id: light_us_rl_3_3_left
|
||||||
|
name: Light - Relay 3 of 3 (left)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 16
|
||||||
|
to: 17
|
||||||
|
- id: light_us_rl_3_3_right
|
||||||
|
name: Light - Relay 3 of 3 (right)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 6
|
||||||
|
to: 7
|
||||||
|
- id: light_us_rl_1_4_left
|
||||||
|
name: Light - Relay 1 of 4 (left)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 23
|
||||||
|
to: 24
|
||||||
|
- id: light_us_rl_1_4_right
|
||||||
|
name: Light - Relay 1 of 4 (right)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 31
|
||||||
|
to: 31
|
||||||
|
- id: light_full
|
||||||
|
from: 0
|
||||||
|
to: 0
|
||||||
|
- id: light_us_rl_2_4_left
|
||||||
|
name: Light - Relay 2 of 4 (left)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 21
|
||||||
|
to: 22
|
||||||
|
- id: light_us_rl_2_4_right
|
||||||
|
name: Light - Relay 2 of 4 (right)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 1
|
||||||
|
to: 2
|
||||||
|
- id: light_us_rl_3_4_left
|
||||||
|
name: Light - Relay 3 of 4 (left)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 17
|
||||||
|
to: 18
|
||||||
|
- id: light_us_rl_3_4_right
|
||||||
|
name: Light - Relay 3 of 4 (right)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 5
|
||||||
|
to: 6
|
||||||
|
- id: light_us_rl_4_4_left
|
||||||
|
name: Light - Relay 4 of 4 (left)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 15
|
||||||
|
to: 16
|
||||||
|
- id: light_us_rl_4_4_right
|
||||||
|
name: Light - Relay 4 of 4 (right)
|
||||||
|
<<: *light_partition_relays
|
||||||
|
segments:
|
||||||
|
- id: light_full
|
||||||
|
from: 7
|
||||||
|
to: 8
|
||||||
|
|
||||||
|
output:
|
||||||
|
- id: output_relay_1
|
||||||
|
platform: gpio
|
||||||
|
pin: GPIO18
|
||||||
|
- id: output_relay_2
|
||||||
|
platform: gpio
|
||||||
|
pin: GPIO17
|
||||||
|
- id: output_relay_3
|
||||||
|
platform: gpio
|
||||||
|
pin: GPIO27
|
||||||
|
- id: output_relay_4
|
||||||
|
platform: gpio
|
||||||
|
pin: GPIO23
|
||||||
|
|
||||||
|
script:
|
||||||
|
- id: !extend boot_initialize
|
||||||
|
then:
|
||||||
|
- script.execute: boot_initialize_relays
|
||||||
|
|
||||||
|
- 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);
|
||||||
|
- globals.set:
|
||||||
|
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:
|
||||||
|
- lambda: |-
|
||||||
|
// EU light modes
|
||||||
|
sl_relay_1_light_mode_eu->set_internal(id(is_us_model) or id(gang_count) < 1);
|
||||||
|
sl_relay_2_light_mode_eu->set_internal(id(is_us_model) or id(gang_count) < 2);
|
||||||
|
sl_relay_3_light_mode_eu->set_internal(id(is_us_model) or id(gang_count) < 3);
|
||||||
|
sl_relay_4_light_mode_eu->set_internal(id(is_us_model) or id(gang_count) < 4);
|
||||||
|
|
||||||
|
// US light modes
|
||||||
|
sl_relay_1_light_mode_us->set_internal(!id(is_us_model) or id(gang_count) < 1);
|
||||||
|
sl_relay_2_light_mode_us->set_internal(!id(is_us_model) or id(gang_count) < 2);
|
||||||
|
sl_relay_3_light_mode_us->set_internal(!id(is_us_model) or id(gang_count) < 3);
|
||||||
|
sl_relay_4_light_mode_us->set_internal(!id(is_us_model) or id(gang_count) < 4);
|
||||||
|
|
||||||
|
// Set this section of initialization as completed
|
||||||
|
id(boot_initialization_relays_light_modes) = true;
|
||||||
|
|
||||||
|
- id: boot_initialize_relays_relay_leds
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
const bool set_internal = not sw_expose_relays_leds_to_ha->state;
|
||||||
|
|
||||||
|
// EU model LEDs
|
||||||
|
// EU model - 1 Gang
|
||||||
|
light_eu_rl_1_1_bottom->set_internal(set_internal or id(is_us_model) or id(gang_count) != 1);
|
||||||
|
light_eu_rl_1_1_top->set_internal(set_internal or id(is_us_model) or id(gang_count) != 1);
|
||||||
|
// EU model - 2 Gang
|
||||||
|
light_eu_rl_1_2_bottom->set_internal(set_internal or id(is_us_model) or id(gang_count) != 2);
|
||||||
|
light_eu_rl_1_2_top->set_internal(set_internal or id(is_us_model) or id(gang_count) != 2);
|
||||||
|
light_eu_rl_2_2_bottom->set_internal(set_internal or id(is_us_model) or id(gang_count) != 2);
|
||||||
|
light_eu_rl_2_2_top->set_internal(set_internal or id(is_us_model) or id(gang_count) != 2);
|
||||||
|
// EU model - 3 Gang
|
||||||
|
light_eu_rl_1_3_bottom->set_internal(set_internal or id(is_us_model) or id(gang_count) != 3);
|
||||||
|
light_eu_rl_1_3_top->set_internal(set_internal or id(is_us_model) or id(gang_count) != 3);
|
||||||
|
light_eu_rl_2_3_bottom->set_internal(set_internal or id(is_us_model) or id(gang_count) != 3);
|
||||||
|
light_eu_rl_2_3_top->set_internal(set_internal or id(is_us_model) or id(gang_count) != 3);
|
||||||
|
light_eu_rl_3_3_bottom->set_internal(set_internal or id(is_us_model) or id(gang_count) != 3);
|
||||||
|
light_eu_rl_3_3_top->set_internal(set_internal or id(is_us_model) or id(gang_count) != 3);
|
||||||
|
// EU model - 4 Gang
|
||||||
|
light_eu_rl_1_4_bottom->set_internal(set_internal or id(is_us_model) or id(gang_count) != 4);
|
||||||
|
light_eu_rl_1_4_top->set_internal(set_internal or id(is_us_model) or id(gang_count) != 4);
|
||||||
|
light_eu_rl_2_4_bottom->set_internal(set_internal or id(is_us_model) or id(gang_count) != 4);
|
||||||
|
light_eu_rl_2_4_top->set_internal(set_internal or id(is_us_model) or id(gang_count) != 4);
|
||||||
|
light_eu_rl_3_4_bottom->set_internal(set_internal or id(is_us_model) or id(gang_count) != 4);
|
||||||
|
light_eu_rl_3_4_top->set_internal(set_internal or id(is_us_model) or id(gang_count) != 4);
|
||||||
|
light_eu_rl_4_4_bottom->set_internal(set_internal or id(is_us_model) or id(gang_count) != 4);
|
||||||
|
light_eu_rl_4_4_top->set_internal(set_internal or id(is_us_model) or id(gang_count) != 4);
|
||||||
|
|
||||||
|
// US model LEDs
|
||||||
|
// US model - 1 Gang
|
||||||
|
light_us_rl_1_1_left->set_internal(set_internal or !id(is_us_model) or id(gang_count) != 1);
|
||||||
|
light_us_rl_1_1_right->set_internal(set_internal or !id(is_us_model) or id(gang_count) != 1);
|
||||||
|
// US model - 2 Gang
|
||||||
|
light_us_rl_1_2_left->set_internal(set_internal or !id(is_us_model) or id(gang_count) != 2);
|
||||||
|
light_us_rl_1_2_right->set_internal(set_internal or !id(is_us_model) or id(gang_count) != 2);
|
||||||
|
light_us_rl_2_2_left->set_internal(set_internal or !id(is_us_model) or id(gang_count) != 2);
|
||||||
|
light_us_rl_2_2_right->set_internal(set_internal or !id(is_us_model) or id(gang_count) != 2);
|
||||||
|
// US model - 3 Gang
|
||||||
|
light_us_rl_1_3_left->set_internal(set_internal or !id(is_us_model) or id(gang_count) != 3);
|
||||||
|
light_us_rl_1_3_right->set_internal(set_internal or !id(is_us_model) or id(gang_count) != 3);
|
||||||
|
light_us_rl_2_3_left->set_internal(set_internal or !id(is_us_model) or id(gang_count) != 3);
|
||||||
|
light_us_rl_2_3_right->set_internal(set_internal or !id(is_us_model) or id(gang_count) != 3);
|
||||||
|
light_us_rl_3_3_left->set_internal(set_internal or !id(is_us_model) or id(gang_count) != 3);
|
||||||
|
light_us_rl_3_3_right->set_internal(set_internal or !id(is_us_model) or id(gang_count) != 3);
|
||||||
|
// US model - 4 Gang
|
||||||
|
light_us_rl_1_4_left->set_internal(set_internal or !id(is_us_model) or id(gang_count) != 4);
|
||||||
|
light_us_rl_1_4_right->set_internal(set_internal or !id(is_us_model) or id(gang_count) != 4);
|
||||||
|
light_us_rl_2_4_left->set_internal(set_internal or !id(is_us_model) or id(gang_count) != 4);
|
||||||
|
light_us_rl_2_4_right->set_internal(set_internal or !id(is_us_model) or id(gang_count) != 4);
|
||||||
|
light_us_rl_3_4_left->set_internal(set_internal or !id(is_us_model) or id(gang_count) != 4);
|
||||||
|
light_us_rl_3_4_right->set_internal(set_internal or !id(is_us_model) or id(gang_count) != 4);
|
||||||
|
light_us_rl_4_4_left->set_internal(set_internal or !id(is_us_model) or id(gang_count) != 4);
|
||||||
|
light_us_rl_4_4_right->set_internal(set_internal or !id(is_us_model) or id(gang_count) != 4);
|
||||||
|
|
||||||
|
// Set this section of initialization as completed
|
||||||
|
id(boot_initialization_relays_relay_leds) = true;
|
||||||
|
|
||||||
|
- id: boot_initialize_relays_relay_modes
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
// Set selector internal based on the model (num of relays)
|
||||||
|
sl_relay_1_mode->set_internal(id(gang_count) < 1);
|
||||||
|
sl_relay_2_mode->set_internal(id(gang_count) < 2);
|
||||||
|
sl_relay_3_mode->set_internal(id(gang_count) < 3);
|
||||||
|
sl_relay_4_mode->set_internal(id(gang_count) < 4);
|
||||||
|
|
||||||
|
// Set indicator (either switch or light) visible on Home Assistant
|
||||||
|
auto relay_mode_index = sl_relay_1_mode->active_index();
|
||||||
|
if (relay_mode_index.has_value()) {
|
||||||
|
light_output_1->set_internal(false or relay_mode_index.value() != 1);
|
||||||
|
sw_relay_1->set_internal(false or relay_mode_index.value() != 0);
|
||||||
|
}
|
||||||
|
relay_mode_index = sl_relay_2_mode->active_index();
|
||||||
|
if (relay_mode_index.has_value()) {
|
||||||
|
light_output_2->set_internal(id(gang_count) < 2 or relay_mode_index.value() != 1);
|
||||||
|
sw_relay_2->set_internal(id(gang_count) < 2 or relay_mode_index.value() != 0);
|
||||||
|
}
|
||||||
|
relay_mode_index = sl_relay_3_mode->active_index();
|
||||||
|
if (relay_mode_index.has_value()) {
|
||||||
|
light_output_3->set_internal(id(gang_count) < 3 or relay_mode_index.value() != 1);
|
||||||
|
sw_relay_3->set_internal(id(gang_count) < 3 or relay_mode_index.value() != 0);
|
||||||
|
}
|
||||||
|
relay_mode_index = sl_relay_4_mode->active_index();
|
||||||
|
if (relay_mode_index.has_value()) {
|
||||||
|
light_output_4->set_internal(id(gang_count) < 4 or relay_mode_index.value() != 1);
|
||||||
|
sw_relay_4->set_internal(id(gang_count) < 4 or relay_mode_index.value() != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set this section of initialization as completed
|
||||||
|
id(boot_initialization_relays_relay_modes) = true;
|
||||||
|
|
||||||
|
- id: !extend button_click_event
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
// Handle only single clicks
|
||||||
|
if (click_count != 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Ignore if other touch events are active
|
||||||
|
if (bs_multi_touch->state ||
|
||||||
|
bs_swipe_left->state ||
|
||||||
|
bs_swipe_down->state ||
|
||||||
|
bs_swipe_right->state) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Toggle relay if corresponding button action is enabled
|
||||||
|
const bool api_disconnected = !global_api_server->is_connected() or
|
||||||
|
!wifi_component->is_connected();
|
||||||
|
std::string select_state;
|
||||||
|
bool toggle_relay = false;
|
||||||
|
if (api_disconnected) {
|
||||||
|
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("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}:
|
||||||
|
select_state = sl_button_1_action->state;
|
||||||
|
toggle_relay = (select_state == "${BUTTON_1_ACTION_TEXT}" or
|
||||||
|
(api_disconnected and select_state == "${BUTTON_1_ACTION_FAILSAFE_TEXT}"));
|
||||||
|
if (toggle_relay)
|
||||||
|
sw_relay_1->toggle();
|
||||||
|
break;
|
||||||
|
case ${BUTTON_2_ID}:
|
||||||
|
select_state = sl_button_2_action->state;
|
||||||
|
toggle_relay = (select_state == "${BUTTON_2_ACTION_TEXT}" or
|
||||||
|
(api_disconnected and select_state == "${BUTTON_2_ACTION_FAILSAFE_TEXT}"));
|
||||||
|
if (toggle_relay)
|
||||||
|
sw_relay_2->toggle();
|
||||||
|
break;
|
||||||
|
case ${BUTTON_3_ID}:
|
||||||
|
select_state = sl_button_3_action->state;
|
||||||
|
toggle_relay = (select_state == "${BUTTON_3_ACTION_TEXT}" or
|
||||||
|
(api_disconnected and select_state == "${BUTTON_3_ACTION_FAILSAFE_TEXT}"));
|
||||||
|
if (toggle_relay)
|
||||||
|
sw_relay_3->toggle();
|
||||||
|
break;
|
||||||
|
case ${BUTTON_4_ID}:
|
||||||
|
select_state = sl_button_4_action->state;
|
||||||
|
toggle_relay = (select_state == "${BUTTON_4_ACTION_TEXT}" or
|
||||||
|
(api_disconnected and select_state == "${BUTTON_4_ACTION_FAILSAFE_TEXT}"));
|
||||||
|
if (toggle_relay)
|
||||||
|
sw_relay_4->toggle();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (toggle_relay) {
|
||||||
|
ESP_LOGI("standard_hw_relays", "Toggle relay %" PRIu8 ": (%s)", button, select_state.c_str());
|
||||||
|
} else if (not select_state.empty()) {
|
||||||
|
ESP_LOGV("standard_hw_relays", "Ignoring toggle for relay %" PRIu8 ": action is '%s'",
|
||||||
|
button, select_state.c_str());
|
||||||
|
} else {
|
||||||
|
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("standard_hw_relays", "Relays not initialized yet");
|
||||||
|
if (not boot_initialize_relays->is_running())
|
||||||
|
boot_initialize_relays->execute();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (uint8_t i = 0; i < id(gang_count); i++) {
|
||||||
|
bool relay_state = false;
|
||||||
|
std::string light_mode;
|
||||||
|
const std::string light_mode_group_1 = id(is_us_model)
|
||||||
|
? "${LIGHT_MODE_LEFT_TEXT}"
|
||||||
|
: "${LIGHT_MODE_BOTTOM_TEXT}";
|
||||||
|
const std::string light_mode_group_2 = id(is_us_model)
|
||||||
|
? "${LIGHT_MODE_RIGHT_TEXT}"
|
||||||
|
: "${LIGHT_MODE_TOP_TEXT}";
|
||||||
|
|
||||||
|
// Determine relay state and light mode
|
||||||
|
switch (i) {
|
||||||
|
case 0:
|
||||||
|
relay_state = id(sw_relay_1).state;
|
||||||
|
light_mode = id(is_us_model)
|
||||||
|
? id(sl_relay_1_light_mode_us)->state
|
||||||
|
: id(sl_relay_1_light_mode_eu)->state;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
relay_state = id(sw_relay_2).state;
|
||||||
|
light_mode = id(is_us_model)
|
||||||
|
? id(sl_relay_2_light_mode_us)->state
|
||||||
|
: id(sl_relay_2_light_mode_eu)->state;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
relay_state = id(sw_relay_3).state;
|
||||||
|
light_mode = id(is_us_model)
|
||||||
|
? id(sl_relay_3_light_mode_us)->state
|
||||||
|
: id(sl_relay_3_light_mode_eu)->state;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
relay_state = id(sw_relay_4).state;
|
||||||
|
light_mode = id(is_us_model)
|
||||||
|
? id(sl_relay_4_light_mode_us)->state
|
||||||
|
: id(sl_relay_4_light_mode_eu)->state;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
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) {
|
||||||
|
if (light_mode == light_mode_group_1 || light_mode == "${LIGHT_MODE_BOTH_TEXT}") {
|
||||||
|
light_set_state->execute(1, i, true); // Left/bottom light
|
||||||
|
}
|
||||||
|
if (light_mode == light_mode_group_2 || light_mode == "${LIGHT_MODE_BOTH_TEXT}") {
|
||||||
|
light_set_state->execute(2, i, true); // Right/top light
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
light_set_state->execute(1, i, false); // Turn off left/bottom light
|
||||||
|
light_set_state->execute(2, i, false); // Turn off right/top light
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
select:
|
||||||
|
- &relay_select_mode_base
|
||||||
|
id: sl_relay_1_mode
|
||||||
|
name: Relay 1 display mode
|
||||||
|
platform: template
|
||||||
|
options:
|
||||||
|
- "${RELAY_MODE_TEXT_SWITCH}"
|
||||||
|
- "${RELAY_MODE_TEXT_LIGHT}"
|
||||||
|
- "${RELAY_MODE_TEXT_NOT_USED}"
|
||||||
|
initial_option: "${RELAY_MODE_TEXT_SWITCH}"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true
|
||||||
|
internal: true
|
||||||
|
entity_category: config
|
||||||
|
disabled_by_default: false
|
||||||
|
icon: mdi:dip-switch
|
||||||
|
on_value:
|
||||||
|
then:
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_pending_restart
|
||||||
|
state: true
|
||||||
|
- id: sl_relay_2_mode
|
||||||
|
name: Relay 2 display mode
|
||||||
|
<<: *relay_select_mode_base
|
||||||
|
- id: sl_relay_3_mode
|
||||||
|
name: Relay 3 display mode
|
||||||
|
<<: *relay_select_mode_base
|
||||||
|
- id: sl_relay_4_mode
|
||||||
|
name: Relay 4 display mode
|
||||||
|
<<: *relay_select_mode_base
|
||||||
|
|
||||||
|
switch:
|
||||||
|
- id: sw_expose_relays_leds_to_ha
|
||||||
|
name: Expose Relay's LEDs to Home Assistant
|
||||||
|
platform: template
|
||||||
|
restore_mode: RESTORE_DEFAULT_OFF
|
||||||
|
optimistic: true
|
||||||
|
internal: false
|
||||||
|
entity_category: config
|
||||||
|
on_turn_on:
|
||||||
|
then:
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_pending_restart
|
||||||
|
state: true
|
||||||
|
on_turn_off:
|
||||||
|
then:
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_pending_restart
|
||||||
|
state: true
|
||||||
|
|
||||||
|
- id: sw_relay_1
|
||||||
|
name: Relay 1
|
||||||
|
output: output_relay_1
|
||||||
|
platform: output
|
||||||
|
restore_mode: ${RELAY_RESTORE_MODE}
|
||||||
|
internal: true
|
||||||
|
on_turn_on:
|
||||||
|
then:
|
||||||
|
- script.execute: show_relay_status
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
- light.is_off: light_output_1
|
||||||
|
then:
|
||||||
|
light.turn_on: light_output_1
|
||||||
|
on_turn_off:
|
||||||
|
then:
|
||||||
|
- script.execute: show_relay_status
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
- light.is_on: light_output_1
|
||||||
|
then:
|
||||||
|
- light.turn_off: light_output_1
|
||||||
|
- id: sw_relay_2
|
||||||
|
name: Relay 2
|
||||||
|
output: output_relay_2
|
||||||
|
platform: output
|
||||||
|
restore_mode: ${RELAY_RESTORE_MODE}
|
||||||
|
internal: true
|
||||||
|
on_turn_on:
|
||||||
|
then:
|
||||||
|
- script.execute: show_relay_status
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
- light.is_off: light_output_2
|
||||||
|
then:
|
||||||
|
light.turn_on: light_output_2
|
||||||
|
on_turn_off:
|
||||||
|
then:
|
||||||
|
- script.execute: show_relay_status
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
- light.is_on: light_output_2
|
||||||
|
then:
|
||||||
|
- light.turn_off: light_output_2
|
||||||
|
- id: sw_relay_3
|
||||||
|
name: Relay 3
|
||||||
|
output: output_relay_3
|
||||||
|
platform: output
|
||||||
|
restore_mode: ${RELAY_RESTORE_MODE}
|
||||||
|
internal: true
|
||||||
|
on_turn_on:
|
||||||
|
then:
|
||||||
|
- script.execute: show_relay_status
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
- light.is_off: light_output_3
|
||||||
|
then:
|
||||||
|
- light.turn_on: light_output_3
|
||||||
|
on_turn_off:
|
||||||
|
then:
|
||||||
|
- script.execute: show_relay_status
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
- light.is_on: light_output_3
|
||||||
|
then:
|
||||||
|
- light.turn_off: light_output_3
|
||||||
|
- id: sw_relay_4
|
||||||
|
name: Relay 4
|
||||||
|
output: output_relay_4
|
||||||
|
platform: output
|
||||||
|
restore_mode: ${RELAY_RESTORE_MODE}
|
||||||
|
internal: true
|
||||||
|
on_turn_on:
|
||||||
|
then:
|
||||||
|
- script.execute: show_relay_status
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
- light.is_off: light_output_4
|
||||||
|
then:
|
||||||
|
- light.turn_on: light_output_4
|
||||||
|
on_turn_off:
|
||||||
|
then:
|
||||||
|
- script.execute: show_relay_status
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
- light.is_on: light_output_4
|
||||||
|
then:
|
||||||
|
- light.turn_off: light_output_4
|
||||||
|
...
|
||||||
182
ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml
Normal file
182
ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml
Normal 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
|
||||||
|
...
|
||||||
168
ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml
Normal file
168
ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
####################################################################################################
|
||||||
|
##### TX Ultimate Easy for ESPHome #####
|
||||||
|
##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy #####
|
||||||
|
####################################################################################################
|
||||||
|
##### Purpose: ESPHome - Standard - Hardware - Vibration system #####
|
||||||
|
####################################################################################################
|
||||||
|
##### 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:
|
||||||
|
vibration_max_duration: 2s
|
||||||
|
|
||||||
|
binary_sensor:
|
||||||
|
- id: bs_vibrating
|
||||||
|
name: Vibrating
|
||||||
|
icon: mdi:vibrate
|
||||||
|
internal: false
|
||||||
|
platform: template
|
||||||
|
lambda: return sw_vibration_motor->state;
|
||||||
|
|
||||||
|
button:
|
||||||
|
- id: bt_vibrate
|
||||||
|
name: Vibrate
|
||||||
|
icon: mdi:vibrate
|
||||||
|
internal: false
|
||||||
|
platform: template
|
||||||
|
on_press:
|
||||||
|
then:
|
||||||
|
- script.execute: vibrate
|
||||||
|
|
||||||
|
esphome:
|
||||||
|
platformio_options:
|
||||||
|
build_flags:
|
||||||
|
- -D TX_ULTIMATE_EASY_STANDARD_HW_VIBRATION
|
||||||
|
|
||||||
|
number:
|
||||||
|
- id: nr_vibrating_duration
|
||||||
|
name: Vibrate duration
|
||||||
|
icon: mdi:vibrate
|
||||||
|
unit_of_measurement: ms
|
||||||
|
internal: false
|
||||||
|
entity_category: config
|
||||||
|
platform: template
|
||||||
|
min_value: 1
|
||||||
|
max_value: 500
|
||||||
|
step: 1
|
||||||
|
initial_value: 15
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true
|
||||||
|
|
||||||
|
ota:
|
||||||
|
on_state_change:
|
||||||
|
then:
|
||||||
|
- 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
|
||||||
|
|
||||||
|
- id: touch_on_multi_touch_release_vibration
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
if (sl_touch_vibration_feedback->state != "Disabled")
|
||||||
|
vibrate->execute();
|
||||||
|
|
||||||
|
- id: !extend touch_on_press
|
||||||
|
then:
|
||||||
|
- script.execute: touch_on_press_vibration
|
||||||
|
|
||||||
|
- id: touch_on_press_vibration
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
if (sl_touch_vibration_feedback->state == "On press" or sl_touch_vibration_feedback->state == "Always")
|
||||||
|
vibrate->execute();
|
||||||
|
|
||||||
|
- id: !extend touch_on_release
|
||||||
|
then:
|
||||||
|
- script.execute: touch_on_release_vibration
|
||||||
|
|
||||||
|
- id: touch_on_release_vibration
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
if (sl_touch_vibration_feedback->state == "On release" or sl_touch_vibration_feedback->state == "Always")
|
||||||
|
vibrate->execute();
|
||||||
|
|
||||||
|
- id: vibrate
|
||||||
|
mode: restart
|
||||||
|
then:
|
||||||
|
- switch.turn_on: sw_vibration_motor
|
||||||
|
- delay: !lambda return nr_vibrating_duration->state;
|
||||||
|
- switch.turn_off: sw_vibration_motor
|
||||||
|
|
||||||
|
select:
|
||||||
|
- id: sl_touch_vibration_feedback
|
||||||
|
name: Touch - Vibration 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
|
||||||
|
|
||||||
|
switch:
|
||||||
|
- id: sw_vibration_motor
|
||||||
|
name: Vibration motor
|
||||||
|
platform: gpio
|
||||||
|
pin: GPIO21
|
||||||
|
restore_mode: ALWAYS_OFF
|
||||||
|
internal: true
|
||||||
|
on_turn_on:
|
||||||
|
then:
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_vibrating
|
||||||
|
state: ON # yamllint disable-line rule:truthy
|
||||||
|
- delay: ${vibration_max_duration}
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
switch.is_on: sw_vibration_motor
|
||||||
|
then:
|
||||||
|
- switch.turn_off: sw_vibration_motor
|
||||||
|
on_turn_off:
|
||||||
|
then:
|
||||||
|
- binary_sensor.template.publish:
|
||||||
|
id: bs_vibrating
|
||||||
|
state: OFF # yamllint disable-line rule:truthy
|
||||||
|
...
|
||||||
64
ESPHome/TX-Ultimate-Easy-ESPHome_standard_media_player.yaml
Normal file
64
ESPHome/TX-Ultimate-Easy-ESPHome_standard_media_player.yaml
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
####################################################################################################
|
||||||
|
##### TX Ultimate Easy for ESPHome #####
|
||||||
|
##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy #####
|
||||||
|
####################################################################################################
|
||||||
|
##### Purpose: ESPHome - Add-on - Media player #####
|
||||||
|
####################################################################################################
|
||||||
|
##### Author: edwardtfn - https://github.com/edwardtfn - https://buymeacoffee.com/edwardfirmo #####
|
||||||
|
####################################################################################################
|
||||||
|
##### NOTE: #####
|
||||||
|
##### - Make changes ONLY if absolutely necessary and you have the required knowledge. #####
|
||||||
|
##### - For normal system use, modifications to this file are NOT required. #####
|
||||||
|
####################################################################################################
|
||||||
|
---
|
||||||
|
packages:
|
||||||
|
standard_hw_audio: !include TX-Ultimate-Easy-ESPHome_standard_hw_audio.yaml
|
||||||
|
|
||||||
|
esphome:
|
||||||
|
platformio_options:
|
||||||
|
build_flags:
|
||||||
|
- -D TX_ULTIMATE_EASY_ADDON_MEDIA_PLAYER
|
||||||
|
|
||||||
|
media_player:
|
||||||
|
- id: mp_media_player
|
||||||
|
name: Media Player
|
||||||
|
internal: false
|
||||||
|
platform: i2s_audio
|
||||||
|
i2s_dout_pin: GPIO15
|
||||||
|
i2s_audio_id: if_i2s_audio
|
||||||
|
i2s_comm_fmt: msb
|
||||||
|
dac_type: external
|
||||||
|
mode: mono
|
||||||
|
mute_pin:
|
||||||
|
number: GPIO26
|
||||||
|
inverted: true
|
||||||
|
allow_other_uses: true
|
||||||
|
|
||||||
|
script:
|
||||||
|
- id: !extend dump_config_list_packages
|
||||||
|
then:
|
||||||
|
- script.wait: dump_config
|
||||||
|
- lambda: |-
|
||||||
|
// Check for requirements
|
||||||
|
#if !defined(TX_ULTIMATE_EASY_CORE)
|
||||||
|
#error "The package TX-Ultimate-Easy-ESPHome_core.yaml is required."
|
||||||
|
#endif
|
||||||
|
#if !defined(TX_ULTIMATE_EASY_STANDARD_HW_AUDIO)
|
||||||
|
#error "The package TX-Ultimate-Easy-ESPHome_standard_hw_audio.yaml is required."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Identify itself
|
||||||
|
ESP_LOGCONFIG(ESPHOME_PROJECT_NAME, " - Add-on - Media Player");
|
||||||
|
|
||||||
|
switch:
|
||||||
|
- id: sw_speaker_amplifier
|
||||||
|
name: Speaker - Amplifier
|
||||||
|
platform: gpio
|
||||||
|
pin:
|
||||||
|
number: GPIO26
|
||||||
|
inverted: true
|
||||||
|
allow_other_uses: true
|
||||||
|
restore_mode: RESTORE_DEFAULT_ON
|
||||||
|
internal: true
|
||||||
|
entity_category: config
|
||||||
|
...
|
||||||
390
README.md
390
README.md
@@ -1,59 +1,375 @@
|
|||||||
# TX Ultimate Easy
|
# TX Ultimate Easy
|
||||||
|
|
||||||
|  | Welcome to TX Ultimate Easy! This project aims to provide custom firmware for Sonoff TX Ultimate devices based on ESPHome, making it easy for even the least tech-savvy users to configure and use. Our goal is to have all the configurations manageable directly through the Home Assistant UI or via blueprints, eliminating the need to edit YAML files manually. |
|
[![Version][version-shield]](https://github.com/edwardtfn/TX-Ultimate-Easy/tags)
|
||||||
|
[![GitHub Activity][commits-shield]](https://github.com/edwardtfn/TX-Ultimate-Easy/commits/main)
|
||||||
|
[![License][license-shield]](LICENSE)
|
||||||
|
[![GitHub Last Commit][last-commit-shield]](https://github.com/edwardtfn/TX-Ultimate-Easy/commits/main)
|
||||||
|
[![ESPHome][esphome-shield]](https://esphome.io/)
|
||||||
|
[![Discord][discord-shield]](https://discord.gg/Db6WJWzWuf)
|
||||||
|
[![Buy me an ice-cream][buymeacoffee-shield]](https://www.buymeacoffee.com/edwardfirmo)
|
||||||
|
|
||||||
|
<!-- markdownlint-disable MD013 MD033 -->
|
||||||
|
| <picture><source media="(prefers-color-scheme: dark)" srcset="Assets/Logo_dark.png"><source media="(prefers-color-scheme: light)" srcset="Assets/Logo_light.png"><img alt="TX Ultimate Easy Logo" src="Assets/Logo_light.png"></picture> | TX Ultimate Easy provides custom ESPHome firmware for Sonoff TX Ultimate devices. Our project focuses on user-friendly configuration through the Home Assistant UI, eliminating the need for manual YAML editing. Whether you're new to home automation or an experienced user, TX Ultimate Easy makes it simple to manage your device. |
|
||||||
| --- | :-- |
|
| --- | :-- |
|
||||||
|
<!-- markdownlint-enable MD013 MD033 -->
|
||||||
|
|
||||||
## Features
|
[version-shield]: https://img.shields.io/github/v/tag/edwardtfn/TX-Ultimate-Easy?label=version
|
||||||
|
[version]: https://github.com/edwardtfn/TX-Ultimate-Easy/tags
|
||||||
|
[commits-shield]: https://img.shields.io/github/commit-activity/y/edwardtfn/TX-Ultimate-Easy
|
||||||
|
[commits]: https://github.com/edwardtfn/TX-Ultimate-Easy/commits/main
|
||||||
|
[license-shield]: https://img.shields.io/github/license/edwardtfn/TX-Ultimate-Easy
|
||||||
|
[license]: LICENSE
|
||||||
|
[last-commit-shield]: https://img.shields.io/github/last-commit/edwardtfn/TX-Ultimate-Easy
|
||||||
|
[esphome-shield]: https://img.shields.io/badge/powered%20by-ESPHome-blue
|
||||||
|
[esphome]: https://esphome.io/
|
||||||
|
[discord-shield]: https://img.shields.io/discord/1243652421692031016?logo=discord
|
||||||
|
[discord]: https://discord.gg/Db6WJWzWuf
|
||||||
|
[buymeacoffee-shield]: https://img.shields.io/static/v1?label=Buy%20me%20an%20ice%20cream&message=❄&color=blue
|
||||||
|
[buymeacoffee]: https://www.buymeacoffee.com/edwardfirmo
|
||||||
|
|
||||||
- **Simple Setup:** Configure your Sonoff TX Ultimate through Home Assistant UI.
|
## Integration with Home Assistant
|
||||||
- **No YAML Editing:** All settings are adjustable without touching YAML files after the initial setup.
|
|
||||||
- **User-Friendly:** Designed for users of all technical levels.
|
|
||||||
- **Customizable:** Flexibility to adapt the firmware to your needs.
|
|
||||||
- **Seamless Integration:** Works flawlessly with Home Assistant.
|
|
||||||
|
|
||||||
## Getting Started
|
TX Ultimate Easy exposes your device's components (sensors, touch panel, relays, etc.) to Home Assistant,
|
||||||
|
allowing you to:
|
||||||
|
|
||||||
### Prerequisites
|
- Monitor sensor states and values
|
||||||
|
- Control device components through the Home Assistant UI
|
||||||
|
- Use device triggers and states in your Home Assistant automations and scripts
|
||||||
|
- Configure device behavior through Home Assistant's service calls
|
||||||
|
|
||||||
- Sonoff TX Ultimate device
|
All automation capabilities are handled through Home Assistant's
|
||||||
- Home Assistant installed
|
native automation system - this project focuses on providing reliable
|
||||||
- ESPHome add-on installed in Home Assistant
|
device integration rather than implementing its own automation tools.
|
||||||
|
|
||||||
### Installation
|
### Event-Based Automation
|
||||||
To be written.
|
|
||||||
|
|
||||||
### Configuration
|
TX Ultimate Easy uses Home Assistant's native Events system for reliable automation triggers.
|
||||||
|
While sensors show the current state (e.g., button pressed/not pressed),
|
||||||
|
events capture-specific actions like clicks, swipes, and long presses.
|
||||||
|
|
||||||
- **Via Home Assistant UI:**
|
For more details, please refer to our **[Events docs](docs/events.md)**.
|
||||||
All device settings can be managed through the Home Assistant interface. No need to edit YAML files directly.
|
|
||||||
|
|
||||||
- **Using Blueprints:**
|
### Device Configuration
|
||||||
Import and use blueprints to quickly configure your device for common use cases.
|
#### Relay Modes
|
||||||
|
- **Light Mode**: Exposes the relay as a light entity with brightness controls (if supported)
|
||||||
|
- **Switch Mode**: Exposes the relay as a simple on/off switch entity
|
||||||
|
|
||||||
## Documentation
|
#### Button Actions
|
||||||
To be written.
|
- **None**: Allows using button events for custom automations
|
||||||
|
Example: Trigger scenes or complex automations through Home Assistant
|
||||||
|
- **Relay Toggle**: Direct control of the associated relay
|
||||||
|
Example: Toggle relay state with each press, independent of Home Assistant
|
||||||
|
|
||||||
|
#### Automation
|
||||||
|
All device behaviors can be customized through Home Assistant automations without relying on local device triggers.
|
||||||
|
|
||||||
|
## Key Features
|
||||||
|
|
||||||
|
- **Home Assistant UI Configuration**: Manage all device settings directly through the Home Assistant interface
|
||||||
|
- **Zero YAML Knowledge Required**: After initial setup, no manual YAML editing needed
|
||||||
|
- **Flexible Light Control**: Customize LED behavior and effects
|
||||||
|
- **Touch Panel Support**: Full support for touch gestures and multi-touch capabilities
|
||||||
|
- **Advanced Automations**: Create complex automations using Home Assistant's powerful automation engine
|
||||||
|
- **BLE Proxy Support**: Optional Bluetooth Low Energy proxy functionality
|
||||||
|
- **Audio Feedback**: Built-in speaker support for audible feedback
|
||||||
|
- **Haptic Feedback**: Vibration motor support for tactile feedback
|
||||||
|
|
||||||
|
## Hardware Support
|
||||||
|
|
||||||
|
- Compatible with all Sonoff TX Ultimate variants:
|
||||||
|
- EU format (Square, T5-xC-86)
|
||||||
|
- US format (Rectangle, T5-xC-120)
|
||||||
|
- 1/2/3/4 gang versions
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
Before getting started, ensure you have:
|
||||||
|
|
||||||
|
1. A Sonoff TX Ultimate device
|
||||||
|
2. Home Assistant installation
|
||||||
|
3. ESPHome add-on installed in Home Assistant
|
||||||
|
4. Basic knowledge of Home Assistant
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Follow these steps to get your TX Ultimate device up and running with ESPHome.
|
||||||
|
|
||||||
|
### 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
|
||||||
|
friendly_name: TX Ultimate Easy
|
||||||
|
|
||||||
|
wifi:
|
||||||
|
ssid: !secret wifi_ssid
|
||||||
|
password: !secret wifi_password
|
||||||
|
|
||||||
|
packages:
|
||||||
|
remote_package:
|
||||||
|
url: https://github.com/edwardtfn/TX-Ultimate-Easy
|
||||||
|
ref: stable # Or you can specify a version, like `ref: v2024.12.6` or `ref: latest` to the latest non-stable
|
||||||
|
refresh: 5min
|
||||||
|
files:
|
||||||
|
- ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml # Core (essential) packages
|
||||||
|
- ESPHome/TX-Ultimate-Easy-ESPHome_standard.yaml # Non-essential, but recommended packages
|
||||||
|
# - ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml # Adds BLE proxy support
|
||||||
|
```
|
||||||
|
You can also use a specific version tag for better control over updates:
|
||||||
|
```yaml
|
||||||
|
ref: v2024.12.2 # Using specific version for controlled updates
|
||||||
|
```
|
||||||
|
**Notes:**
|
||||||
|
- [Click here](https://github.com/edwardtfn/TX-Ultimate-Easy/tags) for a full list of versions available.
|
||||||
|
- [Click here](TX-Ultimate-Easy-ESPHome.yaml)
|
||||||
|
for the latest version of this yaml.
|
||||||
|
5. Click "Save" and then "Install"
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> Starting from version 2025.1.0, non-essential components like `web_server`, `captive_portal`, and `wifi`
|
||||||
|
> are no longer included in the core package. If you need these components,
|
||||||
|
> you must add them manually to your local configuration file.
|
||||||
|
> For example:
|
||||||
|
> ```yaml
|
||||||
|
> # Add these to your configuration if needed
|
||||||
|
> web_server:
|
||||||
|
> captive_portal:
|
||||||
|
> wifi:
|
||||||
|
> ap: # Access point configuration
|
||||||
|
> ```
|
||||||
|
|
||||||
|
### Advanced Settings
|
||||||
|
For more granular control over components,
|
||||||
|
you can use our [advanced configuration template](TX-Ultimate-Easy-ESPHome_advanced.yaml).
|
||||||
|
This template allows you to selectively include specific packages, which can be useful for:
|
||||||
|
|
||||||
|
- Troubleshooting specific components
|
||||||
|
- Reducing memory usage by excluding unused features
|
||||||
|
- Customizing functionality for specific use cases
|
||||||
|
|
||||||
|
Here's an example of the advanced configuration:
|
||||||
|
```yaml
|
||||||
|
packages:
|
||||||
|
remote_package:
|
||||||
|
url: https://github.com/edwardtfn/TX-Ultimate-Easy
|
||||||
|
ref: stable # Or you can specify a version, like `ref: v2024.12.6` or `ref: latest` to the latest non-stable
|
||||||
|
refresh: 5min
|
||||||
|
files:
|
||||||
|
# Core (essential) packages
|
||||||
|
- ESPHome/TX-Ultimate-Easy-ESPHome_core_common.yaml # Basic shared settings
|
||||||
|
- ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml # Button logic
|
||||||
|
- ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml # LED configuration
|
||||||
|
- ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_touch.yaml # Touch panel support
|
||||||
|
|
||||||
|
# Optional but recommended packages
|
||||||
|
- ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml # Relay control
|
||||||
|
- ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml # Haptic feedback
|
||||||
|
|
||||||
|
# Audio options (use none or choose only one - using both will fail)
|
||||||
|
- ESPHome/TX-Ultimate-Easy-ESPHome_standard_media_player.yaml # Media player (Recommended for most users)
|
||||||
|
# - ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml # Basic speaker
|
||||||
|
```
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> Use the advanced configuration with caution. Excluding core packages may cause instability or reduced functionality.
|
||||||
|
|
||||||
|
### Device Flashing
|
||||||
|
|
||||||
|
Initial flashing must be done via serial connection.
|
||||||
|
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 1–2 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
|
||||||
|
|
||||||
|
After installation, you can:
|
||||||
|
|
||||||
|
1. Configure your device through Home Assistant UI
|
||||||
|
2. Customize touch behaviors
|
||||||
|
3. Set up LED patterns and effects
|
||||||
|
4. Create automations
|
||||||
|
5. Enable optional features like BLE proxy
|
||||||
|
|
||||||
|
## Configuration Options
|
||||||
|
|
||||||
|
TX Ultimate Easy offers extensive configuration options:
|
||||||
|
|
||||||
|
- Touch panel sensitivity and gestures
|
||||||
|
- LED colors, patterns, and behaviors
|
||||||
|
- Relay modes and functions
|
||||||
|
- Audio and haptic feedback settings
|
||||||
|
- Network and connectivity options
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
We welcome contributions from the community. If you have ideas for new features, improvements, or bug fixes, please open an issue or submit a pull request.
|
We welcome contributions from the community! Here's how you can help:
|
||||||
|
|
||||||
|
1. Fork the repository
|
||||||
|
2. Create a feature branch from `main`
|
||||||
|
3. Make your changes
|
||||||
|
4. Submit a pull request targeting the `main` branch
|
||||||
|
|
||||||
|
Please ensure your code follows our standards:
|
||||||
|
|
||||||
|
- Passes all lint checks (YAML, C++, Markdown)
|
||||||
|
- Includes appropriate documentation
|
||||||
|
- Follows existing code style
|
||||||
|
|
||||||
|
## Support and Community
|
||||||
|
|
||||||
|
Need help? Here are your options:
|
||||||
|
|
||||||
|
- **Bug Reports & Feature Requests**: Use [GitHub Issues](https://github.com/edwardtfn/TX-Ultimate-Easy/issues)
|
||||||
|
for all bug reports and feature requests
|
||||||
|
- **Community Chat**: Join our [Discord Server](https://discord.gg/Db6WJWzWuf)
|
||||||
|
for discussions and community interaction
|
||||||
|
- **Support the Project**: Consider supporting through Buy Me a Coffee
|
||||||
|
|
||||||
|
Note: For proper tracking and resolution:
|
||||||
|
- All bug reports and feature requests must be submitted through GitHub Issues, not Discord
|
||||||
|
- Submit issues here: [Issues · edwardtfn/TX-Ultimate-Easy](https://github.com/edwardtfn/TX-Ultimate-Easy/issues)
|
||||||
|
|
||||||
|
[](https://www.buymeacoffee.com/edwardfirmo)
|
||||||
|
|
||||||
|
## Acknowledgments
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
||||||
|
|
||||||
## Acknowledgments
|
---
|
||||||
|
|
||||||
This project is highly inspired by these other projects:
|
<!-- markdownlint-disable MD033 -->
|
||||||
- [SmartHome yourself - SONOFF TX Ultimate for ESPHome (Custom Component)](https://github.com/SmartHome-yourself/sonoff-tx-ultimate-for-esphome)
|
<picture>
|
||||||
- [Un loco y su tecnología - Sonoff TX Ultimate with ESPHome | Absolute power](https://www.youtube.com/watch?v=58v8oqSQgXQ)
|
<source media="(prefers-color-scheme: dark)" srcset="Assets/Logo_dark.png">
|
||||||
|
<source media="(prefers-color-scheme: light)" srcset="Assets/Logo_light.png">
|
||||||
Thanks a lot for sharing all your discoveries and ideas.
|
<img alt="TX Ultimate Easy Logo" src="Assets/Logo_light.png" width="100">
|
||||||
|
</picture>
|
||||||
## Support
|
<!-- markdownlint-enable MD033 -->
|
||||||
|
|
||||||
If you find this project helpful, consider supporting us through Buy Me a Coffee:
|
|
||||||
|
|
||||||
[](https://www.buymeacoffee.com/edwardfirmo)
|
|
||||||
|
|
||||||
|
|
||||||
<img src="Assets/Logo.webp" alt="TX Ultimate Easy Logo" width="100"/>
|
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
####################################################################################################
|
||||||
|
##### TX Ultimate Easy for ESPHome #####
|
||||||
|
##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy #####
|
||||||
|
####################################################################################################
|
||||||
|
##### Author: edwardtfn - https://github.com/edwardtfn - https://buymeacoffee.com/edwardfirmo #####
|
||||||
|
####################################################################################################
|
||||||
---
|
---
|
||||||
substitutions:
|
substitutions:
|
||||||
name: tx-ultimate-easy
|
name: tx-ultimate-easy
|
||||||
@@ -10,9 +16,10 @@ wifi:
|
|||||||
packages:
|
packages:
|
||||||
remote_package:
|
remote_package:
|
||||||
url: https://github.com/edwardtfn/TX-Ultimate-Easy
|
url: https://github.com/edwardtfn/TX-Ultimate-Easy
|
||||||
ref: dev
|
ref: stable # Or you can specify a version, like `ref: v2024.12.6` or `ref: latest` to the latest non-stable
|
||||||
refresh: 30s
|
refresh: 5min
|
||||||
files:
|
files:
|
||||||
- ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml
|
- ESPHome/TX-Ultimate-Easy-ESPHome_core.yaml # Core (essential) packages
|
||||||
# - ESPHome/TX-Ultimate-Easy-ESPHome_addon_ble_proxy.yaml # Adds experimental BLE proxy support (limited)
|
- 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
|
||||||
...
|
...
|
||||||
|
|||||||
38
TX-Ultimate-Easy-ESPHome_advanced.yaml
Normal file
38
TX-Ultimate-Easy-ESPHome_advanced.yaml
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
####################################################################################################
|
||||||
|
##### TX Ultimate Easy for ESPHome #####
|
||||||
|
##### Repository: https://github.com/edwardtfn/TX-Ultimate-Easy #####
|
||||||
|
####################################################################################################
|
||||||
|
##### Author: edwardtfn - https://github.com/edwardtfn - https://buymeacoffee.com/edwardfirmo #####
|
||||||
|
####################################################################################################
|
||||||
|
##### WARNING: This is an advanced configuration template. Use with caution as improper #####
|
||||||
|
##### configuration may lead to reduced functionality or system instability. #####
|
||||||
|
####################################################################################################
|
||||||
|
---
|
||||||
|
substitutions:
|
||||||
|
name: tx-ultimate-easy-adv
|
||||||
|
friendly_name: TX Ultimate Easy Advanced
|
||||||
|
|
||||||
|
wifi:
|
||||||
|
ssid: !secret wifi_ssid
|
||||||
|
password: !secret wifi_password
|
||||||
|
|
||||||
|
packages:
|
||||||
|
remote_package:
|
||||||
|
url: https://github.com/edwardtfn/TX-Ultimate-Easy
|
||||||
|
ref: stable # Or you can specify a version, like `ref: v2024.12.6` or `ref: latest` to the latest non-stable
|
||||||
|
refresh: 5min
|
||||||
|
files:
|
||||||
|
# Core (essential) packages - Do not disable these unless you know what you're doing
|
||||||
|
- ESPHome/TX-Ultimate-Easy-ESPHome_core_common.yaml # Basic shared settings
|
||||||
|
- ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_buttons.yaml # Button logic
|
||||||
|
- ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_leds.yaml # LED configuration
|
||||||
|
- ESPHome/TX-Ultimate-Easy-ESPHome_core_hw_touch.yaml # Touch panel support
|
||||||
|
|
||||||
|
# Optional functionality - Can be enabled/disabled as needed
|
||||||
|
- ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_relays.yaml # Relay control
|
||||||
|
- ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_vibration.yaml # Haptic feedback
|
||||||
|
|
||||||
|
# Audio options (use none or choose only one - using both will fail)
|
||||||
|
- ESPHome/TX-Ultimate-Easy-ESPHome_standard_media_player.yaml # Media player (Recommended for most users)
|
||||||
|
# - ESPHome/TX-Ultimate-Easy-ESPHome_standard_hw_speaker.yaml # Basic speaker
|
||||||
|
...
|
||||||
@@ -13,6 +13,7 @@ DEPENDENCIES = ['uart']
|
|||||||
CONF_TX_ULTIMATE_EASY = "tx_ultimate_easy"
|
CONF_TX_ULTIMATE_EASY = "tx_ultimate_easy"
|
||||||
|
|
||||||
CONF_UART = "uart"
|
CONF_UART = "uart"
|
||||||
|
CONF_GANG_COUNT = "gang_count"
|
||||||
|
|
||||||
CONF_ON_TOUCH_EVENT = "on_touch_event"
|
CONF_ON_TOUCH_EVENT = "on_touch_event"
|
||||||
CONF_ON_PRESS = "on_press"
|
CONF_ON_PRESS = "on_press"
|
||||||
@@ -33,6 +34,7 @@ CONFIG_SCHEMA = cv.Schema({
|
|||||||
cv.GenerateID(): cv.declare_id(TxUltimateTouch),
|
cv.GenerateID(): cv.declare_id(TxUltimateTouch),
|
||||||
|
|
||||||
cv.Required(CONF_UART): cv.use_id(uart),
|
cv.Required(CONF_UART): cv.use_id(uart),
|
||||||
|
cv.Optional(CONF_GANG_COUNT, default=1): cv.int_range(min=1, max=4),
|
||||||
|
|
||||||
cv.Optional(CONF_ON_TOUCH_EVENT): automation.validate_automation(single=True),
|
cv.Optional(CONF_ON_TOUCH_EVENT): automation.validate_automation(single=True),
|
||||||
cv.Optional(CONF_ON_PRESS): automation.validate_automation(single=True),
|
cv.Optional(CONF_ON_PRESS): automation.validate_automation(single=True),
|
||||||
@@ -49,6 +51,9 @@ async def register_tx_ultimate_easy(var, config):
|
|||||||
uart_component = await cg.get_variable(config[CONF_UART])
|
uart_component = await cg.get_variable(config[CONF_UART])
|
||||||
cg.add(var.set_uart_component(uart_component))
|
cg.add(var.set_uart_component(uart_component))
|
||||||
|
|
||||||
|
if CONF_GANG_COUNT in config:
|
||||||
|
cg.add(var.set_gang_count(config[CONF_GANG_COUNT]))
|
||||||
|
|
||||||
if CONF_ON_TOUCH_EVENT in config:
|
if CONF_ON_TOUCH_EVENT in config:
|
||||||
await automation.build_automation(
|
await automation.build_automation(
|
||||||
var.get_trigger_touch_event(),
|
var.get_trigger_touch_event(),
|
||||||
@@ -98,8 +103,23 @@ async def register_tx_ultimate_easy(var, config):
|
|||||||
config[CONF_ON_LONG_TOUCH_RELEASE],
|
config[CONF_ON_LONG_TOUCH_RELEASE],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def to_code(config):
|
async def to_code(config):
|
||||||
var = cg.new_Pvariable(config[CONF_ID])
|
var = cg.new_Pvariable(config[CONF_ID])
|
||||||
await cg.register_component(var, config)
|
await cg.register_component(var, config)
|
||||||
await uart.register_uart_device(var, config)
|
await uart.register_uart_device(var, config)
|
||||||
await register_tx_ultimate_easy(var, config)
|
await register_tx_ultimate_easy(var, config)
|
||||||
|
|
||||||
|
if CORE.using_esp_idf:
|
||||||
|
add_idf_sdkconfig_option("CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST", True)
|
||||||
|
add_idf_sdkconfig_option("CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY", True)
|
||||||
|
add_idf_sdkconfig_option("CONFIG_ESP32_REV_MIN_3", True)
|
||||||
|
add_idf_sdkconfig_option("CONFIG_MBEDTLS_DYNAMIC_BUFFER", True)
|
||||||
|
add_idf_sdkconfig_option("CONFIG_MBEDTLS_DYNAMIC_FREE_CA_CERT", True)
|
||||||
|
add_idf_sdkconfig_option("CONFIG_MBEDTLS_DYNAMIC_FREE_CONFIG_DATA", True)
|
||||||
|
add_idf_sdkconfig_option("CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC", True)
|
||||||
|
add_idf_sdkconfig_option("CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY", True)
|
||||||
|
add_idf_sdkconfig_option("CONFIG_SPIRAM_RODATA", True)
|
||||||
|
add_idf_sdkconfig_option("CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP", True)
|
||||||
|
|
||||||
|
cg.add_define("USE_TX_ULTIMATE_EASY")
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "esphome/core/log.h"
|
#include "esphome/core/log.h"
|
||||||
#include "tx_ultimate_easy.h"
|
#include "tx_ultimate_easy.h"
|
||||||
|
#include <cinttypes>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace esphome {
|
namespace esphome {
|
||||||
@@ -48,6 +49,35 @@ namespace esphome {
|
|||||||
|
|
||||||
void TxUltimateEasy::dump_config() {
|
void TxUltimateEasy::dump_config() {
|
||||||
ESP_LOGCONFIG(TAG, "TX Ultimate Easy");
|
ESP_LOGCONFIG(TAG, "TX Ultimate Easy");
|
||||||
|
ESP_LOGCONFIG(TAG, " Gang count: %" PRIu8, this->gang_count_);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TxUltimateEasy::set_gang_count(const uint8_t gang_count) {
|
||||||
|
// Hardware supports maximum of 4 touch-sensitive buttons
|
||||||
|
if (gang_count < 1 or gang_count > 4)
|
||||||
|
return false;
|
||||||
|
this->gang_count_ = gang_count;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t TxUltimateEasy::get_button_from_position(const uint8_t position) {
|
||||||
|
// Validate position bounds
|
||||||
|
if (position > TOUCH_MAX_POSITION)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// Special case for single gang (only one button exists)
|
||||||
|
if (this->gang_count_ == 1)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
//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
|
||||||
|
this->gang_count_ // Clamp to max gang count
|
||||||
|
);
|
||||||
|
return button;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TxUltimateEasy::send_touch_(TouchPoint tp) {
|
void TxUltimateEasy::send_touch_(TouchPoint tp) {
|
||||||
@@ -103,7 +133,8 @@ namespace esphome {
|
|||||||
state == TOUCH_STATE_SWIPE_LEFT ||
|
state == TOUCH_STATE_SWIPE_LEFT ||
|
||||||
state == TOUCH_STATE_SWIPE_RIGHT ||
|
state == TOUCH_STATE_SWIPE_RIGHT ||
|
||||||
state == TOUCH_STATE_MULTI_TOUCH) &&
|
state == TOUCH_STATE_MULTI_TOUCH) &&
|
||||||
(uart_received_bytes[6] >= 0 || state == TOUCH_STATE_MULTI_TOUCH);
|
// Multi-touch events may have x < 0, all other events require valid x position
|
||||||
|
(uart_received_bytes[6] >= 0 || state == TOUCH_STATE_MULTI_TOUCH);
|
||||||
}
|
}
|
||||||
|
|
||||||
int TxUltimateEasy::get_touch_position_x(const std::array<int, UART_RECEIVED_BYTES_SIZE> &uart_received_bytes) {
|
int TxUltimateEasy::get_touch_position_x(const std::array<int, UART_RECEIVED_BYTES_SIZE> &uart_received_bytes) {
|
||||||
@@ -133,6 +164,8 @@ namespace esphome {
|
|||||||
TouchPoint TxUltimateEasy::get_touch_point(const std::array<int, UART_RECEIVED_BYTES_SIZE> &uart_received_bytes) {
|
TouchPoint TxUltimateEasy::get_touch_point(const std::array<int, UART_RECEIVED_BYTES_SIZE> &uart_received_bytes) {
|
||||||
TouchPoint tp;
|
TouchPoint tp;
|
||||||
tp.x = this->get_touch_position_x(uart_received_bytes);
|
tp.x = this->get_touch_position_x(uart_received_bytes);
|
||||||
|
if (tp.x >= 0)
|
||||||
|
tp.button = this->get_button_from_position(static_cast<uint8_t>(tp.x));
|
||||||
tp.state = this->get_touch_state(uart_received_bytes);
|
tp.state = this->get_touch_state(uart_received_bytes);
|
||||||
switch (tp.state) {
|
switch (tp.state) {
|
||||||
case TOUCH_STATE_RELEASE:
|
case TOUCH_STATE_RELEASE:
|
||||||
|
|||||||
@@ -13,6 +13,9 @@
|
|||||||
|
|
||||||
namespace esphome {
|
namespace esphome {
|
||||||
namespace tx_ultimate_easy {
|
namespace tx_ultimate_easy {
|
||||||
|
// Touch Max Position
|
||||||
|
constexpr uint8_t TOUCH_MAX_POSITION = 10;
|
||||||
|
|
||||||
// Touch State Constants
|
// Touch State Constants
|
||||||
constexpr uint8_t TOUCH_STATE_RELEASE = 0x01;
|
constexpr uint8_t TOUCH_STATE_RELEASE = 0x01;
|
||||||
constexpr uint8_t TOUCH_STATE_PRESS = 0x02;
|
constexpr uint8_t TOUCH_STATE_PRESS = 0x02;
|
||||||
@@ -32,6 +35,7 @@ namespace esphome {
|
|||||||
static const char *TAG = "tx_ultimate_easy";
|
static const char *TAG = "tx_ultimate_easy";
|
||||||
|
|
||||||
struct TouchPoint {
|
struct TouchPoint {
|
||||||
|
uint8_t button = 0;
|
||||||
int8_t x = -1;
|
int8_t x = -1;
|
||||||
int8_t state = -1;
|
int8_t state = -1;
|
||||||
std::string state_str = "Unknown";
|
std::string state_str = "Unknown";
|
||||||
@@ -53,6 +57,10 @@ namespace esphome {
|
|||||||
void loop() override;
|
void loop() override;
|
||||||
void dump_config() override;
|
void dump_config() override;
|
||||||
|
|
||||||
|
uint8_t get_gang_count() { return this->gang_count_; }
|
||||||
|
bool set_gang_count(const uint8_t gang_count);
|
||||||
|
uint8_t get_button_from_position(const uint8_t position);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void send_touch_(TouchPoint tp);
|
void send_touch_(TouchPoint tp);
|
||||||
void handle_touch(const std::array<int, UART_RECEIVED_BYTES_SIZE> &bytes);
|
void handle_touch(const std::array<int, UART_RECEIVED_BYTES_SIZE> &bytes);
|
||||||
@@ -70,6 +78,8 @@ namespace esphome {
|
|||||||
Trigger<TouchPoint> trigger_multi_touch_release_;
|
Trigger<TouchPoint> trigger_multi_touch_release_;
|
||||||
Trigger<TouchPoint> trigger_long_touch_release_;
|
Trigger<TouchPoint> trigger_long_touch_release_;
|
||||||
|
|
||||||
|
uint8_t gang_count_ = 1;
|
||||||
|
|
||||||
}; // class TxUltimateEasy
|
}; // class TxUltimateEasy
|
||||||
|
|
||||||
} // namespace tx_ultimate_easy
|
} // namespace tx_ultimate_easy
|
||||||
|
|||||||
236
docs/events.md
Normal file
236
docs/events.md
Normal file
@@ -0,0 +1,236 @@
|
|||||||
|
# Updating the Event Engine in TX Ultimate Easy
|
||||||
|
|
||||||
|
## Overview of the Event System
|
||||||
|
|
||||||
|
The TX Ultimate Easy firmware introduces a powerful
|
||||||
|
and flexible event system designed to handle various types of interactions,
|
||||||
|
such as touch gestures and device states.
|
||||||
|
This system leverages Home Assistant's native event structure,
|
||||||
|
ensuring seamless integration and enabling users to create advanced automations.
|
||||||
|
|
||||||
|
### Event Structure
|
||||||
|
|
||||||
|
All events emitted by the device are categorized under the `esphome.tx_ultimate_easy` event type in Home Assistant.
|
||||||
|
The `data` field within the event payload provides details about the specific interaction.
|
||||||
|
Below is a detailed description of the keys used:
|
||||||
|
|
||||||
|
#### Example Event Payload
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
event:
|
||||||
|
event_type: esphome.tx_ultimate_easy
|
||||||
|
data:
|
||||||
|
device_id: "abc123"
|
||||||
|
device_name: "living_room_panel"
|
||||||
|
firmware: "2024.12.1"
|
||||||
|
domain: touch
|
||||||
|
type: button
|
||||||
|
action: click
|
||||||
|
button_id: 2
|
||||||
|
count: 1
|
||||||
|
position: 3
|
||||||
|
```
|
||||||
|
|
||||||
|
### Key Definitions
|
||||||
|
|
||||||
|
#### `device_id`
|
||||||
|
|
||||||
|
- **Description**: A unique identifier for the device emitting the event.
|
||||||
|
- **Example**: `device_id: "abc123"`
|
||||||
|
|
||||||
|
#### `device_name`
|
||||||
|
|
||||||
|
- **Description**: A Home Assistant-compatible version of the hostname, with blanks and invalid characters replaced by `_`.
|
||||||
|
- **Example**: `device_name: "living_room_panel"`
|
||||||
|
|
||||||
|
#### `firmware`
|
||||||
|
|
||||||
|
- **Description**: The firmware version of the device, formatted as `YYYY.M.S`.
|
||||||
|
- **Example**: `firmware: "2024.12.1"`
|
||||||
|
|
||||||
|
#### `domain`
|
||||||
|
|
||||||
|
- **Description**: The high-level category of the event.
|
||||||
|
- **Examples**:
|
||||||
|
- `boot`
|
||||||
|
- `touch`
|
||||||
|
|
||||||
|
#### `type`
|
||||||
|
|
||||||
|
- **Description**: Specifies the subcategory within the `domain`.
|
||||||
|
- **Examples**:
|
||||||
|
- For `domain: boot`: `start`, `done`
|
||||||
|
- For `domain: touch`: `button`, `swipe`, `multi_touch`
|
||||||
|
|
||||||
|
#### `action`
|
||||||
|
|
||||||
|
- **Description**: Indicates the specific action or interaction.
|
||||||
|
- **Examples**:
|
||||||
|
- For `type: button`: `click`, `double-click`, `long-press`, `multiple-click`
|
||||||
|
- For `type: swipe`: `left`, `right`, `up`, `down`
|
||||||
|
|
||||||
|
#### `button_id`
|
||||||
|
|
||||||
|
- **Description**: Identifies the button involved in the event (specific to `type: button`).
|
||||||
|
- **Example**: `button_id: 2`
|
||||||
|
|
||||||
|
#### `count`
|
||||||
|
|
||||||
|
- **Description**: Indicates the number of clicks or interactions (used with `action: multiple-click`).
|
||||||
|
- **Example**: `count: 3`
|
||||||
|
|
||||||
|
#### `swipe-direction`
|
||||||
|
|
||||||
|
- **Description**: Specifies the direction of a swipe (used with `type: swipe`).
|
||||||
|
- **Examples**: `left`, `right`, `up`, `down`
|
||||||
|
|
||||||
|
#### `position`
|
||||||
|
|
||||||
|
- **Description**: An integer from 1 to 10 indicating the touch position (available on all touch events).
|
||||||
|
- **Example**: `position: 3`
|
||||||
|
|
||||||
|
### Supported Event Types
|
||||||
|
|
||||||
|
#### Boot Events
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
event:
|
||||||
|
device_id: "abc123"
|
||||||
|
device_name: "living_room_panel"
|
||||||
|
firmware: "2024.12.1"
|
||||||
|
domain: boot
|
||||||
|
type: start
|
||||||
|
action: null
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
event:
|
||||||
|
device_id: "abc123"
|
||||||
|
device_name: "living_room_panel"
|
||||||
|
firmware: "2024.12.1"
|
||||||
|
domain: boot
|
||||||
|
type: done
|
||||||
|
action: null
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Touch Events
|
||||||
|
|
||||||
|
##### Button Event
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
event:
|
||||||
|
device_id: "abc123"
|
||||||
|
device_name: "living_room_panel"
|
||||||
|
firmware: "2024.12.1"
|
||||||
|
domain: touch
|
||||||
|
type: button
|
||||||
|
action: click
|
||||||
|
button_id: 1
|
||||||
|
count: 1
|
||||||
|
position: 3
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
event:
|
||||||
|
device_id: "abc123"
|
||||||
|
device_name: "living_room_panel"
|
||||||
|
firmware: "2024.12.1"
|
||||||
|
domain: touch
|
||||||
|
type: button
|
||||||
|
action: multiple-click
|
||||||
|
button_id: 1
|
||||||
|
count: 5
|
||||||
|
position: 3
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Swipe Event
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
event:
|
||||||
|
device_id: "abc123"
|
||||||
|
device_name: "living_room_panel"
|
||||||
|
firmware: "2024.12.1"
|
||||||
|
domain: touch
|
||||||
|
type: swipe
|
||||||
|
action: left
|
||||||
|
swipe-direction: left
|
||||||
|
position: 3
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
event:
|
||||||
|
device_id: "abc123"
|
||||||
|
device_name: "living_room_panel"
|
||||||
|
firmware: "2024.12.1"
|
||||||
|
domain: touch
|
||||||
|
type: swipe
|
||||||
|
action: up
|
||||||
|
swipe-direction: up
|
||||||
|
position: 3
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Multi-Touch Event
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
event:
|
||||||
|
device_id: "abc123"
|
||||||
|
device_name: "living_room_panel"
|
||||||
|
firmware: "2024.12.1"
|
||||||
|
domain: touch
|
||||||
|
type: multi_touch
|
||||||
|
action: release
|
||||||
|
position: 3
|
||||||
|
```
|
||||||
|
|
||||||
|
### Integration in Automations
|
||||||
|
|
||||||
|
#### Listening to Events
|
||||||
|
|
||||||
|
To utilize these events in Home Assistant, follow these steps:
|
||||||
|
|
||||||
|
1. Open the **Developer Tools** in Home Assistant.
|
||||||
|
2. Navigate to the **Events** tab.
|
||||||
|
3. Enter `esphome.tx_ultimate_easy` in the "Event to subscribe to" field.
|
||||||
|
4. Click "Start listening."
|
||||||
|
5. Trigger interactions on your TX Ultimate Easy device to see the events in real-time.
|
||||||
|
|
||||||
|
#### Example Automation YAML
|
||||||
|
|
||||||
|
##### Automation for a Single Click
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
trigger:
|
||||||
|
- platform: event
|
||||||
|
event_type: esphome.tx_ultimate_easy
|
||||||
|
event_data:
|
||||||
|
domain: touch
|
||||||
|
type: button
|
||||||
|
action: click
|
||||||
|
button_id: 1
|
||||||
|
position: 3
|
||||||
|
action:
|
||||||
|
- service: light.toggle
|
||||||
|
target:
|
||||||
|
entity_id: light.living_room
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Automation for a Swipe Gesture
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
trigger:
|
||||||
|
- platform: event
|
||||||
|
event_type: esphome.tx_ultimate_easy
|
||||||
|
event_data:
|
||||||
|
domain: touch
|
||||||
|
type: swipe
|
||||||
|
action: left
|
||||||
|
swipe-direction: left
|
||||||
|
position: 3
|
||||||
|
action:
|
||||||
|
- service: script.activate_scene
|
||||||
|
target:
|
||||||
|
entity_id: scene.relax_mode
|
||||||
|
```
|
||||||
|
|
||||||
|
This event engine provides a robust and extensible framework for handling device interactions,
|
||||||
|
allowing users to implement highly customized automations with ease.
|
||||||
76
versioning/README.md
Normal file
76
versioning/README.md
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
# Versioning
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
This project uses a time-based versioning scheme: `year.month.sequential_number`.
|
||||||
|
The system automates version updates and tagging to ensure consistent, conflict-free management of releases.
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
- `2024.1.1` – First release of January 2024.
|
||||||
|
- `2024.12.2` – Second release of December 2024.
|
||||||
|
|
||||||
|
## How It Works
|
||||||
|
1. **Temporary Branch Creation**: A unique branch is created for each workflow run.
|
||||||
|
2. **Version Update**: The workflow updates the `VERSION` and `VERSION_YAML` files using the current date and release sequence.
|
||||||
|
3. **Commit with Marker**: Changes are committed with a `[skip-versioning]` marker to prevent triggering the workflow again.
|
||||||
|
4. **Merge into Main**: The temporary branch is merged into `main`.
|
||||||
|
5. **Branch Cleanup**: The temporary branch is deleted after merging.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Automated Workflow
|
||||||
|
The versioning process is fully automated:
|
||||||
|
- Developers submit their changes as usual.
|
||||||
|
- The workflow handles version updates, tagging, and integration into `main`.
|
||||||
|
- No manual intervention is needed for versioning.
|
||||||
|
|
||||||
|
### Accessing the Version in Code
|
||||||
|
The version is accessible in the ESPHome YAML configuration file (`TX-Ultimate-Easy-ESPHome_core.yaml`) using the following syntax:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
substitutions:
|
||||||
|
version: <<: !include ../versioning/VERSION
|
||||||
|
```
|
||||||
|
|
||||||
|
This ensures the correct version is dynamically included in the ESPHome setup.
|
||||||
|
|
||||||
|
## Benefits
|
||||||
|
- **Clarity**: Easily track when a release occurred with meaningful version numbers.
|
||||||
|
- **Automation**: Eliminates manual version management.
|
||||||
|
- **Scalability**: Supports frequent updates and concurrent workflows.
|
||||||
|
- **Traceability**: Maintains a clear history of changes through Git tags and version files.
|
||||||
|
|
||||||
|
## System Details
|
||||||
|
|
||||||
|
### Version Format
|
||||||
|
The format `year.month.sequential_number` includes:
|
||||||
|
- `year` (YYYY): A 4-digit number representing the year.
|
||||||
|
- `month` (M): A number from 1 to 12 (no leading zeros).
|
||||||
|
- `sequential_number`: A positive number incremented with each release in the same month.
|
||||||
|
|
||||||
|
### Validation Rules
|
||||||
|
The `bump_version.sh` script enforces strict validation:
|
||||||
|
- Year must be a 4-digit number.
|
||||||
|
- Month must be 1–12 without leading zeros.
|
||||||
|
- Sequence must be a positive number without leading zeros.
|
||||||
|
|
||||||
|
If validation fails, the workflow stops and provides an error message.
|
||||||
|
|
||||||
|
### GitHub Workflow
|
||||||
|
The workflow is triggered automatically when:
|
||||||
|
- Changes are pushed to `main`.
|
||||||
|
- Developers trigger it manually using the `workflow_dispatch` event.
|
||||||
|
|
||||||
|
The workflow avoids infinite loops by committing changes with the `[skip-versioning]` marker.
|
||||||
|
|
||||||
|
## Extending the System
|
||||||
|
Consider extending the system to:
|
||||||
|
- Automatically generate release notes or changelogs.
|
||||||
|
- Notify stakeholders when a new version is released.
|
||||||
|
- Integrate versioning information into deployment pipelines.
|
||||||
|
|
||||||
|
## FAQ
|
||||||
|
**Q: What happens if two workflows run concurrently?**
|
||||||
|
A: Each workflow operates in its own temporary branch, avoiding conflicts.
|
||||||
|
|
||||||
|
**Q: Can I manually update the version?**
|
||||||
|
A: Manual updates are not needed. The workflow ensures accurate, automated versioning.
|
||||||
1
versioning/VERSION
Normal file
1
versioning/VERSION
Normal file
@@ -0,0 +1 @@
|
|||||||
|
2025.1.2
|
||||||
1
versioning/VERSION_YAML
Normal file
1
versioning/VERSION_YAML
Normal file
@@ -0,0 +1 @@
|
|||||||
|
version: 2025.1.2
|
||||||
54
versioning/bump_version.sh
Normal file
54
versioning/bump_version.sh
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
VERSION_FILE="./versioning/VERSION"
|
||||||
|
VERSION_YAML_FILE="./versioning/VERSION_YAML"
|
||||||
|
|
||||||
|
# Read the current version
|
||||||
|
if [ -f "$VERSION_FILE" ]; then
|
||||||
|
CURRENT_VERSION=$(cat "$VERSION_FILE")
|
||||||
|
else
|
||||||
|
CURRENT_VERSION="0.0.0" # Default if file doesn't exist
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Validate the current version format
|
||||||
|
if ! [[ "$CURRENT_VERSION" =~ ^[0-9]{4}\.[0-9]{1,2}\.[0-9]+$ ]]; then
|
||||||
|
echo "Error: Invalid version format in $VERSION_FILE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Extract components
|
||||||
|
CURRENT_YEAR=$(date +%Y)
|
||||||
|
CURRENT_MONTH=$(date +%-m) # Avoid leading zero for the month
|
||||||
|
CURRENT_SEQ=$(echo "$CURRENT_VERSION" | awk -F. '{print $3}')
|
||||||
|
|
||||||
|
VERSION_YEAR=$(echo "$CURRENT_VERSION" | awk -F. '{print $1}')
|
||||||
|
VERSION_MONTH=$(echo "$CURRENT_VERSION" | awk -F. '{print $2}')
|
||||||
|
|
||||||
|
# Determine new version
|
||||||
|
if [[ "$CURRENT_YEAR" == "$VERSION_YEAR" && "$CURRENT_MONTH" == "$VERSION_MONTH" ]]; then
|
||||||
|
NEXT_SEQ=$((CURRENT_SEQ + 1))
|
||||||
|
else
|
||||||
|
NEXT_SEQ=1 # Reset sequence for a new month
|
||||||
|
fi
|
||||||
|
|
||||||
|
NEW_VERSION="${CURRENT_YEAR}.${CURRENT_MONTH}.${NEXT_SEQ}"
|
||||||
|
|
||||||
|
# Update the plain text VERSION file
|
||||||
|
echo "$NEW_VERSION" > "$VERSION_FILE"
|
||||||
|
|
||||||
|
# Update the YAML VERSION_YAML file
|
||||||
|
echo "version: $NEW_VERSION" > "$VERSION_YAML_FILE"
|
||||||
|
|
||||||
|
# Commit and tag
|
||||||
|
if ! git add "$VERSION_FILE" "$VERSION_YAML_FILE"; then
|
||||||
|
echo "Error: Failed to stage version files"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if ! git commit -m "Bump version to $NEW_VERSION [skip-versioning]"; then
|
||||||
|
echo "Error: Failed to commit version bump"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if ! git tag "v$NEW_VERSION"; then
|
||||||
|
echo "Error: Failed to create version tag"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
Reference in New Issue
Block a user