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

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    • Save The Date: ioBroker@Smart Living Forum Solingen, 14.06.

    SONOFF NSPanel mit Lovelace UI

    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      holgerwolf @Armilar last edited by holgerwolf

      @armilar Muss in dem Script der Trigger nicht auch um die Variablen Erstellung drumrum?

      Siehe nächsten Beitrag.

      1 Reply Last reply Reply Quote 0
      • H
        holgerwolf @Armilar last edited by

        @armilar

        @armilar sagte in SONOFF NSPanel mit Lovelace UI:

        @carlos

        Habe jetzt mal ein neues Blocky-Beispiel für die cardPower zum spielen und ausprobieren gebaut.

        "cardPower simple example"

        Das Blockly:
        bb839e1f-3429-4677-8ff1-ab8b921c3b18-cardPower_simple_Example.jpg

        https://github.com/joBr99/nspanel-lovelace-ui/blob/main/ioBroker/Blockly/cardPower_simple_example.xml

        Beim ersten Aufruf sollte die card so aussehen:
        49d009ad-aac1-4780-a179-ce596eceb073-image.png

        Die restlichen Variablen können analog der id: 1 verändert werden, oder durch Datenpunkte mit echter Logik ersetzt werden.

        Ich denke das wird dem allgemeinen Verständnis helfen...

        PS.:

        • direction wurde im Script noch nie abgefragt und ist deshalb im Beispiel auch nicht mehr enthalten
        • speed_id_1-6 kann auch negative Werte enthalten und kehrt somit die Laufrichtung des Punktes um (Empfehlung -5 bis +5)
        • Der mittlere größere Block hat kein Speed
        • Ich habe einen Timer eingebaut, der jede Minute das JSONzusammenbaut und in den Datenpunkt schreibt. Bei Bedarf die Zeit ändern oder durch einen Trigger ersetzten
        • Die Farben gehen von 0=weiß, 1=grün bis 10=rot

        Muss in dem Script der Trigger nicht auch um die Variablen Erstellung drumrum. Ich habe immer alte Werte zum Zeitpunkt des Scriptspeicherns.

        Armilar 2 Replies Last reply Reply Quote 0
        • Armilar
          Armilar Most Active Forum Testing @holgerwolf last edited by

          @holgerwolf

          Welcher Trigger?

          Das abgebildete Blockly arbeitet zyklisch (so wie eingestellt jede Minute)

          83d60365-b105-4d14-9a36-ae20d559c3cf-image.png

          Das heißt, was auch immer dort verarbeitet wird erzeigt jede Minute einen cardPower-String

          H 1 Reply Last reply Reply Quote 0
          • H
            holgerwolf @Armilar last edited by

            @armilar Die Werte für die Variablen"value_ID_XX" werden doch drüber gesetzt.
            Der Zeitplan stellt dann jede Minute den gleichen String zusammen.

            Habe den Zeitplan jetzt mal komplett um alles gelegt und schon passt es.

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

              @holgerwolf

              921d2d01-1af2-41db-8f19-c1084943af46-image.png

              Für jeden Wert muss natürlich ein Datenpunkt zugewiesen werden. Die Scheduler sollte die Variablen umschließen, da sie sonst nicht erneut abgerufen werden --> ja

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

                @wendy2702

                3f1086b1-0f48-497f-9d5a-89674fde0b94-Nextion_Editor_eWhFTF2uXG.gif

                Habe in der Emulation (das gleiche im Original-Panel) mal nachgestellt und einfach unterschiedliche Werte in den Datenpunkt eingegeben. Ich habe das Verhalten nicht...

                wendy2702 1 Reply Last reply Reply Quote 0
                • wendy2702
                  wendy2702 @Armilar last edited by

                  @armilar das heißt auch nach antippen des displays (Dimmer aus) wird weiterhin aktualisiert?

                  Gibt es irgendwo logs die ich mir ansehen kann vom/im Display?

                  Sonst werden die Daten ja vom Mqtt Adapter übertragen, wenn da keine aktuellen Werte mehr übertragen werden läge am Server. Sonst eher am Display, oder?

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

                    @wendy2702

                    519f5034-0ec6-4c46-8fdf-b661fe11a813-image.png

                    Ja die werden kontinuierlich getriggert. Die Funktionalität ist seit der ersten Version des Scriptes drin. Ist auch völlig egal, ob ein Screensaver an ist oder nicht. Die werden befüllt...

                    Kannst zwischen die Zeilen auch mit:

                    console.log("Was auch immer");
                    

                    Logs einbauen.

                    • Das Script triggert die Datenpunkte und Sendet ein Update der Werte über die function HandleScreensaverUpdate()
                      Damit werden alle Statuswerte der unteren Zeile aktualisiert.
                    • Danach wird ein Payload zur Aktualisierung via MQTT an das Panel gesendet...

                    Das gleiche passiert aber auch an anderer Stelle mit der Zeit und dem Datum.

                    Was mich mal interessieren würde ist, passiert das permanent oder wirklich immer?

                    wendy2702 1 Reply Last reply Reply Quote 0
                    • wendy2702
                      wendy2702 @Armilar last edited by

                      @armilar ok.

                      Gerade noch kurz mal probiert. Wenn der Wert eingefroren ist, ich dann den screensaver verlasse. Warte bis er wieder zurück zum screensaver springt wird der Wert wieder aktualisiert.

                      Armilar 2 Replies Last reply Reply Quote 0
                      • Armilar
                        Armilar Most Active Forum Testing @wendy2702 last edited by Armilar

                        @wendy2702

                        Versuche mal den Ereignisschwellenwert in der Admin-Instanz hochzusetzen.

                        1b932394-f656-4183-b85e-a3ab861d125a-image.png

                        Hat mir bei einigen Tests schon den Tag versaut, weil einige Adapter so viele Ereignisse in einer Sekunde produzieren wie nichts gutes.

                        Bestes Beispiel für solche Adapter sind Börsen, Corona, Binance, etc.

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

                          @wendy2702

                          ff843b09-7ad5-488f-a581-5549b9c65e71-image.png

                          Der Haken "Nur bei Änderungen publizieren" ist bei dir ebenfalls nicht gesetzt?

                          wendy2702 1 Reply Last reply Reply Quote 0
                          • wendy2702
                            wendy2702 @Armilar last edited by wendy2702

                            @armilar Den haken habe ich nicht drin.

                            Wert im Admin hoch gesetzt.

                            Gleich Mal schnell testen

                            EDIT: Hat leider nichts geändert.

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

                              @wendy2702

                              Kannst du mal kurz die Einstellungen vom Screensaver-Wetter senden? Servicepage...

                              wendy2702 1 Reply Last reply Reply Quote 0
                              • wendy2702
                                wendy2702 @Armilar last edited by wendy2702

                                @armilar bin unterwegs.

                                Kommt spätestens morgen.

                                Edit:

                                @Armilar : meinst du das?

                                 Parameter - Bitte anpassen - siehe auch Wiki
                                    firstScreensaverEntity:   { ScreensaverEntity: 'modbus.3.holdingRegisters.20498_Wirkenergie_Total',
                                                                ScreensaverEntityFactor: 1,                                 //New
                                                                ScreensaverEntityDecimalPlaces: 0,                          //New 
                                                                ScreensaverEntityIcon: 'solar-power', 
                                                                ScreensaverEntityText: 'Leistung', 
                                                                ScreensaverEntityUnitText: ' W', 
                                                                ScreensaverEntityIconColor: {'val_min': -2500, 'val_max': 2500} 
                                                              },
                                    secondScreensaverEntity:  { ScreensaverEntity: 'daswetter.0.NextHours.Location_1.Day_1.current.windgusts_value', 
                                                                ScreensaverEntityFactor: (1000/3600),                       //New
                                                                ScreensaverEntityDecimalPlaces: 1,                          //New 
                                                                ScreensaverEntityIcon: 'weather-windy', 
                                                                ScreensaverEntityText: "Wind", 
                                                                ScreensaverEntityUnitText: 'km/h', 
                                                                ScreensaverEntityIconColor: {'val_min': 0, 'val_max': 35} 
                                                              },
                                    thirdScreensaverEntity:   { ScreensaverEntity: 'daswetter.0.NextHours.Location_1.Day_1.current.uv_index_value',
                                                                ScreensaverEntityFactor: 1,                                 //New
                                                                ScreensaverEntityDecimalPlaces: 0,                          //New  
                                                                ScreensaverEntityIcon: 'solar-power', 
                                                                ScreensaverEntityText: 'UV', 
                                                                ScreensaverEntityUnitText: '', 
                                                                ScreensaverEntityIconColor: {'val_min': 0, 'val_max': 9} 
                                                              },
                                    fourthScreensaverEntity:  { ScreensaverEntity: 'daswetter.0.NextHours.Location_1.Day_1.current.humidity_value', 
                                                                ScreensaverEntityFactor: 1,                                 //New
                                                                ScreensaverEntityDecimalPlaces: 0,                          //New 
                                                                ScreensaverEntityIcon: 'water-percent', 
                                                                ScreensaverEntityText: 'Luft', 
                                                                ScreensaverEntityUnitText: '%', 
                                                                ScreensaverEntityIconColor: {'val_min': 0, 'val_max': 100, 'val_best': 65} 
                                                              },
                                
                                
                                T 2 Replies Last reply Reply Quote 1
                                • T
                                  TT-Tom @wendy2702 last edited by

                                  @wendy2702

                                  ich kann es bei mir jetzt nachstellen, wir arbeiten an der Problemlösung.

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

                                    @wendy2702

                                    so wir haben eine Lösung gefunden, bitte als Hotfix die Funktion HandleButtonEvent komplett austauschen mit folgendem Code im Spoiler

                                    function HandleButtonEvent(words: any): void {
                                       try {
                                           let tempid = words[2].split('?');
                                           let id = tempid[0];
                                           let buttonAction = words[3];
                                    
                                           if (Debug) {
                                               console.log(words[0] + ' - ' + words[1] + ' - ' + words[2] + ' - ' + words[3] + ' - ' + words[4] + ' - PageId: ' + pageId);
                                           }
                                    
                                           if ((words[2]).substring(0, 8) == 'navigate') {
                                               GeneratePage(eval((words[2]).substring(9, (words[2]).length)));
                                               return;
                                           }
                                    
                                           if (words[2] == 'bNext' || words[2] == 'bPrev' || words[2] == 'bUp' || words[2] == 'bHome' || words[2] == 'bSubNext' || words[2] == 'bSubPrev' ) {
                                               buttonAction = words[2];
                                           }
                                    
                                           if (Debug) {
                                               console.log(buttonAction);
                                           }
                                    
                                           let pageNum:number = 0;
                                    
                                           if (buttonAction.startsWith('swipe')) {
                                               buttonAction = 'bExit';
                                           }
                                           switch (buttonAction) {
                                    
                                               case 'bUp':
                                                   if (pageId < 0) { // Prüfen, ob button1page oder button2page
                                                       pageId = 0;
                                                       UnsubscribeWatcher();
                                                       GeneratePage(config.pages[pageId]);
                                                   } else {
                                                       pageNum = (((pageId - 1) % config.pages.length) + config.pages.length) % config.pages.length;
                                                       pageId = pageNum;
                                                       UnsubscribeWatcher();
                                                       if (activePage != undefined && activePage.parent != undefined) {
                                                           //update pageID
                                                           for (let i = 0; i < config.pages.length; i++) {
                                                               if (config.pages[i] == activePage.parent) {
                                                                   pageId = i;
                                                                   break;
                                                               }
                                                           }
                                                           GeneratePage(activePage.parent);
                                                       }
                                                       else {
                                                           GeneratePage(config.pages[pageId]);
                                                       }
                                                       break;
                                                   }
                                                   break;
                                               case 'bNext':
                                                   pageNum = (((pageId + 1) % config.pages.length) + config.pages.length) % config.pages.length;
                                                   pageId = pageNum;
                                                   UnsubscribeWatcher();
                                                   GeneratePage(config.pages[pageId]);
                                                   break;
                                               case 'bSubNext':
                                                   UnsubscribeWatcher();
                                                   GeneratePage(eval(activePage.next));
                                                   break;
                                               case 'bPrev':
                                                   pageNum = (((pageId - 1) % config.pages.length) + config.pages.length) % config.pages.length;
                                                   pageId = pageNum;
                                                   UnsubscribeWatcher();
                                                   if (activePage != undefined && activePage.parent != undefined) {
                                                       //update pageID
                                                       for (let i = 0; i < config.pages.length; i++) {
                                                           if (config.pages[i] == activePage.parent) {
                                                               pageId = i;
                                                               break;
                                                           }
                                                       }
                                                       GeneratePage(activePage.parent);
                                                   }
                                                   else {
                                                       GeneratePage(config.pages[pageId]);
                                                   }
                                                   break;
                                               case 'bSubPrev':          
                                                   UnsubscribeWatcher();
                                                   GeneratePage(eval(activePage.prev));
                                                   break;
                                               case 'bExit':
                                                   if (getState(NSPanel_Path + 'Config.Screensaver.screenSaverDoubleClick').val && words[2] == 'screensaver') {
                                                       if (words[4] >= 2) {
                                                           setIfExists(NSPanel_Path + 'ScreensaverInfo.popupNotifyHeading', '');
                                                           setIfExists(NSPanel_Path + 'ScreensaverInfo.popupNotifyText', '');
                                                           if (existsObject(NSPanel_Path + 'ScreensaverInfo.bExitPage') && getState(NSPanel_Path + 'ScreensaverInfo.bExitPage').val != null) {
                                                               pageId = getState(NSPanel_Path + 'ScreensaverInfo.bExitPage').val;
                                                               activePage = config.pages[pageId];
                                                               GeneratePage(activePage);
                                                           } else {
                                                               GeneratePage(activePage);
                                                           }
                                                       } else {
                                                           setIfExists(NSPanel_Path + 'ScreensaverInfo.popupNotifyHeading', '');
                                                           setIfExists(NSPanel_Path + 'ScreensaverInfo.popupNotifyText', '');
                                                           screensaverEnabled = true;
                                                           break;
                                                       }
                                                   } else {
                                                       if (Debug) {
                                                           console.log('bExit: ' + words[4] + ' - ' + pageId);
                                                       }
                                                       setIfExists(NSPanel_Path + 'ScreensaverInfo.popupNotifyHeading', '');
                                                       setIfExists(NSPanel_Path + 'ScreensaverInfo.popupNotifyText', '');
                                                       if (existsObject(NSPanel_Path + 'ScreensaverInfo.bExitPage') && getState(NSPanel_Path + 'ScreensaverInfo.bExitPage').val != null) {
                                                           pageId = getState(NSPanel_Path + 'ScreensaverInfo.bExitPage').val
                                                           activePage = config.pages[pageId];
                                                           GeneratePage(activePage);
                                                       } else {
                                                           GeneratePage(activePage);
                                                       }    
                                                   }
                                                   break;
                                               case 'bHome':
                                                   if (Debug) {
                                                       console.log('bExit: ' + words[4] + ' - ' + pageId);
                                                   }
                                                   UnsubscribeWatcher();
                                                   if (activePage.home != undefined) {
                                                       GeneratePage(eval(activePage.home));
                                                   } else {
                                                       GeneratePage(config.pages[0]);
                                                   }
                                                   break;
                                               case 'notifyAction':
                                                   if (words[4] == 'yes') {
                                                       setState(popupNotifyInternalName, <iobJS.State>{ val: words[2], ack: true });
                                                       setState(popupNotifyAction, <iobJS.State>{ val: true, ack: true });
                                                   } else if (words[4] == 'no') {
                                                       setState(popupNotifyInternalName, <iobJS.State>{ val: words[2], ack: true });
                                                       setState(popupNotifyAction, <iobJS.State>{ val: false, ack: true });
                                                   }
                                    
                                                   setIfExists(config.panelSendTopic, 'exitPopup');
                                    
                                                   break;
                                               case 'OnOff':
                                                   if (existsObject(id)) {
                                                       let action = false;
                                                       if (words[4] == '1')
                                                           action = true;
                                                       let o = getObject(id);
                                                       switch (o.common.role) {
                                                           case 'level.mode.fan':
                                                           case 'socket':
                                                           case 'light':
                                                               let pageItem = findPageItem(id);	
                                       						if(pageItem.monobutton != undefined && pageItem.monobutton == true){	
                                       							triggerButton(id + ".SET");
                                       						}	
                                       						else {	
                                       							setIfExists(id + '.SET', action);
                                       						}		
                                       						break;
                                                           case 'dimmer':
                                                               setIfExists(id + '.ON_SET', action) ? true : setIfExists(id + '.ON_ACTUAL', action);
                                                               break;
                                                           case 'ct':
                                                               setIfExists(id + '.ON', action);
                                                               break;
                                                           case 'rgb':
                                                           case 'rgbSingle':
                                                           case 'hue':
                                                               setIfExists(id + '.ON_ACTUAL', action);
                                                       }
                                                   }
                                                   break;
                                               case 'button':
                                                   if (existsObject(id)) {
                                                       let action = false;
                                                       if (words[4] == '1')
                                                           action = true;
                                                       let o = getObject(id);
                                                       switch (o.common.role) {
                                                           case 'lock':
                                                           case 'button':
                                                               toggleState(id + '.SET') ? true : toggleState(id + '.ON_SET');
                                                               break; 
                                                           case 'buttonSensor':
                                                               if (existsObject(id + '.ACTUAL')) {
                                                                   toggleState(id + '.ACTUAL');
                                                               }
                                                               break;
                                                           case 'socket':
                                                           case 'light':
                                                               // Änderung für Monobutton	
                                                               let pageItem = findPageItem(id);	
                                       						if(pageItem.monobutton != undefined && pageItem.monobutton == true){	
                                       							triggerButton(id + ".SET");
                                       						}	
                                       						else {	
                                       							toggleState(id + ".SET") ? true : toggleState(id + ".ON_SET");
                                       						}	
                                       						break;	
                                                           case 'dimmer':
                                                               toggleState(id + '.ON_SET') ? true : toggleState(id + '.ON_ACTUAL');
                                                               break;
                                                           case 'ct':
                                                               toggleState(id + '.ON');
                                                               break;
                                                           case 'rgb':
                                                           case 'rgbSingle':
                                                           case 'hue': // Armilar
                                                               toggleState(id + '.ON_ACTUAL');
                                                           case 'media':
                                                               if (tempid[1] == 'repeat') {
                                                                   let pageItemRepeat = findPageItem(id);
                                                                   let adapterInstanceRepeat = pageItemRepeat.adapterPlayerInstance;
                                                                   let adapterRepeat = adapterInstanceRepeat.split('.');
                                                                   let deviceAdapterRP = adapterRepeat[0];
                                    
                                                                   switch (deviceAdapterRP) {
                                                                       case 'spotify-premium':
                                                                           let stateSpotifyRepeat = getState(id + '.REPEAT').val
                                                                           if (stateSpotifyRepeat == 'off') {
                                                                               setIfExists(id + '.REPEAT', 'context');
                                                                           } else if (stateSpotifyRepeat == 'context') {
                                                                               setIfExists(id + '.REPEAT', 'track');
                                                                           } else if (stateSpotifyRepeat == 'track') {
                                                                               setIfExists(id + '.REPEAT', 'off');
                                                                           }
                                                                           break;
                                                                       case 'alexa2':
                                                                           try {
                                                                               if (getState(id + '.REPEAT').val == 'false') {
                                                                                   setIfExists(id + '.REPEAT', true);
                                                                               } else {
                                                                                   setIfExists(id + '.REPEAT', false);
                                                                               }
                                                                           } catch (err) {
                                                                               console.log('Repeat kann nicht verändert werden');
                                                                           }
                                                                           break;
                                                                       case 'volumio':
                                                                           request({ url:`${getState(adapterInstanceRepeat+'info.host').val}/api/commands/?cmd=repeat`, headers: {'User-Agent': 'ioBroker'} }, 
                                                                               async (error, response, result)=>{}); /* nothing todo @ error */
                                                                           break;
                                                                   }
                                                               }
                                                       }
                                                   }
                                                   break;
                                               case 'up':
                                                   setIfExists(id + '.OPEN', true);
                                                   break;
                                               case 'stop':
                                                   setIfExists(id + '.STOP', true);
                                                   break;
                                               case 'down':
                                                   setIfExists(id + '.CLOSE', true);
                                                   break;
                                               case 'positionSlider':
                                                   (function () { if (timeoutSlider) { clearTimeout(timeoutSlider); timeoutSlider = null; } })();
                                                   timeoutSlider = setTimeout(async function () {
                                                       setIfExists(id + '.SET', parseInt(words[4])) ? true : setIfExists(id + '.ACTUAL', parseInt(words[4]));
                                                   }, 250);
                                                   break;
                                               case 'tiltOpen':
                                                   setIfExists(id + '.TILT_OPEN', true);
                                                   break;
                                               case 'tiltStop':
                                                   setIfExists(id + '.TILT_STOP', true);
                                                   break;
                                               case 'tiltClose':
                                                   setIfExists(id + '.TILT_CLOSE', true);
                                                   break;
                                               case 'tiltSlider':
                                                   (function () { if (timeoutSlider) { clearTimeout(timeoutSlider); timeoutSlider = null; } })();
                                                   timeoutSlider = setTimeout(async function () {
                                                       setIfExists(id + '.TILT_SET', parseInt(words[4])) ? true : setIfExists(id + '.TILT_ACTUAL', parseInt(words[4]));
                                                   }, 250);
                                                   break;
                                               case 'brightnessSlider':
                                                   (function () { if (timeoutSlider) { clearTimeout(timeoutSlider); timeoutSlider = null; } })();
                                                   timeoutSlider = setTimeout(async function () {
                                                       if (existsObject(id)) {
                                                           let o = getObject(id);
                                                           let pageItem = findPageItem(id);
                                    
                                                           switch (o.common.role) {
                                                               case 'dimmer':
                                                                   if (pageItem.minValueBrightness != undefined && pageItem.maxValueBrightness != undefined) {
                                                                       let sliderPos = Math.trunc(scale(parseInt(words[4]), 0, 100, pageItem.maxValueBrightness, pageItem.minValueBrightness));
                                                                       setIfExists(id + '.SET', sliderPos) ? true : setIfExists(id + '.ACTUAL', sliderPos);
                                                                   } else {
                                                                       setIfExists(id + '.SET', parseInt(words[4])) ? true : setIfExists(id + '.ACTUAL', parseInt(words[4]));
                                                                   }
                                                                   break;
                                                               case 'rgb':
                                                               case 'ct':
                                                               case 'rgbSingle':
                                                               case 'hue':
                                                                   if (pageItem.minValueBrightness != undefined && pageItem.maxValueBrightness != undefined) {
                                                                       let sliderPos = Math.trunc(scale(parseInt(words[4]), 0, 100, pageItem.maxValueBrightness, pageItem.minValueBrightness));
                                                                       setIfExists(id + '.DIMMER', sliderPos);
                                                                   } else {
                                                                       setIfExists(id + '.DIMMER', parseInt(words[4]));
                                                                   }
                                                                   break;
                                                           }
                                                       }
                                                   }, 250);
                                                   break;
                                               case 'colorTempSlider': // Armilar - Slider tickt verkehrt - Hell = 0 / Dunkel = 100 -> Korrektur
                                                   (function () { if (timeoutSlider) { clearTimeout(timeoutSlider); timeoutSlider = null; } })();
                                                   timeoutSlider = setTimeout(async function () {
                                                       let pageItem = findPageItem(id);
                                                       if (pageItem.minValueColorTemp !== undefined && pageItem.maxValueColorTemp !== undefined) {
                                                           let colorTempK = Math.trunc(scale(parseInt(words[4]), 0, 100, pageItem.minValueColorTemp, pageItem.maxValueColorTemp));
                                                           setIfExists(id + '.TEMPERATURE', (colorTempK));
                                                       } else {
                                                           setIfExists(id + '.TEMPERATURE', 100 - words[4]);
                                                       }
                                                   }, 250);
                                                   break;
                                               case 'colorWheel':
                                                   let colorCoordinates = words[4].split('|');
                                                   let rgb = pos_to_color(colorCoordinates[0], colorCoordinates[1]);
                                                   if (Debug) {
                                                       console.log(rgb);
                                                   }
                                                   if (Debug) {
                                                       console.log(getHue(rgb.red, rgb.green, rgb.blue));
                                                   }
                                                   let o = getObject(id);
                                                   switch (o.common.role) {
                                                       case 'hue':
                                                           setIfExists(id + '.HUE', getHue(rgb.red, rgb.green, rgb.blue));
                                                           break;
                                                       case 'rgb':
                                                           setIfExists(id + '.RED', rgb.red);
                                                           setIfExists(id + '.GREEN', rgb.green);
                                                           setIfExists(id + '.BLUE', rgb.blue);
                                                           break;
                                                       case 'rgbSingle':
                                                           let pageItem = findPageItem(id);
                                                           if (pageItem.colormode == "xy") {
                                                               //Für z.B. Deconz XY
                                                               setIfExists(id + ".RGB", rgb_to_cie(rgb.red, rgb.green, rgb.blue));
                                                               if (Debug) {
                                                                   console.log(rgb_to_cie(rgb.red, rgb.green, rgb.blue));
                                                               }
                                                           }
                                                           else {
                                                               //Für RGB
                                                               setIfExists(id + ".RGB", ConvertRGBtoHex(rgb.red, rgb.green, rgb.blue));
                                                           }
                                                           break;
                                                   }
                                                   break;
                                               case 'tempUpd':
                                                   setIfExists(id + '.SET', parseInt(words[4]) / 10);
                                                   break;
                                               case 'media-back':
                                                   setIfExists(id + '.PREV', true);
                                                   break;
                                               case 'media-pause':
                                                   let pageItemTemp = findPageItem(id);
                                                   let adaInstanceSplit = pageItemTemp.adapterPlayerInstance.split('.');
                                                   if (adaInstanceSplit[0] == 'squeezeboxrpc') {
                                                       let stateVal = getState(pageItemTemp.adapterPlayerInstance + 'state').val;
                                                       if (stateVal == 0) {
                                                           setState(pageItemTemp.adapterPlayerInstance + 'state', 1);
                                                       } else if (stateVal == 1) {
                                                           setState(pageItemTemp.adapterPlayerInstance + 'state', 0);
                                                       } else if (stateVal == null) {
                                                           setState(pageItemTemp.adapterPlayerInstance + 'state', 1);
                                                       }
                                                   } else {
                                                       if (getState(id + '.STATE').val === true) {
                                                           setIfExists(id + '.PAUSE', true);
                                                       } else {
                                                           setIfExists(id + '.PLAY', true);
                                                       }
                                                   }
                                                   break;
                                               case 'media-next':
                                                   setIfExists(id + '.NEXT', true);
                                                   break;
                                               case 'media-shuffle':
                                                   if ((findPageItem(id).adapterPlayerInstance).startsWith("volumio")) { findPageItem(id).playList = []; break; } //Volumio: empty playlist $uha-20230103
                                                   if (getState(id + '.SHUFFLE').val == 'off') {
                                                       setIfExists(id + '.SHUFFLE', 'on');
                                                   } else {
                                                       setIfExists(id + '.SHUFFLE', 'off');
                                                   }
                                                   break;
                                               case 'volumeSlider':
                                                   setIfExists(id + '.VOLUME', parseInt(words[4]))
                                                   break;
                                               case 'mode-speakerlist':
                                                   let pageItem = findPageItem(id);
                                                   let adapterInstance = pageItem.adapterPlayerInstance;
                                                   let adapter = adapterInstance.split('.');
                                                   let deviceAdapter = adapter[0];
                                    
                                                   switch (deviceAdapter) {
                                                       case 'spotify-premium':
                                                           let strDevicePI = pageItem.speakerList[words[4]];
                                                           let strDeviceID = spotifyGetDeviceID(strDevicePI);
                                                           setState(adapterInstance + 'devices.' + strDeviceID + ".useForPlayback", true);
                                                           break;
                                                       case 'alexa2':
                                                           let i_list = Array.prototype.slice.apply($('[state.id="' + adapterInstance + 'Echo-Devices.*.Info.name"]'));
                                                           for (let i_index in i_list) {
                                                               let i = i_list[i_index];
                                                               if ((getState(i).val) === pageItem.speakerList[words[4]]) {
                                                                   console.log(getState(i).val + ' - ' + pageItem.speakerList[words[4]]);
                                                                   let deviceId = i;
                                                                   deviceId = deviceId.split('.');
                                                                   setIfExists(adapterInstance + 'Echo-Devices.' + pageItem.mediaDevice + '.Commands.textCommand', 'Schiebe meine Musik auf ' + pageItem.speakerList[words[4]]);
                                                                   pageItem.mediaDevice = deviceId[3];
                                                               } 
                                                           }
                                                           break;
                                                       case 'sonos':
                                                           break;
                                                       case 'chromecast':
                                                           break;
                                                   }
                                                   break;
                                               case 'mode-playlist':
                                                   let pageItemPL = findPageItem(id);
                                                   let adapterInstancePL = pageItemPL.adapterPlayerInstance;
                                                   let adapterPL = adapterInstancePL.split('.');
                                                   let deviceAdapterPL = adapterPL[0];
                                    
                                                   switch (deviceAdapterPL) {
                                                       case 'spotify-premium':
                                                           let strDevicePI = pageItemPL.playList[words[4]];
                                                           console.log(strDevicePI);
                                                           let playlistListString = (getState(adapterInstancePL + 'playlists.playlistListString').val).split(';');
                                                           let playlistListIds = (getState(adapterInstancePL + 'playlists.playlistListIds').val).split(';');
                                                           let playlistIndex = playlistListString.indexOf(strDevicePI);
                                                           setState(adapterInstancePL + 'playlists.playlistList', playlistListIds[playlistIndex]);
                                                           setTimeout(async function () {
                                                               globalTracklist = (function () { try {return JSON.parse(getState(adapterInstancePL + 'player.playlist.trackListArray').val);} catch(e) {return {};}})();
                                                           }, 2000);
                                                           break;
                                                       case 'alexa2':
                                                           let tempListItem = pageItemPL.playList[words[4]].split('.');
                                                           setState(adapterInstancePL + 'Echo-Devices.' + pageItemPL.mediaDevice + '.Music-Provider.' + tempListItem[0], tempListItem[1]);
                                                           break;
                                                       case 'volumio':
                                                           let strDevicePL = pageItemPL.playList[words[4]];
                                                           request({ url:`${getState(adapterInstancePL+'info.host').val}/api/commands/?cmd=playplaylist&name=${strDevicePL}`, headers: {'User-Agent': 'ioBroker'} }, 
                                                                     async (error, response, result)=>{}); /* nothing todo @ error */
                                                           break;
                                                   }
                                                   break;
                                               case 'mode-tracklist':
                                                   let pageItemTL = findPageItem(id);
                                                   let adapterInstanceTL = pageItemTL.adapterPlayerInstance;
                                                   let adapterTL = adapterInstanceTL.split('.')
                                                   let deviceAdapterTL = adapterTL[0];
                                    
                                                   switch (deviceAdapterTL) {
                                                       case 'spotify-premium':
                                                           let trackArray = (function () { try {return JSON.parse(getState(pageItemTL.adapterPlayerInstance + 'player.playlist.trackListArray').val);} catch(e) {return {};}})();
                                                           setState(adapterInstanceTL + 'player.trackId', getAttr(trackArray, words[4] + '.id'));
                                                           break;
                                                       case 'alexa2':
                                                           if (Debug) console.log('Aktuell hat alexa2 keine Tracklist');
                                                           break;
                                                       case 'volumio':
                                                           request({ url:`${getState(adapterInstanceTL+'info.host').val}/api/commands/?cmd=play&N=${words[4]}`, headers: {'User-Agent': 'ioBroker'} }, 
                                                               async (error, response, result)=>{}); /* nothing todo @ error */
                                                           break;
                                                   }
                                                   break;
                                               case 'mode-repeat':
                                                   let pageItemRP = findPageItem(id);
                                                   let adapterInstanceRP = pageItemRP.adapterPlayerInstance;
                                                   let adapterRP = adapterInstanceRP.split('.');
                                                   let deviceAdapterRP = adapterRP[0];
                                    
                                                   switch (deviceAdapterRP) {
                                                       case 'spotify-premium':
                                                           setIfExists(id + '.REPEAT', pageItemRP.repeatList[words[4]]);
                                                           break;
                                                       case 'alexa2':
                                                           break;
                                                   }
                                                   break;
                                               case 'mode-equalizer':
                                                   let pageItemEQ = findPageItem(id);
                                                   if (Debug) console.log(id);
                                                   let lastIndex = (id.split('.')).pop();
                                                   setState(NSPanel_Path + 'Media.Player.' + lastIndex + '.EQ.activeMode', pageItemEQ.equalizerList[words[4]]);
                                                   setTimeout(async function () {
                                                       GenerateDetailPage('popupInSel','equalizer', pageItemEQ);
                                                   }, 2000);
                                                   break;
                                               case 'mode-insel':
                                                   setIfExists(id + '.VALUE', parseInt(words[4]));
                                                   break;
                                               case 'media-OnOff':
                                                   let pageItemTem = findPageItem(id);
                                                   let adaInstanceSpli = pageItemTem.adapterPlayerInstance.split('.');
                                                   if (adaInstanceSpli[0] == 'squeezeboxrpc') {
                                                       let stateVal = getState(pageItemTem.adapterPlayerInstance + 'Power').val;
                                                       if (stateVal === 0) {
                                                           setState(pageItemTem.adapterPlayerInstance + 'Power', 1);
                                                           setIfExists(id + '.STOP', false);
                                                           setIfExists(id + '.STATE', 1);
                                                       } else {
                                                           setState(pageItemTem.adapterPlayerInstance + 'Power', 0);
                                                           setIfExists(id + '.STOP', true);
                                                           setIfExists(id + '.STATE', 0);
                                                       }
                                                   } else {
                                                       setIfExists(id + '.STOP', true);
                                                   }
                                                   break;
                                               case 'timer-start':
                                                   if (words[4] != undefined) {
                                                       let timer_panel = words[4].split(':');
                                                       setIfExists(id + '.ACTUAL', (parseInt(timer_panel[1]) * 60) + parseInt(timer_panel[2]));
                                                   }
                                                   setIfExists(id + '.STATE', 'active');
                                                   break;
                                               case 'timer-pause':
                                                   setIfExists(id + '.STATE', 'paused');
                                                   break;
                                               case 'timer-cancle':
                                                   setIfExists(id + '.STATE', 'idle');
                                                   setIfExists(id + '.ACTUAL', 0);
                                                   break;
                                               case 'timer-finish':
                                                   setIfExists(id + '.STATE', 'idle');
                                                   setIfExists(id + '.ACTUAL', 0);
                                                   break;
                                               case 'hvac_action':
                                                   if (words[4] == 'BOOT' || words[4] == 'PART' || words[4] == 'AUTT' || words[4] == 'MANT' || words[4] == 'VACT') {
                                    
                                                       switch (words[4]) {
                                                           case 'BOOT':
                                                               setIfExists(words[2] + '.' + 'BOOST', !getState(words[2] + '.' + 'BOOST').val);
                                                               break;
                                                           case 'PART':
                                                               setIfExists(words[2] + '.' + 'PARTY', !getState(words[2] + '.' + 'PARTY').val);
                                                               break;
                                                           case 'AUTT':
                                                               setIfExists(words[2] + '.' + 'AUTOMATIC', !getState(words[2] + '.' + 'AUTOMATIC').val);
                                                               break;
                                                           case 'MANT':
                                                               setIfExists(words[2] + '.' + 'MANUAL', !getState(words[2] + '.' + 'MANUAL').val);
                                                               break;
                                                           case 'VACT':
                                                               setIfExists(words[2] + '.' + 'VACATION', !getState(words[2] + '.' + 'VACATION').val);
                                                               break;
                                                       }
                                                       let modes = ['BOOT', 'PART', 'AUTT', 'MANT', 'VACT'];
                                                       let modesDP = ['BOOST', 'PARTY', 'AUTOMATIC', 'MANUAL', 'VACATION'];
                                                       for (let mode=0; mode < 5; mode++) {
                                                           if (words[4] != modes[mode]) {
                                                               setIfExists(words[2] + '.' + modesDP[mode], false);
                                                           }
                                                       }
                                                       GeneratePage(config.pages[pageId]);
                                                   } else {
                                                       let HVACMode = 0;
                                                       switch (words[4]) {
                                                           case 'POWER':
                                                               HVACMode = 0;
                                                               setIfExists(words[2] + '.' + words[4], !getState(words[2] + '.' + words[4]).val);
                                                               if (getState(words[2] + '.' + words[4]).val) {
                                                                   HVACMode = 1;
                                                               }
                                                               break;
                                                           case 'AUTO':
                                                               HVACMode = 1;
                                                               break;
                                                           case 'COOL':
                                                               HVACMode = 2;
                                                               break;
                                                           case 'HEAT':
                                                               HVACMode = 3;
                                                               break;
                                                           case 'ECO':
                                                               HVACMode = 4;
                                                               break;
                                                           case 'FAN':
                                                               HVACMode = 5;
                                                               break;
                                                           case 'DRY':
                                                               HVACMode = 6;
                                                               break;
                                                           case 'SWING':
                                                               HVACMode = getState(words[2] + '.MODE').val;
                                                               if (getState(words[2] + '.SWING').val == 0) {
                                                                   setIfExists(words[2] + '.SWING', 1);
                                                               } else {
                                                                   setIfExists(words[2] + '.' + 'SWING', 0);
                                                               }
                                                               break;
                                                       }
                                                       setIfExists(words[2] + '.' + 'MODE', HVACMode);
                                                       GeneratePage(config.pages[pageId]);
                                                   }
                                                   break;
                                               case 'mode-modus1':
                                                   let pageItemT1 = findPageItem(id);
                                                   setIfExists(id + '.' + pageItemT1.setThermoAlias[0], pageItemT1.popupThermoMode1[parseInt(words[4])]);
                                                   break;
                                               case 'mode-modus2':
                                                   let pageItemT2 = findPageItem(id);
                                                   setIfExists(id + '.' + pageItemT2.setThermoAlias[1], pageItemT2.popupThermoMode2[parseInt(words[4])]);
                                                   break;
                                               case 'mode-modus3':
                                                   let pageItemT3 = findPageItem(id);
                                                   setIfExists(id + '.' + pageItemT3.setThermoAlias[2], pageItemT3.popupThermoMode3[parseInt(words[4])]);
                                                   break;
                                               case 'number-set':
                                                   let nobj = getObject(id);
                                                   switch (nobj.common.role) {
                                                       case 'level.mode.fan':
                                                           (function () { if (timeoutSlider) { clearTimeout(timeoutSlider); timeoutSlider = null; } })();
                                                           timeoutSlider = setTimeout(async function () {
                                                               setIfExists(id + '.SPEED', parseInt(words[4]));
                                                           }, 250);
                                                           break;
                                                       default:    
                                                           (function () { if (timeoutSlider) { clearTimeout(timeoutSlider); timeoutSlider = null; } })();
                                                           timeoutSlider = setTimeout(async function () {
                                                               setIfExists(id + '.SET', parseInt(words[4])) ? true : setIfExists(id + '.ACTUAL', parseInt(words[4]));
                                                           }, 250);
                                                           break;
                                                   }
                                                   break;
                                               case 'mode-preset_modes':
                                                   setIfExists(id + '.MODE', parseInt(words[4]));
                                                   break; 
                                               case 'A1': // Alarm-Page Alarm 1 aktivieren
                                                   if (words[4] != '') {
                                                       setIfExists(id + '.TYPE', 'A1');
                                                       setIfExists(id + '.PIN', words[4]);
                                                       setIfExists(id + '.ACTUAL', 'arming');
                                                       setIfExists(id + '.PANEL', NSPanel_Path);
                                                   }
                                                   setTimeout(function(){
                                                       GeneratePage(activePage);
                                                   },250);
                                                   break;
                                               case 'A2': // Alarm-Page Alarm 2 aktivieren
                                                   if (words[4] != '') {
                                                       setIfExists(id + '.TYPE', 'A2');
                                                       setIfExists(id + '.PIN', words[4]);
                                                       setIfExists(id + '.ACTUAL', 'arming');
                                                       setIfExists(id + '.PANEL', NSPanel_Path);
                                                   }
                                                   setTimeout(function(){
                                                       GeneratePage(activePage);
                                                   },250);
                                                   break;
                                               case 'A3': // Alarm-Page Alarm 3 aktivieren
                                                   if (words[4] != '') {
                                                       setIfExists(id + '.TYPE', 'A3');
                                                       setIfExists(id + '.PIN', words[4]);
                                                       setIfExists(id + '.ACTUAL', 'arming');
                                                       setIfExists(id + '.PANEL', NSPanel_Path);
                                                   }
                                                   setTimeout(function(){
                                                       GeneratePage(activePage);
                                                   },250);
                                                   break;
                                               case 'A4': // Alarm-Page Alarm 4 aktivieren
                                                   if (words[4] != '') {
                                                       setIfExists(id + '.TYPE', 'A4');
                                                       setIfExists(id + '.PIN', words[4]);
                                                       setIfExists(id + '.ACTUAL', 'arming');
                                                       setIfExists(id + '.PANEL', NSPanel_Path);
                                                   }
                                                   setTimeout(function(){
                                                       GeneratePage(activePage);
                                                   },250);
                                                   break;
                                               case 'D1': // Alarm-Page Alarm Deaktivieren
                                                   if (Debug) {
                                                       console.log('D1: ' + getState(id + '.PIN').val);
                                                   }
                                                   if (Debug) {
                                                       console.log(words[4]);
                                                   }
                                                   if (words[4] != '') {
                                                       if (getState(id + '.PIN').val == words[4]) {
                                                           setIfExists(id + '.PIN', '0000');
                                                           setIfExists(id + '.TYPE', 'D1');
                                                           setIfExists(id + '.ACTUAL', 'pending');
                                                           setIfExists(id + '.PIN_Failed', 0);
                                                       } else {
                                                           setIfExists(id + '.PIN_Failed', getState(id + '.PIN_Failed').val + 1);
                                                           setIfExists(id + '.ACTUAL', 'triggered');
                                                       }
                                                       setIfExists(id + '.PANEL', NSPanel_Path);
                                                       setTimeout(function(){
                                                           GeneratePage(activePage);
                                                       },500);
                                                   }
                                                   break;
                                               default:
                                                   break;
                                           }
                                       } catch (err) {
                                           console.log('function HandleButtonEvent: ' + err.message);
                                       }
                                    }
                                    

                                    EDIT: Hotfix ist jetzt auch auf Github verfügbar v3.9.0.2

                                    Armilar 1 Reply Last reply Reply Quote 0
                                    • Armilar
                                      Armilar Most Active Forum Testing @TT-Tom last edited by Armilar

                                      @tt-tom @wendy2702

                                      Es gab tatsächlich 2 Lücken, die den Screensaver zum anhalten gebracht haben.

                                      1. Unbekannte Befehle, die in der HMI ausgelöst wurden, jedoch im Script nicht behandelt wurden
                                      2. Ein Event hat den Screensaver angehalten, für den Fall, das eine Notify aufgeschaltet wird und die Screensaver-Updates die Notify nicht überschreiben. Das passiert auch immer noch, jedoch wird das bei einem einfachen Druck auf den Screensaver jetzt verhindert.

                                      Sollte jetzt funktionieren...

                                      wendy2702 1 Reply Last reply Reply Quote 0
                                      • wendy2702
                                        wendy2702 @Armilar last edited by wendy2702

                                        @armilar @TT-Tom

                                        Danke.

                                        Werde ich morgen testen

                                        EDIT: Der Hotfix funktioniert. Danke für die schnelle Lösung

                                        1 Reply Last reply Reply Quote 0
                                        • D
                                          Dieter Kurz last edited by

                                          Hallo zusammen,
                                          ich habe ein Panel mit 3.6.0 erfolgreich am laufen, zumindest mit dem was ich brauche 😉
                                          Nun habe ich ein zweites Panel und möchte dies mit der aktuellen Version installieren.
                                          Können dann beide parallel betrieben werden, oder bringt das alles durcheinander?
                                          Welche Vorgehensweise würdet ihr mir empfehlen?
                                          Freue mich auf Tipps und Anregungen ....

                                          Dieter

                                          Armilar T 2 Replies Last reply Reply Quote 0
                                          • Armilar
                                            Armilar Most Active Forum Testing @Dieter Kurz last edited by Armilar

                                            @dieter-kurz

                                            Im Script gibt es einen Pfad für jedes Panel:

                                            const NSPanel_Path = '0_userdata.0.NSPanel.2.'; // Anpassen an das jeweilige NSPanel

                                            Die MQTT-Parameter müssen natürlich auch auf das neue Panel angepasst werden.

                                            panelRecvTopic: 'mqtt.0.SmartHome.NSPanel_2.tele.RESULT',       // anpassen
                                            panelSendTopic: 'mqtt.0.SmartHome.NSPanel_2.cmnd.CustomSend',   // anpassen
                                            

                                            Das wäre alles...

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            805
                                            Online

                                            31.6k
                                            Users

                                            79.4k
                                            Topics

                                            1.3m
                                            Posts

                                            lovelace ui nspanel sonoff
                                            260
                                            7128
                                            4289138
                                            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