Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Script optimieren - Frage an Experten mit einem Beispiel

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Script optimieren - Frage an Experten mit einem Beispiel

    This topic has been deleted. Only users with topic management privileges can see it.
    • etv
      etv last edited by

      Liebe Script Experten,

      nach ein paar Tagen "Eingewöhnung" in ioBroker hab ich nun sehr viel weiter gebracht, dashUI und ccu.io wird heute noch abgedreht, da ist alles portiert UND die ersten meiner Scripte aus der CCU sind nun endlich unter ioBroker funktionstüchtig!

      ABER - anbei mal ein Beispiel Script, dass von mir sicher zu umständlich gelöst wurde - würde mich freuen, wenn der eine oder andere da seinen Senf dazu gibt und ich ein bisschen was lernen kann.

      Zum Script:

      Das Script prüft auf Änderung von sechs JavaScript Variablen und soll wenn nur eine davon den Wert 6 enthält eine Variable Klima.Alarm auf true setzen. Ist keiner der überprüften Werte eine 6, dann soll der Alarm wieder gelöscht werden.

      Der Hintergrund ist, dass ich mir in VIS einen Button einfärbe sobald ein Klimaalarm aktiv ist um so auf der Hauptseite in VIS einen Hinweis zu bekommen, die Klimawerte zu checken.

      Im Hintergrund werkelt ein Check, ob in einem Raum gelüftet werden sollte (weil zu warm oder zu feucht…).

      on ({id: "javascript.0.Klima.BD.open_color", change: "ne"}, function () {
      
          // wenn dringend Lüften, dann Klimaalarm setzen
          if ("javascript.0.Klima.BD.open_color" == 6) { setState("javascript.0.Klima.Alarm", true)}
      
          // wenn nicht, dann alle anderen Kanäle checken und wenn geht, Alarm löschen
          else {
              if (("javascript.0.Klima.BR.open_color" < 6) && ("javascript.0.Klima.KZ.open_color" < 6) && ("javascript.0.Klima.SZ.open_color" < 6) && ("javascript.0.Klima.WC.open_color" < 6) && ("javascript.0.Klima.WZ.open_color" < 6)) {
              setState("javascript.0.Klima.Alarm", false);
              }
          }
      });
      
      on ({id: "javascript.0.Klima.BR.open_color", change: "ne"}, function () {
      
          // wenn dringend Lüften, dann Klimaalarm setzen
          if ("javascript.0.Klima.BR.open_color" == 6) { setState("javascript.0.Klima.Alarm", true)}
      
          // wenn nicht, dann alle anderen Kanäle checken und wenn geht, Alarm löschen
          else {
              if (("javascript.0.Klima.BD.open_color" < 6) && ("javascript.0.Klima.KZ.open_color" < 6) && ("javascript.0.Klima.SZ.open_color" < 6) && ("javascript.0.Klima.WC.open_color" < 6) && ("javascript.0.Klima.WZ.open_color" < 6)) {
              setState("javascript.0.Klima.Alarm", false);
              }
          }
      });
      
      on ({id: "javascript.0.Klima.KZ.open_color", change: "ne"}, function () {
      
          // wenn dringend Lüften, dann Klimaalarm setzen
          if ("javascript.0.Klima.KZ.open_color" == 6) { setState("javascript.0.Klima.Alarm", true)}
      
          // wenn nicht, dann alle anderen Kanäle checken und wenn geht, Alarm löschen
          else {
              if (("javascript.0.Klima.BD.open_color" < 6) && ("javascript.0.Klima.BR.open_color" < 6) && ("javascript.0.Klima.SZ.open_color" < 6) && ("javascript.0.Klima.WC.open_color" < 6) && ("javascript.0.Klima.WZ.open_color" < 6)) {
              setState("javascript.0.Klima.Alarm", false);
              }
          }
      });
      
      on ({id: "javascript.0.Klima.SZ.open_color", change: "ne"}, function () {
      
          // wenn dringend Lüften, dann Klimaalarm setzen
          if ("javascript.0.Klima.SZ.open_color" == 6) { setState("javascript.0.Klima.Alarm", true)}
      
          // wenn nicht, dann alle anderen Kanäle checken und wenn geht, Alarm löschen
          else {
              if (("javascript.0.Klima.BD.open_color" < 6) && ("javascript.0.Klima.BR.open_color" < 6) && ("javascript.0.Klima.KZ.open_color" < 6) && ("javascript.0.Klima.WC.open_color" < 6) && ("javascript.0.Klima.WZ.open_color" < 6)) {
              setState("javascript.0.Klima.Alarm", false);
              }
          }
      });
      
      on ({id: "javascript.0.Klima.WZ.open_color", change: "ne"}, function () {
      
          // wenn dringend Lüften, dann Klimaalarm setzen
          if ("javascript.0.Klima.WZ.open_color" == 6) { setState("javascript.0.Klima.Alarm", true)}
      
          // wenn nicht, dann alle anderen Kanäle checken und wenn geht, Alarm löschen
          else {
              if (("javascript.0.Klima.BD.open_color" < 6) && ("javascript.0.Klima.BR.open_color" < 6) && ("javascript.0.Klima.KZ.open_color" < 6) && ("javascript.0.Klima.WC.open_color" < 6) && ("javascript.0.Klima.SZ.open_color" < 6)) {
              setState("javascript.0.Klima.Alarm", false);
              }
          }
      });
      
      on ({id: "javascript.0.Klima.WC.open_color", change: "ne"}, function () {
      
          // wenn dringend Lüften, dann Klimaalarm setzen
          if ("javascript.0.Klima.WC.open_color" == 6) { setState("javascript.0.Klima.Alarm", true)}
      
          // wenn nicht, dann alle anderen Kanäle checken und wenn geht, Alarm löschen
          else {
              if (("javascript.0.Klima.BD.open_color" < 6) && ("javascript.0.Klima.BR.open_color" < 6) && ("javascript.0.Klima.KZ.open_color" < 6) && ("javascript.0.Klima.SZ.open_color" < 6) && ("javascript.0.Klima.WZ.open_color" < 6)) {
              setState("javascript.0.Klima.Alarm", false);
              }
          }
      });
      
      

      Danke vorab für Tipps :idea:

      Grüße

      etv

      1 Reply Last reply Reply Quote 0
      • paul53
        paul53 last edited by

        Vorschlag:

        var idBD = "javascript.0.Klima.BD.open_color";
        var idBR = "javascript.0.Klima.BR.open_color";
        var idKZ = "javascript.0.Klima.KZ.open_color";
        var idSZ = "javascript.0.Klima.SZ.open_color";
        var idWZ = "javascript.0.Klima.WZ.open_color";
        var idWC = "javascript.0.Klima.WC.open_color";
        
        var ocBD = getState(idBD).val;
        var ocBR = getState(idBR).val;
        var ocKZ = getState(idKZ).val;
        var ocSZ = getState(idSZ).val;
        var ocWZ = getState(idWZ).val;
        var ocWC = getState(idWC).val;
        
        function setalarm() {
        	if(ocBD == 6 || ocBR == 6 || ocKZ == 6 || ocSZ == 6 || ocWZ == 6 || ocWC == 6) {
        		setState("javascript.0.Klima.Alarm", true);
        		}
        	else {setState("javascript.0.Klima.Alarm", false);}
        }
        
        on(idBD, function(dp) {
        	ocBD = dp.newState.val;
        	setalarm();
        });
        on(idBR, function(dp) {
        	ocBR = dp.newState.val;
        	setalarm();
        });
        on(idKZ, function(dp) {
        	ocKZ = dp.newState.val;
        	setalarm();
        });
        on(idSZ, function(dp) {
        	ocSZ = dp.newState.val;
        	setalarm();
        });
        on(idWZ, function(dp) {
        	ocWZ = dp.newState.val;
        	setalarm();
        });
        on(idWC, function(dp) {
        	ocWC = dp.newState.val;
        	setalarm();
        });
        
        setalarm();  // bei Scriptstart
        
        
        1 Reply Last reply Reply Quote 0
        • P
          pix last edited by

          Hallo,

          sehe gerade, da war paul53 schneller, aber ich zeig mal trotzdem (ungeprüften) meinen Vorschlag:

          function sechs_pruefen () {
              var br = getState("javascript.0.Klima.BR.open_color").val,
                  bd = getState("javascript.0.Klima.BR.open_color").val,
                  kz = getState("javascript.0.Klima.KZ.open_color").val,
                  sz = getState("javascript.0.Klima.SZ.open_color").val,
                  wz = getState("javascript.0.Klima.WZ.open_color").val,
                  wc = getState("javascript.0.Klima.WC.open_color").val;
          
              var alarm = false;
              var alarm_br = (br > 5) ? true : false; // wenn br = 6 dann true, sonst false
              var alarm_bd = (bd > 5) ? true : false;
              var alarm_kz = (kz > 5) ? true : false;
              var alarm_sz = (sz > 5) ? true : false;
              var alarm_wz = (wz > 5) ? true : false;
              var alarm_wc = (wc > 5) ? true : false;
          
              if ( (!alarm_br) && (!alarm_bd) && (!alarm_kz) && (!alarm_sz) && (!alarm_wz) && (!alarm_wc) ) { // wenn alle false sind
                  alarm = false;
              } else {
                  alarm = true;
              }
              setState("javascript.0.Klima.Alarm", alarm);
          }
          
          on ({id: "javascript.0.Klima.BD.open_color", change: "ne"}, function () {
              sechs_pruefen();
          });
          
          on ({id: "javascript.0.Klima.BR.open_color", change: "ne"}, function () {
              sechs_pruefen();
          });
          
          on ({id: "javascript.0.Klima.KZ.open_color", change: "ne"}, function () {
              sechs_pruefen();
          });
          
          on ({id: "javascript.0.Klima.SZ.open_color", change: "ne"}, function () {
              sechs_pruefen();
          });
          
          on ({id: "javascript.0.Klima.WZ.open_color", change: "ne"}, function () {
              sechs_pruefen();
          });
          
          on ({id: "javascript.0.Klima.WC.open_color", change: "ne"}, function () {
              sechs_pruefen();
          });
          

          Gruß,

          Pix
          6443_13.jpg

          1 Reply Last reply Reply Quote 0
          • etv
            etv last edited by

            wow…OK, ich hab noch viel zu lernen 😄

            Danke euch für die Vereinfachungen - werd' beide Versionen ausprobieren und meine Schlüsse daraus ziehen!!

            Grüße

            etv
            6443_14.jpg

            1 Reply Last reply Reply Quote 0
            • paul53
              paul53 last edited by

              @Pix: getState(id).val macht eine Datenbankabfrage. Bei jeder Änderung einer der 6 Variablen erfolgen 6 Datenbankabfragen !

              1 Reply Last reply Reply Quote 0
              • Bluefox
                Bluefox last edited by

                @paul53:

                @Pix: getState(id).val macht eine Datenbankabfrage. Bei jeder Änderung einer der 6 Variablen erfolgen 6 Datenbankabfragen ! `
                In Wirklichkeit, getState liest die Daten aus dem Array und nicht aus dem DB. Also getState ist fast genauso schnell wie deine Lösung.

                https://github.com/ioBroker/ioBroker.ja … t.js#L1325

                1 Reply Last reply Reply Quote 0
                • paul53
                  paul53 last edited by

                  @Bluefox:

                  getState liest die Daten aus dem Array und nicht aus dem DB `
                  Danke, wieder was dazu gelernt. Das bedeutet aber im Umkehrschluss, dass bei einer Aktualisierung der Werte diese sowohl im Array als auch in der DB aktualisiert werden ?

                  1 Reply Last reply Reply Quote 0
                  • Bluefox
                    Bluefox last edited by

                    @paul53:

                    @Bluefox:

                    getState liest die Daten aus dem Array und nicht aus dem DB Danke, wieder was dazu gelernt. Das bedeutet aber im Umkehrschluss, dass bei einer Aktualisierung der Werte diese sowohl im Array als auch in der DB aktualisiert werden ?
                    Ja. Javascript Adpater hält eine Kopie von allen States im Bauch(Array), damit die Skripts bequem direkt auf die Werte zugreifen können. Datenbank konnte auf anderem Rechner sein.
                    4733_id_hm-rega_0.png

                    1 Reply Last reply Reply Quote 0
                    • etv
                      etv last edited by

                      …danke nochmal an paul53 und pix für ihre genialen Beispiele!

                      Hab beide Versionen ausprobiert - sie funktionieren!

                      Im Einsatz hab ich nun die Version von paul53, weil's noch einen Tick kürzer ist....

                      Beide Scripte haben sehr interessanten code drinnen, der mir bei meinen weiteren Projekte sicher weiter helfen wird!

                      Grüße

                      etv

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

                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      944
                      Online

                      31.7k
                      Users

                      79.7k
                      Topics

                      1.3m
                      Posts

                      4
                      9
                      1526
                      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