Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
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
    16
    1
    1.0k

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.0k

Script optimieren - Frage an Experten mit einem Beispiel

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
9 Beiträge 4 Kommentatoren 1.6k Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • etvE Offline
    etvE Offline
    etv
    schrieb am zuletzt editiert von
    #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 Antwort Letzte Antwort
    0
    • paul53P Offline
      paul53P Offline
      paul53
      schrieb am zuletzt editiert von
      #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 Antwort Letzte Antwort
      0
      • P Offline
        P Offline
        pix
        schrieb am zuletzt editiert von
        #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 Antwort Letzte Antwort
        0
        • etvE Offline
          etvE Offline
          etv
          schrieb am zuletzt editiert von
          #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 Antwort Letzte Antwort
          0
          • paul53P Offline
            paul53P Offline
            paul53
            schrieb am zuletzt editiert von
            #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 Antwort Letzte Antwort
            0
            • BluefoxB Offline
              BluefoxB Offline
              Bluefox
              schrieb am zuletzt editiert von
              #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 Antwort Letzte Antwort
              0
              • paul53P Offline
                paul53P Offline
                paul53
                schrieb am zuletzt editiert von
                #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 Antwort Letzte Antwort
                0
                • BluefoxB Offline
                  BluefoxB Offline
                  Bluefox
                  schrieb am zuletzt editiert von
                  #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 Antwort Letzte Antwort
                  0
                  • etvE Offline
                    etvE Offline
                    etv
                    schrieb am zuletzt editiert von
                    #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 Antwort Letzte Antwort
                    0
                    Antworten
                    • In einem neuen Thema antworten
                    Anmelden zum Antworten
                    • Älteste zuerst
                    • Neuste zuerst
                    • Meiste Stimmen


                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    738

                    Online

                    32.6k

                    Benutzer

                    82.0k

                    Themen

                    1.3m

                    Beiträge
                    Community
                    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                    ioBroker Community 2014-2025
                    logo
                    • Anmelden

                    • Du hast noch kein Konto? Registrieren

                    • Anmelden oder registrieren, um zu suchen
                    • Erster Beitrag
                      Letzter Beitrag
                    0
                    • Home
                    • Aktuell
                    • Tags
                    • Ungelesen 0
                    • Kategorien
                    • Unreplied
                    • Beliebt
                    • GitHub
                    • Docu
                    • Hilfe