Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Hardware
    4. SONOFF NSPanel mit Lovelace UI

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    SONOFF NSPanel mit Lovelace UI

    This topic has been deleted. Only users with topic management privileges can see it.
    • T
      TT-Tom @StefanW last edited by

      @stefanw
      Ja geht über ein kleinen Umweg. Im alias die Konvertierung nutzen und bei „schreiben“ val=0 (close) bzw. val=100 (Open).

      S 1 Reply Last reply Reply Quote 2
      • S
        StefanW @TT-Tom last edited by

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

        val=0

        oha, so einfach - es funktioniert schon 👏

        vielen Dank!!!!!
        Stefan

        L 1 Reply Last reply Reply Quote 0
        • L
          ltreff @StefanW last edited by

          @TT-TOM Hallo,
          ich benutze Type-Skript v4.4.0.11.
          Ich habe den Alternative-Screensaver als bevorzugten Screensaver eingestellt. Ich würde gerne mit der Taste 1 vom Alternative-Screensaver auf den Default-Sreensaver umschalten (toggle) und mit der Taste 2 vom Alternative-Screensaver auf den Advanced-Screensaver umschalten (toggle).
          Geht das, und wenn ja, wie?

          T 2 Replies Last reply Reply Quote 0
          • T
            TT-Tom @ltreff last edited by

            @ltreff

            So eine Anfrage hatten wir auch noch nicht. Warum möchtest du zwischen den Screensaver hin und her schalten??

            Es gibt Datenpunkte, die den aktiven Screensaver auf true setzen. Diese müssen dann über die Tasten gesetzt werden.

            Bin Sonntag erst wieder am Rechner, also Geduld.

            1 Reply Last reply Reply Quote 0
            • T
              TT-Tom @ltreff last edited by TT-Tom

              @ltreff

              mir er schliesst sich noch nicht der Sinn, aber das wäre eine Lösung
              Wichtig ist das du die Rule2 in Tasmota aktiv hast , die die Tasten von den Relais abkopplet

              Folgende Stelle im Script anpassen. Um in den neuen Modus zu wechseln, musst du nach dem Umschalten das Panel aufwecken.

                  //-------DE: Anfang Einstellungen für Hardware Button, wenn Sie softwareseitig genutzt werden (Rule2) -------------
                  //-------EN: Start Settings for Hardware Button, if used in software (Rule2) --------------------------------------
                  // DE: Konfiguration des linken Schalters des NSPanels
                  // EN: Configuration of the left switch of the NSPanel
                  button1: {
                      // DE: Mögliche Werte wenn Rule2 definiert: 'page', 'toggle', 'set' - Wenn nicht definiert --> mode: null
                      // EN: Possible values if Rule2 defined: 'page', 'toggle', 'set' - If not defined --> mode: null
                      mode: 'toggle',
                      // DE: Zielpage - Verwendet wenn mode = page
                      // EN: Target page - Used if mode = page
                      page: null,
                      // DE: Zielentity - Verwendet wenn mode = set oder toggle
                      // EN: Target entity - Used if mode = set or toggle
                      entity: AliasPath + 'Config.Screensaver.alternativeScreensaverLayout.SET',
                      // DE: Zielwert - Verwendet wenn mode = set
                      // EN: Target value - Used if mode = set
                      setValue: null,
                  },
              
                  // DE: Konfiguration des rechten Schalters des NSPanels
                  // EN: Configuration of the right switch of the NSPanel
                  button2: {
                      mode: 'toggle',
                      page: null,
                      entity: AliasPath + 'Config.Screensaver.ScreensaverAdvanced.SET',
                      setValue: null,
                  },
              
              L 1 Reply Last reply Reply Quote 0
              • L
                ltreff @TT-Tom last edited by

                @tt-tom Guten morgen,
                die vorgeschlagenen Anpassungen zeigen leider keine Wirkung. Ich drücke Taste 1 oder 2 und anschliessend tippe ich den Bildschirm an zum "Aufwecken".
                Rule2 ist aktiviert, die Relais schalten nicht mehr.

                Zum Sinn: ich habe im Moment keine andere Verwendung für die 2 Tasten, daher dachte ich, ich könnte damit eine beliebige "Page" oder "SubPage" direkt anzeigen, ohne durch das Service_Menu zu navigieren.

                T 1 Reply Last reply Reply Quote 0
                • T
                  TT-Tom @ltreff last edited by

                  @ltreff sagte in SONOFF NSPanel mit Lovelace UI:

                  @tt-tom Guten morgen,
                  die vorgeschlagenen Anpassungen zeigen leider keine Wirkung. Ich drücke Taste 1 oder 2 und anschliessend tippe ich den Bildschirm an zum "Aufwecken".
                  Rule2 ist aktiviert, die Relais schalten nicht mehr.

                  Prüfe bitte mal, ob im alias.0.xxx.Config.Screensaver.alternativeScreensaverLayout.SET bzw. Config.Screensaver.ScreensaverAdvanced.SET sich die Werte ändern wenn du die Tasten betätigst.

                  Zum Sinn: ich habe im Moment keine andere Verwendung für die 2 Tasten, daher dachte ich, ich könnte damit eine beliebige "Page" oder "SubPage" direkt anzeigen, ohne durch das Service_Menu zu navigieren.

                  Du kannst mit den Tasten jede beliebige Seite aufrufen, die config sieht dann so aus.

                  // DE: Konfiguration des rechten Schalters des NSPanels
                      // EN: Configuration of the right switch of the NSPanel
                      button2: {
                          mode: 'page',
                          page: FahrplanEntities,  // Name der Seite 
                          entity: null,
                          setValue: null,
                      },
                  
                  L 1 Reply Last reply Reply Quote 0
                  • L
                    ltreff @TT-Tom last edited by

                    @tt-tom Nein, die Werte ändern sich nicht auf Tastendruck, nur wenn ich im Menu des NSPanel den entsprechenden Button an/ausschalte.

                    T Armilar 2 Replies Last reply Reply Quote 1
                    • T
                      TT-Tom @ltreff last edited by

                      @ltreff

                      Dann passt entweder die Rule2 nicht oder die Config der Tasten. Kannst du beides mal zeigen.

                      1 Reply Last reply Reply Quote 1
                      • Armilar
                        Armilar Most Active Forum Testing @ltreff last edited by Armilar

                        @ltreff

                        zusätzlich zur verwendeten Rule2 oder Tasten-Konfiguration bitte auch kurz einen Blick auf die Konfiguration des MQTT-Topics. Entweder aus Tasmota oder MQTT-Adapter oder einfach den verwendeten CustomSend im Skript. Da der Aufbau in der Rule2 identisch sein muss.

                        Ansonsten sind die Hinweise von @TT-Tom völlig korrekt 😊

                        1 Reply Last reply Reply Quote 1
                        • L
                          ltreff last edited by ltreff

                          @armilar Rule2 ist aus dem Skript:
                          Rule2 on Button1#state do Publish %topic%/tele/RESULT {"CustomRecv":"event,button1"} endon on Button2#state do Publish %topic%/tele/RESULT {"CustomRecv":"event,button2"} endon

                          Tasten-Config im Skript:
                          button1: {
                          // DE: Mögliche Werte wenn Rule2 definiert: 'page', 'toggle', 'set' - Wenn nicht definiert --> mode: null
                          // EN: Possible values if Rule2 defined: 'page', 'toggle', 'set' - If not defined --> mode: null
                          mode: 'toggle',
                          // DE: Zielpage - Verwendet wenn mode = page
                          // EN: Target page - Used if mode = page
                          page: null,
                          // DE: Zielentity - Verwendet wenn mode = set oder toggle
                          // EN: Target entity - Used if mode = set or toggle
                          entity: AliasPath + 'Config.Screensaver.alternativeScreensaverLayout.SET',
                          // DE: Zielwert - Verwendet wenn mode = set
                          // EN: Target value - Used if mode = set
                          setValue: true
                          },

                          // DE: Konfiguration des rechten Schalters des NSPanels
                          // EN: Configuration of the right switch of the NSPanel
                          button2: {
                              mode: 'toggle',
                              page: null,
                              entity: AliasPath + 'Config.Screensaver.ScreensaverAdvanced.SET',
                              setValue: null
                          },
                          

                          /***** 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.MyHome.NSPanel1.tele.RESULT';
                          const NSPanelSendTopic: string = 'mqtt.0.MyHome.NSPanel1.cmnd.CustomSend';
                          

                          Objets_mqtt.png

                          T Armilar 2 Replies Last reply Reply Quote 0
                          • T
                            TT-Tom @ltreff last edited by

                            @ltreff
                            Also doch die Rule2 falsch, die muss den selben Topic haben wie dein Tasmota Topic. Da fehlt dein Myhome.

                            1 Reply Last reply Reply Quote 2
                            • Armilar
                              Armilar Most Active Forum Testing @ltreff last edited by Armilar

                              @ltreff

                              Rule2 on Button1#state do Publish MyHome/%topic%/tele/RESULT {"CustomRecv":"event,button1"} endon on Button2#state do Publish MyHome/%topic%/tele/RESULT {"CustomRecv":"event,button2"} endon
                              Rule2 1
                              
                              L 1 Reply Last reply Reply Quote 2
                              • L
                                ltreff @Armilar last edited by

                                @armilar Das klappt jetzt.
                                Der Wechsel der Anzeige ist auch noch vom Wert 0_userdata.0.NSPanel.1.Config.Screensaver.timeoutScreensaver abhängig.

                                Vielen Dank, ich beende dann diesen Topic.

                                1 Reply Last reply Reply Quote 1
                                • L
                                  losossos @Kuckuckmann last edited by

                                  @kuckuckmann

                                  Mahlzeit, ist schon 'ne Weile her seit meinem letztem post.
                                  Ich habe eine Frage zur Aktualisierung bzw. Aktivierung des Screensavers;
                                  Wie gesagt, ich hab lange nichts mehr an den Panels "gemacht". Alles lief prima und das Motto ist ja beakanntlicher Weise "never touch a running...."
                                  Nun habe ich aber doch mal wieder etwas angepasst/hinzugefügt und dabei dann auch das Skript von v 4.3.1 auf aktuell hochgezogen. Soweit läuft alles. Allerdings ist es jetzt so, daß mein Wetterscreensaver (accuweather) nicht mehr (automatisch) aktiviert wird wenn ich zuvor ne popup-nachricht 0_userdata.0.NSPanel.2.ScreensaverInfo.popupNotifyHeading und 0_userdata.0.NSPanel.2.ScreensaverInfo.popupNotifyText ausgegeben habe. Zuvor war es so, daß nach einem timeout der Wetter screensaver automatisch wieder aktiviert wurde. Jetzt klappt das nur noch wenn ich das Display kurz "antatsche".
                                  (ich zeige in bestimmten Abständen diverse "news" über diese Infozeilen an)
                                  An welcher "Schraube müßte ich denn drehen" ums wieder so hinzubekommen wie's zuvor war?

                                  T 1 Reply Last reply Reply Quote 0
                                  • T
                                    TT-Tom @losossos last edited by

                                    @losossos

                                    Ja da hat sich in der Zeit einiges geändert. Hier kannst du alles nachlesen.
                                    https://github.com/joBr99/nspanel-lovelace-ui/wiki/Changelog
                                    https://github.com/joBr99/nspanel-lovelace-ui/wiki/Release-Notes

                                    und hier die Lösung für dein Problem
                                    https://github.com/joBr99/nspanel-lovelace-ui/wiki/ioBroker-Config-Screensaver#popupnotify-im-screensaver

                                    L 1 Reply Last reply Reply Quote 2
                                    • L
                                      losossos @TT-Tom last edited by

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

                                      Ja da hat sich in der Zeit einiges geändert.

                                      Oh, ja da hat sich ne ganze Menge getan! Gute Arbeit 👍 😊

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

                                      und hier die Lösung für dein Problem

                                      Supi, klar , hätt natürlich auch alles nachlesen können, aber so geht's natürlich viiiiiel schneller.
                                      1000-Dank und schöne 🎅 🎄

                                      1 Reply Last reply Reply Quote 1
                                      • K
                                        Kerschte_de last edited by Kerschte_de

                                        Guten Abend zusammen.
                                        Mein Test-NSPanel hatte ich mit Eurer Unterstützung zum Funktionieren bekommen. Die Kommunikation zwischen Panel und ioB lief.
                                        Inzwischen habe ich meine beiden ioB-Instanzen zu einer neuen und einzigen ioB-Instanz neu aufgesetzt (jetzt kein Raspi mehr, sondern in miniPC (Proxmox). Entsprechend habe ich versucht, auch das Panel umzuziehen. Geflasht und eingerichtet war es ja bereits, also habe ich lediglich auf NSPanel-Tasmota die neue IPv4 hinterlegt. Meinen extern geführten MQTT-Broker habe ich entsprechend der Empfehlung auf einen neuen Port umgestellt ... und ebenfalls im Tasmota des NSPanels aktualisiert.
                                        Die Ojektzeile "mqtt.0.RagowSmartHome.NSPanel_85C180.cmnd.CustomSend" habe ich über einen MQTT-Explorer angelegt. Das hatte funktioniert. Jedoch fiel mir dabei auf, dass ich nicht aus der Konsole des NSPanels heraus einen Befehl übermitteln konnte.
                                        Inzwischen kommuniziert die Wetter-App mit dem Screensaver auf dem NSP. Auch Seiten kann ich im TS-Script des ioB anlegen. TS-Script habe ich auf der neuesten Version. Leider werden aber keine darin verknüpften Werte übertragen. Ich habe alles probiert, was ich mir von Euch dazu anlesen konnte. Ich bekomme es jedoch nicht wieder hin.
                                        Meine Vermutung ist, dass es irgendwie mit dem Abo auf die beiden mqtt-Datenpunkte nicht ganz klappt (CustomSend und stat.RESULT). Dazu kenne ich aber auch nicht die Funktionsweise des Panels, was worüber kommuniziert wird. Wie erwähnt, Wetter im Screensaver und eigene Seitenstrukturen gehen, aber keine Werte/Datenpunkte. Kann mich bitte jemand begleiten, den Fehler bei mir systematisch einzugrenzen?

                                        T 1 Reply Last reply Reply Quote 0
                                        • T
                                          TT-Tom @Kerschte_de last edited by TT-Tom

                                          @kerschte_de

                                          Setze das Script bitte in den Debug-Modus und starte es neu, dann poste das Log vom Start des Script bis zum erscheinen des Screensaver.

                                          Debugmodus im Panel unter Einstellung -> Script -> Debug Modus(an/aus)
                                          oder im Script unter

                                          // DE: liefert bei true detailliertere Meldundgen im Log.
                                          // EN: if true, provides more detailed messages in the log.
                                          var Debug: boolean = true;
                                          
                                          K 1 Reply Last reply Reply Quote 0
                                          • K
                                            Kerschte_de @TT-Tom last edited by

                                            @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 T 4 Replies Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            910
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

                                            lovelace ui nspanel sonoff
                                            261
                                            7149
                                            4789098
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo