mirror of
https://github.com/joBr99/nspanel-lovelace-ui.git
synced 2026-02-19 03:16:59 +01:00
Compare commits
7 Commits
v4.7.3
...
009f61a61c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
009f61a61c | ||
|
|
7f621c935d | ||
|
|
0af6d354c8 | ||
|
|
fe3b23fc76 | ||
|
|
9f26d4cd2e | ||
|
|
8059f65b11 | ||
|
|
b22e055c18 |
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.4.0
|
||||
uses: docker/login-action@v3.0.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@2025.03.0
|
||||
uses: home-assistant/builder@2024.01.0
|
||||
with:
|
||||
args: |
|
||||
${{ env.BUILD_ARGS }} \
|
||||
|
||||
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.18
|
||||
uses: frenck/action-addon-linter@v2.15
|
||||
with:
|
||||
path: "./${{ matrix.path }}"
|
||||
|
||||
@@ -102,28 +102,6 @@
|
||||
│ crcputs sys0,2
|
||||
│ crcputs tSend.txt,0
|
||||
│ //send cmd
|
||||
│ --- HMI/n2t-out/popupLight.txt
|
||||
├── +++ HMI/US/landscape/n2t-out/popupLight.txt
|
||||
│ @@ -453,19 +453,14 @@
|
||||
│ ucopy strCommand.txt,4,payloadLength-5,0
|
||||
│ // write instruction to tInstuction (debug output, but used as variable here, ui elements will be disabled by default)
|
||||
│ spstr strCommand.txt,tInstruction.txt,"~",0
|
||||
│ spstr strCommand.txt,tTmp.txt,"~",1
|
||||
│ if(tInstruction.txt=="entityUpdateDetail"&&entn.txt==tTmp.txt)
|
||||
│ {
|
||||
│ // change icon
|
||||
│ - spstr strCommand.txt,tTmp.txt,"~",2
|
||||
│ - if(tTmp.txt!="")
|
||||
│ - {
|
||||
│ - tIcon1.txt=tTmp.txt
|
||||
│ - }
|
||||
│ //spstr strCommand.txt,tIcon1.txt,"~",2
|
||||
│ vis tIcon1,1
|
||||
│ // change icon color
|
||||
│ spstr strCommand.txt,tTmp.txt,"~",3
|
||||
│ covx tTmp.txt,sys0,0,0
|
||||
│ tIcon1.pco=sys0
|
||||
│ // get Button State
|
||||
│ --- HMI/n2t-out/popupNotify.txt
|
||||
├── +++ HMI/US/landscape/n2t-out/popupNotify.txt
|
||||
│ @@ -439,18 +439,14 @@
|
||||
@@ -336,7 +314,7 @@
|
||||
│ Value: 0
|
||||
│
|
||||
│ Variable (int32) xc1
|
||||
│ @@ -370,165 +336,50 @@
|
||||
│ @@ -370,145 +336,50 @@
|
||||
│ Scope : local
|
||||
│ Dragging : 0
|
||||
│ Send Component ID : disabled
|
||||
@@ -347,10 +325,6 @@
|
||||
│ - 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
|
||||
@@ -375,10 +349,6 @@
|
||||
│ - 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
|
||||
@@ -403,10 +373,6 @@
|
||||
│ - 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
|
||||
@@ -431,10 +397,6 @@
|
||||
│ - 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
|
||||
@@ -459,10 +421,6 @@
|
||||
│ - 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
|
||||
@@ -502,7 +460,7 @@
|
||||
│ Send Component ID : disabled
|
||||
│ Associated Keyboard: none
|
||||
│ Text : PM
|
||||
│ @@ -710,15 +561,14 @@
|
||||
│ @@ -690,15 +561,14 @@
|
||||
│ if(tTmp.txt!="")
|
||||
│ {
|
||||
│ covx tTmp.txt,defaultFontColor,0,0
|
||||
@@ -518,7 +476,7 @@
|
||||
│ if(tAMPM.txt=="")
|
||||
│ {
|
||||
│ vis tAMPM,0
|
||||
│ @@ -839,44 +689,34 @@
|
||||
│ @@ -819,44 +689,34 @@
|
||||
│ //e6Val
|
||||
│ spstr strCommand.txt,e6Val.txt,"~",60
|
||||
│ //f1Icon
|
||||
@@ -563,3 +521,22 @@
|
||||
│ spstr strCommand.txt,tNotifyText.txt,"~",2
|
||||
│ if(tNotifyHead.txt!=""||tNotifyText.txt!="")
|
||||
│ {
|
||||
│ @@ -952,14 +812,18 @@
|
||||
│ {
|
||||
│ page cardPower
|
||||
│ }
|
||||
│ if(tId.txt=="cardChart")
|
||||
│ {
|
||||
│ page cardChart
|
||||
│ }
|
||||
│ + if(tId.txt=="cardLChart")
|
||||
│ + {
|
||||
│ + page cardLChart
|
||||
│ + }
|
||||
│ }
|
||||
│ if(tInstruction.txt=="timeout")
|
||||
│ {
|
||||
│ //set timeout to global var
|
||||
│ spstr strCommand.txt,tTmp.txt,"~",1
|
||||
│ covx tTmp.txt,sleepTimeout,0,0
|
||||
│ }
|
||||
|
||||
@@ -1985,26 +1985,6 @@
|
||||
│ Variable (string) entn
|
||||
│ Attributes
|
||||
│ Scope : local
|
||||
│ @@ -453,19 +453,14 @@
|
||||
│ ucopy strCommand.txt,4,payloadLength-5,0
|
||||
│ // write instruction to tInstuction (debug output, but used as variable here, ui elements will be disabled by default)
|
||||
│ spstr strCommand.txt,tInstruction.txt,"~",0
|
||||
│ spstr strCommand.txt,tTmp.txt,"~",1
|
||||
│ if(tInstruction.txt=="entityUpdateDetail"&&entn.txt==tTmp.txt)
|
||||
│ {
|
||||
│ // change icon
|
||||
│ - spstr strCommand.txt,tTmp.txt,"~",2
|
||||
│ - if(tTmp.txt!="")
|
||||
│ - {
|
||||
│ - tIcon1.txt=tTmp.txt
|
||||
│ - }
|
||||
│ //spstr strCommand.txt,tIcon1.txt,"~",2
|
||||
│ vis tIcon1,1
|
||||
│ // change icon color
|
||||
│ spstr strCommand.txt,tTmp.txt,"~",3
|
||||
│ covx tTmp.txt,sys0,0,0
|
||||
│ tIcon1.pco=sys0
|
||||
│ // get Button State
|
||||
│ --- HMI/n2t-out/popupNotify.txt
|
||||
├── +++ HMI/US/portrait/n2t-out/popupNotify.txt
|
||||
│ @@ -348,15 +348,15 @@
|
||||
@@ -2279,7 +2259,7 @@
|
||||
│ Value: 0
|
||||
│
|
||||
│ Variable (int32) xc1
|
||||
│ @@ -370,165 +324,50 @@
|
||||
│ @@ -370,145 +324,50 @@
|
||||
│ Scope : local
|
||||
│ Dragging : 0
|
||||
│ Send Component ID : disabled
|
||||
@@ -2290,10 +2270,6 @@
|
||||
│ - 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
|
||||
@@ -2318,10 +2294,6 @@
|
||||
│ - 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
|
||||
@@ -2346,10 +2318,6 @@
|
||||
│ - 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
|
||||
@@ -2374,10 +2342,6 @@
|
||||
│ - 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
|
||||
@@ -2402,10 +2366,6 @@
|
||||
│ - 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
|
||||
@@ -2445,7 +2405,7 @@
|
||||
│ Send Component ID : disabled
|
||||
│ Associated Keyboard: none
|
||||
│ Text : PM
|
||||
│ @@ -710,15 +549,14 @@
|
||||
│ @@ -690,15 +549,14 @@
|
||||
│ if(tTmp.txt!="")
|
||||
│ {
|
||||
│ covx tTmp.txt,defaultFontColor,0,0
|
||||
@@ -2461,7 +2421,7 @@
|
||||
│ if(tAMPM.txt=="")
|
||||
│ {
|
||||
│ vis tAMPM,0
|
||||
│ @@ -839,44 +677,34 @@
|
||||
│ @@ -819,44 +677,34 @@
|
||||
│ //e6Val
|
||||
│ spstr strCommand.txt,e6Val.txt,"~",60
|
||||
│ //f1Icon
|
||||
@@ -2506,3 +2466,22 @@
|
||||
│ spstr strCommand.txt,tNotifyText.txt,"~",2
|
||||
│ if(tNotifyHead.txt!=""||tNotifyText.txt!="")
|
||||
│ {
|
||||
│ @@ -952,14 +800,18 @@
|
||||
│ {
|
||||
│ page cardPower
|
||||
│ }
|
||||
│ if(tId.txt=="cardChart")
|
||||
│ {
|
||||
│ page cardChart
|
||||
│ }
|
||||
│ + if(tId.txt=="cardLChart")
|
||||
│ + {
|
||||
│ + page cardLChart
|
||||
│ + }
|
||||
│ }
|
||||
│ if(tInstruction.txt=="timeout")
|
||||
│ {
|
||||
│ //set timeout to global var
|
||||
│ spstr strCommand.txt,tTmp.txt,"~",1
|
||||
│ covx tTmp.txt,sleepTimeout,0,0
|
||||
│ }
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
+++ /dev/fd/62 2024-11-22 20:00:11.734673876 +0000
|
||||
+++ /dev/fd/62 2024-01-20 23:31:31.560618969 +0000
|
||||
+I/n2t-out/Program.s.txt
|
||||
++ HMI/US/portrait/n2t-out/Program.s.txt
|
||||
+1 +12,11 @@
|
||||
@@ -686,13 +686,6 @@
|
||||
+ covx tTmp.txt,sys0,0,0
|
||||
+ hSlider6.maxval=sys0
|
||||
+ }
|
||||
+ }
|
||||
+ if(tInstruction.txt=="pageType")
|
||||
+ {
|
||||
+ sleepValue=0
|
||||
+ //command format pageType,specialPageName
|
||||
+ //write name of speical page to tId
|
||||
+ spstr strCommand.txt,tId.txt,"~",1
|
||||
+I/n2t-out/cardGrid.txt
|
||||
++ HMI/US/portrait/n2t-out/cardGrid.txt
|
||||
+ +7,14 @@
|
||||
@@ -946,6 +939,13 @@
|
||||
+ spstr strCommand.txt,tEntity9.txt,"~",66
|
||||
+ vis tEntity9,1
|
||||
+ }
|
||||
+ }
|
||||
+ if(tInstruction.txt=="pageType")
|
||||
+ {
|
||||
+ sleepValue=0
|
||||
+ //command format pageType,specialPageName
|
||||
+ //write name of speical page to tId
|
||||
+ spstr strCommand.txt,tId.txt,"~",1
|
||||
+I/n2t-out/cardLChart.txt
|
||||
++ HMI/US/portrait/n2t-out/cardLChart.txt
|
||||
+ +7,14 @@
|
||||
@@ -1527,26 +1527,6 @@
|
||||
+e (string) entn
|
||||
+ributes
|
||||
+ Scope : local
|
||||
+19 +453,14 @@
|
||||
+ ucopy strCommand.txt,4,payloadLength-5,0
|
||||
+ // write instruction to tInstuction (debug output, but used as variable here, ui elements will be disabled by default)
|
||||
+ spstr strCommand.txt,tInstruction.txt,"~",0
|
||||
+ spstr strCommand.txt,tTmp.txt,"~",1
|
||||
+ if(tInstruction.txt=="entityUpdateDetail"&&entn.txt==tTmp.txt)
|
||||
+ {
|
||||
+ // change icon
|
||||
+ spstr strCommand.txt,tTmp.txt,"~",2
|
||||
+ if(tTmp.txt!="")
|
||||
+ {
|
||||
+ tIcon1.txt=tTmp.txt
|
||||
+ }
|
||||
+ //spstr strCommand.txt,tIcon1.txt,"~",2
|
||||
+ vis tIcon1,1
|
||||
+ // change icon color
|
||||
+ spstr strCommand.txt,tTmp.txt,"~",3
|
||||
+ covx tTmp.txt,sys0,0,0
|
||||
+ tIcon1.pco=sys0
|
||||
+ // get Button State
|
||||
+I/n2t-out/popupNotify.txt
|
||||
++ HMI/US/portrait/n2t-out/popupNotify.txt
|
||||
+15 +348,15 @@
|
||||
@@ -1821,7 +1801,7 @@
|
||||
+ Value: 0
|
||||
+
|
||||
+e (int32) xc1
|
||||
+165 +324,50 @@
|
||||
+145 +324,50 @@
|
||||
+ Scope : local
|
||||
+ Dragging : 0
|
||||
+ Send Component ID : disabled
|
||||
@@ -1832,10 +1812,6 @@
|
||||
+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
|
||||
@@ -1860,10 +1836,6 @@
|
||||
+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
|
||||
@@ -1888,10 +1860,6 @@
|
||||
+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
|
||||
@@ -1916,10 +1884,6 @@
|
||||
+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
|
||||
@@ -1944,10 +1908,6 @@
|
||||
+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
|
||||
@@ -2048,3 +2008,22 @@
|
||||
+ spstr strCommand.txt,tNotifyText.txt,"~",2
|
||||
+ if(tNotifyHead.txt!=""||tNotifyText.txt!="")
|
||||
+ {
|
||||
+14 +800,18 @@
|
||||
+ {
|
||||
+ page cardPower
|
||||
+ }
|
||||
+ if(tId.txt=="cardChart")
|
||||
+ {
|
||||
+ page cardChart
|
||||
+ }
|
||||
+ if(tId.txt=="cardLChart")
|
||||
+ {
|
||||
+ page cardLChart
|
||||
+ }
|
||||
+ }
|
||||
+ if(tInstruction.txt=="timeout")
|
||||
+ {
|
||||
+ //set timeout to global var
|
||||
+ spstr strCommand.txt,tTmp.txt,"~",1
|
||||
+ covx tTmp.txt,sleepTimeout,0,0
|
||||
+ }
|
||||
|
||||
@@ -30,10 +30,6 @@ popupLightNew
|
||||
23 Component(s)
|
||||
412 Line(s) of event code
|
||||
209 Unique line(s) of event code
|
||||
popupLight
|
||||
28 Component(s)
|
||||
417 Line(s) of event code
|
||||
228 Unique line(s) of event code
|
||||
cardGrid2
|
||||
52 Component(s)
|
||||
703 Line(s) of event code
|
||||
@@ -58,6 +54,10 @@ cardLChart
|
||||
33 Component(s)
|
||||
412 Line(s) of event code
|
||||
267 Unique line(s) of event code
|
||||
popupLight
|
||||
28 Component(s)
|
||||
412 Line(s) of event code
|
||||
227 Unique line(s) of event code
|
||||
cardPower
|
||||
54 Component(s)
|
||||
541 Line(s) of event code
|
||||
@@ -66,6 +66,10 @@ cardThermo
|
||||
57 Component(s)
|
||||
550 Line(s) of event code
|
||||
320 Unique line(s) of event code
|
||||
screensaver2
|
||||
64 Component(s)
|
||||
424 Line(s) of event code
|
||||
264 Unique line(s) of event code
|
||||
popupInSel
|
||||
34 Component(s)
|
||||
621 Line(s) of event code
|
||||
@@ -86,10 +90,6 @@ popupThermo
|
||||
44 Component(s)
|
||||
523 Line(s) of event code
|
||||
276 Unique line(s) of event code
|
||||
screensaver2
|
||||
64 Component(s)
|
||||
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)
|
||||
10798 Line(s) of event code
|
||||
2472 Unique line(s) of event code
|
||||
10769 Line(s) of event code
|
||||
2466 Unique line(s) of event code
|
||||
|
||||
@@ -806,11 +806,6 @@ Timer tmSerial
|
||||
if(tInstruction.txt=="entityUpdateDetail"&&entn.txt==tTmp.txt)
|
||||
{
|
||||
// change icon
|
||||
spstr strCommand.txt,tTmp.txt,"~",2
|
||||
if(tTmp.txt!="")
|
||||
{
|
||||
tIcon1.txt=tTmp.txt
|
||||
}
|
||||
//spstr strCommand.txt,tIcon1.txt,"~",2
|
||||
vis tIcon1,1
|
||||
// change icon color
|
||||
|
||||
@@ -903,10 +903,6 @@ 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
|
||||
@@ -951,10 +947,6 @@ 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
|
||||
@@ -999,10 +991,6 @@ 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
|
||||
@@ -1047,10 +1035,6 @@ 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
|
||||
@@ -1095,10 +1079,6 @@ 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
|
||||
@@ -1814,10 +1794,6 @@ Timer tmSerial
|
||||
{
|
||||
page cardChart
|
||||
}
|
||||
if(tId.txt=="cardLChart")
|
||||
{
|
||||
page cardLChart
|
||||
}
|
||||
}
|
||||
if(tInstruction.txt=="timeout")
|
||||
{
|
||||
|
||||
@@ -457,11 +457,6 @@ Timer tmSerial
|
||||
if(tInstruction.txt=="entityUpdateDetail"&&entn.txt==tTmp.txt)
|
||||
{
|
||||
// change icon
|
||||
spstr strCommand.txt,tTmp.txt,"~",2
|
||||
if(tTmp.txt!="")
|
||||
{
|
||||
tIcon1.txt=tTmp.txt
|
||||
}
|
||||
//spstr strCommand.txt,tIcon1.txt,"~",2
|
||||
vis tIcon1,1
|
||||
// change icon color
|
||||
|
||||
@@ -377,10 +377,6 @@ 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
|
||||
@@ -405,10 +401,6 @@ 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
|
||||
@@ -433,10 +425,6 @@ 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
|
||||
@@ -461,10 +449,6 @@ 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
|
||||
@@ -489,10 +473,6 @@ 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
|
||||
@@ -976,10 +956,6 @@ Timer tmSerial
|
||||
{
|
||||
page cardChart
|
||||
}
|
||||
if(tId.txt=="cardLChart")
|
||||
{
|
||||
page cardLChart
|
||||
}
|
||||
}
|
||||
if(tInstruction.txt=="timeout")
|
||||
{
|
||||
|
||||
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)
|
||||
|
||||
|
||||
@@ -65,5 +65,3 @@ SmartHomeNG: https://github.com/sisamiwe/shng-nspanel-plugin
|
||||
OpenHAB: https://github.com/donoo/o2n2l
|
||||
|
||||
NodeRed: https://github.com/laluz742/node-red-contrib-nspanel-lui
|
||||
|
||||
ESPHome without any Backend: https://github.com/olicooper/esphome-nspanel-lovelace-native
|
||||
|
||||
@@ -3,7 +3,6 @@ import datetime
|
||||
import apis
|
||||
from helper import scale, pos_to_color, rgb_dec565
|
||||
from pages import LuiPagesGen
|
||||
from luibackend.config import Card
|
||||
|
||||
class LuiController(object):
|
||||
|
||||
@@ -334,11 +333,6 @@ 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":
|
||||
@@ -353,8 +347,8 @@ class LuiController(object):
|
||||
else:
|
||||
apis.ha_api.get_entity(entity_id).call_service("turn_off")
|
||||
if button_type == "media-shuffle":
|
||||
shuffle = not apis.ha_api.get_entity(entity_id).attributes['shuffle']
|
||||
apis.ha_api.get_entity(entity_id).call_service("shuffle_set", shuffle=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)
|
||||
if button_type == "volumeSlider":
|
||||
pos = int(value)
|
||||
# HA wants this value between 0 and 1 as float
|
||||
@@ -371,7 +365,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)
|
||||
@@ -398,9 +392,9 @@ class LuiController(object):
|
||||
if button_type == "opnSensorNotify":
|
||||
msg = ""
|
||||
entity = apis.ha_api.get_entity(entity_id)
|
||||
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"
|
||||
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"
|
||||
self._pages_gen.send_message_page("opnSensorNotifyRes", "", msg, "", "")
|
||||
|
||||
# for cardUnlock
|
||||
@@ -417,22 +411,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":
|
||||
@@ -444,12 +438,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
|
||||
@@ -466,7 +460,7 @@ class LuiController(object):
|
||||
apis.ha_api.get_entity(entity_id).call_service("finish")
|
||||
|
||||
@property
|
||||
def current_card(self) -> Card:
|
||||
def current_card(self) -> str:
|
||||
"""Used to get the current card"""
|
||||
|
||||
return self._current_card
|
||||
|
||||
@@ -159,8 +159,8 @@ alarm_control_panel_mapping = {
|
||||
}
|
||||
|
||||
climate_mapping = {
|
||||
'auto': 'fan-auto',
|
||||
'heat_cool': 'sun-snowflake-variant',
|
||||
'auto': 'calendar-sync',
|
||||
'heat_cool': 'calendar-sync',
|
||||
'heat': 'fire',
|
||||
'off': 'power',
|
||||
'cool': 'snowflake',
|
||||
@@ -213,9 +213,6 @@ def get_icon_ha(entity_id, overwrite=None, stateOverwrite=None):
|
||||
entity = apis.ha_api.get_entity(entity_id)
|
||||
state = entity.state if stateOverwrite is None else stateOverwrite
|
||||
|
||||
if entity_id in ["sensor.weather_forecast_daily", "sensor.weather_forecast_hourly"]:
|
||||
ha_type = "weather"
|
||||
|
||||
if overwrite is not None:
|
||||
if type(overwrite) is str:
|
||||
return get_icon_char(overwrite)
|
||||
@@ -266,8 +263,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 := entity.attributes.get("media_content_type"):
|
||||
if media_content_type in media_content_type_mapping:
|
||||
result_icon = media_content_type_mapping[media_content_type]
|
||||
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]
|
||||
|
||||
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,12 +97,13 @@ class LuiPagesGen(object):
|
||||
if state == "sunny":
|
||||
icon_color = 65504 #bright-yellow
|
||||
|
||||
if color := attr.get("rgb_color"):
|
||||
if brightness := attr.get("brightness"):
|
||||
color = rgb_brightness(color, brightness)
|
||||
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)
|
||||
icon_color = rgb_dec565(color)
|
||||
elif brightness := attr.get("brightness"):
|
||||
color = rgb_brightness([253, 216, 53], brightness)
|
||||
elif "brightness" in attr and attr.brightness:
|
||||
color = rgb_brightness([253, 216, 53], attr.brightness)
|
||||
icon_color = rgb_dec565(color)
|
||||
return icon_color
|
||||
|
||||
@@ -128,7 +129,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}")
|
||||
@@ -137,7 +138,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
|
||||
|
||||
@@ -150,7 +151,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:
|
||||
@@ -180,20 +181,17 @@ 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]
|
||||
else:
|
||||
entityType = "delete"
|
||||
|
||||
if entityId in ["sensor.weather_forecast_daily", "sensor.weather_forecast_hourly"]:
|
||||
entityType = "weather"
|
||||
|
||||
apis.ha_api.log(f"Generating item for {entityId} with type {entityType}", level="DEBUG")
|
||||
|
||||
status_entity = apis.ha_api.get_entity(item.status) if item.status and apis.ha_api.entity_exists(item.status) else None
|
||||
@@ -223,7 +221,7 @@ class LuiPagesGen(object):
|
||||
if status_entity:
|
||||
icon_res = get_icon_ha(item.status, overwrite=icon)
|
||||
icon_color = self.get_entity_color(status_entity, ha_type=item.status.split(".")[0], overwrite=colorOverride)
|
||||
if item.status.startswith("sensor") and cardType in ["cardGrid", "cardGrid1", "cardGrid2"] and item.iconOverride is None:
|
||||
if item.status.startswith("sensor") and (cardType == "cardGrid" or cardType == "cardGrid2") and item.iconOverride is None:
|
||||
icon_res = status_entity.state[:4]
|
||||
if icon_res[-1] == ".":
|
||||
icon_res = icon_res[:-1]
|
||||
@@ -247,7 +245,7 @@ class LuiPagesGen(object):
|
||||
if status_entity:
|
||||
icon_id = get_icon_ha(item.status, overwrite=icon)
|
||||
icon_color = self.get_entity_color(status_entity, ha_type=item.status.split(".")[0], overwrite=colorOverride)
|
||||
if item.status.startswith("sensor") and cardType in ["cardGrid", "cardGrid1", "cardGrid2"] and item.iconOverride is None:
|
||||
if item.status.startswith("sensor") and (cardType == "cardGrid" or cardType == "cardGrid2") and item.iconOverride is None:
|
||||
icon_id = status_entity.state[:4]
|
||||
if icon_id[-1] == ".":
|
||||
icon_id = icon_id[:-1]
|
||||
@@ -256,7 +254,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"
|
||||
@@ -275,7 +273,7 @@ class LuiPagesGen(object):
|
||||
icon_up_status = "disable"
|
||||
icon_stop_status = "disable"
|
||||
icon_down_status = "disable"
|
||||
bits = entity.attributes.get('supported_features')
|
||||
bits = entity.attributes.supported_features
|
||||
pos = entity.attributes.get("current_position")
|
||||
if pos is None:
|
||||
pos_status = entity.state
|
||||
@@ -308,24 +306,19 @@ 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
|
||||
if entityType == "binary_sensor":
|
||||
value = get_translation(self._locale, f"backend.component.binary_sensor.state.{device_class}.{entity.state}")
|
||||
if cardType in ["cardGrid", "cardGrid1", "cardGrid2"] and entityType == "sensor" and icon is None:
|
||||
if (cardType == "cardGrid" or cardType == "cardGrid2") and entityType == "sensor" and icon is None:
|
||||
icon_id = entity.state[:4]
|
||||
if icon_id[-1] == ".":
|
||||
icon_id = icon_id[:-1]
|
||||
@@ -387,50 +380,20 @@ class LuiPagesGen(object):
|
||||
elif entityType == "weather":
|
||||
entityTypePanel = "text"
|
||||
unit = get_attr_safe(entity, "temperature_unit", "")
|
||||
rt = None
|
||||
if type(item.stype) == str:
|
||||
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)
|
||||
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)
|
||||
else:
|
||||
value = f'{get_attr_safe(entity, "temperature", "")}{unit}'
|
||||
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)
|
||||
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
|
||||
@@ -489,7 +452,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 = ""
|
||||
@@ -510,10 +473,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 = ""
|
||||
|
||||
@@ -538,7 +501,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)
|
||||
@@ -553,11 +516,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"
|
||||
@@ -571,7 +534,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)
|
||||
@@ -618,12 +581,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":
|
||||
@@ -641,7 +604,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
|
||||
@@ -649,14 +612,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):
|
||||
@@ -673,7 +636,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:
|
||||
@@ -712,7 +675,7 @@ class LuiPagesGen(object):
|
||||
|
||||
#add button to show sensor state
|
||||
add_btn = ""
|
||||
if entity.attributes.get("open_sensors") is not None:
|
||||
if "open_sensors" in entity.attributes and entity.attributes.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")
|
||||
@@ -723,8 +686,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:
|
||||
@@ -734,12 +697,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:
|
||||
@@ -778,8 +741,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(
|
||||
@@ -816,8 +779,6 @@ class LuiPagesGen(object):
|
||||
if send_page_type:
|
||||
if card.cardType == "cardGrid" and len(card.entities) > 6:
|
||||
card.cardType = "cardGrid2"
|
||||
if card.cardType == "cardGrid1":
|
||||
card.cardType = "cardGrid"
|
||||
self.page_type(card.cardType)
|
||||
|
||||
# send sleep timeout if there is one configured for the current card
|
||||
@@ -825,9 +786,9 @@ 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"]:
|
||||
if card.cardType in ["cardEntities", "cardGrid", "cardGrid2"]:
|
||||
self.generate_entities_page(navigation, card.title, card.entities, card.cardType, temp_unit)
|
||||
return
|
||||
if card.cardType == "cardThermo":
|
||||
@@ -879,26 +840,25 @@ class LuiPagesGen(object):
|
||||
color_temp = "disable"
|
||||
color = "disable"
|
||||
effect_supported = "disable"
|
||||
supported_color_modes = entity.attributes['supported_color_modes']
|
||||
|
||||
if "onoff" not in supported_color_modes:
|
||||
|
||||
if "onoff" not in entity.attributes.supported_color_modes:
|
||||
brightness = 0
|
||||
if entity.state == "on":
|
||||
if brightness := entity.attributes.get("brightness"):
|
||||
if "brightness" in entity.attributes and entity.attributes.brightness:
|
||||
# scale 0-255 brightness from ha to 0-100
|
||||
brightness = int(scale(brightness, (0,255), (0,100)))
|
||||
brightness = int(scale(entity.attributes.brightness,(0,255),(0,100)))
|
||||
else:
|
||||
brightness = "disable"
|
||||
if "color_temp" in supported_color_modes:
|
||||
if color_temp := entity.attributes.get("color_temp"):
|
||||
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:
|
||||
# scale ha color temp range to 0-100
|
||||
color_temp = int(scale(color_temp, (entity.attributes['min_mireds'], entity.attributes['max_mireds']),(0, 100)))
|
||||
color_temp = int(scale(entity.attributes.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 supported_color_modes):
|
||||
if any(item in list_color_modes for item in entity.attributes.supported_color_modes):
|
||||
color = "enable"
|
||||
else:
|
||||
color = "disable"
|
||||
@@ -908,20 +868,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 = ""
|
||||
@@ -938,7 +898,7 @@ class LuiPagesGen(object):
|
||||
iconTiltRightStatus = "disable"
|
||||
tilt_pos = "disable"
|
||||
|
||||
bits = entity.attributes['supported_features']
|
||||
bits = entity.attributes.supported_features
|
||||
|
||||
# position supported
|
||||
if bits & 0b00001111:
|
||||
@@ -1025,7 +985,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
|
||||
@@ -1089,8 +1049,8 @@ 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")
|
||||
|
||||
|
||||
|
||||
@@ -6,8 +6,6 @@ from luibackend.mqtt import LuiMqttListener, LuiMqttSender
|
||||
from luibackend.updater import Updater
|
||||
|
||||
import apis
|
||||
import json
|
||||
from typing import Literal
|
||||
|
||||
class NsPanelLovelaceUIManager(ad.ADBase):
|
||||
|
||||
@@ -28,13 +26,13 @@ class NsPanelLovelaceUIManager(ad.ADBase):
|
||||
api_device_id = cfg.get("panelDeviceId")
|
||||
quiet = cfg.get("quiet")
|
||||
|
||||
mqttsender = self._mqttsender = LuiMqttSender(apis.ha_api, use_api, topic_send, api_panel_name, quiet)
|
||||
mqttsend = LuiMqttSender(apis.ha_api, use_api, topic_send, api_panel_name, quiet)
|
||||
|
||||
self._controller = LuiController(cfg, mqttsender.send_mqtt_msg)
|
||||
self._controller = LuiController(cfg, mqttsend.send_mqtt_msg)
|
||||
|
||||
desired_tasmota_driver_version = 8
|
||||
desired_display_firmware_version = 53
|
||||
version = "v4.7.3"
|
||||
version = "v4.3.3"
|
||||
|
||||
model = cfg.get("model")
|
||||
if model == "us-l":
|
||||
@@ -46,7 +44,7 @@ class NsPanelLovelaceUIManager(ad.ADBase):
|
||||
desired_tasmota_driver_url = cfg._config.get("berryURL", "https://raw.githubusercontent.com/joBr99/nspanel-lovelace-ui/main/tasmota/autoexec.be")
|
||||
|
||||
mode = cfg.get("updateMode")
|
||||
updater = Updater(self.adapi.log, mqttsender, topic_send, mode, desired_display_firmware_version, model, desired_display_firmware_url, desired_tasmota_driver_version, desired_tasmota_driver_url)
|
||||
updater = Updater(self.adapi.log, mqttsend, topic_send, mode, desired_display_firmware_version, model, desired_display_firmware_url, desired_tasmota_driver_version, desired_tasmota_driver_url)
|
||||
|
||||
# Request Tasmota Driver Version
|
||||
updater.request_berry_driver_version()
|
||||
@@ -55,24 +53,6 @@ class NsPanelLovelaceUIManager(ad.ADBase):
|
||||
|
||||
self.adapi.log(f'Started ({version})')
|
||||
|
||||
#
|
||||
# helpers
|
||||
#
|
||||
|
||||
def show_card(self, card_key: str) -> None:
|
||||
"""Used to show card on panel"""
|
||||
|
||||
msg = json.dumps({"CustomRecv":f"event,buttonPress2,navigate.{card_key},button"})
|
||||
topic = self._cfg.get("panelRecvTopic")
|
||||
self._mqttsender.send_mqtt_msg(msg, topic)
|
||||
|
||||
def navigate(self, direction: Literal['up', 'prev', 'next']) -> None:
|
||||
"""Used to navigate different directions on the panel"""
|
||||
|
||||
msg = json.dumps({"CustomRecv":f"event,buttonPress2,nav{direction.title()},button"})
|
||||
topic = self._cfg.get("panelRecvTopic")
|
||||
self._mqttsender.send_mqtt_msg(msg, topic)
|
||||
|
||||
@property
|
||||
def current_card(self) -> str:
|
||||
"""Used to get the panel's current card"""
|
||||
|
||||
@@ -93,4 +93,3 @@ Now, to install NSPanel Lovelace UI Backend with HACS, follow these steps:
|
||||
6. A confirmation panel will appear, click on `Download`, and wait for HACS to
|
||||
proceed with the download
|
||||
7. The Backend Application is now installed, and HACS will inform you when updates are available
|
||||
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
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
|
||||
var sourceDP = 'alias.0.Wohnzimmer.Heizung.ACTUAL';
|
||||
var targetDP = '0_userdata.0.Test.chartTest';
|
||||
var rangeHours = 24;
|
||||
var maxXAchsisTicks = 6;
|
||||
var historyInstance = 'history.0';
|
||||
|
||||
on({id: sourceDP, change: "any"}, async function (obj) {
|
||||
sendTo(historyInstance, 'getHistory', {
|
||||
@@ -26,7 +25,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 / factor * 10);
|
||||
var value = (Math.round(result.result[j].val * 10) / 10);
|
||||
|
||||
if (valueDate > targetDate){
|
||||
if ((targetDate.getHours() % stepXAchsis) == 0){
|
||||
@@ -48,4 +47,4 @@ on({id: sourceDP, change: "any"}, async function (obj) {
|
||||
setState(targetDP, cardChartString, true);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
12983
ioBroker/NsPanelTs.ts
12983
ioBroker/NsPanelTs.ts
File diff suppressed because it is too large
Load Diff
@@ -2564,11 +2564,7 @@
|
||||
"crossfade":{
|
||||
"en-US":"Crossfade",
|
||||
"de-DE":"Überblenden"
|
||||
},
|
||||
"tools":{
|
||||
"en-US":"Tools",
|
||||
"de-DE":"Tools"
|
||||
},
|
||||
},
|
||||
"speaker":{
|
||||
"en-US":"Speakerlist",
|
||||
"de-DE":"Wiedergabegeräte",
|
||||
|
||||
@@ -2701,13 +2701,5 @@
|
||||
"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,8 +228,6 @@ 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":
|
||||
@@ -280,8 +278,6 @@ 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