Skip to content
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Hardware
  4. SONOFF NSPanel mit Lovelace UI

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.0k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.8k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.0k

SONOFF NSPanel mit Lovelace UI

SONOFF NSPanel mit Lovelace UI

Scheduled Pinned Locked Moved Hardware
lovelace uinspanelsonoff
7.7k Posts 271 Posters 6.7m Views 253 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • K Kerschte_de

    @tt-tom
    Hallo Tom. Vielen Dank, dass Du Dich der Sache so schnell annimmst. Ich bin gerade auch nochmal das Video von Matthias durchgegangen, ob ich irgendwas entdecke ... habe einige Datenpunkte auch nochmal exakt nach seinem Video angelegt und dann im Script hinterlegt. Leider weiter ohne Erfolg.

    14.12.2024, 18:20:28.125	[info ]: javascript.0 (363) Compiling TypeScript source script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT
    14.12.2024, 18:20:28.391	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: source code did not change, using cached compilation result...
    14.12.2024, 18:20:28.456	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: --- start of NsPanelTs: 0_userdata.0.NSPanel.1. ---
    14.12.2024, 18:20:28.459	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: setObjects enabled - create Alias Channels possible
    14.12.2024, 18:20:28.460	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: weather alias for accuweather.0. already exists
    14.12.2024, 18:20:28.464	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: registered 41 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
    14.12.2024, 18:20:28.502	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Desired TFT Firmware: 53 / v4.4.0
    14.12.2024, 18:20:28.502	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Installed TFT Firmware: 53 / v4.4.0
    14.12.2024, 18:20:28.720	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Debug mode activated
    14.12.2024, 18:20:28.788	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Tasmota Buzzer disabled
    14.12.2024, 18:20:28.800	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: NaN W
    14.12.2024, 18:20:28.801	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: get_current_tasmota_ip_address: 192.168.188.240
    14.12.2024, 18:20:28.809	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting tasmota firmware version
    14.12.2024, 18:20:28.810	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting current berry driver version
    14.12.2024, 18:20:28.811	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: get_current_tasmota_ip_address: 192.168.188.240
    14.12.2024, 18:20:28.811	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting online berry driver version
    14.12.2024, 18:20:28.811	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting online TFT version
    14.12.2024, 18:20:28.813	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting online firmware version
    14.12.2024, 18:20:28.828	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: import adbase as ad
    
    from luibackend.config import LuiBackendConfig
    from luibackend.controller import LuiController
    from luibackend.mqtt import LuiMqttListener, LuiMqttSender
    from luibackend.updater import Updater
    
    import apis
    import json
    from typing import Literal
    
    class NsPanelLovelaceUIManager(ad.ADBase):
    
        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")
            apis.mqtt_api = self.get_plugin_api("MQTT")
    
            cfg = self._cfg = LuiBackendConfig(apis.ha_api, self.args["config"])
    
            use_api = cfg.get("use_api") == True
    
            topic_send = cfg.get("panelSendTopic")
            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)
    
            self._controller = LuiController(cfg, mqttsender.send_mqtt_msg)
            
            desired_tasmota_driver_version   = 8
            desired_display_firmware_version = 53
            version     = "v4.3.3"
            
            model       = cfg.get("model")
            if model == "us-l":
                desired_display_firmware_url = cfg._config.get("displayURL-US-L", f"http://nspanel.pky.eu/lovelace-ui/github/nspanel-us-l-{version}.tft")
            elif model == "us-p":
                desired_display_firmware_url = cfg._config.get("displayURL-US-P", f"http://nspanel.pky.eu/lovelace-ui/github/nspanel-us-p-{version}.tft")
            else:
                desired_display_firmware_url = cfg._config.get("displayURL-EU",   f"http://nspanel.pky.eu/lovelace-ui/github/nspanel-{version}.tft")
            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)
            
            # Request Tasmota Driver Version
            updater.request_berry_driver_version()
    
            LuiMqttListener(use_api, topic_recv, api_panel_name, api_device_id, self._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
    
    14.12.2024, 18:20:28.832	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: # Sonoff NSPanel Tasmota Lovelace UI Berry Driver (Extended Flashing to faster speeds; improved Error Handling)| code by joBr99
    # based on;
    # 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://ip-address-of-your-homeassistant:8123/local/nspanel.tft
    # FlashNextion http://nspanel.pky.eu/lui.tft
    
    class Nextion : Driver
    
        static header = bytes('55BB')
    
        static flash_block_size = 4096
    
        var flash_mode
        var flash_start_millis
        var flash_size
        var flash_written
        var flash_buff
        var flash_offset
        var flash_proto_version
        var flash_proto_baud
        var awaiting_offset
        var tcp
        var ser
        var last_per
        var url
    
        def split_55(b)
          var ret = []
          var s = size(b)   
          var i = s-2   # start from last-1
          while i > 0
            if b[i] == 0x55 && b[i+1] == 0xBB           
              ret.push(b[i..s-1]) # push last msg to list
              b = b[(0..i-1)]   # write the rest back to b
            end
            i -= 1
          end
          ret.push(b)
          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
    
        # encode using custom protocol 55 BB [payload length] [payload length] [payload] [crc] [crc]
        def encode(payload)
          var b = bytes()
          b += self.header
          b.add(size(payload), 2)   # add size as 2 bytes, little endian
          b += bytes().fromstring(payload)
          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("recmod=1")        
        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(4096)
                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, \"time_elapsed\": %d}}",per , (tasmota.millis()-self.flash_start_millis)/1000), "RESULT") 
            end
            if size(to_write)>0
                self.flash_written += size(to_write)
                self.ser.write(to_write)
            end
            log("FLH: Total "+str(self.flash_written),3)
            if (self.flash_written==self.flash_size)
                log("FLH: Flashing complete - Time elapsed: %d", (tasmota.millis()-self.flash_start_millis)/1000)
                self.flash_mode = 0
                self.ser.deinit()
                self.ser = serial(17, 16, 115200, serial.SERIAL_8N1)
            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
                            tasmota.delay(50)
                            log("FLH: Send (High Speed) flash start")
                            self.flash_start_millis = tasmota.millis()
                            #self.sendnx(string.format("whmi-wris %d,115200,res0",self.flash_size))
                            if self.flash_proto_version == 0
                                self.sendnx(string.format("whmi-wri %d,%d,res0",self.flash_size,self.flash_proto_baud))
                            else
                                self.sendnx(string.format("whmi-wris %d,%d,res0",self.flash_size,self.flash_proto_baud))
                            end
                            if self.flash_proto_baud != 115200
                                tasmota.delay(50)
                                self.ser.deinit()
                                self.ser = serial(17, 16, self.flash_proto_baud, serial.SERIAL_8N1)
                            end
                        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)
                            if self.flash_offset != 0
                                self.open_url_at(self.url, self.flash_offset)
                                self.flash_written = self.flash_offset
                            end
                            self.write_block()
                        elif size(msg)==1 && msg[0]==0x05
                            self.write_block()
                        else
                            log("FLH: Something has gone wrong flashing display firmware ["+str(msg)+"]",2)
                        end
                    else
                        var msg_list = self.split_55(msg)
                        for i:0..size(msg_list)-1
                            msg = msg_list[i]
                            if size(msg) > 0
                                if msg == bytes('000000FFFFFF88FFFFFF')
                                    self.screeninit()
                                elif size(msg)>=2 && msg[0]==0x55 && msg[1]==0xBB
                                    var jm = string.format("{\"CustomRecv\":\"%s\"}",msg[4..-3].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 open_url_at(url, pos)
            self.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("Range: bytes=%d-\r\n", pos)
            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/206
            if string.find(headers,"200 OK")>0 || string.find(headers,"206 Partial Content")>0
                log("FLH: HTTP Respose is 200 OK or 206 Partial Content",3)
            else
                log("FLH: HTTP Respose is not 200 OK or 206 Partial Content",3)
                print(headers)
                return -1
            end
            # only set flash size if pos is zero
            if pos == 0
                # check http respose for content-length
                var 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
                log("FLH: Flash file size: "+str(self.flash_size),3)
            end
    
        end
    
        def flash_nextion(url)
            self.flash_size = 0
            var res = self.open_url_at(url, 0)
            if res != -1
                self.begin_nextion_flash()
            end
        end
    
        def init()
            log("NXP: Initializing Driver")
            self.ser = serial(17, 16, 115200, serial.SERIAL_8N1)
            self.flash_mode = 0
            self.flash_proto_version = 1
            self.flash_proto_baud = 921600
        end
    
    end
    
    var nextion = Nextion()
    
    tasmota.add_driver(nextion)
    
    def get_current_version(cmd, idx, payload, payload_json)
        import string
        var version_of_this_script = 9
        var jm = string.format("{\"nlui_driver_version\":\"%s\"}", version_of_this_script)
        tasmota.publish_result(jm, "RESULT")
    end
    
    tasmota.add_cmd('GetDriverVersion', get_current_version)
    
    def update_berry_driver(cmd, idx, payload, payload_json)
        def task()
            import path
            import string
    		if string.find(payload, ".tapp") > 0
    		    print("tapp in URL; will do .tapp update and migration if necessary")
    			
    			if path.exists("autoexec.be")
    			    print("autoexec.be found; will check for migration")
    				var autoexecfile = open('autoexec.be')
    				var line = autoexecfile.readline()
    				autoexecfile.close()
    				if string.find(line, "NSPanel Tasmota Lovelace UI Berry Driver") > 0
    			        print("found lovelace berry driver, going to delete autoexec.be and .bec")
    					path.remove("autoexec.be")
    					path.remove("autoexec.bec")
    				end
    			end
    			
    			var r = tasmota.urlfetch(payload, "nsp-lovelace-driver.tapp")
                if r < 0
                    print("Update failed")
                else
                    tasmota.cmd("Restart 1")
                end
    			
    		elif string.find(payload, ".be") > 0
    		    print("be in URL; will do .be update")
    			if path.exists("nsp-lovelace-driver.tapp")
    			    print("Error: there is the tapp version of the berry driver installed; cannot do .be update.")
    			else
                    var cl = webclient()
                    cl.begin(payload)
                    var r = cl.GET()
                    if r == 200
                        print("Sucessfully downloaded nspanel-lovelace-ui berry driver")
                    else
                        print("Error while downloading nspanel-lovelace-ui berry driver")
                    end
                    r = cl.write_file("autoexec.be")
                    if r < 0
                        print("Error while writeing nspanel-lovelace-ui berry driver")
                    else
                        print("Sucessfully written nspanel-lovelace-ui berry driver")
                        tasmota.cmd("Restart 1")
                    end
    			end
    		else
    			print("invalid url filetype")
    		end
    		
    		
    		
            if path.exists("nsp-lovelace-driver.tapp")
                var r = string.find(payload, ".tapp")
                if r < 0
                    print("URL doesn't contain .tapp skipping update")
                else
    
                end
            else
                var r = string.find(payload, ".be")
                if r < 0
                    print("URL doesn't contain .be skipping update")
                else
            
                end                
            end
        end
        tasmota.set_timer(0,task)
        tasmota.resp_cmnd_done()
    end
    
    tasmota.add_cmd('UpdateDriverVersion', update_berry_driver)
    
    def flash_nextion(cmd, idx, payload, payload_json)
        def task()
        nextion.flash_proto_version = 1
        nextion.flash_proto_baud = 921600
            nextion.flash_nextion(payload)
        end
        tasmota.set_timer(0,task)
        tasmota.resp_cmnd_done()
    end
    
    def flash_nextion_adv(cmd, idx, payload, payload_json)
        def task()        
            if idx==0
                nextion.flash_proto_version = 1
                nextion.flash_proto_baud = 921600
            elif idx==1
                nextion.flash_proto_version = 0
                nextion.flash_proto_baud = 921600
            elif idx==2
                nextion.flash_proto_version = 1
                nextion.flash_proto_baud = 115200
            elif idx==3
                nextion.flash_proto_version = 0
                nextion.flash_proto_baud = 115200
            elif idx==4
                nextion.flash_proto_version = 1
                nextion.flash_proto_baud = 256000
            elif idx==5
                nextion.flash_proto_version = 0
                nextion.flash_proto_baud = 256000
            elif idx==6
                nextion.ser.deinit()
                nextion.ser = serial(17, 16, 9600, serial.SERIAL_8N1)
                nextion.flash_proto_version = 0
                nextion.flash_proto_baud = 921600
            else
                nextion.flash_proto_version = 0
                nextion.flash_proto_baud = 115200
            end
            
            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
    
    tasmota.add_cmd('Nextion', send_cmd)
    tasmota.add_cmd('CustomSend', send_cmd2)
    tasmota.add_cmd('FlashNextion', flash_nextion)
    tasmota.add_cmd('FlashNextionAdv', flash_nextion_adv)
    
    14.12.2024, 18:20:28.835	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: online display firmware version => 53
    14.12.2024, 18:20:28.852	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: {"nlui_driver_version":"9"}
    14.12.2024, 18:20:28.855	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: current tasmota firmware version => 14.3.0
    14.12.2024, 18:20:28.855	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: online berry driver version => 9
    14.12.2024, 18:20:28.882	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: current berry driver version => 9
    14.12.2024, 18:20:28.926	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: hidden Cards disabled
    
    
    K Offline
    K Offline
    Kerschte_de
    wrote on last edited by
    #6647

    @kerschte_de

    {"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594433","id":212594433,"node_id":"RA_kwDOBMkSUM4Mq-8B","name":"tasmota-lite.bin","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":520208,"download_count":62,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-lite.bin"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594444","id":212594444,"node_id":"RA_kwDOBMkSUM4Mq-8M","name":"tasmota-lite.bin.gz","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/gzip","state":"uploaded","size":364868,"download_count":59,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-lite.bin.gz"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594429","id":212594429,"node_id":"RA_kwDOBMkSUM4Mq-79","name":"tasmota-minimal.bin","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":374432,"download_count":108,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-minimal.bin"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594435","id":212594435,"node_id":"RA_kwDOBMkSUM4Mq-8D","name":"tasmota-minimal.bin.gz","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/gzip","state":"uploaded","size":264238,"download_count":113,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-minimal.bin.gz"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594456","id":212594456,"node_id":"RA_kwDOBMkSUM4Mq-8Y","name":"tasmota-NL.bin","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":669024,"download_count":34,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-NL.bin"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594441","id":212594441,"node_id":"RA_kwDOBMkSUM4Mq-8J","name":"tasmota-NL.bin.gz","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/gzip","state":"uploaded","size":469232,"download_count":32,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-NL.bin.gz"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594448","id":212594448,"node_id":"RA_kwDOBMkSUM4Mq-8Q","name":"tasmota-PL.bin","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":669680,"download_count":36,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-PL.bin"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594440","id":212594440,"node_id":"RA_kwDOBMkSUM4Mq-8I","name":"tasmota-PL.bin.gz","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/gzip","state":"uploaded","size":469819,"download_count":34,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-PL.bin.gz"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594445","id":212594445,"node_id":"RA_kwDOBMkSUM4Mq-8N","name":"tasmota-PT.bin","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":669744,"download_count":33,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-PT.bin"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594463","id":212594463,"node_id":"RA_kwDOBMkSUM4Mq-8f","name":"tasmota-PT.bin.gz","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/gzip","state":"uploaded","size":469557,"download_count":32,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-PT.bin.gz"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594447","id":212594447,"node_id":"RA_kwDOBMkSUM4Mq-8P","name":"tasmota-RO.bin","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":669024,"download_count":32,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-RO.bin"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594458","id":212594458,"node_id":"RA_kwDOBMkSUM4Mq-8a","name":"tasmota-RO.bin.gz","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/gzip","state":"uploaded","size":469329,"download_count":32,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-RO.bin.gz"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594449","id":212594449,"node_id":"RA_kwDOBMkSUM4Mq-8R","name":"tasmota-RU.bin","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":673744,"download_count":35,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-RU.bin"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594462","id":212594462,"node_id":"RA_kwDOBMkSUM4Mq-8e","name":"tasmota-RU.bin.gz","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/gzip","state":"uploaded","size":470822,"download_count":33,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-RU.bin.gz"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594469","id":212594469,"node_id":"RA_kwDOBMkSUM4Mq-8l","name":"tasmota-SE.bin","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":669104,"download_count":32,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-SE.bin"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594451","id":212594451,"node_id":"RA_kwDOBMkSUM4Mq-8T","name":"tasmota-SE.bin.gz","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/gzip","state":"uploaded","size":469458,"download_count":32,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-SE.bin.gz"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594455","id":212594455,"node_id":"RA_kwDOBMkSUM4Mq-8X","name":"tasmota-sensors.bin","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":736896,"download_count":48,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-sensors.bin"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594446","id":212594446,"node_id":"RA_kwDOBMkSUM4Mq-8O","name":"tasmota-sensors.bin.gz","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/gzip","state":"uploaded","size":510956,"download_count":53,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-sensors.bin.gz"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594472","id":212594472,"node_id":"RA_kwDOBMkSUM4Mq-8o","name":"tasmota-SK.bin","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":669328,"download_count":32,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-SK.bin"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594467","id":212594467,"node_id":"RA_kwDOBMkSUM4Mq-8j","name":"tasmota-SK.bin.gz","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/gzip","state":"uploaded","size":469668,"download_count":32,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-SK.bin.gz"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594452","id":212594452,"node_id":"RA_kwDOBMkSUM4Mq-8U","name":"tasmota-TR.bin","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":669248,"download_count":33,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-TR.bin"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594466","id":212594466,"node_id":"RA_kwDOBMkSUM4Mq-8i","name":"tasmota-TR.bin.gz","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/gzip","state":"uploaded","size":469588,"download_count":32,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-TR.bin.gz"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594453","id":212594453,"node_id":"RA_kwDOBMkSUM4Mq-8V","name":"tasmota-TW.bin","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":668704,"download_count":32,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-TW.bin"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594450","id":212594450,"node_id":"RA_kwDOBMkSUM4Mq-8S","name":"tasmota-TW.bin.gz","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/gzip","state":"uploaded","size":469967,"download_count":32,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-TW.bin.gz"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594461","id":212594461,"node_id":"RA_kwDOBMkSUM4Mq-8d","name":"tasmota-UK.bin","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":673856,"download_count":38,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-UK.bin"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594459","id":212594459,"node_id":"RA_kwDOBMkSUM4Mq-8b","name":"tasmota-UK.bin.gz","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/gzip","state":"uploaded","size":470776,"download_count":34,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-UK.bin.gz"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594474","id":212594474,"node_id":"RA_kwDOBMkSUM4Mq-8q","name":"tasmota-VN.bin","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":670496,"download_count":33,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-VN.bin"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594464","id":212594464,"node_id":"RA_kwDOBMkSUM4Mq-8g","name":"tasmota-VN.bin.gz","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/gzip","state":"uploaded","size":469736,"download_count":33,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-VN.bin.gz"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594468","id":212594468,"node_id":"RA_kwDOBMkSUM4Mq-8k","name":"tasmota-zbbridge.bin","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":765456,"download_count":37,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-zbbridge.bin"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594475","id":212594475,"node_id":"RA_kwDOBMkSUM4Mq-8r","name":"tasmota-zbbridge.bin.gz","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/gzip","state":"uploaded","size":527313,"download_count":40,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-zbbridge.bin.gz"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594460","id":212594460,"node_id":"RA_kwDOBMkSUM4Mq-8c","name":"tasmota-zigbee.bin","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":857760,"download_count":33,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-zigbee.bin"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594465","id":212594465,"node_id":"RA_kwDOBMkSUM4Mq-8h","name":"tasmota-zigbee.bin.gz","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/gzip","state":"uploaded","size":590540,"download_count":36,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota-zigbee.bin.gz"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594482","id":212594482,"node_id":"RA_kwDOBMkSUM4Mq-8y","name":"tasmota.bin","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":668064,"download_count":84,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota.bin"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594479","id":212594479,"node_id":"RA_kwDOBMkSUM4Mq-8v","name":"tasmota.bin.gz","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/gzip","state":"uploaded","size":468540,"download_count":83,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota.bin.gz"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594473","id":212594473,"node_id":"RA_kwDOBMkSUM4Mq-8p","name":"tasmota32-AD.bin","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":2066048,"download_count":33,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota32-AD.bin"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594471","id":212594471,"node_id":"RA_kwDOBMkSUM4Mq-8n","name":"tasmota32-AD.factory.bin","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":2983552,"download_count":34,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota32-AD.factory.bin"},{"url":"https://api.github.com/repos/arendst/Tasmota/releases/assets/212594478","id":212594478,"node_id":"RA_kwDOBMkSUM4Mq-8u","name":"tasmota32-AF.bin","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":2065568,"download_count":33,"created_at":"2024-12-11T09:35:48Z","updated_at":"2024-12-11T09:35:49Z","browser_download_url":"https://github.com/arendst/Tasmota/releases/download/v14.4.0/tasmota32-AF.bin"},
    
    1 Reply Last reply
    0
    • K Kerschte_de

      @tt-tom
      Hallo Tom. Vielen Dank, dass Du Dich der Sache so schnell annimmst. Ich bin gerade auch nochmal das Video von Matthias durchgegangen, ob ich irgendwas entdecke ... habe einige Datenpunkte auch nochmal exakt nach seinem Video angelegt und dann im Script hinterlegt. Leider weiter ohne Erfolg.

      14.12.2024, 18:20:28.125	[info ]: javascript.0 (363) Compiling TypeScript source script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT
      14.12.2024, 18:20:28.391	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: source code did not change, using cached compilation result...
      14.12.2024, 18:20:28.456	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: --- start of NsPanelTs: 0_userdata.0.NSPanel.1. ---
      14.12.2024, 18:20:28.459	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: setObjects enabled - create Alias Channels possible
      14.12.2024, 18:20:28.460	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: weather alias for accuweather.0. already exists
      14.12.2024, 18:20:28.464	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: registered 41 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
      14.12.2024, 18:20:28.502	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Desired TFT Firmware: 53 / v4.4.0
      14.12.2024, 18:20:28.502	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Installed TFT Firmware: 53 / v4.4.0
      14.12.2024, 18:20:28.720	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Debug mode activated
      14.12.2024, 18:20:28.788	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Tasmota Buzzer disabled
      14.12.2024, 18:20:28.800	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: NaN W
      14.12.2024, 18:20:28.801	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: get_current_tasmota_ip_address: 192.168.188.240
      14.12.2024, 18:20:28.809	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting tasmota firmware version
      14.12.2024, 18:20:28.810	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting current berry driver version
      14.12.2024, 18:20:28.811	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: get_current_tasmota_ip_address: 192.168.188.240
      14.12.2024, 18:20:28.811	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting online berry driver version
      14.12.2024, 18:20:28.811	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting online TFT version
      14.12.2024, 18:20:28.813	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting online firmware version
      14.12.2024, 18:20:28.828	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: import adbase as ad
      
      from luibackend.config import LuiBackendConfig
      from luibackend.controller import LuiController
      from luibackend.mqtt import LuiMqttListener, LuiMqttSender
      from luibackend.updater import Updater
      
      import apis
      import json
      from typing import Literal
      
      class NsPanelLovelaceUIManager(ad.ADBase):
      
          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")
              apis.mqtt_api = self.get_plugin_api("MQTT")
      
              cfg = self._cfg = LuiBackendConfig(apis.ha_api, self.args["config"])
      
              use_api = cfg.get("use_api") == True
      
              topic_send = cfg.get("panelSendTopic")
              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)
      
              self._controller = LuiController(cfg, mqttsender.send_mqtt_msg)
              
              desired_tasmota_driver_version   = 8
              desired_display_firmware_version = 53
              version     = "v4.3.3"
              
              model       = cfg.get("model")
              if model == "us-l":
                  desired_display_firmware_url = cfg._config.get("displayURL-US-L", f"http://nspanel.pky.eu/lovelace-ui/github/nspanel-us-l-{version}.tft")
              elif model == "us-p":
                  desired_display_firmware_url = cfg._config.get("displayURL-US-P", f"http://nspanel.pky.eu/lovelace-ui/github/nspanel-us-p-{version}.tft")
              else:
                  desired_display_firmware_url = cfg._config.get("displayURL-EU",   f"http://nspanel.pky.eu/lovelace-ui/github/nspanel-{version}.tft")
              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)
              
              # Request Tasmota Driver Version
              updater.request_berry_driver_version()
      
              LuiMqttListener(use_api, topic_recv, api_panel_name, api_device_id, self._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
      
      14.12.2024, 18:20:28.832	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: # Sonoff NSPanel Tasmota Lovelace UI Berry Driver (Extended Flashing to faster speeds; improved Error Handling)| code by joBr99
      # based on;
      # 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://ip-address-of-your-homeassistant:8123/local/nspanel.tft
      # FlashNextion http://nspanel.pky.eu/lui.tft
      
      class Nextion : Driver
      
          static header = bytes('55BB')
      
          static flash_block_size = 4096
      
          var flash_mode
          var flash_start_millis
          var flash_size
          var flash_written
          var flash_buff
          var flash_offset
          var flash_proto_version
          var flash_proto_baud
          var awaiting_offset
          var tcp
          var ser
          var last_per
          var url
      
          def split_55(b)
            var ret = []
            var s = size(b)   
            var i = s-2   # start from last-1
            while i > 0
              if b[i] == 0x55 && b[i+1] == 0xBB           
                ret.push(b[i..s-1]) # push last msg to list
                b = b[(0..i-1)]   # write the rest back to b
              end
              i -= 1
            end
            ret.push(b)
            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
      
          # encode using custom protocol 55 BB [payload length] [payload length] [payload] [crc] [crc]
          def encode(payload)
            var b = bytes()
            b += self.header
            b.add(size(payload), 2)   # add size as 2 bytes, little endian
            b += bytes().fromstring(payload)
            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("recmod=1")        
          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(4096)
                  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, \"time_elapsed\": %d}}",per , (tasmota.millis()-self.flash_start_millis)/1000), "RESULT") 
              end
              if size(to_write)>0
                  self.flash_written += size(to_write)
                  self.ser.write(to_write)
              end
              log("FLH: Total "+str(self.flash_written),3)
              if (self.flash_written==self.flash_size)
                  log("FLH: Flashing complete - Time elapsed: %d", (tasmota.millis()-self.flash_start_millis)/1000)
                  self.flash_mode = 0
                  self.ser.deinit()
                  self.ser = serial(17, 16, 115200, serial.SERIAL_8N1)
              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
                              tasmota.delay(50)
                              log("FLH: Send (High Speed) flash start")
                              self.flash_start_millis = tasmota.millis()
                              #self.sendnx(string.format("whmi-wris %d,115200,res0",self.flash_size))
                              if self.flash_proto_version == 0
                                  self.sendnx(string.format("whmi-wri %d,%d,res0",self.flash_size,self.flash_proto_baud))
                              else
                                  self.sendnx(string.format("whmi-wris %d,%d,res0",self.flash_size,self.flash_proto_baud))
                              end
                              if self.flash_proto_baud != 115200
                                  tasmota.delay(50)
                                  self.ser.deinit()
                                  self.ser = serial(17, 16, self.flash_proto_baud, serial.SERIAL_8N1)
                              end
                          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)
                              if self.flash_offset != 0
                                  self.open_url_at(self.url, self.flash_offset)
                                  self.flash_written = self.flash_offset
                              end
                              self.write_block()
                          elif size(msg)==1 && msg[0]==0x05
                              self.write_block()
                          else
                              log("FLH: Something has gone wrong flashing display firmware ["+str(msg)+"]",2)
                          end
                      else
                          var msg_list = self.split_55(msg)
                          for i:0..size(msg_list)-1
                              msg = msg_list[i]
                              if size(msg) > 0
                                  if msg == bytes('000000FFFFFF88FFFFFF')
                                      self.screeninit()
                                  elif size(msg)>=2 && msg[0]==0x55 && msg[1]==0xBB
                                      var jm = string.format("{\"CustomRecv\":\"%s\"}",msg[4..-3].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 open_url_at(url, pos)
              self.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("Range: bytes=%d-\r\n", pos)
              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/206
              if string.find(headers,"200 OK")>0 || string.find(headers,"206 Partial Content")>0
                  log("FLH: HTTP Respose is 200 OK or 206 Partial Content",3)
              else
                  log("FLH: HTTP Respose is not 200 OK or 206 Partial Content",3)
                  print(headers)
                  return -1
              end
              # only set flash size if pos is zero
              if pos == 0
                  # check http respose for content-length
                  var 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
                  log("FLH: Flash file size: "+str(self.flash_size),3)
              end
      
          end
      
          def flash_nextion(url)
              self.flash_size = 0
              var res = self.open_url_at(url, 0)
              if res != -1
                  self.begin_nextion_flash()
              end
          end
      
          def init()
              log("NXP: Initializing Driver")
              self.ser = serial(17, 16, 115200, serial.SERIAL_8N1)
              self.flash_mode = 0
              self.flash_proto_version = 1
              self.flash_proto_baud = 921600
          end
      
      end
      
      var nextion = Nextion()
      
      tasmota.add_driver(nextion)
      
      def get_current_version(cmd, idx, payload, payload_json)
          import string
          var version_of_this_script = 9
          var jm = string.format("{\"nlui_driver_version\":\"%s\"}", version_of_this_script)
          tasmota.publish_result(jm, "RESULT")
      end
      
      tasmota.add_cmd('GetDriverVersion', get_current_version)
      
      def update_berry_driver(cmd, idx, payload, payload_json)
          def task()
              import path
              import string
      		if string.find(payload, ".tapp") > 0
      		    print("tapp in URL; will do .tapp update and migration if necessary")
      			
      			if path.exists("autoexec.be")
      			    print("autoexec.be found; will check for migration")
      				var autoexecfile = open('autoexec.be')
      				var line = autoexecfile.readline()
      				autoexecfile.close()
      				if string.find(line, "NSPanel Tasmota Lovelace UI Berry Driver") > 0
      			        print("found lovelace berry driver, going to delete autoexec.be and .bec")
      					path.remove("autoexec.be")
      					path.remove("autoexec.bec")
      				end
      			end
      			
      			var r = tasmota.urlfetch(payload, "nsp-lovelace-driver.tapp")
                  if r < 0
                      print("Update failed")
                  else
                      tasmota.cmd("Restart 1")
                  end
      			
      		elif string.find(payload, ".be") > 0
      		    print("be in URL; will do .be update")
      			if path.exists("nsp-lovelace-driver.tapp")
      			    print("Error: there is the tapp version of the berry driver installed; cannot do .be update.")
      			else
                      var cl = webclient()
                      cl.begin(payload)
                      var r = cl.GET()
                      if r == 200
                          print("Sucessfully downloaded nspanel-lovelace-ui berry driver")
                      else
                          print("Error while downloading nspanel-lovelace-ui berry driver")
                      end
                      r = cl.write_file("autoexec.be")
                      if r < 0
                          print("Error while writeing nspanel-lovelace-ui berry driver")
                      else
                          print("Sucessfully written nspanel-lovelace-ui berry driver")
                          tasmota.cmd("Restart 1")
                      end
      			end
      		else
      			print("invalid url filetype")
      		end
      		
      		
      		
              if path.exists("nsp-lovelace-driver.tapp")
                  var r = string.find(payload, ".tapp")
                  if r < 0
                      print("URL doesn't contain .tapp skipping update")
                  else
      
                  end
              else
                  var r = string.find(payload, ".be")
                  if r < 0
                      print("URL doesn't contain .be skipping update")
                  else
              
                  end                
              end
          end
          tasmota.set_timer(0,task)
          tasmota.resp_cmnd_done()
      end
      
      tasmota.add_cmd('UpdateDriverVersion', update_berry_driver)
      
      def flash_nextion(cmd, idx, payload, payload_json)
          def task()
          nextion.flash_proto_version = 1
          nextion.flash_proto_baud = 921600
              nextion.flash_nextion(payload)
          end
          tasmota.set_timer(0,task)
          tasmota.resp_cmnd_done()
      end
      
      def flash_nextion_adv(cmd, idx, payload, payload_json)
          def task()        
              if idx==0
                  nextion.flash_proto_version = 1
                  nextion.flash_proto_baud = 921600
              elif idx==1
                  nextion.flash_proto_version = 0
                  nextion.flash_proto_baud = 921600
              elif idx==2
                  nextion.flash_proto_version = 1
                  nextion.flash_proto_baud = 115200
              elif idx==3
                  nextion.flash_proto_version = 0
                  nextion.flash_proto_baud = 115200
              elif idx==4
                  nextion.flash_proto_version = 1
                  nextion.flash_proto_baud = 256000
              elif idx==5
                  nextion.flash_proto_version = 0
                  nextion.flash_proto_baud = 256000
              elif idx==6
                  nextion.ser.deinit()
                  nextion.ser = serial(17, 16, 9600, serial.SERIAL_8N1)
                  nextion.flash_proto_version = 0
                  nextion.flash_proto_baud = 921600
              else
                  nextion.flash_proto_version = 0
                  nextion.flash_proto_baud = 115200
              end
              
              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
      
      tasmota.add_cmd('Nextion', send_cmd)
      tasmota.add_cmd('CustomSend', send_cmd2)
      tasmota.add_cmd('FlashNextion', flash_nextion)
      tasmota.add_cmd('FlashNextionAdv', flash_nextion_adv)
      
      14.12.2024, 18:20:28.835	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: online display firmware version => 53
      14.12.2024, 18:20:28.852	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: {"nlui_driver_version":"9"}
      14.12.2024, 18:20:28.855	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: current tasmota firmware version => 14.3.0
      14.12.2024, 18:20:28.855	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: online berry driver version => 9
      14.12.2024, 18:20:28.882	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: current berry driver version => 9
      14.12.2024, 18:20:28.926	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: hidden Cards disabled
      
      
      K Offline
      K Offline
      Kerschte_de
      wrote on last edited by
      #6648

      @kerschte_de

      da ist was durcheinandergekommen, da ich die maximale Zeichenzahl übersteige. Ich versuche es nochmal ab Zeile 572

      javascript.0	18:20:28.125	info	Compiling TypeScript source script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT
      javascript.0	18:20:28.391	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: source code did not change, using cached compilation result...
      javascript.0	18:20:28.456	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: --- start of NsPanelTs: 0_userdata.0.NSPanel.1. ---
      javascript.0	18:20:28.459	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: setObjects enabled - create Alias Channels possible
      javascript.0	18:20:28.460	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: weather alias for accuweather.0. already exists
      javascript.0	18:20:28.464	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: registered 41 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
      javascript.0	18:20:28.502	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Desired TFT Firmware: 53 / v4.4.0
      javascript.0	18:20:28.502	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Installed TFT Firmware: 53 / v4.4.0
      javascript.0	18:20:28.720	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Debug mode activated
      javascript.0	18:20:28.788	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Tasmota Buzzer disabled
      javascript.0	18:20:28.800	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: NaN W
      javascript.0	18:20:28.801	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: get_current_tasmota_ip_address: 192.168.188.240
      javascript.0	18:20:28.809	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting tasmota firmware version
      javascript.0	18:20:28.810	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting current berry driver version
      javascript.0	18:20:28.811	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: get_current_tasmota_ip_address: 192.168.188.240
      javascript.0	18:20:28.811	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting online berry driver version
      javascript.0	18:20:28.811	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting online TFT version
      javascript.0	18:20:28.813	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting online firmware version
      javascript.0	18:20:28.828	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: import adbase as ad from luibackend.config import LuiBackendConfig from luibackend.controller import LuiController from luibackend.mqtt import LuiMqttListener, LuiMqttSender from luibackend.updater import Updater import apis import json from typing import Literal class NsPanelLovelaceUIManager(ad.ADBase): 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") apis.mqtt_api = self.get_plugin_api("MQTT") cfg = self._cfg = LuiBackendConfig(apis.ha_api, self.args["config"]) use_api = cfg.get("use_api") == True topic_send = cfg.get("panelSendTopic") 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) self._controller = LuiController(cfg, mqttsender.send_mqtt_msg) desired_tasmota_driver_version = 8 desired_display_firmware_version = 53 version = "v4.3.3" model = cfg.get("model") if model == "us-l": desired_display_firmware_url = cfg._config.get("displayURL-US-L", f"http://nspanel.pky.eu/lovelace-ui/github/nspanel-us-l-{version}.tft") elif model == "us-p": desired_display_firmware_url = cfg._config.get("displayURL-US-P", f"http://nspanel.pky.eu/lovelace-ui/github/nspanel-us-p-{version}.tft") else: desired_display_firmware_url = cfg._config.get("displayURL-EU", f"http://nspanel.pky.eu/lovelace-ui/github/nspanel-{version}.tft") 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) # Request Tasmota Driver Version updater.request_berry_driver_version() LuiMqttListener(use_api, topic_recv, api_panel_name, api_device_id, self._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
      javascript.0	18:20:28.832	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: # Sonoff NSPanel Tasmota Lovelace UI Berry Driver (Extended Flashing to faster speeds; improved Error Handling)| code by joBr99 # based on; # 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://ip-address-of-your-homeassistant:8123/local/nspanel.tft # FlashNextion http://nspanel.pky.eu/lui.tft class Nextion : Driver static header = bytes('55BB') static flash_block_size = 4096 var flash_mode var flash_start_millis var flash_size var flash_written var flash_buff var flash_offset var flash_proto_version var flash_proto_baud var awaiting_offset var tcp var ser var last_per var url def split_55(b) var ret = [] var s = size(b) var i = s-2 # start from last-1 while i > 0 if b[i] == 0x55 && b[i+1] == 0xBB ret.push(b[i..s-1]) # push last msg to list b = b[(0..i-1)] # write the rest back to b end i -= 1 end ret.push(b) 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 # encode using custom protocol 55 BB [payload length] [payload length] [payload] [crc] [crc] def encode(payload) var b = bytes() b += self.header b.add(size(payload), 2) # add size as 2 bytes, little endian b += bytes().fromstring(payload) 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("recmod=1") 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(4096) 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, \"time_elapsed\": %d}}",per , (tasmota.millis()-self.flash_start_millis)/1000), "RESULT") end if size(to_write)>0 self.flash_written += size(to_write) self.ser.write(to_write) end log("FLH: Total "+str(self.flash_written),3) if (self.flash_written==self.flash_size) log("FLH: Flashing complete - Time elapsed: %d", (tasmota.millis()-self.flash_start_millis)/1000) self.flash_mode = 0 self.ser.deinit() self.ser = serial(17, 16, 115200, serial.SERIAL_8N1) 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 tasmota.delay(50) log("FLH: Send (High Speed) flash start") self.flash_start_millis = tasmota.millis() #self.sendnx(string.format("whmi-wris %d,115200,res0",self.flash_size)) if self.flash_proto_version == 0 self.sendnx(string.format("whmi-wri %d,%d,res0",self.flash_size,self.flash_proto_baud)) else self.sendnx(string.format("whmi-wris %d,%d,res0",self.flash_size,self.flash_proto_baud)) end if self.flash_proto_baud != 115200 tasmota.delay(50) self.ser.deinit() self.ser = serial(17, 16, self.flash_proto_baud, serial.SERIAL_8N1) end 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) if self.flash_offset != 0 self.open_url_at(self.url, self.flash_offset) self.flash_written = self.flash_offset end self.write_block() elif size(msg)==1 && msg[0]==0x05 self.write_block() else log("FLH: Something has gone wrong flashing display firmware ["+str(msg)+"]",2) end else var msg_list = self.split_55(msg) for i:0..size(msg_list)-1 msg = msg_list[i] if size(msg) > 0 if msg == bytes('000000FFFFFF88FFFFFF') self.screeninit() elif size(msg)>=2 && msg[0]==0x55 && msg[1]==0xBB var jm = string.format("{\"CustomRecv\":\"%s\"}",msg[4..-3].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 open_url_at(url, pos) self.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("Range: bytes=%d-\r\n", pos) 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/206 if string.find(headers,"200 OK")>0 || string.find(headers,"206 Partial Content")>0 log("FLH: HTTP Respose is 200 OK or 206 Partial Content",3) else log("FLH: HTTP Respose is not 200 OK or 206 Partial Content",3) print(headers) return -1 end # only set flash size if pos is zero if pos == 0 # check http respose for content-length var 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 log("FLH: Flash file size: "+str(self.flash_size),3) end end def flash_nextion(url) self.flash_size = 0 var res = self.open_url_at(url, 0) if res != -1 self.begin_nextion_flash() end end def init() log("NXP: Initializing Driver") self.ser = serial(17, 16, 115200, serial.SERIAL_8N1) self.flash_mode = 0 self.flash_proto_version = 1 self.flash_proto_baud = 921600 end end var nextion = Nextion() tasmota.add_driver(nextion) def get_current_version(cmd, idx, payload, payload_json) import string var version_of_this_script = 9 var jm = string.format("{\"nlui_driver_version\":\"%s\"}", version_of_this_script) tasmota.publish_result(jm, "RESULT") end tasmota.add_cmd('GetDriverVersion', get_current_version) def update_berry_driver(cmd, idx, payload, payload_json) def task() import path import string if string.find(payload, ".tapp") > 0 print("tapp in URL; will do .tapp update and migration if necessary") if path.exists("autoexec.be") print("autoexec.be found; will check for migration") var autoexecfile = open('autoexec.be') var line = autoexecfile.readline() autoexecfile.close() if string.find(line, "NSPanel Tasmota Lovelace UI Berry Driver") > 0 print("found lovelace berry driver, going to delete autoexec.be and .bec") path.remove("autoexec.be") path.remove("autoexec.bec") end end var r = tasmota.urlfetch(payload, "nsp-lovelace-driver.tapp") if r < 0 print("Update failed") else tasmota.cmd("Restart 1") end elif string.find(payload, ".be") > 0 print("be in URL; will do .be update") if path.exists("nsp-lovelace-driver.tapp") print("Error: there is the tapp version of the berry driver installed; cannot do .be update.") else var cl = webclient() cl.begin(payload) var r = cl.GET() if r == 200 print("Sucessfully downloaded nspanel-lovelace-ui berry driver") else print("Error while downloading nspanel-lovelace-ui berry driver") end r = cl.write_file("autoexec.be") if r < 0 print("Error while writeing nspanel-lovelace-ui berry driver") else print("Sucessfully written nspanel-lovelace-ui berry driver") tasmota.cmd("Restart 1") end end else print("invalid url filetype") end if path.exists("nsp-lovelace-driver.tapp") var r = string.find(payload, ".tapp") if r < 0 print("URL doesn't contain .tapp skipping update") else end else var r = string.find(payload, ".be") if r < 0 print("URL doesn't contain .be skipping update") else end end end tasmota.set_timer(0,task) tasmota.resp_cmnd_done() end tasmota.add_cmd('UpdateDriverVersion', update_berry_driver) def flash_nextion(cmd, idx, payload, payload_json) def task() nextion.flash_proto_version = 1 nextion.flash_proto_baud = 921600 nextion.flash_nextion(payload) end tasmota.set_timer(0,task) tasmota.resp_cmnd_done() end def flash_nextion_adv(cmd, idx, payload, payload_json) def task() if idx==0 nextion.flash_proto_version = 1 nextion.flash_proto_baud = 921600 elif idx==1 nextion.flash_proto_version = 0 nextion.flash_proto_baud = 921600 elif idx==2 nextion.flash_proto_version = 1 nextion.flash_proto_baud = 115200 elif idx==3 nextion.flash_proto_version = 0 nextion.flash_proto_baud = 115200 elif idx==4 nextion.flash_proto_version = 1 nextion.flash_proto_baud = 256000 elif idx==5 nextion.flash_proto_version = 0 nextion.flash_proto_baud = 256000 elif idx==6 nextion.ser.deinit() nextion.ser = serial(17, 16, 9600, serial.SERIAL_8N1) nextion.flash_proto_version = 0 nextion.flash_proto_baud = 921600 else nextion.flash_proto_version = 0 nextion.flash_proto_baud = 115200 end 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 tasmota.add_cmd('Nextion', send_cmd) tasmota.add_cmd('CustomSend', send_cmd2) tasmota.add_cmd('FlashNextion', flash_nextion) tasmota.add_cmd('FlashNextionAdv', flash_nextion_adv)
      javascript.0	18:20:28.835	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: online display firmware version => 53
      javascript.0	18:20:28.852	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: {"nlui_driver_version":"9"}
      javascript.0	18:20:28.855	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: current tasmota firmware version => 14.3.0
      javascript.0	18:20:28.855	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: online berry driver version => 9
      javascript.0	18:20:28.882	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: current berry driver version => 9
      javascript.0	18:20:28.926	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: hidden Cards disabled
      javascript.0	18:20:29.007	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: {"url":"https://api.github.com/repos/joBr99/nspanel-lovelace-ui/releases/149090497","assets_url":"https://api.github.com/repos/joBr99/nspanel-lovelace-ui/releases/149090497/assets","upload_url":"https://uploads.github.com/repos/joBr99/nspanel-lovelace-ui/releases/149090497/assets{?name,label}","html_url":"https://github.com/joBr99/nspanel-lovelace-ui/releases/tag/v4.4.0","id":149090497,"author":{"login":"joBr99","id":29555657,"node_id":"MDQ6VXNlcjI5NTU1NjU3","avatar_url":"https://avatars.githubusercontent.com/u/29555657?v=4","gravatar_id":"","url":"https://api.github.com/users/joBr99","html_url":"https://github.com/joBr99","followers_url":"https://api.github.com/users/joBr99/followers","following_url":"https://api.github.com/users/joBr99/following{/other_user}","gists_url":"https://api.github.com/users/joBr99/gists{/gist_id}","starred_url":"https://api.github.com/users/joBr99/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joBr99/subscriptions","organizations_url":"https://api.github.com/users/joBr99/orgs","repos_url":"https://api.github.com/users/joBr99/repos","events_url":"https://api.github.com/users/joBr99/events{/privacy}","received_events_url":"https://api.github.com/users/joBr99/received_events","type":"User","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOGo1zRM4I4vDB","tag_name":"v4.4.0","target_commitish":"main","name":"v4.4.0 - Update for HA 2024.04","draft":false,"prerelease":false,"created_at":"2024-03-30T11:18:31Z","published_at":"2024-03-30T12:26:37Z","assets":[],"tarball_url":"https://api.github.com/repos/joBr99/nspanel-lovelace-ui/tarball/v4.4.0","zipball_url":"https://api.github.com/repos/joBr99/nspanel-lovelace-ui/zipball/v4.4.0","body":"## Besides the Update of the App in HACS you need to do the following things:\r\n\r\n🔄 **Restart the AppDaemon Container**\r\n\r\n**Add the following workaround to your Home Assistant configuration.yaml**\r\n\r\nhttps://docs.nspanel.pky.eu/stable/prepare_ha/#workaround-for-homeassistant-202404\r\n\r\n🔄 **Restart Home Assistant**\r\n\r\n## New Features:\r\n\r\n- **Implemented changes to work with upcoming Homeassistant Version 2024.04 @joBr99**\r\n","mentions_count":1}
      
      T 1 Reply Last reply
      0
      • K Kerschte_de

        @tt-tom
        Hallo Tom. Vielen Dank, dass Du Dich der Sache so schnell annimmst. Ich bin gerade auch nochmal das Video von Matthias durchgegangen, ob ich irgendwas entdecke ... habe einige Datenpunkte auch nochmal exakt nach seinem Video angelegt und dann im Script hinterlegt. Leider weiter ohne Erfolg.

        14.12.2024, 18:20:28.125	[info ]: javascript.0 (363) Compiling TypeScript source script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT
        14.12.2024, 18:20:28.391	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: source code did not change, using cached compilation result...
        14.12.2024, 18:20:28.456	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: --- start of NsPanelTs: 0_userdata.0.NSPanel.1. ---
        14.12.2024, 18:20:28.459	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: setObjects enabled - create Alias Channels possible
        14.12.2024, 18:20:28.460	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: weather alias for accuweather.0. already exists
        14.12.2024, 18:20:28.464	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: registered 41 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
        14.12.2024, 18:20:28.502	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Desired TFT Firmware: 53 / v4.4.0
        14.12.2024, 18:20:28.502	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Installed TFT Firmware: 53 / v4.4.0
        14.12.2024, 18:20:28.720	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Debug mode activated
        14.12.2024, 18:20:28.788	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Tasmota Buzzer disabled
        14.12.2024, 18:20:28.800	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: NaN W
        14.12.2024, 18:20:28.801	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: get_current_tasmota_ip_address: 192.168.188.240
        14.12.2024, 18:20:28.809	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting tasmota firmware version
        14.12.2024, 18:20:28.810	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting current berry driver version
        14.12.2024, 18:20:28.811	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: get_current_tasmota_ip_address: 192.168.188.240
        14.12.2024, 18:20:28.811	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting online berry driver version
        14.12.2024, 18:20:28.811	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting online TFT version
        14.12.2024, 18:20:28.813	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting online firmware version
        14.12.2024, 18:20:28.828	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: import adbase as ad
        
        from luibackend.config import LuiBackendConfig
        from luibackend.controller import LuiController
        from luibackend.mqtt import LuiMqttListener, LuiMqttSender
        from luibackend.updater import Updater
        
        import apis
        import json
        from typing import Literal
        
        class NsPanelLovelaceUIManager(ad.ADBase):
        
            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")
                apis.mqtt_api = self.get_plugin_api("MQTT")
        
                cfg = self._cfg = LuiBackendConfig(apis.ha_api, self.args["config"])
        
                use_api = cfg.get("use_api") == True
        
                topic_send = cfg.get("panelSendTopic")
                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)
        
                self._controller = LuiController(cfg, mqttsender.send_mqtt_msg)
                
                desired_tasmota_driver_version   = 8
                desired_display_firmware_version = 53
                version     = "v4.3.3"
                
                model       = cfg.get("model")
                if model == "us-l":
                    desired_display_firmware_url = cfg._config.get("displayURL-US-L", f"http://nspanel.pky.eu/lovelace-ui/github/nspanel-us-l-{version}.tft")
                elif model == "us-p":
                    desired_display_firmware_url = cfg._config.get("displayURL-US-P", f"http://nspanel.pky.eu/lovelace-ui/github/nspanel-us-p-{version}.tft")
                else:
                    desired_display_firmware_url = cfg._config.get("displayURL-EU",   f"http://nspanel.pky.eu/lovelace-ui/github/nspanel-{version}.tft")
                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)
                
                # Request Tasmota Driver Version
                updater.request_berry_driver_version()
        
                LuiMqttListener(use_api, topic_recv, api_panel_name, api_device_id, self._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
        
        14.12.2024, 18:20:28.832	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: # Sonoff NSPanel Tasmota Lovelace UI Berry Driver (Extended Flashing to faster speeds; improved Error Handling)| code by joBr99
        # based on;
        # 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://ip-address-of-your-homeassistant:8123/local/nspanel.tft
        # FlashNextion http://nspanel.pky.eu/lui.tft
        
        class Nextion : Driver
        
            static header = bytes('55BB')
        
            static flash_block_size = 4096
        
            var flash_mode
            var flash_start_millis
            var flash_size
            var flash_written
            var flash_buff
            var flash_offset
            var flash_proto_version
            var flash_proto_baud
            var awaiting_offset
            var tcp
            var ser
            var last_per
            var url
        
            def split_55(b)
              var ret = []
              var s = size(b)   
              var i = s-2   # start from last-1
              while i > 0
                if b[i] == 0x55 && b[i+1] == 0xBB           
                  ret.push(b[i..s-1]) # push last msg to list
                  b = b[(0..i-1)]   # write the rest back to b
                end
                i -= 1
              end
              ret.push(b)
              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
        
            # encode using custom protocol 55 BB [payload length] [payload length] [payload] [crc] [crc]
            def encode(payload)
              var b = bytes()
              b += self.header
              b.add(size(payload), 2)   # add size as 2 bytes, little endian
              b += bytes().fromstring(payload)
              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("recmod=1")        
            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(4096)
                    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, \"time_elapsed\": %d}}",per , (tasmota.millis()-self.flash_start_millis)/1000), "RESULT") 
                end
                if size(to_write)>0
                    self.flash_written += size(to_write)
                    self.ser.write(to_write)
                end
                log("FLH: Total "+str(self.flash_written),3)
                if (self.flash_written==self.flash_size)
                    log("FLH: Flashing complete - Time elapsed: %d", (tasmota.millis()-self.flash_start_millis)/1000)
                    self.flash_mode = 0
                    self.ser.deinit()
                    self.ser = serial(17, 16, 115200, serial.SERIAL_8N1)
                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
                                tasmota.delay(50)
                                log("FLH: Send (High Speed) flash start")
                                self.flash_start_millis = tasmota.millis()
                                #self.sendnx(string.format("whmi-wris %d,115200,res0",self.flash_size))
                                if self.flash_proto_version == 0
                                    self.sendnx(string.format("whmi-wri %d,%d,res0",self.flash_size,self.flash_proto_baud))
                                else
                                    self.sendnx(string.format("whmi-wris %d,%d,res0",self.flash_size,self.flash_proto_baud))
                                end
                                if self.flash_proto_baud != 115200
                                    tasmota.delay(50)
                                    self.ser.deinit()
                                    self.ser = serial(17, 16, self.flash_proto_baud, serial.SERIAL_8N1)
                                end
                            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)
                                if self.flash_offset != 0
                                    self.open_url_at(self.url, self.flash_offset)
                                    self.flash_written = self.flash_offset
                                end
                                self.write_block()
                            elif size(msg)==1 && msg[0]==0x05
                                self.write_block()
                            else
                                log("FLH: Something has gone wrong flashing display firmware ["+str(msg)+"]",2)
                            end
                        else
                            var msg_list = self.split_55(msg)
                            for i:0..size(msg_list)-1
                                msg = msg_list[i]
                                if size(msg) > 0
                                    if msg == bytes('000000FFFFFF88FFFFFF')
                                        self.screeninit()
                                    elif size(msg)>=2 && msg[0]==0x55 && msg[1]==0xBB
                                        var jm = string.format("{\"CustomRecv\":\"%s\"}",msg[4..-3].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 open_url_at(url, pos)
                self.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("Range: bytes=%d-\r\n", pos)
                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/206
                if string.find(headers,"200 OK")>0 || string.find(headers,"206 Partial Content")>0
                    log("FLH: HTTP Respose is 200 OK or 206 Partial Content",3)
                else
                    log("FLH: HTTP Respose is not 200 OK or 206 Partial Content",3)
                    print(headers)
                    return -1
                end
                # only set flash size if pos is zero
                if pos == 0
                    # check http respose for content-length
                    var 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
                    log("FLH: Flash file size: "+str(self.flash_size),3)
                end
        
            end
        
            def flash_nextion(url)
                self.flash_size = 0
                var res = self.open_url_at(url, 0)
                if res != -1
                    self.begin_nextion_flash()
                end
            end
        
            def init()
                log("NXP: Initializing Driver")
                self.ser = serial(17, 16, 115200, serial.SERIAL_8N1)
                self.flash_mode = 0
                self.flash_proto_version = 1
                self.flash_proto_baud = 921600
            end
        
        end
        
        var nextion = Nextion()
        
        tasmota.add_driver(nextion)
        
        def get_current_version(cmd, idx, payload, payload_json)
            import string
            var version_of_this_script = 9
            var jm = string.format("{\"nlui_driver_version\":\"%s\"}", version_of_this_script)
            tasmota.publish_result(jm, "RESULT")
        end
        
        tasmota.add_cmd('GetDriverVersion', get_current_version)
        
        def update_berry_driver(cmd, idx, payload, payload_json)
            def task()
                import path
                import string
        		if string.find(payload, ".tapp") > 0
        		    print("tapp in URL; will do .tapp update and migration if necessary")
        			
        			if path.exists("autoexec.be")
        			    print("autoexec.be found; will check for migration")
        				var autoexecfile = open('autoexec.be')
        				var line = autoexecfile.readline()
        				autoexecfile.close()
        				if string.find(line, "NSPanel Tasmota Lovelace UI Berry Driver") > 0
        			        print("found lovelace berry driver, going to delete autoexec.be and .bec")
        					path.remove("autoexec.be")
        					path.remove("autoexec.bec")
        				end
        			end
        			
        			var r = tasmota.urlfetch(payload, "nsp-lovelace-driver.tapp")
                    if r < 0
                        print("Update failed")
                    else
                        tasmota.cmd("Restart 1")
                    end
        			
        		elif string.find(payload, ".be") > 0
        		    print("be in URL; will do .be update")
        			if path.exists("nsp-lovelace-driver.tapp")
        			    print("Error: there is the tapp version of the berry driver installed; cannot do .be update.")
        			else
                        var cl = webclient()
                        cl.begin(payload)
                        var r = cl.GET()
                        if r == 200
                            print("Sucessfully downloaded nspanel-lovelace-ui berry driver")
                        else
                            print("Error while downloading nspanel-lovelace-ui berry driver")
                        end
                        r = cl.write_file("autoexec.be")
                        if r < 0
                            print("Error while writeing nspanel-lovelace-ui berry driver")
                        else
                            print("Sucessfully written nspanel-lovelace-ui berry driver")
                            tasmota.cmd("Restart 1")
                        end
        			end
        		else
        			print("invalid url filetype")
        		end
        		
        		
        		
                if path.exists("nsp-lovelace-driver.tapp")
                    var r = string.find(payload, ".tapp")
                    if r < 0
                        print("URL doesn't contain .tapp skipping update")
                    else
        
                    end
                else
                    var r = string.find(payload, ".be")
                    if r < 0
                        print("URL doesn't contain .be skipping update")
                    else
                
                    end                
                end
            end
            tasmota.set_timer(0,task)
            tasmota.resp_cmnd_done()
        end
        
        tasmota.add_cmd('UpdateDriverVersion', update_berry_driver)
        
        def flash_nextion(cmd, idx, payload, payload_json)
            def task()
            nextion.flash_proto_version = 1
            nextion.flash_proto_baud = 921600
                nextion.flash_nextion(payload)
            end
            tasmota.set_timer(0,task)
            tasmota.resp_cmnd_done()
        end
        
        def flash_nextion_adv(cmd, idx, payload, payload_json)
            def task()        
                if idx==0
                    nextion.flash_proto_version = 1
                    nextion.flash_proto_baud = 921600
                elif idx==1
                    nextion.flash_proto_version = 0
                    nextion.flash_proto_baud = 921600
                elif idx==2
                    nextion.flash_proto_version = 1
                    nextion.flash_proto_baud = 115200
                elif idx==3
                    nextion.flash_proto_version = 0
                    nextion.flash_proto_baud = 115200
                elif idx==4
                    nextion.flash_proto_version = 1
                    nextion.flash_proto_baud = 256000
                elif idx==5
                    nextion.flash_proto_version = 0
                    nextion.flash_proto_baud = 256000
                elif idx==6
                    nextion.ser.deinit()
                    nextion.ser = serial(17, 16, 9600, serial.SERIAL_8N1)
                    nextion.flash_proto_version = 0
                    nextion.flash_proto_baud = 921600
                else
                    nextion.flash_proto_version = 0
                    nextion.flash_proto_baud = 115200
                end
                
                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
        
        tasmota.add_cmd('Nextion', send_cmd)
        tasmota.add_cmd('CustomSend', send_cmd2)
        tasmota.add_cmd('FlashNextion', flash_nextion)
        tasmota.add_cmd('FlashNextionAdv', flash_nextion_adv)
        
        14.12.2024, 18:20:28.835	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: online display firmware version => 53
        14.12.2024, 18:20:28.852	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: {"nlui_driver_version":"9"}
        14.12.2024, 18:20:28.855	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: current tasmota firmware version => 14.3.0
        14.12.2024, 18:20:28.855	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: online berry driver version => 9
        14.12.2024, 18:20:28.882	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: current berry driver version => 9
        14.12.2024, 18:20:28.926	[info ]: javascript.0 (363) script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: hidden Cards disabled
        
        
        T Offline
        T Offline
        TT-Tom
        wrote on last edited by
        #6649

        @kerschte_de

        aus dem Script diese Zeilen zeigen und ein Screenshot vom MQTT baum des Panel

        // DE: Anpassen an die Verzeichnisse der MQTT-Adapter-Instanz
        // EN: Adapt to the MQTT adapter instance directories
        const NSPanelReceiveTopic: string = 'mqtt.0.SmartHome.NSPanel_1.tele.RESULT';
        const NSPanelSendTopic: string = 'mqtt.0.SmartHome.NSPanel_1.cmnd.CustomSend';
        

        Gruß Tom
        https://github.com/tt-tom17
        Wenn meine Hilfe erfolgreich war, benutze bitte das Voting unten rechts im Beitrag

        NSPanel Script Wiki
        https://github.com/joBr99/nspanel-lovelace-ui/wiki

        NSPanel Adapter Wiki
        https://github.com/ticaki/ioBroker.nspanel-lovelace-ui/wiki

        K 1 Reply Last reply
        0
        • K Kerschte_de

          @kerschte_de

          da ist was durcheinandergekommen, da ich die maximale Zeichenzahl übersteige. Ich versuche es nochmal ab Zeile 572

          javascript.0	18:20:28.125	info	Compiling TypeScript source script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT
          javascript.0	18:20:28.391	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: source code did not change, using cached compilation result...
          javascript.0	18:20:28.456	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: --- start of NsPanelTs: 0_userdata.0.NSPanel.1. ---
          javascript.0	18:20:28.459	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: setObjects enabled - create Alias Channels possible
          javascript.0	18:20:28.460	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: weather alias for accuweather.0. already exists
          javascript.0	18:20:28.464	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: registered 41 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
          javascript.0	18:20:28.502	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Desired TFT Firmware: 53 / v4.4.0
          javascript.0	18:20:28.502	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Installed TFT Firmware: 53 / v4.4.0
          javascript.0	18:20:28.720	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Debug mode activated
          javascript.0	18:20:28.788	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Tasmota Buzzer disabled
          javascript.0	18:20:28.800	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: NaN W
          javascript.0	18:20:28.801	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: get_current_tasmota_ip_address: 192.168.188.240
          javascript.0	18:20:28.809	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting tasmota firmware version
          javascript.0	18:20:28.810	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting current berry driver version
          javascript.0	18:20:28.811	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: get_current_tasmota_ip_address: 192.168.188.240
          javascript.0	18:20:28.811	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting online berry driver version
          javascript.0	18:20:28.811	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting online TFT version
          javascript.0	18:20:28.813	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: Requesting online firmware version
          javascript.0	18:20:28.828	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: import adbase as ad from luibackend.config import LuiBackendConfig from luibackend.controller import LuiController from luibackend.mqtt import LuiMqttListener, LuiMqttSender from luibackend.updater import Updater import apis import json from typing import Literal class NsPanelLovelaceUIManager(ad.ADBase): 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") apis.mqtt_api = self.get_plugin_api("MQTT") cfg = self._cfg = LuiBackendConfig(apis.ha_api, self.args["config"]) use_api = cfg.get("use_api") == True topic_send = cfg.get("panelSendTopic") 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) self._controller = LuiController(cfg, mqttsender.send_mqtt_msg) desired_tasmota_driver_version = 8 desired_display_firmware_version = 53 version = "v4.3.3" model = cfg.get("model") if model == "us-l": desired_display_firmware_url = cfg._config.get("displayURL-US-L", f"http://nspanel.pky.eu/lovelace-ui/github/nspanel-us-l-{version}.tft") elif model == "us-p": desired_display_firmware_url = cfg._config.get("displayURL-US-P", f"http://nspanel.pky.eu/lovelace-ui/github/nspanel-us-p-{version}.tft") else: desired_display_firmware_url = cfg._config.get("displayURL-EU", f"http://nspanel.pky.eu/lovelace-ui/github/nspanel-{version}.tft") 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) # Request Tasmota Driver Version updater.request_berry_driver_version() LuiMqttListener(use_api, topic_recv, api_panel_name, api_device_id, self._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
          javascript.0	18:20:28.832	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: # Sonoff NSPanel Tasmota Lovelace UI Berry Driver (Extended Flashing to faster speeds; improved Error Handling)| code by joBr99 # based on; # 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://ip-address-of-your-homeassistant:8123/local/nspanel.tft # FlashNextion http://nspanel.pky.eu/lui.tft class Nextion : Driver static header = bytes('55BB') static flash_block_size = 4096 var flash_mode var flash_start_millis var flash_size var flash_written var flash_buff var flash_offset var flash_proto_version var flash_proto_baud var awaiting_offset var tcp var ser var last_per var url def split_55(b) var ret = [] var s = size(b) var i = s-2 # start from last-1 while i > 0 if b[i] == 0x55 && b[i+1] == 0xBB ret.push(b[i..s-1]) # push last msg to list b = b[(0..i-1)] # write the rest back to b end i -= 1 end ret.push(b) 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 # encode using custom protocol 55 BB [payload length] [payload length] [payload] [crc] [crc] def encode(payload) var b = bytes() b += self.header b.add(size(payload), 2) # add size as 2 bytes, little endian b += bytes().fromstring(payload) 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("recmod=1") 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(4096) 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, \"time_elapsed\": %d}}",per , (tasmota.millis()-self.flash_start_millis)/1000), "RESULT") end if size(to_write)>0 self.flash_written += size(to_write) self.ser.write(to_write) end log("FLH: Total "+str(self.flash_written),3) if (self.flash_written==self.flash_size) log("FLH: Flashing complete - Time elapsed: %d", (tasmota.millis()-self.flash_start_millis)/1000) self.flash_mode = 0 self.ser.deinit() self.ser = serial(17, 16, 115200, serial.SERIAL_8N1) 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 tasmota.delay(50) log("FLH: Send (High Speed) flash start") self.flash_start_millis = tasmota.millis() #self.sendnx(string.format("whmi-wris %d,115200,res0",self.flash_size)) if self.flash_proto_version == 0 self.sendnx(string.format("whmi-wri %d,%d,res0",self.flash_size,self.flash_proto_baud)) else self.sendnx(string.format("whmi-wris %d,%d,res0",self.flash_size,self.flash_proto_baud)) end if self.flash_proto_baud != 115200 tasmota.delay(50) self.ser.deinit() self.ser = serial(17, 16, self.flash_proto_baud, serial.SERIAL_8N1) end 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) if self.flash_offset != 0 self.open_url_at(self.url, self.flash_offset) self.flash_written = self.flash_offset end self.write_block() elif size(msg)==1 && msg[0]==0x05 self.write_block() else log("FLH: Something has gone wrong flashing display firmware ["+str(msg)+"]",2) end else var msg_list = self.split_55(msg) for i:0..size(msg_list)-1 msg = msg_list[i] if size(msg) > 0 if msg == bytes('000000FFFFFF88FFFFFF') self.screeninit() elif size(msg)>=2 && msg[0]==0x55 && msg[1]==0xBB var jm = string.format("{\"CustomRecv\":\"%s\"}",msg[4..-3].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 open_url_at(url, pos) self.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("Range: bytes=%d-\r\n", pos) 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/206 if string.find(headers,"200 OK")>0 || string.find(headers,"206 Partial Content")>0 log("FLH: HTTP Respose is 200 OK or 206 Partial Content",3) else log("FLH: HTTP Respose is not 200 OK or 206 Partial Content",3) print(headers) return -1 end # only set flash size if pos is zero if pos == 0 # check http respose for content-length var 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 log("FLH: Flash file size: "+str(self.flash_size),3) end end def flash_nextion(url) self.flash_size = 0 var res = self.open_url_at(url, 0) if res != -1 self.begin_nextion_flash() end end def init() log("NXP: Initializing Driver") self.ser = serial(17, 16, 115200, serial.SERIAL_8N1) self.flash_mode = 0 self.flash_proto_version = 1 self.flash_proto_baud = 921600 end end var nextion = Nextion() tasmota.add_driver(nextion) def get_current_version(cmd, idx, payload, payload_json) import string var version_of_this_script = 9 var jm = string.format("{\"nlui_driver_version\":\"%s\"}", version_of_this_script) tasmota.publish_result(jm, "RESULT") end tasmota.add_cmd('GetDriverVersion', get_current_version) def update_berry_driver(cmd, idx, payload, payload_json) def task() import path import string if string.find(payload, ".tapp") > 0 print("tapp in URL; will do .tapp update and migration if necessary") if path.exists("autoexec.be") print("autoexec.be found; will check for migration") var autoexecfile = open('autoexec.be') var line = autoexecfile.readline() autoexecfile.close() if string.find(line, "NSPanel Tasmota Lovelace UI Berry Driver") > 0 print("found lovelace berry driver, going to delete autoexec.be and .bec") path.remove("autoexec.be") path.remove("autoexec.bec") end end var r = tasmota.urlfetch(payload, "nsp-lovelace-driver.tapp") if r < 0 print("Update failed") else tasmota.cmd("Restart 1") end elif string.find(payload, ".be") > 0 print("be in URL; will do .be update") if path.exists("nsp-lovelace-driver.tapp") print("Error: there is the tapp version of the berry driver installed; cannot do .be update.") else var cl = webclient() cl.begin(payload) var r = cl.GET() if r == 200 print("Sucessfully downloaded nspanel-lovelace-ui berry driver") else print("Error while downloading nspanel-lovelace-ui berry driver") end r = cl.write_file("autoexec.be") if r < 0 print("Error while writeing nspanel-lovelace-ui berry driver") else print("Sucessfully written nspanel-lovelace-ui berry driver") tasmota.cmd("Restart 1") end end else print("invalid url filetype") end if path.exists("nsp-lovelace-driver.tapp") var r = string.find(payload, ".tapp") if r < 0 print("URL doesn't contain .tapp skipping update") else end else var r = string.find(payload, ".be") if r < 0 print("URL doesn't contain .be skipping update") else end end end tasmota.set_timer(0,task) tasmota.resp_cmnd_done() end tasmota.add_cmd('UpdateDriverVersion', update_berry_driver) def flash_nextion(cmd, idx, payload, payload_json) def task() nextion.flash_proto_version = 1 nextion.flash_proto_baud = 921600 nextion.flash_nextion(payload) end tasmota.set_timer(0,task) tasmota.resp_cmnd_done() end def flash_nextion_adv(cmd, idx, payload, payload_json) def task() if idx==0 nextion.flash_proto_version = 1 nextion.flash_proto_baud = 921600 elif idx==1 nextion.flash_proto_version = 0 nextion.flash_proto_baud = 921600 elif idx==2 nextion.flash_proto_version = 1 nextion.flash_proto_baud = 115200 elif idx==3 nextion.flash_proto_version = 0 nextion.flash_proto_baud = 115200 elif idx==4 nextion.flash_proto_version = 1 nextion.flash_proto_baud = 256000 elif idx==5 nextion.flash_proto_version = 0 nextion.flash_proto_baud = 256000 elif idx==6 nextion.ser.deinit() nextion.ser = serial(17, 16, 9600, serial.SERIAL_8N1) nextion.flash_proto_version = 0 nextion.flash_proto_baud = 921600 else nextion.flash_proto_version = 0 nextion.flash_proto_baud = 115200 end 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 tasmota.add_cmd('Nextion', send_cmd) tasmota.add_cmd('CustomSend', send_cmd2) tasmota.add_cmd('FlashNextion', flash_nextion) tasmota.add_cmd('FlashNextionAdv', flash_nextion_adv)
          javascript.0	18:20:28.835	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: online display firmware version => 53
          javascript.0	18:20:28.852	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: {"nlui_driver_version":"9"}
          javascript.0	18:20:28.855	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: current tasmota firmware version => 14.3.0
          javascript.0	18:20:28.855	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: online berry driver version => 9
          javascript.0	18:20:28.882	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: current berry driver version => 9
          javascript.0	18:20:28.926	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: hidden Cards disabled
          javascript.0	18:20:29.007	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_KeT: {"url":"https://api.github.com/repos/joBr99/nspanel-lovelace-ui/releases/149090497","assets_url":"https://api.github.com/repos/joBr99/nspanel-lovelace-ui/releases/149090497/assets","upload_url":"https://uploads.github.com/repos/joBr99/nspanel-lovelace-ui/releases/149090497/assets{?name,label}","html_url":"https://github.com/joBr99/nspanel-lovelace-ui/releases/tag/v4.4.0","id":149090497,"author":{"login":"joBr99","id":29555657,"node_id":"MDQ6VXNlcjI5NTU1NjU3","avatar_url":"https://avatars.githubusercontent.com/u/29555657?v=4","gravatar_id":"","url":"https://api.github.com/users/joBr99","html_url":"https://github.com/joBr99","followers_url":"https://api.github.com/users/joBr99/followers","following_url":"https://api.github.com/users/joBr99/following{/other_user}","gists_url":"https://api.github.com/users/joBr99/gists{/gist_id}","starred_url":"https://api.github.com/users/joBr99/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joBr99/subscriptions","organizations_url":"https://api.github.com/users/joBr99/orgs","repos_url":"https://api.github.com/users/joBr99/repos","events_url":"https://api.github.com/users/joBr99/events{/privacy}","received_events_url":"https://api.github.com/users/joBr99/received_events","type":"User","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOGo1zRM4I4vDB","tag_name":"v4.4.0","target_commitish":"main","name":"v4.4.0 - Update for HA 2024.04","draft":false,"prerelease":false,"created_at":"2024-03-30T11:18:31Z","published_at":"2024-03-30T12:26:37Z","assets":[],"tarball_url":"https://api.github.com/repos/joBr99/nspanel-lovelace-ui/tarball/v4.4.0","zipball_url":"https://api.github.com/repos/joBr99/nspanel-lovelace-ui/zipball/v4.4.0","body":"## Besides the Update of the App in HACS you need to do the following things:\r\n\r\n🔄 **Restart the AppDaemon Container**\r\n\r\n**Add the following workaround to your Home Assistant configuration.yaml**\r\n\r\nhttps://docs.nspanel.pky.eu/stable/prepare_ha/#workaround-for-homeassistant-202404\r\n\r\n🔄 **Restart Home Assistant**\r\n\r\n## New Features:\r\n\r\n- **Implemented changes to work with upcoming Homeassistant Version 2024.04 @joBr99**\r\n","mentions_count":1}
          
          T Offline
          T Offline
          TT-Tom
          wrote on last edited by
          #6650

          @kerschte_de

          kannst zurück setzen

          Gruß Tom
          https://github.com/tt-tom17
          Wenn meine Hilfe erfolgreich war, benutze bitte das Voting unten rechts im Beitrag

          NSPanel Script Wiki
          https://github.com/joBr99/nspanel-lovelace-ui/wiki

          NSPanel Adapter Wiki
          https://github.com/ticaki/ioBroker.nspanel-lovelace-ui/wiki

          1 Reply Last reply
          0
          • T TT-Tom

            @kerschte_de

            aus dem Script diese Zeilen zeigen und ein Screenshot vom MQTT baum des Panel

            // DE: Anpassen an die Verzeichnisse der MQTT-Adapter-Instanz
            // EN: Adapt to the MQTT adapter instance directories
            const NSPanelReceiveTopic: string = 'mqtt.0.SmartHome.NSPanel_1.tele.RESULT';
            const NSPanelSendTopic: string = 'mqtt.0.SmartHome.NSPanel_1.cmnd.CustomSend';
            
            K Offline
            K Offline
            Kerschte_de
            wrote on last edited by
            #6651

            @tt-tom
            ... ja, mache ich:

            /***** 1. Tasmota-Config *****/
            
                // DE: Anpassen an die Verzeichnisse der MQTT-Adapter-Instanz
                // EN: Adapt to the MQTT adapter instance directories
                const NSPanelReceiveTopic: string = 'mqtt.0.RagowSmartHome.NSPanel_85C180.tele.RESULT';
                const NSPanelSendTopic: string = 'mqtt.0.RagowSmartHome.NSPanel_85C180.cmnd.CustomSend';
            
                // DE: nur ändern, falls der User im Tasmota vor dem Kompilieren umbenannt wurde (Standard Tasmota: admin)
                // EN: only change if the user was renamed in Tasmota before compiling (default Tasmota: admin)
                const tasmota_web_admin_user: string = 'admin';
                
                // DE: setzten, falls "Web Admin Password" in Tasmota vergeben
                // EN set if "Web Admin Password" is assigned in Tasmota
                const tasmota_web_admin_password: string = '';
            
                // DE: Setzen der bevorzugten Tasmota32-Version (für Updates)
                // EN: Set preferred Tasmota32 version (for updates)
                const tasmotaOtaVersion: string = 'tasmota32-DE.bin';
                    // DE: Es können ebenfalls andere Versionen verwendet werden wie zum Beispiel:
                    // EN: Other versions can also be used, such as:
                    // 'tasmota32-nspanel.bin' or 'tasmota32.bin' or 'tasmota32-DE.bin' or etc.
            

            27c27a5a-c80a-4316-8db4-3e4f0dfc4f57-image.png

            T 1 Reply Last reply
            0
            • K Kerschte_de

              @tt-tom
              ... ja, mache ich:

              /***** 1. Tasmota-Config *****/
              
                  // DE: Anpassen an die Verzeichnisse der MQTT-Adapter-Instanz
                  // EN: Adapt to the MQTT adapter instance directories
                  const NSPanelReceiveTopic: string = 'mqtt.0.RagowSmartHome.NSPanel_85C180.tele.RESULT';
                  const NSPanelSendTopic: string = 'mqtt.0.RagowSmartHome.NSPanel_85C180.cmnd.CustomSend';
              
                  // DE: nur ändern, falls der User im Tasmota vor dem Kompilieren umbenannt wurde (Standard Tasmota: admin)
                  // EN: only change if the user was renamed in Tasmota before compiling (default Tasmota: admin)
                  const tasmota_web_admin_user: string = 'admin';
                  
                  // DE: setzten, falls "Web Admin Password" in Tasmota vergeben
                  // EN set if "Web Admin Password" is assigned in Tasmota
                  const tasmota_web_admin_password: string = '';
              
                  // DE: Setzen der bevorzugten Tasmota32-Version (für Updates)
                  // EN: Set preferred Tasmota32 version (for updates)
                  const tasmotaOtaVersion: string = 'tasmota32-DE.bin';
                      // DE: Es können ebenfalls andere Versionen verwendet werden wie zum Beispiel:
                      // EN: Other versions can also be used, such as:
                      // 'tasmota32-nspanel.bin' or 'tasmota32.bin' or 'tasmota32-DE.bin' or etc.
              

              27c27a5a-c80a-4316-8db4-3e4f0dfc4f57-image.png

              T Offline
              T Offline
              TT-Tom
              wrote on last edited by
              #6652

              @kerschte_de
              der tele fehlt, der ist entscheidend

              Gruß Tom
              https://github.com/tt-tom17
              Wenn meine Hilfe erfolgreich war, benutze bitte das Voting unten rechts im Beitrag

              NSPanel Script Wiki
              https://github.com/joBr99/nspanel-lovelace-ui/wiki

              NSPanel Adapter Wiki
              https://github.com/ticaki/ioBroker.nspanel-lovelace-ui/wiki

              K 1 Reply Last reply
              0
              • T TT-Tom

                @kerschte_de
                der tele fehlt, der ist entscheidend

                K Offline
                K Offline
                Kerschte_de
                wrote on last edited by
                #6653

                @tt-tom ... oh, sorry.

                b4a83219-57aa-46de-ac5d-afe1df3d83b0-image.png

                T 1 Reply Last reply
                0
                • K Kerschte_de

                  @tt-tom ... oh, sorry.

                  b4a83219-57aa-46de-ac5d-afe1df3d83b0-image.png

                  T Offline
                  T Offline
                  TT-Tom
                  wrote on last edited by
                  #6654

                  @kerschte_de

                  okay hier stimmt alles, jetzt bitte die Config einer Seite wo keine Werte kommen und den passenden Objektbaum vom ioBroker

                  Gruß Tom
                  https://github.com/tt-tom17
                  Wenn meine Hilfe erfolgreich war, benutze bitte das Voting unten rechts im Beitrag

                  NSPanel Script Wiki
                  https://github.com/joBr99/nspanel-lovelace-ui/wiki

                  NSPanel Adapter Wiki
                  https://github.com/ticaki/ioBroker.nspanel-lovelace-ui/wiki

                  K 2 Replies Last reply
                  0
                  • T TT-Tom

                    @kerschte_de

                    okay hier stimmt alles, jetzt bitte die Config einer Seite wo keine Werte kommen und den passenden Objektbaum vom ioBroker

                    K Offline
                    K Offline
                    Kerschte_de
                    wrote on last edited by
                    #6655

                    @tt-tom ja, gern.

                    Die Hauptseite ("HOME") dient der Navigation auf Unterseiten. Aktuell habe ich nur noch die im Erdgeschoss aktiv. Dort sind testweise 2 Temperatur-Sensoren verlinkt ... es kommt jedoch nichts an Werten an. Die Seiten selbst funktionieren alle ... so auch wie der Screensaver und das komplette Service-Menu:

                    //-- Anfang für eigene Seiten -- z.T. selbstdefinierte Aliase erforderlich ----------------
                    //-- Start for your own pages -- some self-defined aliases required ----------------
                    
                        //-- https://github.com/joBr99/nspanel-lovelace-ui/wiki/NSPanel-Page-%E2%80%90-Typen_How-2_Beispiele
                    
                    //-- ##### ##### ##### KERSTEN #### ##### #####
                    //Level 0
                    
                    let Navigation1: PageType =
                    {
                        'type': 'cardGrid',
                        'heading': 'HOME',
                        'useColor': true,
                        'items': [
                            /*PageItem*/{ navigate: true, id: 'SensorenEG', icon: 'home-floor-0',offColor: Menu, onColor: Menu, name: 'Sensoren EG'},
                            //*PageItem*/{ navigate: true, id: 'SensorenOG', icon: 'home-floor-1',offColor: Menu, onColor: Menu, name: 'Sensoren OG'},
                            //*PageItem*/{ navigate: true, id: 'SensorenKeller', icon: 'home-floor-negative-1',offColor: Menu, onColor: Menu, name: 'Sensoren Keller'},
                            /*PageItem*/{ navigate: true, id: 'NSPanel_Service', icon: 'hammer-screwdriver',offColor: Menu, onColor: Menu, name: 'ServiceMenu'},
                            //{ id: 'alias.0.NSPanel_1.TestFenster', offColor: MSRed, onColor: MSGreen, name: 'Büro Fenster'},
                            //{ id: 'alias.0.NSPanel_1.Luftreiniger', icon: 'power', offColor: MSRed, onColor: MSGreen},
                            //{ id: 'alias.0.NSPanel_1.TestBlind', icon: 'projector-screen', onColor: White, name: 'Beamer', secondRow: 'auch Text'},
                            //{ id: 'alias.0.NSPanel_1.Kippfenster', useValue: true }
                        ]
                    };
                    
                    
                         //Level 1
                         let SensorenEG: PageType =
                         {
                             'type': 'cardGrid',
                             'heading': 'Zigbee-Geräte EG',
                             'useColor': true,
                             'subPage': true,
                             'parent': Navigation1,
                             'items': [
                                 { id: 'alias.0.NSPanel.1.1_Haus.EG.TempWZ.ACTUAL', name: 'WZ Temp.°C', offColor: MSRed, onColor: MSGreen, useValue: true, fontSize: 3, colorScale: {'val_min': 15, 'val_max': 35, 'val_best': 21} },
                                 {},
                                 { id: 'alias.0.NSPanel.1.1_Haus.EG.TempWZ.SECOND', name: 'WZ Luft %', offColor: MSYellow, onColor: MSYellow , useValue: true, fontSize: 3, colorScale: {'val_min': 30, 'val_max': 100, 'val_best': 60} },
                                 { id: 'alias.0.NSPanel.1.1_Haus.EG.TempKueche.ACTUAL', name: 'Küche Temp.°C', offColor: MSRed, onColor: MSGreen, useValue: true, fontSize: 3, colorScale: {'val_min': 15, 'val_max': 35, 'val_best': 21} },
                                 {},
                                 { id: 'alias.0.NSPanel.1.1_Haus.EG.TempKueche.SECOND', name: 'Küche Luft %', offColor: MSYellow, onColor: MSYellow , useValue: true, fontSize: 3, colorScale: {'val_min': 30, 'val_max': 100, 'val_best': 60} },
                             ]
                         };
                    
                    
                    //-- ENDE für eigene Seiten -- z.T. selbstdefinierte Aliase erforderlich -------------------------
                    
                    

                    Hier noch die Einbindung der Seiten selbst:

                    /***********************************************************************
                     **                                                                   **
                     **                           Configuration                           **
                     **                                                                   **
                     ***********************************************************************/
                    
                    export const config: Config = {
                        // Seiteneinteilung / Page division
                        // Hauptseiten / Mainpages
                        pages: [
                            Navigation1,
                            //NSPanel_Service, //Auto-Alias Service Page
                            //Unlock_Service            //Auto-Alias Service Page (Service Pages used with cardUnlock)
                        ],
                        // Unterseiten / Subpages
                        subPages: [
                            SensorenEG, // --> KeT hinzugefügt
                            NSPanel_Service, //Auto-Alias Service Page --> KeT von der Hauptseite auf die Sub-Seite verschoben (über Auskommentierung)
                            NSPanel_Service_SubPage, //Auto-Alias Service Page (only used with cardUnlock)
                            NSPanel_Infos, //Auto-Alias Service Page
                            NSPanel_Wifi_Info_1, //Auto-Alias Service Page
                            NSPanel_Wifi_Info_2, //Auto-Alias Service Page
                            NSPanel_Sensoren, //Auto-Alias Service Page
                            NSPanel_Hardware, //Auto-Alias Service Page
                            NSPanel_IoBroker, //Auot-Alias Service Page
                            NSPanel_Einstellungen, //Auto-Alias Service Page
                            NSPanel_Screensaver, //Auto-Alias Service Page
                            NSPanel_ScreensaverDimmode, //Auto-Alias Service Page
                            NSPanel_ScreensaverBrightness, //Auto-Alias Service Page
                            NSPanel_ScreensaverLayout, //Auto-Alias Service Page
                            NSPanel_ScreensaverWeather, //Auto-Alias Service Page
                            NSPanel_ScreensaverDateformat, //Auto-Alias Service Page
                            NSPanel_ScreensaverIndicators, //Auto-Alias Service Page
                            NSPanel_Relays, //Auto-Alias Service Page
                            NSPanel_Script, //Auto-Alias Service Page
                            NSPanel_Firmware, //Auto-Alias Service Page
                            NSPanel_FirmwareTasmota, //Auto-Alias Service Page
                            NSPanel_FirmwareBerry, //Auto-Alias Service Page
                            NSPanel_FirmwareNextion, //Auto-Alias Service Page
                        ],
                    
                    

                    und hier der Sreenshot der beiden Temperatur-Sensoren:
                    e1a77316-92dd-492a-9da3-f256db1f7263-image.png

                    T 1 Reply Last reply
                    0
                    • T TT-Tom

                      @kerschte_de

                      okay hier stimmt alles, jetzt bitte die Config einer Seite wo keine Werte kommen und den passenden Objektbaum vom ioBroker

                      K Offline
                      K Offline
                      Kerschte_de
                      wrote on last edited by
                      #6656

                      @tt-tom
                      Das Konstrukt hatte in der alten Umgebung funktioniert. Testweise hatte ich es auf etliche Sensoren in den unterschiedlichen Etagen mal aufgebaut. Aktuell funktionieren die Seiten weiterhin, nur die Inhalte der Sensoren werden nicht transferiert.

                      1 Reply Last reply
                      0
                      • K Kerschte_de

                        @tt-tom ja, gern.

                        Die Hauptseite ("HOME") dient der Navigation auf Unterseiten. Aktuell habe ich nur noch die im Erdgeschoss aktiv. Dort sind testweise 2 Temperatur-Sensoren verlinkt ... es kommt jedoch nichts an Werten an. Die Seiten selbst funktionieren alle ... so auch wie der Screensaver und das komplette Service-Menu:

                        //-- Anfang für eigene Seiten -- z.T. selbstdefinierte Aliase erforderlich ----------------
                        //-- Start for your own pages -- some self-defined aliases required ----------------
                        
                            //-- https://github.com/joBr99/nspanel-lovelace-ui/wiki/NSPanel-Page-%E2%80%90-Typen_How-2_Beispiele
                        
                        //-- ##### ##### ##### KERSTEN #### ##### #####
                        //Level 0
                        
                        let Navigation1: PageType =
                        {
                            'type': 'cardGrid',
                            'heading': 'HOME',
                            'useColor': true,
                            'items': [
                                /*PageItem*/{ navigate: true, id: 'SensorenEG', icon: 'home-floor-0',offColor: Menu, onColor: Menu, name: 'Sensoren EG'},
                                //*PageItem*/{ navigate: true, id: 'SensorenOG', icon: 'home-floor-1',offColor: Menu, onColor: Menu, name: 'Sensoren OG'},
                                //*PageItem*/{ navigate: true, id: 'SensorenKeller', icon: 'home-floor-negative-1',offColor: Menu, onColor: Menu, name: 'Sensoren Keller'},
                                /*PageItem*/{ navigate: true, id: 'NSPanel_Service', icon: 'hammer-screwdriver',offColor: Menu, onColor: Menu, name: 'ServiceMenu'},
                                //{ id: 'alias.0.NSPanel_1.TestFenster', offColor: MSRed, onColor: MSGreen, name: 'Büro Fenster'},
                                //{ id: 'alias.0.NSPanel_1.Luftreiniger', icon: 'power', offColor: MSRed, onColor: MSGreen},
                                //{ id: 'alias.0.NSPanel_1.TestBlind', icon: 'projector-screen', onColor: White, name: 'Beamer', secondRow: 'auch Text'},
                                //{ id: 'alias.0.NSPanel_1.Kippfenster', useValue: true }
                            ]
                        };
                        
                        
                             //Level 1
                             let SensorenEG: PageType =
                             {
                                 'type': 'cardGrid',
                                 'heading': 'Zigbee-Geräte EG',
                                 'useColor': true,
                                 'subPage': true,
                                 'parent': Navigation1,
                                 'items': [
                                     { id: 'alias.0.NSPanel.1.1_Haus.EG.TempWZ.ACTUAL', name: 'WZ Temp.°C', offColor: MSRed, onColor: MSGreen, useValue: true, fontSize: 3, colorScale: {'val_min': 15, 'val_max': 35, 'val_best': 21} },
                                     {},
                                     { id: 'alias.0.NSPanel.1.1_Haus.EG.TempWZ.SECOND', name: 'WZ Luft %', offColor: MSYellow, onColor: MSYellow , useValue: true, fontSize: 3, colorScale: {'val_min': 30, 'val_max': 100, 'val_best': 60} },
                                     { id: 'alias.0.NSPanel.1.1_Haus.EG.TempKueche.ACTUAL', name: 'Küche Temp.°C', offColor: MSRed, onColor: MSGreen, useValue: true, fontSize: 3, colorScale: {'val_min': 15, 'val_max': 35, 'val_best': 21} },
                                     {},
                                     { id: 'alias.0.NSPanel.1.1_Haus.EG.TempKueche.SECOND', name: 'Küche Luft %', offColor: MSYellow, onColor: MSYellow , useValue: true, fontSize: 3, colorScale: {'val_min': 30, 'val_max': 100, 'val_best': 60} },
                                 ]
                             };
                        
                        
                        //-- ENDE für eigene Seiten -- z.T. selbstdefinierte Aliase erforderlich -------------------------
                        
                        

                        Hier noch die Einbindung der Seiten selbst:

                        /***********************************************************************
                         **                                                                   **
                         **                           Configuration                           **
                         **                                                                   **
                         ***********************************************************************/
                        
                        export const config: Config = {
                            // Seiteneinteilung / Page division
                            // Hauptseiten / Mainpages
                            pages: [
                                Navigation1,
                                //NSPanel_Service, //Auto-Alias Service Page
                                //Unlock_Service            //Auto-Alias Service Page (Service Pages used with cardUnlock)
                            ],
                            // Unterseiten / Subpages
                            subPages: [
                                SensorenEG, // --> KeT hinzugefügt
                                NSPanel_Service, //Auto-Alias Service Page --> KeT von der Hauptseite auf die Sub-Seite verschoben (über Auskommentierung)
                                NSPanel_Service_SubPage, //Auto-Alias Service Page (only used with cardUnlock)
                                NSPanel_Infos, //Auto-Alias Service Page
                                NSPanel_Wifi_Info_1, //Auto-Alias Service Page
                                NSPanel_Wifi_Info_2, //Auto-Alias Service Page
                                NSPanel_Sensoren, //Auto-Alias Service Page
                                NSPanel_Hardware, //Auto-Alias Service Page
                                NSPanel_IoBroker, //Auot-Alias Service Page
                                NSPanel_Einstellungen, //Auto-Alias Service Page
                                NSPanel_Screensaver, //Auto-Alias Service Page
                                NSPanel_ScreensaverDimmode, //Auto-Alias Service Page
                                NSPanel_ScreensaverBrightness, //Auto-Alias Service Page
                                NSPanel_ScreensaverLayout, //Auto-Alias Service Page
                                NSPanel_ScreensaverWeather, //Auto-Alias Service Page
                                NSPanel_ScreensaverDateformat, //Auto-Alias Service Page
                                NSPanel_ScreensaverIndicators, //Auto-Alias Service Page
                                NSPanel_Relays, //Auto-Alias Service Page
                                NSPanel_Script, //Auto-Alias Service Page
                                NSPanel_Firmware, //Auto-Alias Service Page
                                NSPanel_FirmwareTasmota, //Auto-Alias Service Page
                                NSPanel_FirmwareBerry, //Auto-Alias Service Page
                                NSPanel_FirmwareNextion, //Auto-Alias Service Page
                            ],
                        
                        

                        und hier der Sreenshot der beiden Temperatur-Sensoren:
                        e1a77316-92dd-492a-9da3-f256db1f7263-image.png

                        T Offline
                        T Offline
                        TT-Tom
                        wrote on last edited by
                        #6657

                        @kerschte_de

                        du hast zwei Fehler in deinem Setup.

                        let SensorenEG: PageType =
                             {
                                 'type': 'cardGrid',
                                 'heading': 'Zigbee-Geräte EG',
                                 'useColor': true,
                                 'subPage': true,
                                 'parent': Navigation1,
                                 'items': [
                                     { id: 'alias.0.NSPanel.1.1_Haus.EG.TempWZ.ACTUAL', name: 'WZ Temp.°C', offColor: MSRed, onColor: MSGreen, useValue: true, fontSize: 3, colorScale: {'val_min': 15, 'val_max': 35, 'val_best': 21} },
                                     {},
                                     { id: 'alias.0.NSPanel.1.1_Haus.EG.TempWZ.SECOND', name: 'WZ Luft %', offColor: MSYellow, onColor: MSYellow , useValue: true, fontSize: 3, colorScale: {'val_min': 30, 'val_max': 100, 'val_best': 60} },
                                     { id: 'alias.0.NSPanel.1.1_Haus.EG.TempKueche.ACTUAL', name: 'Küche Temp.°C', offColor: MSRed, onColor: MSGreen, useValue: true, fontSize: 3, colorScale: {'val_min': 15, 'val_max': 35, 'val_best': 21} },
                                     {},
                                     { id: 'alias.0.NSPanel.1.1_Haus.EG.TempKueche.SECOND', name: 'Küche Luft %', offColor: MSYellow, onColor: MSYellow , useValue: true, fontSize: 3, colorScale: {'val_min': 30, 'val_max': 100, 'val_best': 60} },
                                 ]
                             };
                        

                        in einer Page Config, werden keine Datenpunkte angegeben, sonder immer nur die Cannel.

                        { id: 'alias.0.NSPanel.1.1_Haus.EG.TempWZ', name: 'WZ Temp.°C', offColor: MSRed, onColor: MSGreen, useValue: true, fontSize: 3, colorScale: {'val_min': 15, 'val_max': 35, 'val_best': 21} },
                        

                        dein Channel hat für diese Kombi (ACTUAL, SECOND) den falschen Typ. Diese Datenpunkte werden nur beim Thermostat ausgewertet, was auch eine andere Page zur Folge hat. Beim Type Temperature wird nur der ACTUAL ausgewertet vom Script.
                        Bedeutet du musst für jeden Sensor einen eigenen Alias erstellen.

                        Im Screensaver sieht die Sache anders aus dort wird direkt auf den Datenpunkt verwiesen. Beispiel hier

                        // leftScreensaverEntity 1 (only Advanced Screensaver)
                                    {
                                        ScreensaverEntity: NSPanel_Path + 'Sensor.ANALOG.Temperature',
                                        ScreensaverEntityFactor: 1,
                                        ScreensaverEntityDecimalPlaces: 1,
                                        ScreensaverEntityIconOn: 'thermometer',
                                        ScreensaverEntityIconOff: null,
                                        ScreensaverEntityText: 'Temperatur',
                                        ScreensaverEntityUnitText: '°C',
                                        ScreensaverEntityIconColor: {'val_min': 0, 'val_max': 35, 'val_best': 22}
                                    },
                        

                        Gruß Tom
                        https://github.com/tt-tom17
                        Wenn meine Hilfe erfolgreich war, benutze bitte das Voting unten rechts im Beitrag

                        NSPanel Script Wiki
                        https://github.com/joBr99/nspanel-lovelace-ui/wiki

                        NSPanel Adapter Wiki
                        https://github.com/ticaki/ioBroker.nspanel-lovelace-ui/wiki

                        K 1 Reply Last reply
                        0
                        • T TT-Tom

                          @kerschte_de

                          du hast zwei Fehler in deinem Setup.

                          let SensorenEG: PageType =
                               {
                                   'type': 'cardGrid',
                                   'heading': 'Zigbee-Geräte EG',
                                   'useColor': true,
                                   'subPage': true,
                                   'parent': Navigation1,
                                   'items': [
                                       { id: 'alias.0.NSPanel.1.1_Haus.EG.TempWZ.ACTUAL', name: 'WZ Temp.°C', offColor: MSRed, onColor: MSGreen, useValue: true, fontSize: 3, colorScale: {'val_min': 15, 'val_max': 35, 'val_best': 21} },
                                       {},
                                       { id: 'alias.0.NSPanel.1.1_Haus.EG.TempWZ.SECOND', name: 'WZ Luft %', offColor: MSYellow, onColor: MSYellow , useValue: true, fontSize: 3, colorScale: {'val_min': 30, 'val_max': 100, 'val_best': 60} },
                                       { id: 'alias.0.NSPanel.1.1_Haus.EG.TempKueche.ACTUAL', name: 'Küche Temp.°C', offColor: MSRed, onColor: MSGreen, useValue: true, fontSize: 3, colorScale: {'val_min': 15, 'val_max': 35, 'val_best': 21} },
                                       {},
                                       { id: 'alias.0.NSPanel.1.1_Haus.EG.TempKueche.SECOND', name: 'Küche Luft %', offColor: MSYellow, onColor: MSYellow , useValue: true, fontSize: 3, colorScale: {'val_min': 30, 'val_max': 100, 'val_best': 60} },
                                   ]
                               };
                          

                          in einer Page Config, werden keine Datenpunkte angegeben, sonder immer nur die Cannel.

                          { id: 'alias.0.NSPanel.1.1_Haus.EG.TempWZ', name: 'WZ Temp.°C', offColor: MSRed, onColor: MSGreen, useValue: true, fontSize: 3, colorScale: {'val_min': 15, 'val_max': 35, 'val_best': 21} },
                          

                          dein Channel hat für diese Kombi (ACTUAL, SECOND) den falschen Typ. Diese Datenpunkte werden nur beim Thermostat ausgewertet, was auch eine andere Page zur Folge hat. Beim Type Temperature wird nur der ACTUAL ausgewertet vom Script.
                          Bedeutet du musst für jeden Sensor einen eigenen Alias erstellen.

                          Im Screensaver sieht die Sache anders aus dort wird direkt auf den Datenpunkt verwiesen. Beispiel hier

                          // leftScreensaverEntity 1 (only Advanced Screensaver)
                                      {
                                          ScreensaverEntity: NSPanel_Path + 'Sensor.ANALOG.Temperature',
                                          ScreensaverEntityFactor: 1,
                                          ScreensaverEntityDecimalPlaces: 1,
                                          ScreensaverEntityIconOn: 'thermometer',
                                          ScreensaverEntityIconOff: null,
                                          ScreensaverEntityText: 'Temperatur',
                                          ScreensaverEntityUnitText: '°C',
                                          ScreensaverEntityIconColor: {'val_min': 0, 'val_max': 35, 'val_best': 22}
                                      },
                          
                          K Offline
                          K Offline
                          Kerschte_de
                          wrote on last edited by
                          #6658

                          @tt-tom Großartig, dass Du auf fehlerhafte Punkte gestoßen bist. Ich habe gerade jedoch Mühe, Deinen Punkt richtig zu verstehen. Ich habe mitgenommen, dass ich die Aliase neu anlegen muss. Dabei darf ich jedoch nicht auf den Typ "Temperatur" gehen?
                          bcff6753-4f78-43b0-82ad-a083c6e1435c-image.png

                          T 1 Reply Last reply
                          0
                          • K Kerschte_de

                            @tt-tom Großartig, dass Du auf fehlerhafte Punkte gestoßen bist. Ich habe gerade jedoch Mühe, Deinen Punkt richtig zu verstehen. Ich habe mitgenommen, dass ich die Aliase neu anlegen muss. Dabei darf ich jedoch nicht auf den Typ "Temperatur" gehen?
                            bcff6753-4f78-43b0-82ad-a083c6e1435c-image.png

                            T Offline
                            T Offline
                            TT-Tom
                            wrote on last edited by TT-Tom
                            #6659

                            @kerschte_de
                            Doch Temperatur ist richtig.
                            Aber nur ACTUAL ausfüllen. Für für Luftfeuchtigkeit gibt es einen anderen Typ/Cannel.

                            Gruß Tom
                            https://github.com/tt-tom17
                            Wenn meine Hilfe erfolgreich war, benutze bitte das Voting unten rechts im Beitrag

                            NSPanel Script Wiki
                            https://github.com/joBr99/nspanel-lovelace-ui/wiki

                            NSPanel Adapter Wiki
                            https://github.com/ticaki/ioBroker.nspanel-lovelace-ui/wiki

                            K 2 Replies Last reply
                            0
                            • T TT-Tom

                              @kerschte_de
                              Doch Temperatur ist richtig.
                              Aber nur ACTUAL ausfüllen. Für für Luftfeuchtigkeit gibt es einen anderen Typ/Cannel.

                              K Offline
                              K Offline
                              Kerschte_de
                              wrote on last edited by
                              #6660

                              @tt-tom ... das würde jedoch bedeuten, dass die Temp angezeigt, die Luftfeuchte jedoch nicht. Es wird allerdings gar keiner der 4 Werte angezeigt ... nur die Feldbezeichnungen und Einheiten.
                              Ich habe die Luftfeuchtigkeit als "SECOND" im Alias-Gerät herausgelöscht, so dass ausschließlich der ACTUAL existiert. Zudem im Script die Verlinkung herausgenommen bzw. auskommentiert.

                              
                                   //Level 1
                                   let SensorenEG: PageType =
                                   {
                                       'type': 'cardGrid',
                                       'heading': 'Zigbee-Geräte EG',
                                       'useColor': true,
                                       'subPage': true,
                                       'parent': Navigation1,
                                       'items': [
                                           { id: 'alias.0.NSPanel.1.1_Haus.EG.TempWZ.ACTUAL', name: 'WZ Temp.°C', offColor: MSRed, onColor: MSGreen, useValue: true, fontSize: 3, colorScale: {'val_min': 15, 'val_max': 35, 'val_best': 21} },
                                           {},
                                           {},//{ id: '', name: 'WZ Luft %', offColor: MSYellow, onColor: MSYellow , useValue: true, fontSize: 3, colorScale: {'val_min': 30, 'val_max': 100, 'val_best': 60} },
                                           { id: 'alias.0.NSPanel.1.1_Haus.EG.TempKueche.ACTUAL', name: 'Küche Temp.°C', offColor: MSRed, onColor: MSGreen, useValue: true, fontSize: 3, colorScale: {'val_min': 15, 'val_max': 35, 'val_best': 21} },
                                           {},
                                           {},//{ id: '', name: 'Küche Luft %', offColor: MSYellow, onColor: MSYellow , useValue: true, fontSize: 3, colorScale: {'val_min': 30, 'val_max': 100, 'val_best': 60} },
                                       ]
                                   };
                              
                              

                              671d39b4-bed6-4064-9a0a-70fbf0b1f91b-image.png

                              Die Seite besteht jetzt nur noch aus den beiden Temperaturen, die jedoch weiterhin mit "0" angezeigt werden.

                              Läuft die Kommunikation zw. ioB und NSP der Werte anders als die der Seiten? Oder wird das alles ausschließlich über die beiden Punkte "CustomSend" und "RESULT"?

                              1 Reply Last reply
                              0
                              • T TT-Tom

                                @kerschte_de
                                Doch Temperatur ist richtig.
                                Aber nur ACTUAL ausfüllen. Für für Luftfeuchtigkeit gibt es einen anderen Typ/Cannel.

                                K Offline
                                K Offline
                                Kerschte_de
                                wrote on last edited by Kerschte_de
                                #6661

                                @tt-tom Die Luftfeuchtigkeit habe ich jetzt für die beiden Testräume als einzelnen Channel "Feuchtigkeit" angelegt und eingebunden. Die Felder werden wieder angezeigt, der Wert darin "0".

                                //-- Anfang für eigene Seiten -- z.T. selbstdefinierte Aliase erforderlich ----------------
                                //-- Start for your own pages -- some self-defined aliases required ----------------
                                
                                    //-- https://github.com/joBr99/nspanel-lovelace-ui/wiki/NSPanel-Page-%E2%80%90-Typen_How-2_Beispiele
                                
                                //-- ##### ##### ##### KERSTEN #### ##### #####
                                //Level 0
                                
                                let Navigation1: PageType =
                                {
                                    'type': 'cardGrid',
                                    'heading': 'HOME',
                                    'useColor': true,
                                    'items': [
                                        /*PageItem*/{ navigate: true, id: 'SensorenEG', icon: 'home-floor-0',offColor: Menu, onColor: Menu, name: 'Sensoren EG'},
                                        //*PageItem*/{ navigate: true, id: 'SensorenOG', icon: 'home-floor-1',offColor: Menu, onColor: Menu, name: 'Sensoren OG'},
                                        //*PageItem*/{ navigate: true, id: 'SensorenKeller', icon: 'home-floor-negative-1',offColor: Menu, onColor: Menu, name: 'Sensoren Keller'},
                                        /*PageItem*/{ navigate: true, id: 'NSPanel_Service', icon: 'hammer-screwdriver',offColor: Menu, onColor: Menu, name: 'ServiceMenu'},
                                        //{ id: 'alias.0.NSPanel_1.TestFenster', offColor: MSRed, onColor: MSGreen, name: 'Büro Fenster'},
                                        //{ id: 'alias.0.NSPanel_1.Luftreiniger', icon: 'power', offColor: MSRed, onColor: MSGreen},
                                        //{ id: 'alias.0.NSPanel_1.TestBlind', icon: 'projector-screen', onColor: White, name: 'Beamer', secondRow: 'auch Text'},
                                        //{ id: 'alias.0.NSPanel_1.Kippfenster', useValue: true }
                                    ]
                                };
                                
                                
                                     //Level 1
                                     let SensorenEG: PageType =
                                     {
                                         'type': 'cardGrid',
                                         'heading': 'Zigbee-Geräte EG',
                                         'useColor': true,
                                         'subPage': true,
                                         'parent': Navigation1,
                                         'items': [
                                             { id: 'alias.0.NSPanel.1.1_Haus.EG.TempWZ.ACTUAL', name: 'WZ Temp.°C', offColor: MSRed, onColor: MSGreen, useValue: true, fontSize: 3, colorScale: {'val_min': 15, 'val_max': 35, 'val_best': 21} },
                                             {},
                                             { id: 'alias.0.NSPanel.1.1_Haus.EG.LuftfeuchteWZ.ACTUAL', name: 'WZ Luft %', offColor: MSYellow, onColor: MSYellow , useValue: true, fontSize: 3, colorScale: {'val_min': 30, 'val_max': 100, 'val_best': 60} },
                                             { id: 'alias.0.NSPanel.1.1_Haus.EG.TempKueche.ACTUAL', name: 'Küche Temp.°C', offColor: MSRed, onColor: MSGreen, useValue: true, fontSize: 3, colorScale: {'val_min': 15, 'val_max': 35, 'val_best': 21} },
                                             {},
                                             { id: 'alias.0.NSPanel.1.1_Haus.EG.LuftfeuchteKueche.ACTUAL', name: 'Küche Luft %', offColor: MSYellow, onColor: MSYellow , useValue: true, fontSize: 3, colorScale: {'val_min': 30, 'val_max': 100, 'val_best': 60} },
                                         ]
                                     };
                                
                                
                                //-- ENDE für eigene Seiten -- z.T. selbstdefinierte Aliase erforderlich -------------------------
                                //-- END for your own pages -- some self-defined aliases required ------------------------
                                
                                

                                b82cf168-1a52-4fb2-b17f-0e150abf1515-image.png

                                69507981-2c3e-4357-887c-48f227874b16-image.png

                                998cb31e-53bb-4669-ade4-657dbfc8ab62-WIN_20241214_20_16_43_Pro.jpg

                                Macht es Sinn, nochmal bestimmte Punkte der Installation zu wiederholen?

                                T 1 Reply Last reply
                                0
                                • K Kerschte_de

                                  @tt-tom Die Luftfeuchtigkeit habe ich jetzt für die beiden Testräume als einzelnen Channel "Feuchtigkeit" angelegt und eingebunden. Die Felder werden wieder angezeigt, der Wert darin "0".

                                  //-- Anfang für eigene Seiten -- z.T. selbstdefinierte Aliase erforderlich ----------------
                                  //-- Start for your own pages -- some self-defined aliases required ----------------
                                  
                                      //-- https://github.com/joBr99/nspanel-lovelace-ui/wiki/NSPanel-Page-%E2%80%90-Typen_How-2_Beispiele
                                  
                                  //-- ##### ##### ##### KERSTEN #### ##### #####
                                  //Level 0
                                  
                                  let Navigation1: PageType =
                                  {
                                      'type': 'cardGrid',
                                      'heading': 'HOME',
                                      'useColor': true,
                                      'items': [
                                          /*PageItem*/{ navigate: true, id: 'SensorenEG', icon: 'home-floor-0',offColor: Menu, onColor: Menu, name: 'Sensoren EG'},
                                          //*PageItem*/{ navigate: true, id: 'SensorenOG', icon: 'home-floor-1',offColor: Menu, onColor: Menu, name: 'Sensoren OG'},
                                          //*PageItem*/{ navigate: true, id: 'SensorenKeller', icon: 'home-floor-negative-1',offColor: Menu, onColor: Menu, name: 'Sensoren Keller'},
                                          /*PageItem*/{ navigate: true, id: 'NSPanel_Service', icon: 'hammer-screwdriver',offColor: Menu, onColor: Menu, name: 'ServiceMenu'},
                                          //{ id: 'alias.0.NSPanel_1.TestFenster', offColor: MSRed, onColor: MSGreen, name: 'Büro Fenster'},
                                          //{ id: 'alias.0.NSPanel_1.Luftreiniger', icon: 'power', offColor: MSRed, onColor: MSGreen},
                                          //{ id: 'alias.0.NSPanel_1.TestBlind', icon: 'projector-screen', onColor: White, name: 'Beamer', secondRow: 'auch Text'},
                                          //{ id: 'alias.0.NSPanel_1.Kippfenster', useValue: true }
                                      ]
                                  };
                                  
                                  
                                       //Level 1
                                       let SensorenEG: PageType =
                                       {
                                           'type': 'cardGrid',
                                           'heading': 'Zigbee-Geräte EG',
                                           'useColor': true,
                                           'subPage': true,
                                           'parent': Navigation1,
                                           'items': [
                                               { id: 'alias.0.NSPanel.1.1_Haus.EG.TempWZ.ACTUAL', name: 'WZ Temp.°C', offColor: MSRed, onColor: MSGreen, useValue: true, fontSize: 3, colorScale: {'val_min': 15, 'val_max': 35, 'val_best': 21} },
                                               {},
                                               { id: 'alias.0.NSPanel.1.1_Haus.EG.LuftfeuchteWZ.ACTUAL', name: 'WZ Luft %', offColor: MSYellow, onColor: MSYellow , useValue: true, fontSize: 3, colorScale: {'val_min': 30, 'val_max': 100, 'val_best': 60} },
                                               { id: 'alias.0.NSPanel.1.1_Haus.EG.TempKueche.ACTUAL', name: 'Küche Temp.°C', offColor: MSRed, onColor: MSGreen, useValue: true, fontSize: 3, colorScale: {'val_min': 15, 'val_max': 35, 'val_best': 21} },
                                               {},
                                               { id: 'alias.0.NSPanel.1.1_Haus.EG.LuftfeuchteKueche.ACTUAL', name: 'Küche Luft %', offColor: MSYellow, onColor: MSYellow , useValue: true, fontSize: 3, colorScale: {'val_min': 30, 'val_max': 100, 'val_best': 60} },
                                           ]
                                       };
                                  
                                  
                                  //-- ENDE für eigene Seiten -- z.T. selbstdefinierte Aliase erforderlich -------------------------
                                  //-- END for your own pages -- some self-defined aliases required ------------------------
                                  
                                  

                                  b82cf168-1a52-4fb2-b17f-0e150abf1515-image.png

                                  69507981-2c3e-4357-887c-48f227874b16-image.png

                                  998cb31e-53bb-4669-ade4-657dbfc8ab62-WIN_20241214_20_16_43_Pro.jpg

                                  Macht es Sinn, nochmal bestimmte Punkte der Installation zu wiederholen?

                                  T Offline
                                  T Offline
                                  TT-Tom
                                  wrote on last edited by TT-Tom
                                  #6662

                                  @kerschte_de

                                  du hast mein Post anscheinend nicht verstanden. In der Page/Seitenconfig wird nicht auf den Datenpunkt verwiesen, sondern auf den Folder/Channel.

                                  id: 'alias.0.NSPanel.1.1_Haus.EG.TempWZ'
                                  

                                  Edit: link zum Post

                                  Macht es Sinn, nochmal bestimmte Punkte der Installation zu wiederholen?

                                  das passt schon, sind nur kleine Fehler. Das Grundgerüst steht doch. 🙂

                                  Gruß Tom
                                  https://github.com/tt-tom17
                                  Wenn meine Hilfe erfolgreich war, benutze bitte das Voting unten rechts im Beitrag

                                  NSPanel Script Wiki
                                  https://github.com/joBr99/nspanel-lovelace-ui/wiki

                                  NSPanel Adapter Wiki
                                  https://github.com/ticaki/ioBroker.nspanel-lovelace-ui/wiki

                                  K 1 Reply Last reply
                                  1
                                  • T TT-Tom

                                    @kerschte_de

                                    du hast mein Post anscheinend nicht verstanden. In der Page/Seitenconfig wird nicht auf den Datenpunkt verwiesen, sondern auf den Folder/Channel.

                                    id: 'alias.0.NSPanel.1.1_Haus.EG.TempWZ'
                                    

                                    Edit: link zum Post

                                    Macht es Sinn, nochmal bestimmte Punkte der Installation zu wiederholen?

                                    das passt schon, sind nur kleine Fehler. Das Grundgerüst steht doch. 🙂

                                    K Offline
                                    K Offline
                                    Kerschte_de
                                    wrote on last edited by
                                    #6663

                                    @tt-tom sagte in SONOFF NSPanel mit Lovelace UI:

                                    @kerschte_de

                                    du hast mein Post anscheinend nicht verstanden. In der Page/Seitenconfig wird nicht auf den Datenpunkt verwiesen, sondern auf den Folder/Channel.

                                    id: 'alias.0.NSPanel.1.1_Haus.EG.TempWZ'
                                    

                                    Oh Mann, jetzt raff ich es erst. Habe es angepasst und es funktioniert tadellos. Dann starte ich mal mit dem Aufbau. Tausend Dank @TT-Tom für's Entdecken meines Fehlers. Schönes WE und schönen 3. Advent heute 🙂

                                    T 1 Reply Last reply
                                    1
                                    • K Kerschte_de

                                      @tt-tom sagte in SONOFF NSPanel mit Lovelace UI:

                                      @kerschte_de

                                      du hast mein Post anscheinend nicht verstanden. In der Page/Seitenconfig wird nicht auf den Datenpunkt verwiesen, sondern auf den Folder/Channel.

                                      id: 'alias.0.NSPanel.1.1_Haus.EG.TempWZ'
                                      

                                      Oh Mann, jetzt raff ich es erst. Habe es angepasst und es funktioniert tadellos. Dann starte ich mal mit dem Aufbau. Tausend Dank @TT-Tom für's Entdecken meines Fehlers. Schönes WE und schönen 3. Advent heute 🙂

                                      T Offline
                                      T Offline
                                      TT-Tom
                                      wrote on last edited by
                                      #6664

                                      @kerschte_de
                                      viel Spass beim Neuaufbau und schönen 3. Advent🎄

                                      Gruß Tom
                                      https://github.com/tt-tom17
                                      Wenn meine Hilfe erfolgreich war, benutze bitte das Voting unten rechts im Beitrag

                                      NSPanel Script Wiki
                                      https://github.com/joBr99/nspanel-lovelace-ui/wiki

                                      NSPanel Adapter Wiki
                                      https://github.com/ticaki/ioBroker.nspanel-lovelace-ui/wiki

                                      1 Reply Last reply
                                      0
                                      • K Offline
                                        K Offline
                                        Kerschte_de
                                        wrote on last edited by Kerschte_de
                                        #6665

                                        Guten Abend.
                                        Ich habe gerade eine Hue-Birne aus dem Hue-Adapter in das NSPanel integriert (als Gerät "Hue-Licht"). Die Steuerung der Farben geht soweit (auch wenn ich nicht auf ein sattes blau komme), aber bei der Steuerung der Farbtemperatur funktioniert genau diese nicht. Die Helligkeit auf der Seite läuft, die Farbtemperatur ist fest auf auf 2000 °K eingestellt (bei erstmaliger Betätigung des Farbtemperatur-Gebers). Man kann den Regler schieben wie man möchte, keine Reaktion. Ändere ich den Wert im Alias in der Objektstruktur durch Werteingabe, funktionert es tatellos. Handelt es sich um einen Fehler im Script?
                                        Das Script zum NSP habe ich mal auf debug gestellt und den Farbtemp-Regler betätigt. Aktion gibt es - sie kommt nur nirgends an und im Alias wird permanent die 2000 °K angezeigt. Alles andere lässt sich an der Lampe über das NSP bedienen.

                                        javascript.0	20:53:03.174	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_FINAL: HandleButtonEvent activePage: 4 id: 0 tempid: 0 pageItemId: alias.0.NSPanel.1.1_Haus.Og.Badlampe
                                        javascript.0	20:53:03.174	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_FINAL: HandleButtonEvent übergebene Werte event - buttonPress2 - 0 - colorTempSlider - 46 - PageId: 0
                                        javascript.0	20:53:03.174	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_FINAL: HandleButtonEvent buttonAction: colorTempSlider
                                        javascript.0	20:53:03.174	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_FINAL: HandleMessage -> buttonPress2 event - buttonPress2 - 0 - colorTempSlider - 46
                                        javascript.0	20:53:03.425	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_FINAL: findPageItem -> pageItem {"id":"alias.0.NSPanel.1.1_Haus.Og.Badlampe","offColor":{"red":251,"green":105,"blue":98},"onColor":{"red":121,"green":222,"blue":121},"name":"Bad-Lampe"}
                                        

                                        Der entsprechende Script-Eintrag lautet wie folgt:

                                                 let EinzellichterWZ: PageType =
                                                {
                                                    'type': 'cardEntities',
                                                    'heading': 'WZ Einzel-Lampen',
                                                    'useColor': true,
                                                    'subPage': true,
                                                    'parent': Wohnzimmer1,
                                                    'prev': undefined,
                                                    'next': undefined,
                                                    'home': 'HOME1',
                                                    'items': [
                                                        { id: 'alias.0.NSPanel.1.1_Haus.Og.Badlampe', offColor: MSRed, onColor: MSGreen, name: 'Bad-Lampe', interpolateColor: true},
                                                        //{ id: 'alias.0.NSPanel.1.1_Haus.Og.Badlampe2', offColor: MSRed, onColor: MSGreen, name: 'Bad-Lampe'},
                                                        //{ id: 'alias.0.NSPanel.1.1_Haus.Og.Badlampe3', offColor: MSRed, onColor: MSGreen, name: 'Bad-Lampe'},
                                                        //{ id: 'alias.0.NSPanel.1.1_Haus.Og.Badlampe4', offColor: MSRed, onColor: MSGreen, name: 'Bad-Lampe'}
                                                    ]
                                                };
                                        

                                        Vielen Dank für eine Rückmeldung.
                                        Kersten

                                        T 1 Reply Last reply
                                        0
                                        • K Kerschte_de

                                          Guten Abend.
                                          Ich habe gerade eine Hue-Birne aus dem Hue-Adapter in das NSPanel integriert (als Gerät "Hue-Licht"). Die Steuerung der Farben geht soweit (auch wenn ich nicht auf ein sattes blau komme), aber bei der Steuerung der Farbtemperatur funktioniert genau diese nicht. Die Helligkeit auf der Seite läuft, die Farbtemperatur ist fest auf auf 2000 °K eingestellt (bei erstmaliger Betätigung des Farbtemperatur-Gebers). Man kann den Regler schieben wie man möchte, keine Reaktion. Ändere ich den Wert im Alias in der Objektstruktur durch Werteingabe, funktionert es tatellos. Handelt es sich um einen Fehler im Script?
                                          Das Script zum NSP habe ich mal auf debug gestellt und den Farbtemp-Regler betätigt. Aktion gibt es - sie kommt nur nirgends an und im Alias wird permanent die 2000 °K angezeigt. Alles andere lässt sich an der Lampe über das NSP bedienen.

                                          javascript.0	20:53:03.174	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_FINAL: HandleButtonEvent activePage: 4 id: 0 tempid: 0 pageItemId: alias.0.NSPanel.1.1_Haus.Og.Badlampe
                                          javascript.0	20:53:03.174	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_FINAL: HandleButtonEvent übergebene Werte event - buttonPress2 - 0 - colorTempSlider - 46 - PageId: 0
                                          javascript.0	20:53:03.174	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_FINAL: HandleButtonEvent buttonAction: colorTempSlider
                                          javascript.0	20:53:03.174	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_FINAL: HandleMessage -> buttonPress2 event - buttonPress2 - 0 - colorTempSlider - 46
                                          javascript.0	20:53:03.425	info	script.js.common.NSPanel.NSPanel_WZ_4_4_0_11_FINAL: findPageItem -> pageItem {"id":"alias.0.NSPanel.1.1_Haus.Og.Badlampe","offColor":{"red":251,"green":105,"blue":98},"onColor":{"red":121,"green":222,"blue":121},"name":"Bad-Lampe"}
                                          

                                          Der entsprechende Script-Eintrag lautet wie folgt:

                                                   let EinzellichterWZ: PageType =
                                                  {
                                                      'type': 'cardEntities',
                                                      'heading': 'WZ Einzel-Lampen',
                                                      'useColor': true,
                                                      'subPage': true,
                                                      'parent': Wohnzimmer1,
                                                      'prev': undefined,
                                                      'next': undefined,
                                                      'home': 'HOME1',
                                                      'items': [
                                                          { id: 'alias.0.NSPanel.1.1_Haus.Og.Badlampe', offColor: MSRed, onColor: MSGreen, name: 'Bad-Lampe', interpolateColor: true},
                                                          //{ id: 'alias.0.NSPanel.1.1_Haus.Og.Badlampe2', offColor: MSRed, onColor: MSGreen, name: 'Bad-Lampe'},
                                                          //{ id: 'alias.0.NSPanel.1.1_Haus.Og.Badlampe3', offColor: MSRed, onColor: MSGreen, name: 'Bad-Lampe'},
                                                          //{ id: 'alias.0.NSPanel.1.1_Haus.Og.Badlampe4', offColor: MSRed, onColor: MSGreen, name: 'Bad-Lampe'}
                                                      ]
                                                  };
                                          

                                          Vielen Dank für eine Rückmeldung.
                                          Kersten

                                          T Offline
                                          T Offline
                                          TT-Tom
                                          wrote on last edited by TT-Tom
                                          #6666

                                          @kerschte_de

                                          Zeige bitte auch mal die Datenpunkte im Alias

                                          der Slider geht auf TEMPERATURE

                                          Edit: Link zum Wiki

                                          noch ein Edit: du musst den Wertebereich für die Farbtemperatur angeben z.b. 2000 - 4400 sieht dann so aus.

                                          { id: 'alias.0.NSPanel.1.1_Haus.Og.Badlampe', offColor: MSRed, onColor: MSGreen, name: 'Bad-Lampe', interpolateColor: true, minValueColorTemp: 2000, maxValueColorTemp: 4400},
                                          

                                          Gruß Tom
                                          https://github.com/tt-tom17
                                          Wenn meine Hilfe erfolgreich war, benutze bitte das Voting unten rechts im Beitrag

                                          NSPanel Script Wiki
                                          https://github.com/joBr99/nspanel-lovelace-ui/wiki

                                          NSPanel Adapter Wiki
                                          https://github.com/ticaki/ioBroker.nspanel-lovelace-ui/wiki

                                          K 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          601

                                          Online

                                          32.4k

                                          Users

                                          81.3k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe