Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Licht Script zählen Shellys hinzufügen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Licht Script zählen Shellys hinzufügen

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

      Guten Tag,

      ich benutze seit längerem das Licht Script zählen von diesem Topic
      https://forum.iobroker.net/topic/5369/gelöst-lichter-zählen-script-läuft-nicht/113

      Ich habe mir nun, auch der Preisfrage wegen, zusätzlich Shelly´s als Lichtschalter verbaut. Gerne würde ich diese Schalter auch mit dem Script abfragen. Nur habe ich von dieser Sprache keine Ahnung.

      Wer könnte das Script um die Shelly´s erweitern? Der Datenpunkt müsste folgender sein:
      8d11c43a-a6c2-455d-9344-d42c3fe7df00-image.png

      Dieses Script ist bei mir im Einsatz - entnommen aus verlinktem Topic:

      /* Status Zahl Lichter
      
      zählt die Lichter in allen Räumen und meldet die Eingeschalteten namentlich
      Daten kommen vom Gewerk "Licht"
      */
      var logging = true;
      
      var idAnzahlEin = 'javascript.0.Status.Lichter.Anzahl_ein',
            idAnzahl = 'javascript.0.Status.Lichter.Anzahl',
            idText = 'javascript.0.Status.Lichter.Text',
            idRaum = 'javascript.0.Status.Lichter.Raum', // <---- NEU
            idAnsage = 'javascript.0.Status.Lichter.Ansage';
      
      // Ab hier nix mehr ändern
      createState(idAnzahl, { // wenn benötigt: Anzahl der vorhandenen Lichter
          type: 'number',
          name: 'Anzahl aller Lichter',
          min: 0,
          def: 0,
          role: 'value'
      });
      createState(idAnzahlEin, { // Anzahl der Lichter, die auf sind als Variable unter Javascript.0 anlegen
          type: 'number',
          name: 'Anzahl der eingeschalteten Lichter',
          min: 0,
          def: 0,
          role: 'value'
      });
      createState(idText, { // Anzahl der brennenden Lichter und deren Namen als Variable unter Javascript.0 anlegen
          type: 'string',
          name: 'Eingeschaltete Lichter',
          desc: 'Namen der eingeschalteten Lichter',
          def: ' ',
          role: 'value'
      });
      createState(idAnsage, {
          type: 'string',
          name: 'Eingeschaltete Lichter (Ansage)',
          desc: 'Namen der eingeschalteten Lichter (für Ansage aufbereitet)',
          def: ' ',
          role: 'value'
      });
      createState(idRaum, { // Räume, in denen Lichter brennen // <---- NEU
          type: 'string',
          name: 'Räume mit eingeschalteten Lichter',
          desc: 'Namen der Räume, in denen Lichter eingeschaltet sind',
          def: ' ',
          role: 'value'
      });
      
      // HM Schalter, HM Dimmer und Hue Schalter im Gewerk Licht
      const hmSTATE = $('channel[state.id=*.STATE](functions=Licht)');
      const hmLEVEL = $('channel[state.id=*.LEVEL](functions=Licht)');
      const hueon   = $('state[id=*.on](functions=Licht)');
      
      var anzahlLichterAn,
          anzahlLichter,
          textLichterAn,
          textRaum;
      
      function checkLicht(id, vorn, hinten) {
          var name = getObject(id).common.name;
          var devicename = name.substring(vorn, name.indexOf(hinten)); //Zeichen vorn, State hinten aus Text entfernen
          var raum = getObject(id, "rooms").enumNames[0]; 
          if (getState(id).val) { // wenn Zustand != false / 0, dann wird die Anzahl der Lichter hochgezählt
              ++anzahlLichterAn;
              textLichterAn.push(devicename); // Zu Array hinzufügen
              if(textRaum.indexOf(raum) == -1) textRaum.push(raum); // zu Array hinzu, wenn noch nicht vorhanden
          }
          ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status
      }
      
      function checkDevices() {
          // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht auf 0
          anzahlLichterAn = 0;
          anzahlLichter = 0;
          textLichterAn = [];
          textRaum = [];
          hmSTATE.each(function(id, i) { // Schleife für jedes gefundenen Element *.STATE im Gewerk Licht
      	    checkLicht(id, 0, '.STATE');
          });
      
          hueon.each(function(id, i) { // Schleife für jedes gefundenen Element *.on im Gewerk Licht
      	    checkLicht(id, 12, '.on');
          });
      
          hmLEVEL.each(function(id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht
      	    checkLicht(id, 0, '.LEVEL');
          });
      
          // Array mit Lichternamen sortieren
          textLichterAn.sort();
          textRaum.sort(); // <---- NEU
          // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben
          if (logging) log("Text: " + textLichterAn);
          if (logging) log("Anzahl Lichter: " + anzahlLichter + " # davon Lichter an: " + anzahlLichterAn);
          // die ermittelten Werte werden als javascript.0\. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
          setState(idText, textLichterAn.join(', ')); // Schreibt die aktuelle Namen der eingeschalteten Lichter
          // setState(idText, textLichterAn.join(', ')); // Schreibt die aktuelle Namen der eingeschalteten Lichter
          setState(idAnzahlEin, textLichterAn.length); // Schreibt die aktuelle Anzahl der eingeschalteten Lichter
          setState(idAnzahl, anzahlLichter); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Licht
          // setState(idRaum, textRaum.join(', ')); // Räume, in denen Licht brennt // <---- NEU
          setState(idRaum, textRaum.join(', ')); // Räume, in denen Licht brennt // <---- NEU
      }
      // Trigger
      hmSTATE.on(function(obj) { // bei Zustandänderung *.STATE im Gewerk Licht
          if (logging) log('Auslösender Schalter: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
          checkDevices();
      });
      hueon.on(function(obj) { // bei Zustandänderung *.on von HUE Lampen im Gewerk Licht
          if (logging) log('Auslösende HUE: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
          checkDevices();
      });
      hmLEVEL.on(function(obj) { // bei Zustandänderung *.LEVEL im Gewerk Licht
          if (logging) log('Auslösender Dimmer: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
          checkDevices();
      });
      
      // Skriptstart
      setTimeout(function() {
          if (logging) log('Auslöser Skriptstart');
          checkDevices();
      }, 500);
      
      // Aufbereitung für Ansage
      function strip_tags(data) {
          var rueckgabe = data.replace(/( |<([^>]+)>)/ig, " ");
          return (rueckgabe);
      }
      
      on(idText, function(obj) {
          var text = obj.state.val;
          text = (getState(idAnzahl).val > 0) ? 'Lichter eingeschaltet: ' + strip_tags(text) : 'Alle Lichter sind ausgeschaltet';
          setState(idAnsage, text);
      });
      

      Für die Mühe danke ich schonmal im Voraus 🙂

      Gruß
      Torsten

      PS: Sollte ich mein Thema in der Forensuche übersehen haben reicht auch ein Hinweis auf den entsprechenden Eintrag

      crunchip 1 Reply Last reply Reply Quote 0
      • crunchip
        crunchip Forum Testing Most Active @Torsten G. last edited by

        @Torsten-G kann selbst kein Javascript.
        Ich verwende ein anderes script und hab es für mich angepasst, unter anderem , für sonoff, shelly, Mi-light, Tuya, Milight-Smart-Light
        du benötigst für shelly eigentlich

        $('state[id=*.Switch](functions="Licht")'); // Shelly
        

        dein Script ruft ab

        $('channel[state.id=*.STATE](functions=Licht)');
        

        falls du es testen möchtest, bei mir ist funktions="licht" kleingeschrieben, müsstest Zeile 64-70, ändern in "Licht"
        hier das Script

        /* Status Zahl Lichter
        
        zählt die Lichter in allen Räumen und meldet die Eingeschalteten namentlich
        Daten kommen vom Gewerk "licht"
        
        erstellt: 17.06.2015 nach diesem Vorbild: viewtopic.php?f=21&t=869&sid=f9ba5657489ff431a1990884f90779c1#p6564
        23.06.2015 globale Variablendefinition zählen_Lichter.textLichterAn fehlte und wurde hinzugefügt
        Log Ausgabe auskommentiert
        05.08.2015 STATE aus der Ausgabe entfernt nach Idee von stephan61 http://forum.iobroker.org/viewtopic.php ... t=20#p9267
        24.03.2016 keine Anzeigen von virtuellen Kanälen mehr (in Abhängigkeit der Abfrage des Namens)
        06.05.2016 Datenpunkt für Ansagen zugefügt
        02.07.2016 abgeschaltet, da Fehler
        03.07.2016 Zähl-Funktion getrennt nach Schalter und Dimmer
        search statt indexOf und RegEx für Suche nach Virtuellen Kanälen
        27.11.2016 Verschoben in Status
        Code optimiert
        23.12.2016 Räume eingebaut
        */
        var logging = true;
        
        var idAnzahlEin = 'javascript.0.Status.Lichter.Anzahl_ein',
        idAnzahl = 'javascript.0.Status.Lichter.Anzahl',
        idText = 'javascript.0.Status.Lichter.Text',
        idRaum = 'javascript.0.Status.Lichter.Raum', // <---- NEU
        idAnsage = 'javascript.0.Status.Lichter.Ansage';
        
        // Ab hier nix mehr ändern
        createState(idAnzahl, { // wenn benötigt: Anzahl der vorhandenen Lichter
        type: 'number',
        name: 'Anzahl aller Lichter',
        min: 0,
        def: 0,
        role: 'value'
        });
        createState(idAnzahlEin, { // Anzahl der Lichter, die auf sind als Variable unter Javascript.0 anlegen
        type: 'number',
        name: 'Anzahl der eingeschalteten Lichter',
        min: 0,
        def: 0,
        role: 'value'
        });
        createState(idText, { // Anzahl der brennenden Lichter und deren Namen als Variable unter Javascript.0 anlegen
        type: 'string',
        name: 'Eingeschaltete Lichter',
        desc: 'Namen der eingeschalteten Lichter',
        def: ' ',
        role: 'value'
        });
        createState(idAnsage, {
        type: 'string',
        name: 'Eingeschaltete Lichter (Ansage)',
        desc: 'Namen der eingeschalteten Lichter (für Ansage aufbereitet)',
        def: ' ',
        role: 'value'
        });
        createState(idRaum, { // Räume, in denen Lichter brennen // <---- NEU
        type: 'string',
        name: 'Räume mit eingeschalteten Lichter',
        desc: 'Namen der Räume, in denen Lichter eingeschaltet sind',
        def: ' ',
        role: 'value'
        });
        
        var cacheSelectorState = $('channel[state.id=*.STATE](functions="licht")'); // Gewerk licht
        var cacheSelectorLevel = $('channel[state.id=*.level](functions="licht")');
        var cacheSelectorPOWER = $('state[id=*.POWER](functions="licht")'); // Sonoff
        var cacheSelectorSwitch = $('state[id=*.Switch](functions="licht")'); // Shelly
        var cacheSelectorMi = $('state[id=*.state](functions=licht)'); //Mi-Light
        var cacheSelectorTuya = $('state[id=*.1](functions="licht")'); //Tuya
        var cacheSelectorSmart = $('state[id=*.onoff](functions="licht")');//Milight-Smart-Light
        
        function checkDevices(obj) {
        // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk licht auf 0
        var anzahlLichterAn = 0;
        var anzahlLichter = 0;
        var textLichterAn = [];
        var textRaum = [];
        
        /*if (logging) {
        log('++++++ Lichter Anzahl ++++ ');
        log('#### SCHALTER ##### ');
        }*/
        cacheSelectorState.each(function (id, i) { // Schleife für jedes gefundenen Element *.STATE im Gewerk Licht
        var obj = getObject(id);
        var name = getObject(id).common.name;
        var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element)
        var devicename = name.substring(0, name.indexOf(".STATE")); //.state aus Text entfernen
        var raumname = getObject(id, "rooms"); // <---- NEU
        
        if (status) { // wenn Zustand = true, dann wird die ANzahl der Lichter hochgezählt
        ++anzahlLichterAn; 
        textLichterAn.push(devicename); // Zu Array hinzufügen
        textRaum.push(raumname.enumNames); // <---- NEU
        }
        ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status
        // } // ENDE VK-Abfrage
        });
        
        
        //if (logging) log('#### DIMMER ##### ');
        cacheSelectorLevel.each(function (id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht
        var obj = getObject(id);
        var name = getObject(id).common.name;
        var status = getState(id).val; // Zustand *.LEVEL abfragen (jedes Element)
        var devicename = name.substring(0, name.indexOf(".LEVEL")); //.state aus Text entfernen
        var raumname = getObject(id, "rooms"); // <---- NEU
        
        if (parseFloat(status) > 0) { // Wenn Dimmwert über 0
        ++anzahlLichterAn; 
        textLichterAn.push(devicename); // Zu Array hinzufügen
        textRaum.push(raumname.enumNames); // <---- NEU
        }
        ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status
        // } // Ende Abfrage VK 
        }); 
        
        
        /*if (logging) {
        log('++++++ Lichter Anzahl ++++ ');
        log('#### SCHALTER ##### ');
        }*/
        cacheSelectorPOWER.each(function (id, i) { // Schleife für jedes gefundenen Element *.POWER im Gewerk Licht
        var obj = getObject(id);
        var name = getObject(id).common.name;
        var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element)
        var devicename = name.substring(0, name.indexOf("POWER")); //.state aus Text entfernen
        var raumname = getObject(id, "rooms"); // <---- NEU
        
        if (status) { // wenn Zustand = true, dann wird die ANzahl der Lichter hochgezählt
        ++anzahlLichterAn; 
        textLichterAn.push(devicename); // Zu Array hinzufügen
        textRaum.push(raumname.enumNames); // <---- NEU
        }
        ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status
        // } // ENDE VK-Abfrage
        });
        
        
        /*if (logging) {
        log('++++++ Lichter Anzahl ++++ ');
        log('#### SCHALTER ##### ');
        }*/
        cacheSelectorSwitch.each(function (id, i) { // Schleife für jedes gefundenen Element *.POWER im Gewerk Licht
        var obj = getObject(id);
        var name = getObject(id).common.name;
        var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element)
        var devicename = name;
        var raumname = getObject(id, "rooms"); // <---- NEU
        
        if (status) { // wenn Zustand = true, dann wird die ANzahl der Lichter hochgezählt
        ++anzahlLichterAn; 
        textLichterAn.push(devicename); // Zu Array hinzufügen
        textRaum.push(raumname.enumNames); // <---- NEU
        }
        ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status
        // } // ENDE VK-Abfrage
        });
        
        
        /*if (logging) {
        log('++++++ Lichter Anzahl ++++ ');
        log('#### SCHALTER ##### ');
        }*/
        cacheSelectorMi.each(function (id, i) { // Schleife für jedes gefundenen Element *.POWER im Gewerk Licht
        var obj = getObject(id);
        var name = getObject(id).common.name;
        var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element)
        var devicename = name.substring(0, name.indexOf(" Switch ON/OFF")); //.state aus Text entfernen
        var raumname = getObject(id, "rooms"); // <---- NEU
        
        if (status) { // wenn Zustand = true, dann wird die ANzahl der Lichter hochgezählt
        ++anzahlLichterAn; 
        textLichterAn.push(devicename); // Zu Array hinzufügen
        textRaum.push(raumname.enumNames); // <---- NEU
        }
        ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status
        // } // ENDE VK-Abfrage
        });
        
        /*if (logging) {
        log('++++++ Lichter Anzahl ++++ ');
        log('#### SCHALTER ##### ');
        }*/
        cacheSelectorTuya.each(function (id, i) { // Schleife für jedes gefundenen Element *.POWER im Gewerk Licht
        var obj = getObject(id);
        var name = getObject(id).common.name;
        var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element)
        var devicename = name.substring(0, name.indexOf(" switch")); //.state aus Text entfernen
        var raumname = getObject(id, "rooms"); // <---- NEU
        
        if (status) { // wenn Zustand = true, dann wird die ANzahl der Lichter hochgezählt
        ++anzahlLichterAn; 
        textLichterAn.push(devicename); // Zu Array hinzufügen
        textRaum.push(raumname.enumNames); // <---- NEU
        }
        ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status
        // } // ENDE VK-Abfrage
        });
        
        /*if (logging) {
        log('++++++ Lichter Anzahl ++++ ');
        log('#### SCHALTER ##### ');
        }*/
        cacheSelectorSmart.each(function (id, i) { // Schleife für jedes gefundenen Element *.POWER im Gewerk Licht
        var obj = getObject(id);
        var name = getObject(id).common.name;
        var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element)
        var devicename = name.substring(0, name.indexOf("On/Off")); //.state aus Text entfernen
        var raumname = getObject(id, "rooms"); // <---- NEU
        
        if (status) { // wenn Zustand = true, dann wird die ANzahl der Lichter hochgezählt
        ++anzahlLichterAn; 
        textLichterAn.push(devicename); // Zu Array hinzufügen
        textRaum.push(raumname.enumNames); // <---- NEU
        }
        ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status
        // } // ENDE VK-Abfrage
        });
        
        // Array mit Lichternamen sortieren
        textLichterAn.sort();
        textRaum.sort(); // <---- NEU
        // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben
        if (logging) log("Text: " + textLichterAn);
        if (logging) log("Anzahl Lichter: " + anzahlLichter + " # davon Lichter an: " + anzahlLichterAn);
        // die ermittelten Werte werden als javascript.0. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
        setState(idText, textLichterAn.join(', ')); // Schreibt die aktuelle Namen der eingeschalteten Lichter
        setState(idAnzahlEin, textLichterAn.length); // Schreibt die aktuelle Anzahl der eingeschalteten Lichter
        setState(idAnzahl, anzahlLichter); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Licht
        // setState(idRaum, textRaum.join(',<br>')); // Räume, in denen Licht brennt // <---- NEU
        setState(idRaum, textRaum.join(', ')); // Räume, in denen Licht brennt // <---- NEU
        }
        
        // Trigger
        cacheSelectorState.on(function(obj) { // bei Zustandänderung *.STATE im Gewerk licht
        if (logging) log('Auslösender Schalter: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
        checkDevices();
        });
        cacheSelectorLevel.on(function(obj) { // bei Zustandänderung *.LEVEL im Gewerk licht
        if (logging) log('Auslösender Dimmer: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
        checkDevices();
        });
        cacheSelectorPOWER.on(function(obj) { // bei Zustandänderung *.STATE im Gewerk licht
        if (logging) log('Auslösender Schalter: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
        checkDevices();
        });
        cacheSelectorSwitch.on(function(obj) { // bei Zustandänderung *.STATE im Gewerk licht
        if (logging) log('Auslösender Schalter: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
        checkDevices();
        });
        cacheSelectorTuya.on(function(obj) { // bei Zustandänderung *.STATE im Gewerk licht
        if (logging) log('Auslösender Schalter: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
        checkDevices();
        });
        cacheSelectorSmart.on(function(obj) { // bei Zustandänderung *.STATE im Gewerk licht
        if (logging) log('Auslösender Schalter: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
        checkDevices();
        });
        
        function main() {
        setTimeout(function(){
        if (logging) log('Auslöser Skriptstart');
        checkDevices();
        }, 2000);
        }
        
        main(); // Skriptstart-Auslöser
        
        // Aufbereitung für Ansage
        function strip_tags(data) {
        var rueckgabe = data.replace(/(&nbsp;|<([^>]+)>)/ig, " ");
        return(rueckgabe);
        }
        
        on(idText, function (obj) {
        var text = obj.state.val;
        text = (getState(idAnzahl).val > 0 ) ? 'Lichter eingeschaltet: ' + strip_tags(text) : 'Alle Lichter ausgeschaltet';
        setState(idAnsage, text);
        });
        

        Z T 2 Replies Last reply Reply Quote 0
        • Z
          zahnheinrich @crunchip last edited by

          @crunchip
          Oder alle Lichter in alias Datenpunkte überführen.
          Alias ist dein Freund 🙂

          1 Reply Last reply Reply Quote 0
          • T
            Torsten G. @crunchip last edited by

            @crunchip Vielen Dank Script ausgetauscht und angepasst klappt.

            Erledigt

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

            Support us

            ioBroker
            Community Adapters
            Donate

            490
            Online

            31.8k
            Users

            79.9k
            Topics

            1.3m
            Posts

            3
            4
            362
            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