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

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Script optimieren - Frage an Experten mit einem Beispiel

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    3.5k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.1k

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.5k

Script optimieren - Frage an Experten mit einem Beispiel

Scheduled Pinned Locked Moved Skripten / Logik
9 Posts 4 Posters 1.6k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • etvE Offline
    etvE Offline
    etv
    wrote on last edited by
    #1

    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

    …ist schon sehr lange begeisterter ioBroker Nutzer! 1x zu Hause und 1x auf der Alm. ioBroker ist das 'Hirn' des Smarthome und steuert HomeMatic und Shellys, loggt was so passiert, zeigt es auf Tabletts schön an und ermöglicht mir via Cloud Adapter den Fernzugriff...

    1 Reply Last reply
    0
    • paul53P Offline
      paul53P Offline
      paul53
      wrote on last edited by
      #2

      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
      
      

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

      1 Reply Last reply
      0
      • P Offline
        P Offline
        pix
        wrote on last edited by
        #3

        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

        ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

        1 Reply Last reply
        0
        • etvE Offline
          etvE Offline
          etv
          wrote on last edited by
          #4

          wow…OK, ich hab noch viel zu lernen :D

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

          Grüße

          etv
          6443_14.jpg

          …ist schon sehr lange begeisterter ioBroker Nutzer! 1x zu Hause und 1x auf der Alm. ioBroker ist das 'Hirn' des Smarthome und steuert HomeMatic und Shellys, loggt was so passiert, zeigt es auf Tabletts schön an und ermöglicht mir via Cloud Adapter den Fernzugriff...

          1 Reply Last reply
          0
          • paul53P Offline
            paul53P Offline
            paul53
            wrote on last edited by
            #5

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

            Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
            Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

            1 Reply Last reply
            0
            • BluefoxB Offline
              BluefoxB Offline
              Bluefox
              wrote on last edited by
              #6

              @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
              0
              • paul53P Offline
                paul53P Offline
                paul53
                wrote on last edited by
                #7

                @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 ?

                Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                1 Reply Last reply
                0
                • BluefoxB Offline
                  BluefoxB Offline
                  Bluefox
                  wrote on last edited by
                  #8

                  @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
                  0
                  • etvE Offline
                    etvE Offline
                    etv
                    wrote on last edited by
                    #9

                    …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

                    …ist schon sehr lange begeisterter ioBroker Nutzer! 1x zu Hause und 1x auf der Alm. ioBroker ist das 'Hirn' des Smarthome und steuert HomeMatic und Shellys, loggt was so passiert, zeigt es auf Tabletts schön an und ermöglicht mir via Cloud Adapter den Fernzugriff...

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


                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    352

                    Online

                    32.7k

                    Users

                    82.4k

                    Topics

                    1.3m

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

                    • Don't have an account? Register

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