mirror of
https://github.com/joBr99/nspanel-lovelace-ui.git
synced 2026-02-18 02:47:00 +01:00
Compare commits
2 Commits
v4.7.2
...
8eae83c8ba
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8eae83c8ba | ||
|
|
127671047f |
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -58,5 +58,5 @@ _If applicable, add screenshots/pictures to help explain your problem._
|
||||
_Add any other context about the problem here._
|
||||
_Please note here in case you are using ioBroker_
|
||||
|
||||
### PANEL / FIRMWARE VERSION
|
||||
### PANEL / FIRMWARE VERION
|
||||
_Please add the Panel/Firmware Version you are using (EU, US-L or US-P)_
|
||||
|
||||
2
.github/ISSUE_TEMPLATE/feature-request.md
vendored
2
.github/ISSUE_TEMPLATE/feature-request.md
vendored
@@ -24,5 +24,5 @@ _A clear and concise description of what the feature should do._
|
||||
### ADDITIONAL CONTEXT
|
||||
_Add any other context about the problem here._
|
||||
|
||||
### PANEL / FIRMWARE VERSION
|
||||
### PANEL / FIRMWARE VERION
|
||||
_Please add the Panel/Firmware Version you are using (EU, US-L or US-P)_
|
||||
|
||||
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.3.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@2024.08.2
|
||||
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
|
||||
|
||||
@@ -1,3 +1,2 @@
|
||||
ha_api = None
|
||||
mqtt_api = None
|
||||
ad_api = None
|
||||
mqtt_api = None
|
||||
@@ -132,7 +132,6 @@ class LuiBackendConfig(object):
|
||||
'sleepTrackingZones': ["not_home", "off"],
|
||||
'sleepOverride': None,
|
||||
'locale': "en_US",
|
||||
'quiet': True,
|
||||
'timeFormat': "%H:%M",
|
||||
'dateFormatBabel': "full",
|
||||
'dateAdditionalTemplate': "",
|
||||
|
||||
@@ -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
|
||||
@@ -464,9 +458,3 @@ class LuiController(object):
|
||||
apis.ha_api.get_entity(entity_id).call_service("pause")
|
||||
if button_type == "timer-finish":
|
||||
apis.ha_api.get_entity(entity_id).call_service("finish")
|
||||
|
||||
@property
|
||||
def current_card(self) -> Card:
|
||||
"""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)
|
||||
|
||||
@@ -77,13 +77,12 @@ class LuiMqttListener(object):
|
||||
self._controller.detail_open(msg[2], msg[3])
|
||||
|
||||
class LuiMqttSender(object):
|
||||
def __init__(self, api, use_api, topic_send, api_panel_name, quiet):
|
||||
def __init__(self, api, use_api, topic_send, api_panel_name):
|
||||
self._ha_api = api
|
||||
self._use_api = use_api
|
||||
self._topic_send = topic_send
|
||||
self._api_panel_name = api_panel_name
|
||||
self._prev_msg = ""
|
||||
self._quiet = quiet
|
||||
|
||||
def send_mqtt_msg(self, msg, topic=None, force=False):
|
||||
if not force and self._prev_msg == msg:
|
||||
@@ -91,9 +90,7 @@ class LuiMqttSender(object):
|
||||
return
|
||||
self._prev_msg = msg
|
||||
|
||||
if self._quiet is False:
|
||||
apis.ha_api.log(f"Sending Message: {msg}")
|
||||
|
||||
apis.ha_api.log(f"Sending Message: {msg}")
|
||||
if self._use_api:
|
||||
apis.ha_api.call_service(service="esphome/" + self._api_panel_name + "_nspanelui_api_call", command=2, data=msg)
|
||||
else:
|
||||
|
||||
@@ -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,19 +306,19 @@ class LuiPagesGen(object):
|
||||
device_class = entity.attributes.get("device_class", "")
|
||||
unit_of_measurement = entity.attributes.get("unit_of_measurement", "")
|
||||
value = entity.state
|
||||
|
||||
|
||||
# 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]
|
||||
@@ -382,35 +380,20 @@ class LuiPagesGen(object):
|
||||
elif entityType == "weather":
|
||||
entityTypePanel = "text"
|
||||
unit = get_attr_safe(entity, "temperature_unit", "")
|
||||
if type(item.stype) == int:
|
||||
results = apis.ha_api.call_service(
|
||||
"weather/get_forecasts", target={"entity_id": entityId}, service_data={"type": "daily"}
|
||||
)
|
||||
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
|
||||
@@ -469,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 = ""
|
||||
@@ -490,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 = ""
|
||||
|
||||
@@ -518,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)
|
||||
@@ -533,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"
|
||||
@@ -551,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)
|
||||
@@ -598,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":
|
||||
@@ -621,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
|
||||
@@ -629,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):
|
||||
@@ -653,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:
|
||||
@@ -692,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")
|
||||
@@ -703,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:
|
||||
@@ -714,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:
|
||||
@@ -758,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(
|
||||
@@ -796,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
|
||||
@@ -805,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":
|
||||
@@ -859,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"
|
||||
@@ -888,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 = ""
|
||||
@@ -918,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:
|
||||
@@ -1005,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
|
||||
@@ -1069,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")
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import adbase as ad
|
||||
import hassapi as hass
|
||||
|
||||
from luibackend.config import LuiBackendConfig
|
||||
from luibackend.controller import LuiController
|
||||
@@ -6,19 +6,15 @@ from luibackend.mqtt import LuiMqttListener, LuiMqttSender
|
||||
from luibackend.updater import Updater
|
||||
|
||||
import apis
|
||||
import json
|
||||
from typing import Literal
|
||||
|
||||
class NsPanelLovelaceUIManager(ad.ADBase):
|
||||
class NsPanelLovelaceUIManager(hass.Hass):
|
||||
|
||||
def initialize(self):
|
||||
self.adapi = self.get_ad_api()
|
||||
self.adapi.log('Starting')
|
||||
apis.ad_api = self.adapi
|
||||
apis.ha_api = self.get_plugin_api("HASS")
|
||||
self.log('Starting')
|
||||
apis.ha_api = self
|
||||
apis.mqtt_api = self.get_plugin_api("MQTT")
|
||||
|
||||
cfg = self._cfg = LuiBackendConfig(apis.ha_api, self.args["config"])
|
||||
cfg = self._cfg = LuiBackendConfig(self, self.args["config"])
|
||||
|
||||
use_api = cfg.get("use_api") == True
|
||||
|
||||
@@ -26,11 +22,10 @@ class NsPanelLovelaceUIManager(ad.ADBase):
|
||||
topic_recv = cfg.get("panelRecvTopic")
|
||||
api_panel_name = cfg.get("panelName")
|
||||
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(self, use_api, topic_send, api_panel_name)
|
||||
|
||||
self._controller = LuiController(cfg, mqttsender.send_mqtt_msg)
|
||||
controller = LuiController(cfg, mqttsend.send_mqtt_msg)
|
||||
|
||||
desired_tasmota_driver_version = 8
|
||||
desired_display_firmware_version = 53
|
||||
@@ -46,35 +41,11 @@ 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.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()
|
||||
|
||||
LuiMqttListener(use_api, topic_recv, api_panel_name, api_device_id, self._controller, updater)
|
||||
LuiMqttListener(use_api, topic_recv, api_panel_name, api_device_id, controller, updater)
|
||||
|
||||
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"""
|
||||
|
||||
return self._controller.current_card.key
|
||||
self.log(f'Started ({version})')
|
||||
|
||||
@@ -44,6 +44,8 @@ Using a 6th entity will automatically activate the alternative layout.
|
||||
type: 0
|
||||
- entity: weather.demo_weather_north
|
||||
type: 1
|
||||
- entity: weather.demo_weather_north
|
||||
type: 2
|
||||
- entity: sensor.energy_usage
|
||||
- entity: delete
|
||||
- entity: sensor.indoor_temp
|
||||
|
||||
@@ -93,38 +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
|
||||
|
||||
# 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
|
||||
- platform: homeassistant
|
||||
event: start
|
||||
action:
|
||||
- service: weather.get_forecasts
|
||||
data:
|
||||
type: daily
|
||||
target:
|
||||
entity_id: weather.home # change to your weather entity
|
||||
response_variable: daily
|
||||
sensor:
|
||||
- name: Weather Forecast Daily
|
||||
unique_id: weather_forecast_daily
|
||||
state: "{{ states('weather.home') }}" # # change to your weather entity in this line
|
||||
attributes:
|
||||
temperature: "{{ state_attr('weather.home', 'temperature') }}" # change to your weather entity
|
||||
temperature_unit: "{{ state_attr('weather.home', 'temperature_unit') }}" # change to your weather entity
|
||||
forecast: "{{ daily['weather.home'].forecast }}" # change to your weather entity
|
||||
```
|
||||

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

|
||||
|
||||
|
||||
@@ -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.
12267
ioBroker/NsPanelTs.ts
12267
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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# https://developers.home-assistant.io/docs/add-ons/configuration#add-on-config
|
||||
name: NSPanel Lovelace UI Addon
|
||||
version: "4.7.80"
|
||||
version: "4.7.78"
|
||||
slug: nspanel-lovelace-ui
|
||||
description: NSPanel Lovelace UI Addon
|
||||
services:
|
||||
|
||||
@@ -209,11 +209,11 @@ class HAEntity(panel_cards.Entity):
|
||||
forecast = libs.home_assistant.execute_script(
|
||||
entity_name=self.entity_id,
|
||||
domain='weather',
|
||||
service="get_forecasts",
|
||||
service="get_forecast",
|
||||
service_data={
|
||||
'type': forecast_type
|
||||
}
|
||||
).get(self.entity_id,{}).get("forecast", [])
|
||||
).get("forecast", [])
|
||||
if len(forecast) > pos:
|
||||
forcast_pos = forecast[pos]
|
||||
forcast_condition = forcast_pos.get("condition", "")
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
paho-mqtt==1.6.1
|
||||
paho-mqtt
|
||||
pyyaml
|
||||
websockets
|
||||
websocket-client
|
||||
@@ -7,4 +7,4 @@ python-dateutil
|
||||
scheduler
|
||||
babel
|
||||
watchdog
|
||||
jinja2
|
||||
jinja2
|
||||
Reference in New Issue
Block a user