mirror of
https://github.com/joBr99/nspanel-lovelace-ui.git
synced 2025-12-21 06:54:24 +01:00
Compare commits
220 Commits
v4.4.0
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
081d0c5a3b | ||
|
|
98f70b20f0 | ||
|
|
4c02b5bc26 | ||
|
|
fb841abf45 | ||
|
|
bff89f0364 | ||
|
|
27ccc0cfe7 | ||
|
|
22a54c88c8 | ||
|
|
87c58cc62d | ||
|
|
1ee19213bd | ||
|
|
0c3d173f40 | ||
|
|
cc201fb7fe | ||
|
|
44d2c6fbfc | ||
|
|
9cd2f6a464 | ||
|
|
7473d13762 | ||
|
|
f57b3fe8e4 | ||
|
|
9b1558c9a6 | ||
|
|
6181dec958 | ||
|
|
a94cf0cef3 | ||
|
|
d01ccede57 | ||
|
|
65be5ffeb0 | ||
|
|
d53afb0b20 | ||
|
|
9822870fc9 | ||
|
|
8a54d1422c | ||
|
|
3f573557f0 | ||
|
|
c2ca3b26d1 | ||
|
|
476a252a92 | ||
|
|
0af779973b | ||
|
|
8e0609a781 | ||
|
|
5dab816259 | ||
|
|
5f8409f5f1 | ||
|
|
3d85e86a95 | ||
|
|
85de880cda | ||
|
|
98269b19aa | ||
|
|
d77382ee88 | ||
|
|
e925d133d2 | ||
|
|
5ef3e8132b | ||
|
|
662b79a389 | ||
|
|
c984ff53a3 | ||
|
|
f8b748a418 | ||
|
|
bc31670760 | ||
|
|
cbf6abf4dd | ||
|
|
5c85e4a6e1 | ||
|
|
cbede2412e | ||
|
|
82d22743cc | ||
|
|
640d0dfa14 | ||
|
|
ccc62d1e6a | ||
|
|
6cec0245a3 | ||
|
|
f3c98adf06 | ||
|
|
f4487e4285 | ||
|
|
8e2780b2cb | ||
|
|
0372221973 | ||
|
|
947ef2d592 | ||
|
|
a1f39236c4 | ||
|
|
4cdd1ed586 | ||
|
|
1836d29931 | ||
|
|
fca29cfbd8 | ||
|
|
b27910c1af | ||
|
|
f046ae6031 | ||
|
|
4475ab1277 | ||
|
|
9afdb71a7c | ||
|
|
c84d78551f | ||
|
|
5e2a4b17ae | ||
|
|
acdba468b3 | ||
|
|
5803a489f5 | ||
|
|
54c8d302a8 | ||
|
|
8059905579 | ||
|
|
4dc39c1b79 | ||
|
|
16909f7e7f | ||
|
|
397932a6bc | ||
|
|
04ac10b453 | ||
|
|
ff103927e8 | ||
|
|
c6e94f80de | ||
|
|
5d4ae6247d | ||
|
|
8b63322e50 | ||
|
|
7fd5b3967a | ||
|
|
1d719446c0 | ||
|
|
3913b86228 | ||
|
|
3fddbfe451 | ||
|
|
c7b492c276 | ||
|
|
2e0cff80c1 | ||
|
|
3943dee733 | ||
|
|
41e7f3c3e2 | ||
|
|
5e373ad856 | ||
|
|
0d3d40cca2 | ||
|
|
221063a5a6 | ||
|
|
8e9b8ab476 | ||
|
|
1c6be4681e | ||
|
|
7b4f4cd863 | ||
|
|
9b285efe2d | ||
|
|
22e96f2b3a | ||
|
|
23da51f662 | ||
|
|
b395a08b6e | ||
|
|
ac07dbb185 | ||
|
|
86ab806b6e | ||
|
|
89d08ea507 | ||
|
|
deacd17fc9 | ||
|
|
4372e4193e | ||
|
|
d4cb8b548d | ||
|
|
faa2880e8d | ||
|
|
eeeccc786d | ||
|
|
3bcf2372b0 | ||
|
|
9612f882a5 | ||
|
|
aa29552a90 | ||
|
|
a38393338a | ||
|
|
d2e953410c | ||
|
|
0ac345328b | ||
|
|
11bf450e4c | ||
|
|
e54faea639 | ||
|
|
25062483c9 | ||
|
|
f58be676bf | ||
|
|
cc147d29ab | ||
|
|
78d20f81d2 | ||
|
|
29a3c8123c | ||
|
|
7807651223 | ||
|
|
deb7f6788e | ||
|
|
9ca7a4e829 | ||
|
|
855ab2b28c | ||
|
|
b1b042a25f | ||
|
|
3a82af67b1 | ||
|
|
84e2105361 | ||
|
|
bae90b2b55 | ||
|
|
f6b605443d | ||
|
|
14d337891a | ||
|
|
a3df442a6a | ||
|
|
53af81f84d | ||
|
|
02332cc094 | ||
|
|
19964f4ea6 | ||
|
|
3e777246a0 | ||
|
|
737bb80af0 | ||
|
|
07155018ef | ||
|
|
b8c0939382 | ||
|
|
985d395ba3 | ||
|
|
9f8e899af7 | ||
|
|
5359ed5e4b | ||
|
|
081d176f24 | ||
|
|
0bfe72eec9 | ||
|
|
d417aa2fb9 | ||
|
|
d647fb3b4f | ||
|
|
ebf6300b06 | ||
|
|
3977f9aa53 | ||
|
|
8478194bb0 | ||
|
|
417c99cdb9 | ||
|
|
0e8849a382 | ||
|
|
dd9ccaf076 | ||
|
|
ff461d821c | ||
|
|
6d68165fb6 | ||
|
|
489fd23edb | ||
|
|
4b39d5b438 | ||
|
|
b5a5aa41c6 | ||
|
|
e878e08675 | ||
|
|
246a7f1922 | ||
|
|
c83921ca71 | ||
|
|
c9deae3d5c | ||
|
|
8184c10e93 | ||
|
|
98746cc8d1 | ||
|
|
79fe05eb9c | ||
|
|
b2dd46411a | ||
|
|
2c7dd23220 | ||
|
|
a873e3e29e | ||
|
|
6a3b984c6c | ||
|
|
ebbcf7c21e | ||
|
|
0526b26b4a | ||
|
|
c20dab43a6 | ||
|
|
918a859a74 | ||
|
|
b3d3902399 | ||
|
|
69e02b0886 | ||
|
|
74a602c34d | ||
|
|
710bb2d884 | ||
|
|
7396806fab | ||
|
|
a87044a2b9 | ||
|
|
0c54f747b9 | ||
|
|
d6955eaad7 | ||
|
|
5638720336 | ||
|
|
e33875e9f5 | ||
|
|
9532ca2442 | ||
|
|
47f59e1b63 | ||
|
|
b9195101da | ||
|
|
34a9424c29 | ||
|
|
54ce2a1c10 | ||
|
|
5166fb1f58 | ||
|
|
5e9434b7eb | ||
|
|
a7398e54e3 | ||
|
|
ac54e042ea | ||
|
|
4f17085a81 | ||
|
|
c864eb6e73 | ||
|
|
828aa8fd21 | ||
|
|
84615fad05 | ||
|
|
b90b50395c | ||
|
|
c27a23e5fe | ||
|
|
1b33ddb207 | ||
|
|
d68de45c3b | ||
|
|
5b46b39dac | ||
|
|
2d0201759d | ||
|
|
104788e2a4 | ||
|
|
4f1139a531 | ||
|
|
f673aad38e | ||
|
|
c8a8e1351c | ||
|
|
5d84b59bbd | ||
|
|
2a807702f4 | ||
|
|
448b9cb30c | ||
|
|
248dc3a1c9 | ||
|
|
cd76c0528e | ||
|
|
58e2febf64 | ||
|
|
0372b034f6 | ||
|
|
1d730a0ce5 | ||
|
|
1a629ee8d5 | ||
|
|
cd563ad1ce | ||
|
|
ec18b6349b | ||
|
|
4d7d87d62a | ||
|
|
15a021a58f | ||
|
|
63c85e6b96 | ||
|
|
6a94795a67 | ||
|
|
d302567369 | ||
|
|
f8d6a1543d | ||
|
|
6df5a68682 | ||
|
|
7e1cc36805 | ||
|
|
491ed21f98 | ||
|
|
e53cf5dab0 | ||
|
|
e853889247 | ||
|
|
19b0fe4052 |
4
.github/workflows/builder.yaml
vendored
4
.github/workflows/builder.yaml
vendored
@@ -92,7 +92,7 @@ jobs:
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
if: env.BUILD_ARGS != '--test'
|
||||
uses: docker/login-action@v3.1.0
|
||||
uses: docker/login-action@v3.5.0
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
@@ -100,7 +100,7 @@ jobs:
|
||||
|
||||
- name: Build ${{ matrix.addon }} add-on
|
||||
if: steps.check.outputs.build_arch == 'true'
|
||||
uses: home-assistant/builder@2024.03.5
|
||||
uses: home-assistant/builder@2025.03.0
|
||||
with:
|
||||
args: |
|
||||
${{ env.BUILD_ARGS }} \
|
||||
|
||||
2
.github/workflows/docs-dev.yml
vendored
2
.github/workflows/docs-dev.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: actions/setup-python@v5
|
||||
- uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: 3.x
|
||||
- run: pip install mkdocs-material mkdocs-video markdown-include mike
|
||||
|
||||
2
.github/workflows/docs-release.yml
vendored
2
.github/workflows/docs-release.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: actions/setup-python@v5
|
||||
- uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: 3.x
|
||||
- run: pip install mkdocs-material mkdocs-video markdown-include mike
|
||||
|
||||
2
.github/workflows/lint.yaml
vendored
2
.github/workflows/lint.yaml
vendored
@@ -36,6 +36,6 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: 🚀 Run Home Assistant Add-on Lint
|
||||
uses: frenck/action-addon-linter@v2.15
|
||||
uses: frenck/action-addon-linter@v2.18
|
||||
with:
|
||||
path: "./${{ matrix.path }}"
|
||||
|
||||
@@ -336,7 +336,7 @@
|
||||
│ Value: 0
|
||||
│
|
||||
│ Variable (int32) xc1
|
||||
│ @@ -370,145 +336,50 @@
|
||||
│ @@ -370,165 +336,50 @@
|
||||
│ Scope : local
|
||||
│ Dragging : 0
|
||||
│ Send Component ID : disabled
|
||||
@@ -347,6 +347,10 @@
|
||||
│ - Events
|
||||
│ - Touch Press Event
|
||||
│ - tSend.txt="event,buttonPress2,"+entn1.txt+",button"
|
||||
│ - if(entn1.txt=="")
|
||||
│ - {
|
||||
│ - tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
│ - }
|
||||
│ - //send calc crc
|
||||
│ - btlen tSend.txt,sys0
|
||||
│ - crcrest 1,0xffff // reset CRC
|
||||
@@ -371,6 +375,10 @@
|
||||
│ - Events
|
||||
│ - Touch Press Event
|
||||
│ - tSend.txt="event,buttonPress2,"+entn2.txt+",button"
|
||||
│ - if(entn2.txt=="")
|
||||
│ - {
|
||||
│ - tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
│ - }
|
||||
│ - //send calc crc
|
||||
│ - btlen tSend.txt,sys0
|
||||
│ - crcrest 1,0xffff // reset CRC
|
||||
@@ -395,6 +403,10 @@
|
||||
│ - Events
|
||||
│ - Touch Press Event
|
||||
│ - tSend.txt="event,buttonPress2,"+entn3.txt+",button"
|
||||
│ - if(entn3.txt=="")
|
||||
│ - {
|
||||
│ - tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
│ - }
|
||||
│ - //send calc crc
|
||||
│ - btlen tSend.txt,sys0
|
||||
│ - crcrest 1,0xffff // reset CRC
|
||||
@@ -419,6 +431,10 @@
|
||||
│ - Events
|
||||
│ - Touch Press Event
|
||||
│ - tSend.txt="event,buttonPress2,"+entn4.txt+",button"
|
||||
│ - if(entn4.txt=="")
|
||||
│ - {
|
||||
│ - tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
│ - }
|
||||
│ - //send calc crc
|
||||
│ - btlen tSend.txt,sys0
|
||||
│ - crcrest 1,0xffff // reset CRC
|
||||
@@ -443,6 +459,10 @@
|
||||
│ - Events
|
||||
│ - Touch Press Event
|
||||
│ - tSend.txt="event,buttonPress2,"+entn5.txt+",button"
|
||||
│ - if(entn5.txt=="")
|
||||
│ - {
|
||||
│ - tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
│ - }
|
||||
│ - //send calc crc
|
||||
│ - btlen tSend.txt,sys0
|
||||
│ - crcrest 1,0xffff // reset CRC
|
||||
@@ -482,7 +502,7 @@
|
||||
│ Send Component ID : disabled
|
||||
│ Associated Keyboard: none
|
||||
│ Text : PM
|
||||
│ @@ -690,15 +561,14 @@
|
||||
│ @@ -710,15 +561,14 @@
|
||||
│ if(tTmp.txt!="")
|
||||
│ {
|
||||
│ covx tTmp.txt,defaultFontColor,0,0
|
||||
@@ -498,7 +518,7 @@
|
||||
│ if(tAMPM.txt=="")
|
||||
│ {
|
||||
│ vis tAMPM,0
|
||||
│ @@ -819,44 +689,34 @@
|
||||
│ @@ -839,44 +689,34 @@
|
||||
│ //e6Val
|
||||
│ spstr strCommand.txt,e6Val.txt,"~",60
|
||||
│ //f1Icon
|
||||
|
||||
@@ -2279,7 +2279,7 @@
|
||||
│ Value: 0
|
||||
│
|
||||
│ Variable (int32) xc1
|
||||
│ @@ -370,145 +324,50 @@
|
||||
│ @@ -370,165 +324,50 @@
|
||||
│ Scope : local
|
||||
│ Dragging : 0
|
||||
│ Send Component ID : disabled
|
||||
@@ -2290,6 +2290,10 @@
|
||||
│ - Events
|
||||
│ - Touch Press Event
|
||||
│ - tSend.txt="event,buttonPress2,"+entn1.txt+",button"
|
||||
│ - if(entn1.txt=="")
|
||||
│ - {
|
||||
│ - tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
│ - }
|
||||
│ - //send calc crc
|
||||
│ - btlen tSend.txt,sys0
|
||||
│ - crcrest 1,0xffff // reset CRC
|
||||
@@ -2314,6 +2318,10 @@
|
||||
│ - Events
|
||||
│ - Touch Press Event
|
||||
│ - tSend.txt="event,buttonPress2,"+entn2.txt+",button"
|
||||
│ - if(entn2.txt=="")
|
||||
│ - {
|
||||
│ - tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
│ - }
|
||||
│ - //send calc crc
|
||||
│ - btlen tSend.txt,sys0
|
||||
│ - crcrest 1,0xffff // reset CRC
|
||||
@@ -2338,6 +2346,10 @@
|
||||
│ - Events
|
||||
│ - Touch Press Event
|
||||
│ - tSend.txt="event,buttonPress2,"+entn3.txt+",button"
|
||||
│ - if(entn3.txt=="")
|
||||
│ - {
|
||||
│ - tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
│ - }
|
||||
│ - //send calc crc
|
||||
│ - btlen tSend.txt,sys0
|
||||
│ - crcrest 1,0xffff // reset CRC
|
||||
@@ -2362,6 +2374,10 @@
|
||||
│ - Events
|
||||
│ - Touch Press Event
|
||||
│ - tSend.txt="event,buttonPress2,"+entn4.txt+",button"
|
||||
│ - if(entn4.txt=="")
|
||||
│ - {
|
||||
│ - tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
│ - }
|
||||
│ - //send calc crc
|
||||
│ - btlen tSend.txt,sys0
|
||||
│ - crcrest 1,0xffff // reset CRC
|
||||
@@ -2386,6 +2402,10 @@
|
||||
│ - Events
|
||||
│ - Touch Press Event
|
||||
│ - tSend.txt="event,buttonPress2,"+entn5.txt+",button"
|
||||
│ - if(entn5.txt=="")
|
||||
│ - {
|
||||
│ - tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
│ - }
|
||||
│ - //send calc crc
|
||||
│ - btlen tSend.txt,sys0
|
||||
│ - crcrest 1,0xffff // reset CRC
|
||||
@@ -2425,7 +2445,7 @@
|
||||
│ Send Component ID : disabled
|
||||
│ Associated Keyboard: none
|
||||
│ Text : PM
|
||||
│ @@ -690,15 +549,14 @@
|
||||
│ @@ -710,15 +549,14 @@
|
||||
│ if(tTmp.txt!="")
|
||||
│ {
|
||||
│ covx tTmp.txt,defaultFontColor,0,0
|
||||
@@ -2441,7 +2461,7 @@
|
||||
│ if(tAMPM.txt=="")
|
||||
│ {
|
||||
│ vis tAMPM,0
|
||||
│ @@ -819,44 +677,34 @@
|
||||
│ @@ -839,44 +677,34 @@
|
||||
│ //e6Val
|
||||
│ spstr strCommand.txt,e6Val.txt,"~",60
|
||||
│ //f1Icon
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
+++ /dev/fd/62 2024-02-25 11:03:09.634837907 +0000
|
||||
+++ /dev/fd/62 2024-11-22 20:00:11.734673876 +0000
|
||||
+I/n2t-out/Program.s.txt
|
||||
++ HMI/US/portrait/n2t-out/Program.s.txt
|
||||
+1 +12,11 @@
|
||||
@@ -1821,7 +1821,7 @@
|
||||
+ Value: 0
|
||||
+
|
||||
+e (int32) xc1
|
||||
+145 +324,50 @@
|
||||
+165 +324,50 @@
|
||||
+ Scope : local
|
||||
+ Dragging : 0
|
||||
+ Send Component ID : disabled
|
||||
@@ -1832,6 +1832,10 @@
|
||||
+nts
|
||||
+ Touch Press Event
|
||||
+ tSend.txt="event,buttonPress2,"+entn1.txt+",button"
|
||||
+ if(entn1.txt=="")
|
||||
+ {
|
||||
+ tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
+ }
|
||||
+ //send calc crc
|
||||
+ btlen tSend.txt,sys0
|
||||
+ crcrest 1,0xffff // reset CRC
|
||||
@@ -1856,6 +1860,10 @@
|
||||
+nts
|
||||
+ Touch Press Event
|
||||
+ tSend.txt="event,buttonPress2,"+entn2.txt+",button"
|
||||
+ if(entn2.txt=="")
|
||||
+ {
|
||||
+ tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
+ }
|
||||
+ //send calc crc
|
||||
+ btlen tSend.txt,sys0
|
||||
+ crcrest 1,0xffff // reset CRC
|
||||
@@ -1880,6 +1888,10 @@
|
||||
+nts
|
||||
+ Touch Press Event
|
||||
+ tSend.txt="event,buttonPress2,"+entn3.txt+",button"
|
||||
+ if(entn3.txt=="")
|
||||
+ {
|
||||
+ tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
+ }
|
||||
+ //send calc crc
|
||||
+ btlen tSend.txt,sys0
|
||||
+ crcrest 1,0xffff // reset CRC
|
||||
@@ -1904,6 +1916,10 @@
|
||||
+nts
|
||||
+ Touch Press Event
|
||||
+ tSend.txt="event,buttonPress2,"+entn4.txt+",button"
|
||||
+ if(entn4.txt=="")
|
||||
+ {
|
||||
+ tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
+ }
|
||||
+ //send calc crc
|
||||
+ btlen tSend.txt,sys0
|
||||
+ crcrest 1,0xffff // reset CRC
|
||||
@@ -1928,6 +1944,10 @@
|
||||
+nts
|
||||
+ Touch Press Event
|
||||
+ tSend.txt="event,buttonPress2,"+entn5.txt+",button"
|
||||
+ if(entn5.txt=="")
|
||||
+ {
|
||||
+ tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
+ }
|
||||
+ //send calc crc
|
||||
+ btlen tSend.txt,sys0
|
||||
+ crcrest 1,0xffff // reset CRC
|
||||
|
||||
@@ -88,8 +88,8 @@ popupThermo
|
||||
276 Unique line(s) of event code
|
||||
screensaver2
|
||||
64 Component(s)
|
||||
428 Line(s) of event code
|
||||
266 Unique line(s) of event code
|
||||
448 Line(s) of event code
|
||||
272 Unique line(s) of event code
|
||||
cardEntities
|
||||
67 Component(s)
|
||||
1205 Line(s) of event code
|
||||
@@ -98,5 +98,5 @@ cardEntities
|
||||
Total
|
||||
23 Page(s)
|
||||
881 Component(s)
|
||||
10778 Line(s) of event code
|
||||
2466 Unique line(s) of event code
|
||||
10798 Line(s) of event code
|
||||
2472 Unique line(s) of event code
|
||||
|
||||
@@ -903,6 +903,10 @@ Text f1Icon
|
||||
Events
|
||||
Touch Press Event
|
||||
tSend.txt="event,buttonPress2,"+entn1.txt+",button"
|
||||
if(entn1.txt=="")
|
||||
{
|
||||
tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
}
|
||||
//send calc crc
|
||||
btlen tSend.txt,sys0
|
||||
crcrest 1,0xffff // reset CRC
|
||||
@@ -947,6 +951,10 @@ Text f2Icon
|
||||
Events
|
||||
Touch Press Event
|
||||
tSend.txt="event,buttonPress2,"+entn2.txt+",button"
|
||||
if(entn2.txt=="")
|
||||
{
|
||||
tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
}
|
||||
//send calc crc
|
||||
btlen tSend.txt,sys0
|
||||
crcrest 1,0xffff // reset CRC
|
||||
@@ -991,6 +999,10 @@ Text f3Icon
|
||||
Events
|
||||
Touch Press Event
|
||||
tSend.txt="event,buttonPress2,"+entn3.txt+",button"
|
||||
if(entn3.txt=="")
|
||||
{
|
||||
tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
}
|
||||
//send calc crc
|
||||
btlen tSend.txt,sys0
|
||||
crcrest 1,0xffff // reset CRC
|
||||
@@ -1035,6 +1047,10 @@ Text f4Icon
|
||||
Events
|
||||
Touch Press Event
|
||||
tSend.txt="event,buttonPress2,"+entn4.txt+",button"
|
||||
if(entn4.txt=="")
|
||||
{
|
||||
tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
}
|
||||
//send calc crc
|
||||
btlen tSend.txt,sys0
|
||||
crcrest 1,0xffff // reset CRC
|
||||
@@ -1079,6 +1095,10 @@ Text f5Icon
|
||||
Events
|
||||
Touch Press Event
|
||||
tSend.txt="event,buttonPress2,"+entn5.txt+",button"
|
||||
if(entn5.txt=="")
|
||||
{
|
||||
tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
}
|
||||
//send calc crc
|
||||
btlen tSend.txt,sys0
|
||||
crcrest 1,0xffff // reset CRC
|
||||
|
||||
@@ -377,6 +377,10 @@ Text f1Icon
|
||||
Events
|
||||
Touch Press Event
|
||||
tSend.txt="event,buttonPress2,"+entn1.txt+",button"
|
||||
if(entn1.txt=="")
|
||||
{
|
||||
tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
}
|
||||
//send calc crc
|
||||
btlen tSend.txt,sys0
|
||||
crcrest 1,0xffff // reset CRC
|
||||
@@ -401,6 +405,10 @@ Text f2Icon
|
||||
Events
|
||||
Touch Press Event
|
||||
tSend.txt="event,buttonPress2,"+entn2.txt+",button"
|
||||
if(entn2.txt=="")
|
||||
{
|
||||
tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
}
|
||||
//send calc crc
|
||||
btlen tSend.txt,sys0
|
||||
crcrest 1,0xffff // reset CRC
|
||||
@@ -425,6 +433,10 @@ Text f3Icon
|
||||
Events
|
||||
Touch Press Event
|
||||
tSend.txt="event,buttonPress2,"+entn3.txt+",button"
|
||||
if(entn3.txt=="")
|
||||
{
|
||||
tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
}
|
||||
//send calc crc
|
||||
btlen tSend.txt,sys0
|
||||
crcrest 1,0xffff // reset CRC
|
||||
@@ -449,6 +461,10 @@ Text f4Icon
|
||||
Events
|
||||
Touch Press Event
|
||||
tSend.txt="event,buttonPress2,"+entn4.txt+",button"
|
||||
if(entn4.txt=="")
|
||||
{
|
||||
tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
}
|
||||
//send calc crc
|
||||
btlen tSend.txt,sys0
|
||||
crcrest 1,0xffff // reset CRC
|
||||
@@ -473,6 +489,10 @@ Text f5Icon
|
||||
Events
|
||||
Touch Press Event
|
||||
tSend.txt="event,buttonPress2,"+entn5.txt+",button"
|
||||
if(entn5.txt=="")
|
||||
{
|
||||
tSend.txt="event,buttonPress2,screensaver,bExit,"+tTmp.txt
|
||||
}
|
||||
//send calc crc
|
||||
btlen tSend.txt,sys0
|
||||
crcrest 1,0xffff // reset CRC
|
||||
|
||||
BIN
HMI/nspanel.HMI
BIN
HMI/nspanel.HMI
Binary file not shown.
BIN
HMI/nspanel.tft
BIN
HMI/nspanel.tft
Binary file not shown.
@@ -5,7 +5,7 @@ If you like this project consider buying me a pizza 🍕 <a href="https://paypal
|
||||
[](https://github.com/hacs/integration)
|
||||

|
||||
[](https://github.com/joBr99/nspanel-lovelace-ui/releases)
|
||||

|
||||

|
||||
[](https://github.com/joBr99/nspanel-lovelace-ui/commits/main)
|
||||
|
||||
|
||||
|
||||
@@ -334,6 +334,11 @@ class LuiController(object):
|
||||
apis.ha_api.get_entity(entity_id).call_service("return_to_base")
|
||||
elif entity_id.startswith('service'):
|
||||
apis.ha_api.call_service(entity_id.replace('service.', '', 1).replace('.','/', 1), **entity_config.data)
|
||||
elif entity_id.startswith('valve'):
|
||||
if apis.ha_api.get_entity(entity_id).state == "open":
|
||||
apis.ha_api.get_entity(entity_id).call_service("close_valve")
|
||||
else:
|
||||
apis.ha_api.get_entity(entity_id).call_service("open_valve")
|
||||
|
||||
# for media page
|
||||
if button_type == "media-next":
|
||||
@@ -348,8 +353,8 @@ class LuiController(object):
|
||||
else:
|
||||
apis.ha_api.get_entity(entity_id).call_service("turn_off")
|
||||
if button_type == "media-shuffle":
|
||||
suffle = not apis.ha_api.get_entity(entity_id).attributes.shuffle
|
||||
apis.ha_api.get_entity(entity_id).call_service("shuffle_set", shuffle=suffle)
|
||||
shuffle = not apis.ha_api.get_entity(entity_id).attributes['shuffle']
|
||||
apis.ha_api.get_entity(entity_id).call_service("shuffle_set", shuffle=shuffle)
|
||||
if button_type == "volumeSlider":
|
||||
pos = int(value)
|
||||
# HA wants this value between 0 and 1 as float
|
||||
@@ -366,7 +371,7 @@ class LuiController(object):
|
||||
if button_type == "colorTempSlider":
|
||||
entity = apis.ha_api.get_entity(entity_id)
|
||||
#scale 0-100 from slider to color range of lamp
|
||||
color_val = scale(int(value), (0, 100), (entity.attributes.min_mireds, entity.attributes.max_mireds))
|
||||
color_val = scale(int(value), (0, 100), (entity.attributes['min_mireds'], entity.attributes['max_mireds']))
|
||||
apis.ha_api.get_entity(entity_id).call_service("turn_on", color_temp=color_val)
|
||||
if button_type == "colorWheel":
|
||||
apis.ha_api.log(value)
|
||||
@@ -393,9 +398,9 @@ class LuiController(object):
|
||||
if button_type == "opnSensorNotify":
|
||||
msg = ""
|
||||
entity = apis.ha_api.get_entity(entity_id)
|
||||
if "open_sensors" in entity.attributes and entity.attributes.open_sensors is not None:
|
||||
for e in entity.attributes.open_sensors:
|
||||
msg += f"- {apis.ha_api.get_entity(e).attributes.friendly_name}\r\n"
|
||||
if open_sensors := entity.attributes.get("open_sensors") is not None:
|
||||
for e in open_sensors:
|
||||
msg += f"- {apis.ha_api.get_entity(e).attributes['friendly_name']}\r\n"
|
||||
self._pages_gen.send_message_page("opnSensorNotifyRes", "", msg, "", "")
|
||||
|
||||
# for cardUnlock
|
||||
@@ -412,22 +417,22 @@ class LuiController(object):
|
||||
|
||||
if button_type == "mode-preset_modes":
|
||||
entity = apis.ha_api.get_entity(entity_id)
|
||||
preset_mode = entity.attributes.preset_modes[int(value)]
|
||||
preset_mode = entity.attributes['preset_modes'][int(value)]
|
||||
entity.call_service("set_preset_mode", preset_mode=preset_mode)
|
||||
|
||||
if button_type == "mode-swing_modes":
|
||||
entity = apis.ha_api.get_entity(entity_id)
|
||||
swing_mode = entity.attributes.swing_modes[int(value)]
|
||||
swing_mode = entity.attributes['swing_modes'][int(value)]
|
||||
entity.call_service("set_swing_mode", swing_mode=swing_mode)
|
||||
|
||||
if button_type == "mode-fan_modes":
|
||||
entity = apis.ha_api.get_entity(entity_id)
|
||||
fan_mode = entity.attributes.fan_modes[int(value)]
|
||||
fan_mode = entity.attributes['fan_modes'][int(value)]
|
||||
entity.call_service("set_fan_mode", fan_mode=fan_mode)
|
||||
|
||||
if button_type in ["mode-input_select", "mode-select"]:
|
||||
entity = apis.ha_api.get_entity(entity_id)
|
||||
option = entity.attributes.options[int(value)]
|
||||
option = entity.attributes['options'][int(value)]
|
||||
entity.call_service("select_option", option=option)
|
||||
|
||||
if button_type == "mode-light":
|
||||
@@ -439,12 +444,12 @@ class LuiController(object):
|
||||
if options_list is not None:
|
||||
option = options_list[int(value)]
|
||||
else:
|
||||
option = entity.attributes.effect_list[int(value)]
|
||||
option = entity.attributes['effect_list'][int(value)]
|
||||
entity.call_service("turn_on", effect=option)
|
||||
|
||||
if button_type == "mode-media_player":
|
||||
entity = apis.ha_api.get_entity(entity_id)
|
||||
option = entity.attributes.source_list[int(value)]
|
||||
option = entity.attributes['source_list'][int(value)]
|
||||
entity.call_service("select_source", source=option)
|
||||
|
||||
# timer detail page
|
||||
|
||||
@@ -159,8 +159,8 @@ alarm_control_panel_mapping = {
|
||||
}
|
||||
|
||||
climate_mapping = {
|
||||
'auto': 'calendar-sync',
|
||||
'heat_cool': 'calendar-sync',
|
||||
'auto': 'fan-auto',
|
||||
'heat_cool': 'sun-snowflake-variant',
|
||||
'heat': 'fire',
|
||||
'off': 'power',
|
||||
'cool': 'snowflake',
|
||||
@@ -266,8 +266,8 @@ def get_icon_ha(entity_id, overwrite=None, stateOverwrite=None):
|
||||
# based on media_content_type
|
||||
elif ha_type == "media_player":
|
||||
result_icon = "speaker-off"
|
||||
if "media_content_type" in entity.attributes:
|
||||
if entity.attributes.media_content_type in media_content_type_mapping:
|
||||
result_icon = media_content_type_mapping[entity.attributes.media_content_type]
|
||||
if media_content_type := entity.attributes.get("media_content_type"):
|
||||
if media_content_type in media_content_type_mapping:
|
||||
result_icon = media_content_type_mapping[media_content_type]
|
||||
|
||||
return get_icon_char(result_icon)
|
||||
|
||||
@@ -25,7 +25,7 @@ class LuiPagesGen(object):
|
||||
self._config = config
|
||||
self._locale = config.get("locale")
|
||||
self._send_mqtt_msg = send_mqtt_msg
|
||||
|
||||
|
||||
def get_entity_color(self, entity, ha_type=None, stateOverwrite=None, overwrite=None):
|
||||
if overwrite is not None:
|
||||
if type(overwrite) in [str, list]:
|
||||
@@ -82,7 +82,7 @@ class LuiPagesGen(object):
|
||||
icon_color = 63878 #red
|
||||
if state == "fog":
|
||||
icon_color = 38066 #75% grey
|
||||
if state in ["hail", "snowy"]:
|
||||
if state in ["hail", "snowy"]:
|
||||
icon_color = 65535 #white
|
||||
if state == "lightning":
|
||||
icon_color = 65120 #golden-yellow
|
||||
@@ -97,13 +97,12 @@ class LuiPagesGen(object):
|
||||
if state == "sunny":
|
||||
icon_color = 65504 #bright-yellow
|
||||
|
||||
if "rgb_color" in attr and attr.rgb_color:
|
||||
color = attr.rgb_color
|
||||
if "brightness" in attr and attr.brightness:
|
||||
color = rgb_brightness(color, attr.brightness)
|
||||
if color := attr.get("rgb_color"):
|
||||
if brightness := attr.get("brightness"):
|
||||
color = rgb_brightness(color, brightness)
|
||||
icon_color = rgb_dec565(color)
|
||||
elif "brightness" in attr and attr.brightness:
|
||||
color = rgb_brightness([253, 216, 53], attr.brightness)
|
||||
elif brightness := attr.get("brightness"):
|
||||
color = rgb_brightness([253, 216, 53], brightness)
|
||||
icon_color = rgb_dec565(color)
|
||||
return icon_color
|
||||
|
||||
@@ -129,7 +128,7 @@ class LuiPagesGen(object):
|
||||
else:
|
||||
dateformat = self._config.get("dateFormat")
|
||||
date = datetime.datetime.now().strftime(dateformat)
|
||||
|
||||
|
||||
addTemplate = self._config.get("dateAdditionalTemplate")
|
||||
addDateText = apis.ha_api.render_template(addTemplate)
|
||||
self._send_mqtt_msg(f"date~{date}{addDateText}")
|
||||
@@ -138,7 +137,7 @@ class LuiPagesGen(object):
|
||||
if target_page == "cardUnlock":
|
||||
target_page = "cardAlarm"
|
||||
self._send_mqtt_msg(f"pageType~{target_page}")
|
||||
|
||||
|
||||
def update_screensaver_weather(self, theme):
|
||||
entities = self._config._config_screensaver.entities
|
||||
|
||||
@@ -151,7 +150,7 @@ class LuiPagesGen(object):
|
||||
item_str = ""
|
||||
for item in entities:
|
||||
item_str += self.generate_entities_item(item, "cardEntities", mask=["type", "entityId"])
|
||||
|
||||
|
||||
self._send_mqtt_msg(f"weatherUpdate{item_str}")
|
||||
# send color if configured in screensaver
|
||||
if theme is not None:
|
||||
@@ -181,11 +180,11 @@ class LuiPagesGen(object):
|
||||
colorOverride = item.colorOverride
|
||||
name = item.nameOverride
|
||||
uuid = item.uuid
|
||||
|
||||
|
||||
# check ha template for name
|
||||
if item.nameOverride is not None and ("{" in item.nameOverride and "}" in item.nameOverride):
|
||||
name = apis.ha_api.render_template(item.nameOverride)
|
||||
|
||||
|
||||
# type of the item is the string before the "." in the entityId
|
||||
if entityId is not None:
|
||||
entityType = entityId.split(".")[0]
|
||||
@@ -257,7 +256,7 @@ class LuiPagesGen(object):
|
||||
if entity is None:
|
||||
return f"~text~{entityId}~{get_icon_id('alert-circle-outline')}~17299~Not found check~ apps.yaml"
|
||||
|
||||
|
||||
|
||||
# HA Entities
|
||||
# common res vars
|
||||
entityTypePanel = "text"
|
||||
@@ -276,7 +275,7 @@ class LuiPagesGen(object):
|
||||
icon_up_status = "disable"
|
||||
icon_stop_status = "disable"
|
||||
icon_down_status = "disable"
|
||||
bits = entity.attributes.supported_features
|
||||
bits = entity.attributes.get('supported_features')
|
||||
pos = entity.attributes.get("current_position")
|
||||
if pos is None:
|
||||
pos_status = entity.state
|
||||
@@ -309,13 +308,18 @@ class LuiPagesGen(object):
|
||||
device_class = entity.attributes.get("device_class", "")
|
||||
unit_of_measurement = entity.attributes.get("unit_of_measurement", "")
|
||||
value = entity.state
|
||||
|
||||
|
||||
try:
|
||||
value = str(round(float(value), 1))
|
||||
except:
|
||||
print("An exception occurred")
|
||||
|
||||
# limit value to 4 chars on us-p
|
||||
if self._config.get("model") == "us-p" and cardType == "cardEntities":
|
||||
value = entity.state[:4]
|
||||
if value[-1] == ".":
|
||||
value = value[:-1]
|
||||
|
||||
|
||||
if device_class != "temperature":
|
||||
value = value + " "
|
||||
value = value + unit_of_measurement
|
||||
@@ -383,20 +387,50 @@ class LuiPagesGen(object):
|
||||
elif entityType == "weather":
|
||||
entityTypePanel = "text"
|
||||
unit = get_attr_safe(entity, "temperature_unit", "")
|
||||
if type(item.stype) == int and len(entity.attributes.forecast) >= item.stype:
|
||||
fdate = dp.parse(entity.attributes.forecast[item.stype]['datetime'])
|
||||
global babel_spec
|
||||
if babel_spec is not None:
|
||||
dateformat = "E" if item.nameOverride is None else item.nameOverride
|
||||
name = babel.dates.format_datetime(fdate.astimezone(), dateformat, locale=self._locale)
|
||||
rt = None
|
||||
if type(item.stype) == str and ":" in item.stype and len(item.stype.split(":")) == 2:
|
||||
spintstr = item.stype.split(":")
|
||||
rt = spintstr[0]
|
||||
item.stype = int(spintstr[1])
|
||||
if type(item.stype) == int:
|
||||
bits = get_attr_safe(entity, "supported_features", 0b0)
|
||||
if not rt:
|
||||
rt = "daily"
|
||||
if bits & 0b001: #FORECAST_DAILY
|
||||
rt = "daily"
|
||||
elif bits & 0b010: #FORECAST_HOURLY
|
||||
rt = "hourly"
|
||||
elif bits & 0b100: #FORECAST_TWICE_DAILY
|
||||
rt = "twice_daily"
|
||||
|
||||
results = apis.ha_api.call_service(
|
||||
"weather/get_forecasts", target={"entity_id": entityId}, service_data={"type": rt}
|
||||
)
|
||||
forecast = results.get("result", {}).get("response", {}).get(entityId, {}).get('forecast') or entity.attributes.get('forecast', [])
|
||||
if len(forecast) >= item.stype:
|
||||
day_forecast = forecast[item.stype]
|
||||
fdate = dp.parse(day_forecast['datetime'])
|
||||
global babel_spec
|
||||
if babel_spec is not None:
|
||||
dateformat = "E" if item.nameOverride is None else item.nameOverride
|
||||
name = babel.dates.format_datetime(fdate.astimezone(), dateformat, locale=self._locale)
|
||||
else:
|
||||
dateformat = "%a" if item.nameOverride is None else item.nameOverride
|
||||
name = fdate.astimezone().strftime(dateformat)
|
||||
icon_id = get_icon_ha(entityId, stateOverwrite=day_forecast['condition'])
|
||||
value = f'{day_forecast.get("temperature", "")}{unit}'
|
||||
color = self.get_entity_color(entity, ha_type=entityType, stateOverwrite=day_forecast['condition'], overwrite=colorOverride)
|
||||
else:
|
||||
dateformat = "%a" if item.nameOverride is None else item.nameOverride
|
||||
name = fdate.astimezone().strftime(dateformat)
|
||||
icon_id = get_icon_ha(entityId, stateOverwrite=entity.attributes.forecast[item.stype]['condition'])
|
||||
value = f'{entity.attributes.forecast[item.stype].get("temperature", "")}{unit}'
|
||||
color = self.get_entity_color(entity, ha_type=entityType, stateOverwrite=entity.attributes.forecast[item.stype]['condition'], overwrite=colorOverride)
|
||||
value = f'{get_attr_safe(entity, "temperature", "")}{unit}'
|
||||
else:
|
||||
value = f'{get_attr_safe(entity, "temperature", "")}{unit}'
|
||||
elif entityType == "valve":
|
||||
entityTypePanel = "valve"
|
||||
value = get_translation(self._locale, f"backend.component.binary_sensor.state.door.{entity.state}")
|
||||
if entity.state == "open":
|
||||
icon_id = get_icon_id("valve-open")
|
||||
else:
|
||||
icon_id = get_icon_id("valve-closed")
|
||||
else:
|
||||
name = "unsupported"
|
||||
# Overwrite for value
|
||||
@@ -455,7 +489,7 @@ class LuiPagesGen(object):
|
||||
command = f"entityUpd~Not found~{navigation}~{item}~check~220~apps.yaml~150~300~5~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Please~your~~"
|
||||
else:
|
||||
entity = apis.ha_api.get_entity(item)
|
||||
heading = title if title != "unknown" else entity.attributes.friendly_name
|
||||
heading = title if title != "unknown" else entity.attributes['friendly_name']
|
||||
current_temp = get_attr_safe(entity, "current_temperature", "")
|
||||
dest_temp = get_attr_safe(entity, "temperature", None)
|
||||
dest_temp2 = ""
|
||||
@@ -476,10 +510,10 @@ class LuiPagesGen(object):
|
||||
state_value += get_translation(self._locale, f"backend.component.climate.state._.{entity.state}")
|
||||
if hvac_action != "":
|
||||
state_value += ")"
|
||||
|
||||
|
||||
min_temp = int(get_attr_safe(entity, "min_temp", 0)*10)
|
||||
max_temp = int(get_attr_safe(entity, "max_temp", 0)*10)
|
||||
step_temp = int(get_attr_safe(entity, "target_temp_step", 0.5)*10)
|
||||
step_temp = int(get_attr_safe(entity, "target_temp_step", 0.5)*10)
|
||||
icon_res_list = []
|
||||
icon_res = ""
|
||||
|
||||
@@ -504,7 +538,7 @@ class LuiPagesGen(object):
|
||||
state = 0
|
||||
if(mode == entity.state):
|
||||
state = 1
|
||||
|
||||
|
||||
icon_res_list.append(f"~{icon_id}~{color_on}~{state}~{mode}")
|
||||
|
||||
icon_res = "".join(icon_res_list)
|
||||
@@ -519,11 +553,11 @@ class LuiPagesGen(object):
|
||||
icon_res = "~"*4 + icon_res_list[0] + "~"*4 + icon_res_list[1] + "~"*4 + icon_res_list[2] + "~"*4 + icon_res_list[3]
|
||||
elif len(icon_res_list) >= 5 or self._config.get("model") == "us-p":
|
||||
icon_res = "".join(icon_res_list) + "~"*4*(8-len(icon_res_list))
|
||||
|
||||
|
||||
currently_translation = get_translation(self._locale, "frontend.ui.card.climate.currently")
|
||||
state_translation = get_translation(self._locale, "frontend.ui.panel.config.devices.entities.state")
|
||||
action_translation = get_translation(self._locale, "frontend.ui.card.climate.operation").replace(' ','\r\n')
|
||||
|
||||
|
||||
detailPage = "1"
|
||||
if any(x in ["preset_modes", "swing_modes", "fan_modes"] for x in entity.attributes):
|
||||
detailPage = "0"
|
||||
@@ -537,7 +571,7 @@ class LuiPagesGen(object):
|
||||
command = f"entityUpd~Not found~{navigation}"
|
||||
else:
|
||||
entity = apis.ha_api.get_entity(item)
|
||||
heading = title if title != "unknown" else entity.attributes.friendly_name
|
||||
heading = title if title != "unknown" else entity.attributes['friendly_name']
|
||||
|
||||
# get data from homeassistant
|
||||
data_raw = apis.ha_api.get_history(entity_id = item, days = 7)
|
||||
@@ -584,12 +618,12 @@ class LuiPagesGen(object):
|
||||
else:
|
||||
media_icon = self.generate_entities_item(entity, "cardGrid")
|
||||
ha_entity = apis.ha_api.get_entity(entityId)
|
||||
heading = title if title != "unknown" else ha_entity.attributes.friendly_name
|
||||
heading = title if title != "unknown" else ha_entity.attributes['friendly_name']
|
||||
title = get_attr_safe(ha_entity, "media_title", "")
|
||||
author = get_attr_safe(ha_entity, "media_artist", "")
|
||||
volume = int(get_attr_safe(ha_entity, "volume_level", 0)*100)
|
||||
iconplaypause = get_icon_id("pause") if ha_entity.state == "playing" else get_icon_id("play")
|
||||
bits = ha_entity.attributes.supported_features
|
||||
bits = ha_entity.attributes['supported_features']
|
||||
onoffbutton = "disable"
|
||||
if bits & 0b10000000:
|
||||
if ha_entity.state == "off":
|
||||
@@ -607,7 +641,7 @@ class LuiPagesGen(object):
|
||||
item_str = ""
|
||||
for item in entities:
|
||||
item_str += self.generate_entities_item(item, "cardGrid")
|
||||
|
||||
|
||||
bck_override = entity.iconOverride
|
||||
if entity.status is not None:
|
||||
bck_entity = entity.entityId
|
||||
@@ -615,14 +649,14 @@ class LuiPagesGen(object):
|
||||
|
||||
entity.iconOverride = "mdi:speaker"
|
||||
item_str += self.generate_entities_item(entity, "cardGrid")
|
||||
|
||||
|
||||
entity.iconOverride = bck_override
|
||||
if entity.status is not None:
|
||||
entity.entityId = bck_entity
|
||||
|
||||
command = f"entityUpd~{heading}~{navigation}~{entityId}~{title}~~{author}~~{volume}~{iconplaypause}~{onoffbutton}~{shuffleBtn}{media_icon}{item_str}"
|
||||
self._send_mqtt_msg(command)
|
||||
|
||||
|
||||
def generate_alarm_page(self, navigation, title, entity, overwrite_supported_modes, alarmBtn):
|
||||
item = entity.entityId
|
||||
if not apis.ha_api.entity_exists(item):
|
||||
@@ -639,7 +673,7 @@ class LuiPagesGen(object):
|
||||
if not entity.attributes.get("code_arm_required", False):
|
||||
numpad = "disable"
|
||||
if overwrite_supported_modes is None:
|
||||
bits = entity.attributes.supported_features
|
||||
bits = entity.attributes['supported_features']
|
||||
if bits & 0b000001:
|
||||
supported_modes.append("arm_home")
|
||||
if bits & 0b000010:
|
||||
@@ -678,7 +712,7 @@ class LuiPagesGen(object):
|
||||
|
||||
#add button to show sensor state
|
||||
add_btn = ""
|
||||
if "open_sensors" in entity.attributes and entity.attributes.open_sensors is not None:
|
||||
if entity.attributes.get("open_sensors") is not None:
|
||||
add_btn=f"{get_icon_id('progress-alert')}~{rgb_dec565([243,179,0])}~"
|
||||
if alarmBtn is not None and type(alarmBtn) is dict:
|
||||
entity = alarmBtn.get("entity")
|
||||
@@ -689,8 +723,8 @@ class LuiPagesGen(object):
|
||||
else:
|
||||
icon_color = rgb_dec565([243,179,0])
|
||||
add_btn=f"{iconnav}~{icon_color}~{entity}"
|
||||
|
||||
|
||||
|
||||
|
||||
# add padding to arm buttons
|
||||
arm_buttons = ""
|
||||
for b in supported_modes:
|
||||
@@ -700,12 +734,12 @@ class LuiPagesGen(object):
|
||||
arm_buttons += "~"*((4-len(supported_modes))*2)
|
||||
command = f"entityUpd~{title}~{navigation}~{item}{arm_buttons}~{icon}~{color}~{numpad}~{flashing}~{add_btn}"
|
||||
self._send_mqtt_msg(command)
|
||||
|
||||
|
||||
def generate_unlock_page(self, navigation, item, title, destination, pin):
|
||||
color = rgb_dec565([255,0,0])
|
||||
icon = get_icon_id("lock")
|
||||
supported_modes = ["cardUnlock-unlock"]
|
||||
|
||||
|
||||
# add padding to arm buttons
|
||||
arm_buttons = ""
|
||||
for b in supported_modes:
|
||||
@@ -744,8 +778,8 @@ class LuiPagesGen(object):
|
||||
if (time.time()-card.last_update) < card.cooldown:
|
||||
return
|
||||
card.last_update = time.time()
|
||||
|
||||
|
||||
|
||||
|
||||
leftBtn = "delete~~~~~"
|
||||
if card.uuid_prev is not None:
|
||||
leftBtn = self.generate_entities_item(Entity(
|
||||
@@ -791,7 +825,7 @@ class LuiPagesGen(object):
|
||||
self._send_mqtt_msg(f"timeout~{card.sleepTimeout}")
|
||||
else:
|
||||
self._send_mqtt_msg(f'timeout~{self._config.get("sleepTimeout")}')
|
||||
|
||||
|
||||
temp_unit = card.raw_config.get("temperatureUnit", "celsius")
|
||||
if card.cardType in ["cardEntities", "cardGrid", "cardGrid1","cardGrid2"]:
|
||||
self.generate_entities_page(navigation, card.title, card.entities, card.cardType, temp_unit)
|
||||
@@ -845,25 +879,26 @@ class LuiPagesGen(object):
|
||||
color_temp = "disable"
|
||||
color = "disable"
|
||||
effect_supported = "disable"
|
||||
|
||||
if "onoff" not in entity.attributes.supported_color_modes:
|
||||
supported_color_modes = entity.attributes['supported_color_modes']
|
||||
|
||||
if "onoff" not in supported_color_modes:
|
||||
brightness = 0
|
||||
if entity.state == "on":
|
||||
if "brightness" in entity.attributes and entity.attributes.brightness:
|
||||
if brightness := entity.attributes.get("brightness"):
|
||||
# scale 0-255 brightness from ha to 0-100
|
||||
brightness = int(scale(entity.attributes.brightness,(0,255),(0,100)))
|
||||
brightness = int(scale(brightness, (0,255), (0,100)))
|
||||
else:
|
||||
brightness = "disable"
|
||||
if "color_temp" in entity.attributes.supported_color_modes and entity.attributes.supported_color_modes:
|
||||
if "color_temp" in entity.attributes and entity.attributes.color_temp:
|
||||
if "color_temp" in supported_color_modes:
|
||||
if color_temp := entity.attributes.get("color_temp"):
|
||||
# scale ha color temp range to 0-100
|
||||
color_temp = int(scale(entity.attributes.color_temp,(entity.attributes.min_mireds, entity.attributes.max_mireds),(0,100)))
|
||||
color_temp = int(scale(color_temp, (entity.attributes['min_mireds'], entity.attributes['max_mireds']),(0, 100)))
|
||||
else:
|
||||
color_temp = "unknown"
|
||||
else:
|
||||
color_temp = "disable"
|
||||
list_color_modes = ["xy", "rgb", "rgbw", "hs"]
|
||||
if any(item in list_color_modes for item in entity.attributes.supported_color_modes):
|
||||
if any(item in list_color_modes for item in supported_color_modes):
|
||||
color = "enable"
|
||||
else:
|
||||
color = "disable"
|
||||
@@ -873,20 +908,20 @@ class LuiPagesGen(object):
|
||||
brightness_translation = get_translation(self._locale, "frontend.ui.card.light.brightness")
|
||||
color_temp_translation = get_translation(self._locale, "frontend.ui.card.light.color_temperature")
|
||||
self._send_mqtt_msg(f"entityUpdateDetail~{entity_id}~~{icon_color}~{switch_val}~{brightness}~{color_temp}~{color}~{color_translation}~{color_temp_translation}~{brightness_translation}~{effect_supported}", force=is_open_detail)
|
||||
|
||||
|
||||
def generate_shutter_detail_page(self, entity_id, is_open_detail=False):
|
||||
entity = apis.ha_api.get_entity(entity_id)
|
||||
entityType = "cover"
|
||||
device_class = entity.attributes.get("device_class", "window")
|
||||
icon_id = get_icon_ha(entity_id)
|
||||
|
||||
|
||||
pos = entity.attributes.get("current_position")
|
||||
if pos is None:
|
||||
pos_status = entity.state
|
||||
pos = "disable"
|
||||
else:
|
||||
pos_status = pos
|
||||
|
||||
|
||||
pos_translation = ""
|
||||
icon_up = ""
|
||||
icon_stop = ""
|
||||
@@ -903,7 +938,7 @@ class LuiPagesGen(object):
|
||||
iconTiltRightStatus = "disable"
|
||||
tilt_pos = "disable"
|
||||
|
||||
bits = entity.attributes.supported_features
|
||||
bits = entity.attributes['supported_features']
|
||||
|
||||
# position supported
|
||||
if bits & 0b00001111:
|
||||
@@ -990,7 +1025,7 @@ class LuiPagesGen(object):
|
||||
if modes:
|
||||
modes_out += f"{heading}~{mode}~{cur_mode}~{modes_res}~"
|
||||
|
||||
self._send_mqtt_msg(f"entityUpdateDetail~{entity_id}~{icon_id}~{icon_color}~{modes_out}", force=is_open_detail)
|
||||
self._send_mqtt_msg(f"entityUpdateDetail~{entity_id}~{icon_id}~{icon_color}~{modes_out}", force=is_open_detail)
|
||||
|
||||
def generate_input_select_detail_page(self, entity_id, is_open_detail=False):
|
||||
options_list = None
|
||||
@@ -1054,8 +1089,9 @@ class LuiPagesGen(object):
|
||||
label2 = get_translation(self._locale, "frontend.ui.card.timer.actions.cancel")
|
||||
label3 = get_translation(self._locale, "frontend.ui.card.timer.actions.finish")
|
||||
self._send_mqtt_msg(f"entityUpdateDetail~{entity_id}~~{icon_color}~{entity_id}~{min_remaining}~{sec_remaining}~{editable}~{action1}~{action2}~{action3}~{label1}~{label2}~{label3}", force=is_open_detail)
|
||||
|
||||
|
||||
def send_message_page(self, ident, heading, msg, b1, b2):
|
||||
self._send_mqtt_msg(f"pageType~popupNotify")
|
||||
self._send_mqtt_msg(f"entityUpdateDetail~{ident}~{heading}~65535~{b1}~65535~{b2}~65535~{msg}~65535~0")
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ class NsPanelLovelaceUIManager(ad.ADBase):
|
||||
|
||||
desired_tasmota_driver_version = 8
|
||||
desired_display_firmware_version = 53
|
||||
version = "v4.3.3"
|
||||
version = "v4.7.3"
|
||||
|
||||
model = cfg.get("model")
|
||||
if model == "us-l":
|
||||
|
||||
@@ -94,33 +94,3 @@ Now, to install NSPanel Lovelace UI Backend with HACS, follow these steps:
|
||||
proceed with the download
|
||||
7. The Backend Application is now installed, and HACS will inform you when updates are available
|
||||
|
||||
# Workaround for HomeAssistant 2024.04
|
||||
AppDaemon is using the old REST API that until AppDaemon moved on the the websocket API this woraround is needed to get weather forecast data from homeassistant. (https://github.com/AppDaemon/appdaemon/issues/1837)
|
||||
|
||||
To get the forecast data in appdaemon, there is a script needed in homeassistant's configuration.yaml:
|
||||
|
||||
```yaml
|
||||
template:
|
||||
- trigger:
|
||||
- platform: time_pattern
|
||||
hours: /1
|
||||
action:
|
||||
- service: weather.get_forecasts
|
||||
data:
|
||||
type: daily
|
||||
target:
|
||||
entity_id: weather.k3ll3r # change to your weather entity in this line
|
||||
response_variable: daily
|
||||
sensor:
|
||||
- name: Weather Forecast Daily
|
||||
unique_id: weather_forecast_daily
|
||||
state: "{{ now().isoformat() }}"
|
||||
attributes:
|
||||
forecast: "{{ daily['weather.k3ll3r'].forecast }}" # change to your weather entity in this line
|
||||
```
|
||||

|
||||
|
||||
Adjust the entities in your apps.yaml that are accessing the forecast to the newly created trigger template:
|
||||
|
||||

|
||||
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
var sourceDP = 'alias.0.Wohnzimmer.Heizung.ACTUAL';
|
||||
var targetDP = '0_userdata.0.Test.chartTest';
|
||||
var rangeHours = 24;
|
||||
var maxXAchsisTicks = 6;
|
||||
var historyInstance = 'history.0';
|
||||
const sourceDP = 'alias.0.Wohnzimmer.Heizung.ACTUAL';
|
||||
const targetDP = '0_userdata.0.Test.chartTest';
|
||||
const rangeHours = 24;
|
||||
const maxXAchsisTicks = 6;
|
||||
const historyInstance = 'history.0';
|
||||
const factor = 1; // Bei zu großen Werten und negativen Anzeigen im Panel um das 10fache erhöhen
|
||||
|
||||
on({id: sourceDP, change: "any"}, async function (obj) {
|
||||
sendTo(historyInstance, 'getHistory', {
|
||||
@@ -25,7 +26,7 @@ on({id: sourceDP, change: "any"}, async function (obj) {
|
||||
//Check history items for requested hours
|
||||
for (var j = 0, targetValue = 0; j < result.result.length; j++) {
|
||||
var valueDate = new Date(result.result[j].ts);
|
||||
var value = (Math.round(result.result[j].val * 10) / 10);
|
||||
var value = Math.round(result.result[j].val / factor * 10);
|
||||
|
||||
if (valueDate > targetDate){
|
||||
if ((targetDate.getHours() % stepXAchsis) == 0){
|
||||
@@ -47,4 +48,4 @@ on({id: sourceDP, change: "any"}, async function (obj) {
|
||||
setState(targetDP, cardChartString, true);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
BIN
ioBroker/HMI/nspanel-us-l-v4.5.0.HMI
Normal file
BIN
ioBroker/HMI/nspanel-us-l-v4.5.0.HMI
Normal file
Binary file not shown.
BIN
ioBroker/HMI/nspanel-us-p-v4.5.0.HMI
Normal file
BIN
ioBroker/HMI/nspanel-us-p-v4.5.0.HMI
Normal file
Binary file not shown.
BIN
ioBroker/HMI/nspanel-v4.5.0.HMI
Normal file
BIN
ioBroker/HMI/nspanel-v4.5.0.HMI
Normal file
Binary file not shown.
13609
ioBroker/NsPanelTs.ts
13609
ioBroker/NsPanelTs.ts
File diff suppressed because it is too large
Load Diff
@@ -2564,7 +2564,11 @@
|
||||
"crossfade":{
|
||||
"en-US":"Crossfade",
|
||||
"de-DE":"Überblenden"
|
||||
},
|
||||
},
|
||||
"tools":{
|
||||
"en-US":"Tools",
|
||||
"de-DE":"Tools"
|
||||
},
|
||||
"speaker":{
|
||||
"en-US":"Speakerlist",
|
||||
"de-DE":"Wiedergabegeräte",
|
||||
|
||||
@@ -2701,5 +2701,13 @@
|
||||
"scriptname":{
|
||||
"en-US":"Script name",
|
||||
"de-DE":"Skriptname"
|
||||
},
|
||||
"hiddencards_offon":{
|
||||
"en-US":"hidden Cards (on/off)",
|
||||
"de-DE":"ausgeblendete Seiten (an/aus)"
|
||||
},
|
||||
"easyview_layout":{
|
||||
"en-US":"Easyview Layout",
|
||||
"de-DE":"Einfaches Layout"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -228,6 +228,8 @@ class LovelaceUIPanel:
|
||||
self.render_current_page(requested=True)
|
||||
if msg[1] == "buttonPress2":
|
||||
entity_id = msg[2]
|
||||
if entity_id == "":
|
||||
return
|
||||
btype = msg[3]
|
||||
value = msg[4] if len(msg) > 4 else None
|
||||
if btype == "bExit":
|
||||
@@ -278,6 +280,8 @@ class LovelaceUIPanel:
|
||||
self.privious_cards.append(self.current_card)
|
||||
self.current_card = self.searchCard(card_iid)
|
||||
self.render_current_page(switchPages=True)
|
||||
case 'mode-light':
|
||||
ha_control.handle_buttons(entity_id, btype, value, entity_config=entity_config)
|
||||
case _:
|
||||
ha_control.handle_buttons(entity_id, btype, value)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user