NxPanel - Replacement Firmware for Sonoff NSPanel

Did you try to install it from the console of Tasmota? Just go in there and issue this command: installnxpanel
It should work than.

Thank you,
thats my Problem. If i use installnxpanel and it startet to flash, i can see in error message like this
"FLH:Something has gone wrong flashing nxpanel [bytes('0000)]
"NXP: Received Raw = bytes(‘0000’)
I try it with other options, but nothing helps
The first Flash i use installnxpanel and see the progress bar up to 100%. After reboot the problem started. I wil buy another NSpanel and try again. Maybe i will find it out…

p.s.
If i try this → FlashNextion http://proto.systems/nxpanel/nxpanel-1.0.8.tft

i the something started…but after 5 hour i see this…

20:37:00.974 NXP: skipped command becuase still flashing
20:37:06.293 BRY: GC from 37359 to 26146 bytes, objects freed 233/340 (in 3 ms) - slots from 613/656 to 249/504
20:37:11.400 WIF: Checking connection…
20:37:31.400 WIF: Checking connection…
20:37:33.296 BRY: GC from 36425 to 26259 bytes, objects freed 269/345 (in 3 ms) - slots from 687/744 to 256/504
20:37:51.400 WIF: Checking connection…
20:38:00.300 BRY: GC from 36557 to 26135 bytes, objects freed 275/341 (in 2 ms) - slots from 691/744 to 249/503
20:38:00.917 NXP: Time and date synced with { “clock”: { “date”:19,“month”:12,“year”:2022,“weekday”:1,“hour”:20,“min”:38 } }
20:38:00.965 BRY: GC from 36400 to 27098 bytes, objects freed 184/353 (in 3 ms) - slots from 549/580 to 261/519
20:38:00.974 NXP: skipped command becuase still flashing
20:38:11.400 WIF: Checking connection…
20:38:22.801 BRY: GC from 37340 to 26026 bytes, objects freed 273/338 (in 3 ms) - slots from 679/714 to 245/458
20:38:31.400 WIF: Checking connection…
20:38:51.400 WIF: Checking connection…
20:38:54.293 BRY: GC from 36323 to 26266 bytes, objects freed 266/343 (in 3 ms) - slots from 681/713 to 253/473
20:39:00.917 NXP: Time and date synced with { “clock”: { “date”:19,“month”:12,“year”:2022,“weekday”:1,“hour”:20,“min”:39 } }
20:39:00.955 BRY: GC from 36566 to 27098 bytes, objects freed 203/353 (in 3 ms) - slots from 583/609 to 261/534
20:39:00.976 NXP: skipped command becuase still flashing
…but nothing change the panel. i can not use the nxpanel …shit happens
Greets Udo

by the way. the first picture i can see is…
IMG_2117

Try flashing it back to the original firmware and if that works, repeat installing Tasmota

Have you actually installed 1.1.4 of the berry script?

You need to copy this to your device using;
image.png

Make sure that is the 1.1.4 version.

IMG_2118

Hi,
yes i am using nxpanel.be from peepshow-21-
I thought Berry 1.1.4 was a driver that i had to install extra. Didn’t think this file was meant.

i try the exampel with my own settings
mosquitto_pub -u openhabian -P mqttpwd22?? -t
cmnd/nspanel_7DD7FC/nxpanel -m '{“summary”: {“title”:“Out 32°C”, “text”:“In 29°C”}}

and over MQTT Explorer change nothing

my second panel is comming tomorrow.i try to backup the original firmware and i hop ein can reflashing the first panel with it. the original firmware can not find on the web, also no instructions for flashing back to the original firmware…

if nothing helps. i try to flash the second panel on nxpanel …
Maybe i will have two paperweights then :slight_smile:

I think it should work fine after you press OK, but can you sent the tasmota console log when it boots, so I can see why

Hello and thank you. I currently have Tasmota 12.2.0 as a trial, but can reinstall 12.3.0 or 12.3.1 as well. with different versions, I can also see different reactions in the console. Which version would be best for circling the error? I have always used the same NXpanel.be script with all Tasmota versions, the one with 1.1.4.
Best regards
Udo

Hello,

After reboot and delete *.bec files

What does the error mean:
21:25:12.765 TFS: File ‘autoexec.bat’ not found

This error comes up with every reboot.

Other Tasmota versions has other errors.
But it is too much text to send it here.

00:00:00.002-209/49 HDW: ESP32-D0WD-V3
00:00:00.108-207/49 UFS: FlashFS mounted with 288 kB free
00:00:00.166 CFG: Loaded from File, Count 53
00:00:00.177 QPC: Count 1
00:00:00.178 CFG: CR 416/699, Busy 0
00:00:00.186 CFG: CR 416/699, Busy 0
00:00:00.189 ROT: Mode 1
00:00:00.198 BRY: GC from 3819 to 3049 bytes, objects freed 5/20 (in 1 ms) - slots from 35/61 to 23/61
00:00:00.416 CFG: No ‘*.autoconf’ file found
00:00:00.420 BRY: GC from 4785 to 4041 bytes, objects freed 5/42 (in 1 ms) - slots from 61/91 to 41/91
00:00:00.421 BRY: Berry initialized, RAM used=4041 bytes
00:00:00.437 BRY: No ‘preinit.be’
00:00:00.440 SRC: Restart
00:00:00.447 Project tasmota - Tasmota Version 12.3.1(nspanel)-2_0_5_3(2022-12-16T10:31:01)
00:00:00.448 ETH: No ETH MDC and/or ETH MDIO GPIO defined
00:00:00.149 BRY: GC from 8123 to 6677 bytes, objects freed 22/99 (in 1 ms) - slots from 135/152 to 101/137
00:00:00.170 BRY: GC from 13414 to 12306 bytes, objects freed 18/182 (in 1 ms) - slots from 192/213 to 159/213
00:00:01.025 BRY: GC from 22571 to 21499 bytes, objects freed 16/303 (in 1 ms) - slots from 263/274 to 235/274
00:00:01.230 NXP: Initializing Driver
00:00:01.235 NXP: Nextion command sent = bytes(‘4452414B4A485355594447424E434A48474A4B534842444EFFFFFF’)
00:00:01.238 NXP: Nextion command sent = bytes(‘72657374FFFFFF’)
00:00:01.243 SRC: Berry
00:00:01.244 CMD: Grp 0, Cmd ‘RULE’, Idx 3, Len 1, Pld 1, Data ‘1’
00:00:01.247 RSL: RESULT = {“Rule3”:{“State”:“ON”,“Once”:“OFF”,“StopOnError”:“OFF”,“Length”:0,“Free”:511,“Rules”:“”}}
00:00:01.249 BRY: Stack resized from 800 to 1072 bytes
00:00:01.257 BRY: GC from 31768 to 21498 bytes, objects freed 57/368 (in 3 ms) - slots from 409/442 to 271/411
00:00:01.266 SRC: Berry
00:00:01.267 CMD: Grp 0, Cmd ‘STATE’, Idx 1, Len 0, Pld -99, Data ‘’
00:00:01.270 BRY: GC from 22701 to 21243 bytes, objects freed 34/364 (in 1 ms) - slots from 329/411 to 266/396
00:00:01.272 RSL: RESULT = {“Time”:“1970-01-01T00:00:01”,“Uptime”:“0T00:00:00”,“UptimeSec”:0,“Heap”:184,“SleepMode”:“Dynamic”,“Sleep”:0,“LoadAvg”:0,“MqttCount”:0,“Berry”:{“HeapUsed”:20,“Objects”:364},“POWER1”:“OFF”,“POWER2”:“OFF”}
00:00:01.299 BRY: Successfully loaded ‘autoexec.be’
00:00:01.883 WIF: Checking connection…
00:00:01.884 WIF: Attempting connection…
00:00:02.338 WIF: Connecting to AP1 Wlan Channel 6 BSSId DA:28:E5:65:92:29 in mode 11n as NXPanel-BBAE48-3656…
00:00:03.319 WIF: Checking connection…
00:00:03.320 WIF: Attempting connection…
00:00:04.202 WIF: IPv4 192.168.178.185, mask 255.255.255.0, gateway 192.168.178.1
00:00:04.358 WIF: Checking connection…
00:00:04.359 WIF: Connected
00:00:04.623 HTP: Web server active on NXPanel-BBAE48-3656 with IP address 192.168.178.185
00:00:04.678 HTP: Console
00:00:04.801 NTP: Sync time…
00:00:04.827 WIF: Resolving ‘pool.ntp.org’ (131.188.3.221)
00:00:04.873 RTC: UTC 2022-12-21T20:25:12, DST 2022-03-27T02:00:00, STD 2022-10-30T03:00:00
21:25:12.000 RTC: Synced by NTP
21:25:12.090 BRY: GC from 31501 to 20284 bytes, objects freed 267/339 (in 3 ms) - slots from 695/729 to 249/503
21:25:12.611 MQT: Attempting connection…
21:25:12.613 WIF: Resolving ‘192.168.178.110’ (192.168.178.110)
21:25:12.652 MQT: Connected
21:25:12.655 MQT: tele/NXPanel_BBAE48/LWT = Online (retained)
21:25:12.658 MQT: cmnd/NXPanel_BBAE48/POWER =
21:25:12.659 MQT: Subscribe to cmnd/NXPanel_BBAE48/#
21:25:12.661 MQT: Subscribe to cmnd/tasmotas/#
21:25:12.663 MQT: Subscribe to cmnd/NXPanel_BBAE48_fb/#
21:25:12.666 MQT: tele/NXPanel_BBAE48/INFO1 = {“Info1”:{“Module”:“NSPanel”,“Version”:“12.3.1(nspanel)”,“FallbackTopic”:“cmnd/NXPanel_BBAE48_fb/”,“GroupTopic”:“cmnd/tasmotas/”}}
21:25:12.694 MQT: tele/NXPanel_BBAE48/INFO2 = {“Info2”:{“WebServerMode”:“Admin”,“Hostname”:“NXPanel-BBAE48-3656”,“IPAddress”:“192.168.178.185”}}
21:25:12.722 MQT: tele/NXPanel_BBAE48/INFO3 = {“Info3”:{“RestartReason”:“Vbat power on reset”,“BootCount”:30}}
21:25:12.743 MQT: stat/NXPanel_BBAE48/RESULT = {“POWER1”:“OFF”}
21:25:12.745 MQT: stat/NXPanel_BBAE48/POWER1 = OFF
21:25:12.748 MQT: stat/NXPanel_BBAE48/RESULT = {“POWER2”:“OFF”}
21:25:12.750 MQT: stat/NXPanel_BBAE48/POWER2 = OFF
21:25:12.765 TFS: File ‘autoexec.bat’ not found
21:25:12.791 BRY: GC from 30583 to 20012 bytes, objects freed 254/331 (in 3 ms) - slots from 675/698 to 239/487
21:25:13.909 NXP: Received Raw = bytes(‘0000000000000000000000000000000000000000000000000000000000000000…’)
21:25:13.935 MQT: tele/NXPanel_BBAE48/RESULT = {“nextion”:“bytes(‘0000000000000000000000000000000000000000000000000000000000000000…’)”}
21:25:14.809 QPC: Reset
21:25:16.008 NXP: Received Raw = bytes(‘0000’)
21:25:16.017 MQT: tele/NXPanel_BBAE48/RESULT = {“nextion”:“bytes(‘’)”}
21:25:16.810 APP: Boot Count 30
21:25:16.816 BRY: GC from 29221 to 19838 bytes, objects freed 206/327 (in 4 ms) - slots from 549/577 to 233/487
21:25:16.823 MQT: tele/NXPanel_BBAE48/STATE = {“Time”:“2022-12-21T21:25:16”,“Uptime”:“0T00:00:09”,“UptimeSec”:9,“Heap”:116,“SleepMode”:“Dynamic”,“Sleep”:0,“LoadAvg”:254,“MqttCount”:1,“Berry”:{“HeapUsed”:19,“Objects”:327},“POWER1”:“OFF”,“POWER2”:“OFF”,“Wifi”:{“AP”:1,“SSId”:“Wlan”,“BSSId”:“DA:28:E5:65:92:29”,“Channel”:6,“Mode”:“11n”,“RSSI”:100,“Signal”:-44,“LinkCount”:1,“Downtime”:“0T00:00:04”}}
21:25:16.879 MQT: tele/NXPanel_BBAE48/SENSOR = {“Time”:“2022-12-21T21:25:16”,“ANALOG”:{“Temperature1”:25.4},“TempUnit”:“C”}
21:25:17.267 CFG: Saved, Count 54, Bytes 4096
21:25:18.083 NXP: Received Raw = bytes(‘0000’)
21:25:18.093 MQT: tele/NXPanel_BBAE48/RESULT = {“nextion”:“bytes(‘’)”}
21:25:19.983 NXP: Received Raw = bytes(‘0000’)
21:25:19.992 MQT: tele/NXPanel_BBAE48/RESULT = {“nextion”:“bytes(‘’)”}
21:25:21.194 BRY: GC from 30110 to 20119 bytes, objects freed 220/335 (in 3 ms) - slots from 618/638 to 243/533
21:25:21.817 MQT: tasmota/discovery/782184BBAE48/config = {“ip”:“192.168.178.185”,“dn”:“Tasmota”,“fn”:[“Tasmota”,“”,null,null,null,null,null,null],“hn”:“NXPanel-BBAE48-3656”,“mac”:“782184BBAE48”,“md”:“NSPanel”,“ty”:0,“if”:0,“ofln”:“Offline”,“onln”:“Online”,“state”:[“OFF”,“ON”,“TOGGLE”,“HOLD”],“sw”:“12.3.1”,“t”:“NXPanel_BBAE48”,“ft”:“%prefix%/%topic%/”,“tp”:[“cmnd”,“stat”,“tele”],“rl”:[1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],“swc”:[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],“swn”:[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],“btn”:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],“so”:{“4”:0,“11”:0,“13”:0,“17”:0,“20”:0,“30”:0,“68”:0,“73”:0,“82”:0,“114”:0,“117”:0},“lk”:0,“lt_st”:0,“sho”:[0,0,0,0],“sht”:[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],“ver”:1} (retained)
21:25:21.835 MQT: tasmota/discovery/782184BBAE48/sensors = {“sn”:{“Time”:“2022-12-21T21:25:21”,“ANALOG”:{“Temperature1”:25.4},“TempUnit”:“C”},“ver”:1} (retained)
21:25:21.983 NXP: Received Raw = bytes(‘0000’)
21:25:21.993 MQT: tele/NXPanel_BBAE48/RESULT = {“nextion”:“bytes(‘’)”}
21:25:23.985 NXP: Received Raw = bytes(‘0000’)
21:25:23.995 MQT: tele/NXPanel_BBAE48/RESULT = {“nextion”:“bytes(‘’)”}
21:25:25.983 NXP: Received Raw = bytes(‘0000’)
21:25:25.993 MQT: tele/NXPanel_BBAE48/RESULT = {“nextion”:“bytes(‘’)”}
21:25:27.983 NXP: Received Raw = bytes(‘0000’)
21:25:27.993 MQT: tele/NXPanel_BBAE48/RESULT = {“nextion”:“bytes(‘’)”}
21:25:28.011 BRY: GC from 30365 to 20010 bytes, objects freed 256/330 (in 3 ms) - slots from 633/668 to 239/517
21:25:29.984 NXP: Received Raw = bytes(‘0000’)
21:25:29.993 MQT: tele/NXPanel_BBAE48/RESULT = {“nextion”:“bytes(‘’)”}
21:25:31.608 WIF: Checking connection…
21:25:31.983 NXP: Received Raw = bytes(‘0000’)
21:25:31.992 MQT: tele/NXPanel_BBAE48/RESULT = {“nextion”:“bytes(‘’)”}
21:25:33.984 NXP: Received Raw = bytes(‘0000’)
21

Emmm, sorry for my stupid question? But do you have the autoexec.bec there? As it needs to be, but the log shows that the file is not found…

good morning, of course I have these files. I’ve re-created them a number of times. a few times Tasmota reflashed with esptools and sometimes also via OTA. made no difference. After flashing, no files were entered and since these *.bec were generated, I hoped for normality. When I switched to NXpanel I had Tasmota 12.3.0 on it via web installer and NSPanel worked. I followed the instructions here to create the NXPanel.be file and the progress bar also went up to 100%. after the reboot I noticed that the time is not displayed like on the success messages from others. Since then I have been re-flashing real versions of tasmota. Unfortunately, I can’t determine whether it’s due to Tasmota or the NPanel module.

I couldn’t find out whether there is a way to re-enforce the installation process as if NSPanel was still on it. whether there were problems with tasmota 12.3.0 and the install or I was just unlucky, who knows? as long as I don’t manage to force a new installation of NXpanel, I can’t change anything about the status. maybe a detour via an installation of ESPhome will help? I’m open to all ways to use NXPanel. I won’t give up…

and it wasn’t a stupid question, unfortunately I had also dealt with it

thats after reboot on Tasmota 12.3.1 an delete the *.bec files.
The *.bec were rebuilt . and the problems remain

IMG_2130

Hello, apparently my NSPanel basically has a problem. When trying to force a solution via Home Assistant and ESPHome, I realized. If I can’t upload under Home Assistant, there must be a reason. There is also an error under ESPHome that Nextion could not be started, Home Assistant refuses to start a panel upload. NxPanel either put obstacles in the way that I can’t put away or the panel was faulty.
Until the switch from NSPanel to NXPanel, everything had worked according to the expectations of the howtos. Strange that no change can be forced and NXPanel is still displayed. It’s also strange that I’m probably the only one on the web who has such a problem. Something is preventing Home Assitant from starting the process. It’s a strange experience, but it’s one.
Whether there are NSPanel that have bugs or where Sonoff has found a way to create problems? Maybe I’ll find out someday… Until then, Merry Christmas and a Happy New Year.

Guys, I’m further along than I ever thought I was. While searching the net, I found a piece of information that solved my problem. That’s how I believe it, because installnxpanel triggers another installation of the NXpanel. I had to enter the building rate to 9600 in the nxpanel.be. Blunt copying of nxpanel.be doesn’t work for everyone. Why some can cope with 9600 and others 115200, I do not know. But it didn’t matter which Tasmota version I had taken.
After I nxpanel.be on 9600 I had no error message in the console after rebuilding nxpanel.bec. After I ran InstallNXpanel and the installation bar appeared again in the display, a stone fell from my heart. 4 nights hardly any sleep and felt the entire internet read through… Merry Christmas

I’m a bit lost why you are talking about 9600/115200 stuff for nxpanel.be??

This is copied to the device over the wifi via the filemanger in the tasmota web gui??

There’s no serial in this?

Or are you talking about when the nxpanel.be script install the HMI file into the Nextion?

I updated my TAS to 12.3.1, just as you, my nxpanel.be is 1.1.4, as above.

run xnpanelinstall for tas and it works a treat…

13:45:57.341 CMD: installnxpanel
13:45:57.354 MQT: stat/nspanel/RESULT = {“InstallNxPanel”:“Done”}
13:45:57.409 FLH: host: proto.systems, port: 80, get: /nxpanel/nxpanel-latest.tft
13:45:58.503 FLH: Send (High Speed) flash start
13:45:58.931 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 0}}
13:46:00.447 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 1}}
13:46:01.140 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 2}}
13:46:01.817 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 3}}
13:46:02.520 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 4}}
13:46:03.172 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 5}}
13:46:03.884 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 6}}
13:46:04.462 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 7}}
13:46:05.173 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 8}}
13:46:05.867 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 9}}
13:46:06.570 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 10}}
13:46:07.282 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 11}}
13:46:08.031 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 12}}
13:46:08.757 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 13}}
13:46:09.365 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 14}}
13:46:10.103 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 15}}
13:46:10.826 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 16}}
13:46:11.562 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 17}}
13:46:12.289 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 18}}
13:46:13.017 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 19}}
13:46:13.725 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 20}}
13:46:14.327 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 21}}
13:46:15.073 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 22}}
13:46:15.786 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 23}}
13:46:16.549 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 24}}
13:46:17.288 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 25}}
13:46:18.022 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 26}}
13:46:18.617 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 27}}
13:46:19.333 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 28}}
13:46:20.066 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 29}}
13:46:20.769 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 30}}
13:46:21.506 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 31}}
13:46:22.264 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 32}}
13:46:22.937 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 33}}
13:46:23.526 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 34}}
13:46:24.200 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 35}}
13:46:24.918 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 36}}
13:46:25.621 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 37}}
13:46:26.320 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 38}}
13:46:27.016 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 39}}
13:46:27.774 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 40}}
13:46:28.385 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 41}}
13:46:29.098 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 42}}
13:46:29.789 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 43}}
13:46:30.500 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 44}}
13:46:31.189 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 45}}
13:46:31.897 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 46}}
13:46:32.552 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 47}}
13:46:33.256 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 48}}
13:46:33.953 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 49}}
13:46:34.643 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 50}}
13:46:35.363 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 51}}
13:46:36.082 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 52}}
13:46:36.777 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 53}}
13:46:37.367 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 54}}
13:46:38.111 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 55}}
13:46:38.843 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 56}}
13:46:39.583 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 57}}
13:46:40.341 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 58}}
13:46:41.084 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 59}}
13:46:41.814 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 60}}
13:46:42.380 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 61}}
13:46:43.094 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 62}}
13:46:43.825 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 63}}
13:46:44.543 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 64}}
13:46:45.293 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 65}}
13:46:47.543 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 66}}
13:46:50.239 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 67}}
13:46:53.124 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 68}}
13:46:55.919 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 69}}
13:46:58.921 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 70}}
13:47:02.120 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 71}}
13:47:05.008 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 72}}
13:47:08.101 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 73}}
13:47:10.703 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 74}}
13:47:13.609 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 75}}
13:47:16.503 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 76}}
13:47:19.289 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 77}}
13:47:22.183 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 78}}
13:47:25.157 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 79}}
13:47:28.202 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 80}}
13:47:30.898 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 81}}
13:47:33.993 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 82}}
13:47:37.073 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 83}}
13:47:40.055 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 84}}
13:47:42.961 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 85}}
13:47:45.911 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 86}}
13:47:48.504 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 87}}
13:47:51.522 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 88}}
13:47:54.508 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 89}}
13:47:57.516 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 90}}
13:48:00.584 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 91}}
13:48:03.574 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 92}}
13:48:06.566 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 93}}
13:48:09.167 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 94}}
13:48:11.977 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 95}}
13:48:14.756 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 96}}
13:48:17.546 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 97}}
13:48:20.340 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 98}}
13:48:21.927 MQT: tele/nspanel/STATE = {“Time”:“2022-12-24T13:48:21”,“Uptime”:“0T01:15:08”,“UptimeSec”:4508,“Heap”:102,“SleepMode”:“Dynamic”,“Sleep”:0,“LoadAvg”:4996,“MqttCount”:1,“Berry”:{“HeapUsed”:21,“Objects”:347},“POWER1”:“OFF”,“POWER2”:“OFF”,“Wifi”:{“AP”:1,“SSId”:“Error-404s”,“BSSId”:“00:22:33:44:AA:A0”,“Channel”:10,“Mode”:“11n”,“RSSI”:64,“Signal”:-68,“LinkCount”:1,“Downtime”:“0T00:00:03”}}
13:48:21.960 MQT: tele/nspanel/SENSOR = {“Time”:“2022-12-24T13:48:21”,“ANALOG”:{“Temperature1”:24.2},“TempUnit”:“C”}
13:48:23.235 MQT: tele/nspanel/RESULT = {“Flashing”:{“complete”: 99}}
13:48:25.235 MQT: stat/nspanel/RESULT = {“NxPanel”:“Done”}
13:48:25.711 MQT: stat/nspanel/RESULT = {“NxPanel”:“Done”}
13:48:25.743 FLH: Flashing complete
13:48:25.848 MQT: tele/nspanel/RESULT = {“nextion”:“bytes(‘’)”}
13:48:27.943 NXP: Screen Initialized
13:48:28.003 NXP: Switch state updated with { “switches”: { “switch1”: 0 , “switch2”: 0 } }
13:48:28.059 NXP: Restoring: {“config”: {“ar”: 0, “dn”: 76, “st”: 30, “dl”: 2, “wp”: 1, “v”: “1.0.8”, “at”: 1, “au”: 1, “ah”: 0, “sm”: 0}}
13:48:28.138 NXP: Triggering update check
13:48:28.864 MQT: tele/nspanel/RESULT = {“config”:{“v”:“1.0.8”,“au”:1,“at”:1,“sm”:0,“st”:30,“wp”:1,“ar”:0,“ah”:0,“dl”:2,“dn”:76}}
13:48:29.245 NXP: Update check for ‘testing’
13:48:29.502 NXP: Current version 1.0.8 is latest
13:48:29.556 MQT: tele/nspanel/RESULT = {“config”:{“v”:“1.0.8”,“au”:1,“at”:1,“sm”:0,“st”:30,“wp”:1,“ar”:0,“ah”:0,“dl”:2,“dn”:76}}
13:48:35.352 MQT: tele/nspanel/RESULT = {“init”: {“nx-panel”: “1.0.8”, “berry”: “1.1.4” }}

You dont get this?

Hi Mike, thanks for your help. In the meantime I had wanted to set up a second NSPanel after the instructions and setup with nxpanel.be and got the same result. It was written by Installnxpanel with 115200 builds and went up to 100%. After the reboot, the time was also displayed there. I could not force reinstall both panels. Only when I read about the solution in a post to simply change the build rate from 115200 to 9600.

at the bottom right when booting is now the Berry and Panel version, which was missing until now. The panel boots without me having to press OK buttton. with 12.2.0 still no clock time was displayed. after upgrading to 12.3.1 and the build rate of 9600, both NSPanels now work.
Why Installnxpanel could install with 115200 on the first attempt and not afterwards, I do not understand. now I can’t explain that I had to change the value to 9600 in nxpanel.be to get a working panel. now I also see the desired messages in the console when pressing switches and buttons. That with two panels the same problems and solutions are, strangely, Thank you and mary Christmas

P.S.
Here I found the reference to the solution with the baud rate to 9600

Otherwise I always got the error after trying to use installnxpanel again:

[BUG] Something has gone wrong flashing display firmware

Now it works with this weird change

Thats now my nxpanel.be.

Sonoff NSPanel Tasmota (Nextion with Flashing) driver | code by peepshow-21

based on;

Sonoff NSPanel Tasmota driver v0.47 | code by blakadder and s-hadinger

Example Flash

FlashNextion http://172.17.20.5:8080/static/chunks/nxpanel.tft

FlashNextion http://proto.systems/nxpanel/nxpanel-1.0.0.tft

class Nextion : Driver

static VERSION = "1.1.4"
static header = bytes().fromstring("PS")

static flash_block_size = 4096

var flash_mode
var flash_size
var flash_written
var flash_buff
var flash_offset
var awaiting_offset
var tcp
var ser
var last_per
var auto_update_flag

def split_msg(b)   
    import string
    var ret = []
    var i = 0
    while i < size(b)-1
        if b[i] == 0x55 && b[i+1] == 0xAA
            if i > 0
                var nb = b[0..i-1];
                ret.push(nb)
            end
            b = b[i+2..]
            i = 0
        else
            i+=1
        end
    end
    if size(b) > 0
        ret.push(b)
    end
    return ret
end

def crc16(data, poly)
  if !poly  poly = 0xA001 end
  # CRC-16 MODBUS HASHING ALGORITHM
  var crc = 0xFFFF
  for i:0..size(data)-1
    crc = crc ^ data[i]
    for j:0..7
      if crc & 1
        crc = (crc >> 1) ^ poly
      else
        crc = crc >> 1
      end
    end
  end
  return crc
end

def encode(payload)
  var b = bytes()
  b += self.header
  var nsp_type = 0 # not used
  b.add(nsp_type)       # add a single byte
  var b1 = bytes().fromstring(payload)
  var b2 = bytes()
  for i: 0..size(b1)-1
    if (b1[i]!=0xC2)
        b2.add(b1[i])
    end
  end
  b.add(size(b2), 2)   # add size as 2 bytes, little endian
  b += b2
  var msg_crc = self.crc16(b)
  b.add(msg_crc, 2)       # crc 2 bytes, little endian
  return b
end

def encodenx(payload)
    var b = bytes().fromstring(payload)
    b += bytes('FFFFFF')
    return b
end

def sendnx(payload)
    import string
    var payload_bin = self.encodenx(payload)
    self.ser.write(payload_bin)
    log(string.format("NXP: Nextion command sent = %s",str(payload_bin)), 3)       
end

def send(payload)
    var payload_bin = self.encode(payload)
    if self.flash_mode==1
        log("NXP: skipped command becuase still flashing", 3)
    else 
        self.ser.write(payload_bin)
        log("NXP: payload sent = " + str(payload_bin), 3)
    end
end

def write_to_nextion(b)
    self.ser.write(b)
end

def screeninit()
    log("NXP: Screen Initialized") 
    self.sendnx("berry.txt=\""+self.VERSION+"\"")
    self.sendnx("click init_bn,1")
    self.sendnx("recmod=1")
    tasmota.delay(50)
    self.set_power()
    import persist
    if persist.has("config")
        var m = map()
        m.setitem("config",persist.config)
        var s = m.tostring()
        var json = ""
        for i: 0..size(s)-1
            if s[i]=="'"
                json += '"'
            else
                json += s[i]
            end
        end
        log("NXP: Restoring: "+json)
        self.send(json)
    end
    self.check_for_updates()
end

def write_block()
    
    import string
    log("FLH: Read block",3)
    while size(self.flash_buff)<self.flash_block_size && self.tcp.connected()
        if self.tcp.available()>0
            self.flash_buff += self.tcp.readbytes()
        else
            tasmota.delay(50)
            log("FLH: Wait for available...",3)
        end
    end
    log("FLH: Buff size "+str(size(self.flash_buff)),3)
    var to_write
    if size(self.flash_buff)>self.flash_block_size
        to_write = self.flash_buff[0..self.flash_block_size-1]
        self.flash_buff = self.flash_buff[self.flash_block_size..]
    else
        to_write = self.flash_buff
        self.flash_buff = bytes()
    end
    log("FLH: Writing "+str(size(to_write)),3)
    var per = (self.flash_written*100)/self.flash_size
    if (self.last_per!=per) 
        self.last_per = per
        tasmota.publish_result(string.format("{\"Flashing\":{\"complete\": %d}}",per), "RESULT") 
    end
    if size(to_write)>0
        self.flash_written += size(to_write)
        if self.flash_offset==0 || self.flash_written>self.flash_offset
            self.ser.write(to_write)
            self.flash_offset = 0
        else
            tasmota.set_timer(10,/->self.write_block())
        end
    end
    log("FLH: Total "+str(self.flash_written),3)
    if (self.flash_written==self.flash_size)
        log("FLH: Flashing complete")
        self.flash_mode = 0
    end

end

def every_100ms()
    import string
    if self.ser.available() > 0
        var msg = self.ser.read()
        if size(msg) > 0
            log(string.format("NXP: Received Raw = %s",str(msg)), 3)
            if (self.flash_mode==1)
                var strv = msg[0..-4].asstring()
                if string.find(strv,"comok 2")>=0
                    log("FLH: Send (High Speed) flash start")
                    self.sendnx(string.format("whmi-wris %d,9600,res0",self.flash_size))
                elif size(msg)==1 && msg[0]==0x08
                    log("FLH: Waiting offset...",3)
                    self.awaiting_offset = 1
                elif size(msg)==4 && self.awaiting_offset==1
                    self.awaiting_offset = 0
                    self.flash_offset = msg.get(0,4)
                    log("FLH: Flash offset marker "+str(self.flash_offset),3)
                    self.write_block()
                elif size(msg)==1 && msg[0]==0x05
                    self.write_block()
                else
                    log("FLH: Something has gone wrong flashing nxpanel ["+str(msg)+"]",2)
                end
            else
                var msg_list = self.split_msg(msg)
                for i:0..size(msg_list)-1
                    msg = msg_list[i]
                    if size(msg) > 0
                        if msg == bytes('000000FFFFFF88FFFFFF')
                            self.screeninit()
                        elif msg[0]==0x7B # JSON, starting with "{"
                            var jm = string.format("%s",msg[0..-1].asstring())
                            tasmota.publish_result(jm, "RESULT")        
                        elif msg[0]==0x07 && size(msg)==1 # BELL/Buzzer
                            tasmota.cmd("buzzer 1,1")
                        else
                            var jm = string.format("{\"nextion\":\"%s\"}",str(msg[0..-4]))
                            tasmota.publish_result(jm, "RESULT")        
                        end
                    end       
                end
            end
        end
    end
end      

def begin_nextion_flash()
    self.flash_written = 0
    self.awaiting_offset = 0
    self.flash_offset = 0
    self.sendnx('DRAKJHSUYDGBNCJHGJKSHBDN')
    self.sendnx('recmod=0')
    self.sendnx('recmod=0')
    self.flash_mode = 1
    self.sendnx("connect")        
end

def set_power()
  var ps = tasmota.get_power()
  for i:0..1
    if ps[i] == true
      ps[i] = "1"
    else 
      ps[i] = "0"
    end
  end
  var json_payload = '{ "switches": { "switch1": ' + ps[0] + ' , "switch2": ' + ps[1] +  ' } }'
  log('NXP: Switch state updated with ' + json_payload)
  self.send(json_payload)
end

def set_clock()
  var now = tasmota.rtc()
  var time_raw = now['local']
  var nsp_time = tasmota.time_dump(time_raw)
  var time_payload = '{ "clock": { "date":' + str(nsp_time['day']) + ',"month":' + str(nsp_time['month']) + ',"year":' + str(nsp_time['year']) + ',"weekday":' + str(nsp_time['weekday']) + ',"hour":' + str(nsp_time['hour']) + ',"min":' + str(nsp_time['min']) + ' } }'
  log('NXP: Time and date synced with ' + time_payload, 3)
  self.send(time_payload)
end

def open_url(url)

    import string
    var host
    var port
    var s1 = string.split(url,7)[1]
    var i = string.find(s1,":")
    var sa
    if i<0
        port = 80
        i = string.find(s1,"/")
        sa = string.split(s1,i)
        host = sa[0]
    else
        sa = string.split(s1,i)
        host = sa[0]
        s1 = string.split(sa[1],1)[1]
        i = string.find(s1,"/")
        sa = string.split(s1,i)
        port = int(sa[0])
    end
    var get = sa[1]
    log(string.format("FLH: host: %s, port: %s, get: %s",host,port,get))
    self.tcp = tcpclient()
    self.tcp.connect(host,port)
    log("FLH: Connected:"+str(self.tcp.connected()),3)
    var get_req = "GET "+get+" HTTP/1.0\r\n"
get_req += string.format("HOST: %s:%s\r\n\r\n",host,port)
    self.tcp.write(get_req)
    var a = self.tcp.available()
    i = 1
    while a==0 && i<5
      tasmota.delay(100*i)
      tasmota.yield() 
      i += 1
      log("FLH: Retry "+str(i),3)
      a = self.tcp.available()
    end
    if a==0
        log("FLH: Nothing available to read!",3)
        return
    end
    var b = self.tcp.readbytes()
    i = 0
    var end_headers = false;
    var headers
    while i<size(b) && headers==nil
        if b[i..(i+3)]==bytes().fromstring("\r\n\r\n") 
            headers = b[0..(i+3)].asstring()
            self.flash_buff = b[(i+4)..]
        else
            i += 1
        end
    end
    #print(headers)
	# check http respose for code 200
	var tag = "200 OK"
    i = string.find(headers,tag)
    if (i>0) 
        log("FLH: HTTP Respose is 200 OK",3)
	else
        log("FLH: HTTP Respose is not 200 OK",3)
		print(headers)
		return
    end
	# check http respose for content-length
    tag = "Content-Length: "
    i = string.find(headers,tag)
    if (i>0) 
        var i2 = string.find(headers,"\r\n",i)
        var s = headers[i+size(tag)..i2-1]
        self.flash_size=int(s)
    end
    if self.flash_size==0
        log("FLH: No size header, counting ...",3)
        self.flash_size = size(self.flash_buff)
        #print("counting start ...")
        while self.tcp.connected()
            while self.tcp.available()>0
                self.flash_size += size(self.tcp.readbytes())
            end
            tasmota.delay(50)
        end
        #print("counting end ...",self.flash_size)
        self.tcp.close()
        self.open_url(url)
    else
        log("FLH: Size found in header, skip count",3)
    end
    log("FLH: Flash file size: "+str(self.flash_size),3)

end

def flash_nextion(url)

    self.flash_size = 0
    self.open_url(url)
    self.begin_nextion_flash()

end

def version_number(sval)
    import string
    var i1 = string.find(sval,".",0)
    var i2 = string.find(sval,".",i1+1)
    var num = int(sval[0..i1-1])*10000+int(sval[i1+1..i2-1])*100+int(sval[i2+1..])
    return num
end

def auto_update()

    log("NXP: Triggering update check");
    self.auto_update_flag = 1
    var json = '{"config": ""}'
    self.send(json)

end

def update_trigger (value, trigger, msg)
    log("NXP: persist msg: "+str(msg),3)
    import persist
    persist.config = msg.item("config")
    persist.save()
    log("NXP: persist saved",3)
    if self.auto_update_flag==0
        return
    end
    self.auto_update_flag = 0
    import string
    var url = nil
    if msg.item("config").item("at")==1
        log("NXP: Update check for 'testing'")
        url = "http://proto.systems/nxpanel/version-testing.txt"
    elif msg.item("config").item("au")==1
        log("NXP: Update check for 'release'")
        url = "http://proto.systems/nxpanel/version-release.txt"
    else
        log("NXP: No auto update active")
    end
    if url!=nil
        var web = webclient()
        log("FLH: Open: "+url,3)
        web.begin(url)
        log("FLH: GET ...",3)
        var r = web.GET()
        log("FLH: STAT "+str(r),3)
        var ver = web.get_string()
        var i=string.find(ver,"\n")
        if i>0
            ver = ver[0..i-1]
        end
        if self.version_number(ver)>self.version_number(value)
            log("NXP: Newer version available - "+ver)
            url = "http://proto.systems/nxpanel/nxpanel-"+ver+".tft"
            tasmota.set_timer(100,/->self.flash_nextion(url))
        else
            log("NXP: Current version "+value+" is latest")
        end
        web.close()
    end
end

def check_for_updates()
    
    self.auto_update()
    tasmota.set_timer(1000*60*60*24,/->self.check_for_updates()) # daily

end

def init()
    log("NXP: Initializing Driver")
    self.ser = serial(17, 16, 9600, serial.SERIAL_8N1)
    self.sendnx('DRAKJHSUYDGBNCJHGJKSHBDN')
    self.sendnx('rest')
    self.flash_mode = 0
end

def install()

    self.flash_nextion("http://proto.systems/nxpanel/nxpanel-latest.tft")

end

end

var nextion = Nextion()

tasmota.add_driver(nextion)

def flash_nextion(cmd, idx, payload, payload_json)
def task()
nextion.flash_nextion(payload)
end
tasmota.set_timer(0,task)
tasmota.resp_cmnd_done()
end

def send_cmd(cmd, idx, payload, payload_json)
nextion.sendnx(payload)
tasmota.resp_cmnd_done()
end

def send_cmd2(cmd, idx, payload, payload_json)
nextion.send(payload)
tasmota.resp_cmnd_done()
end

def auto_update(cmd, idx, payload, payload_json)
nextion.auto_update()
tasmota.resp_cmnd_done()
end

def install_nxpanel()
tasmota.set_timer(50,/->nextion.install())
tasmota.resp_cmnd_done()
end

tasmota.add_cmd(‘Nextion’, send_cmd)
tasmota.add_cmd(‘Screen’, send_cmd2)
tasmota.add_cmd(‘NxPanel’, send_cmd2)
tasmota.add_cmd(‘FlashNextion’, flash_nextion)
tasmota.add_cmd(‘AutoFlash’, auto_update)
tasmota.add_cmd(‘InstallNxPanel’, install_nxpanel)

tasmota.add_rule(“power1#state”, /-> nextion.set_power())
tasmota.add_rule(“power2#state”, /-> nextion.set_power())
tasmota.add_rule(“Time#Minute”, /-> nextion.set_clock())
tasmota.add_rule(“alarm#update=1”, /-> nextion.auto_update())
tasmota.add_rule(“config#v”, /a,b,c-> nextion.update_trigger(a,b,c))
tasmota.cmd(“Rule3 1”) # needed until Berry bug fixed
tasmota.cmd(“State”)

did you come around to check this?

The panel works great, I just need to trim the script a bit to get better performance. And I don´t need 8 buttons on the main page.

Did you get this working? I had a look at the script but I could not find a way to adjust this.

@m-home
Thank you for your great development.
@Alf
Thank you for the great documentation. It helps a lot.
I am doing my first steps with the Nxpanel and everything works pretty good.

Now my question is: How can I control the “S”-Factor in {H,S,B}? H and S works good.
{“dimmer”:{“pid”:16,“power”:0,“hsbcolor”:“180,100,50”}}

Also there is a “Warm” Option on the page. I don’t know for what. It gives back some strange ct-values from 154 to 500.
{“dimmer”:{“pid”:16,“power”:1,“ct”:154}}
{“dimmer”:{“pid”:16,“power”:0,“ct”:500}}

Any idea? Thank you in advance. BR

1 Like

No, I have not found a way to change it yet.

What about:

nxpanel({"start": {"pid":n, "format":n}})

…on the console…

In your case:

nxpanel({"start": {"pid":10, "format":2}})

Thanks for the great work!

I just implement my first nxpanel (which works in standalone mode) and I want to use the thermostat. Everything works here BUT the “Required” and “Current” temperatures are set with precision 0, e.g. “4”, “21”. What I need is with one digit, e.g. “21.5”. Is this possible? I couldnt find a way.
What I try is:
Show/configure main panel:

nxpanel({"refresh":{"pid":11,"name":"Home - Main Panel","format":2,buttons:[ {"bid":1,"label":"Hall","type":"delete","state":0,"icon":1}, {"bid":2,"label":"Heating","type":10,"next":10,"state":9,"icon":9}]}})

Configure/set themro panel:

nxpanel({"refresh":{"pid":15,"name":"Thermostat","therm":{"temp":"16.1","set":"17.2","state":1,"heat":1}}})

But still shows with 0 precision/no digits.

Any ideas? I can’t use it with this precision…
Thanks!

Is this project dead?