Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] Lichter zählen Script läuft nicht

    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

    [gelöst] Lichter zählen Script läuft nicht

    This topic has been deleted. Only users with topic management privileges can see it.
    • crunchip
      crunchip Forum Testing Most Active last edited by

      habe es so, für Mi-Light, Shelly, Sonoff...

      /* 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
      
      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
      
      
      // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen)
      // if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) { 
      /*
      if (logging) {
      log('-------');
      log('Kanal: ' + name);
      log('Status: ' + status); 
      }
      */
      
      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
      
      // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen)
      // if ( (devicename.search(/(CUX)|(K2)|(K3)|(V10)|(VK)|(:)/ig) == -1) ) { // Geräte mit diesen Strings im namen nicht beachten
      /*
      if (logging) {
      log('-------');
      log('Kanal: ' + name);
      log('Status: ' + status + '%'); 
      }
      */
      
      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
      
      
      // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen)
      // if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) { 
      /*
      if (logging) {
      log('-------');
      log('Kanal: ' + name);
      log('Status: ' + status); 
      }
      */
      
      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
      
      // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen)
      // if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) { 
      /*
      if (logging) {
      log('-------');
      log('Kanal: ' + name);
      log('Status: ' + status); 
      }
      */
      
      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
      
      // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen)
      // if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) { 
      /*
      if (logging) {
      log('-------');
      log('Kanal: ' + name);
      log('Status: ' + status); 
      }
      */
      
      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();
      });
      cacheSelectorMi.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);
      });
      
      1 Reply Last reply Reply Quote 1
      • paul53
        paul53 @mech last edited by paul53

        @mech sagte:

        Wie könnte ich den nun noch die Homematic "aktoren" abfragen?

        Wenn die Kanäle dem Gewerk "Licht" zugeordnet sind:

        const cacheSelectorSTATE = $('channel[state.id=*.STATE](functions=light)');
        
        M 1 Reply Last reply Reply Quote 0
        • M
          mech last edited by

          Wow, danke für eure Hilfe 🙂 Das hat mir echt geholfen.

          Jetzt habe ich in diesem Beitrag ein Widget dafür gefunden: https://forum.iobroker.net/topic/3884/licht-skript-liefert-falsche-gerätenamen/2

          Besteht hier die Möglichkeit das ich mir die angeschalteten Lichter anzeigen lassen kann? Und diese dann direkt auch ausschalten kann, bisher sieht mein Widget so aus:

          vis 2019-05-30 20-21-45.png

          1 Reply Last reply Reply Quote 0
          • M
            mech @paul53 last edited by

            @paul53

            Hm, die Homematic findet er nicht. Die Objekte sehen so aus:

            objects - ioBroker 2019-05-30 20-54-46.png

            Jemand eine Idee dazu?

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

              @mech sagte:

              Die Objekte sehen so aus:

              const cacheSelectorOn = $('state[id=*.on](functions=light)');
              
              1 Reply Last reply Reply Quote 0
              • M
                mech last edited by

                @paul53 said in [gelöst] Lichter zählen Script läuft nicht:

                const cacheSelectorOn = $('stateid=*.on');

                Danke das du noch antwortest 🙂

                Ich habe das so zugefügt, bekomme dann aber an anderer Stelle einen JS Fehler:

                21:42:11.798	error	javascript.0 script.js.Verbraucher: script.js.Verbraucher:538
                21:42:11.799	error	javascript.0 at script.js.Verbraucher:538:1
                
                

                Das ist die betroffene Zeile 538

                cacheSelectorON.on(function(obj) { // bei Zustandänderung *.STATE im Gewerk licht
                
                1 Reply Last reply Reply Quote 0
                • M
                  mech last edited by mech

                  Okay fehler selbst gesehen.

                  ON = On

                  Das habe ich unter Trigger noch zugefügt.

                  cacheSelectorOn.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();
                  
                  });
                  

                  Aber leider zeigt er mir bisher nur die Shellys an =/

                  1 Reply Last reply Reply Quote 0
                  • M
                    mech last edited by

                    Update: Es scheint auf jedenfall den HM Schalter zu triggern:

                    21:48:40.204	info	javascript.0 script.js.Verbraucher: Auslösender Schalter: hmip.0.devices.3014F711A0000858A9919754.channels.1.on: false
                    

                    Nur dieser wird wohl nicht in die Variable für die Lampen geschrieben.

                    1 Reply Last reply Reply Quote 0
                    • M
                      mech last edited by

                      Hier mal das ganze Script:

                      /* Status Zahl Lichter
                      
                      {1}
                      
                      zählt die Lichter in allen Räumen und meldet die Eingeschalteten namentlich
                      
                      Daten kommen vom Gewerk "licht"
                      
                      {1}
                      
                      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 cacheSelectorHM = $('state[id=*.switch](functions=light)');
                      
                      var cacheSelectorState = $('channel[state.id=*.STATE](functions="light")'); // Gewerk licht
                      
                      var cacheSelectorLevel = $('channel[state.id=*.level](functions="light")');
                      
                      var cacheSelectorPOWER = $('state[id=*.POWER](functions="light")'); // Sonoff
                      
                      var cacheSelectorSwitch = $('state[id=*.Switch](functions="light")'); // Shelly
                      
                      var cacheSelectorMi = $('state[id=*.state](functions=light)'); //Mi-Light
                      
                      //var cacheSelectorON = $('switch[id=*.switch](functions=light)'); //Homematic
                      
                      const cacheSelectorOn = $('state[id=*.on](functions=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
                      
                       
                      
                       
                      
                      // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen)
                      
                      // if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) { 
                      
                      
                      /*
                      if (logging) {
                      
                      log('-------');
                      
                      log('Kanal: ' + name);
                      
                      log('Status: ' + status); 
                      
                      }}
                      */
                      
                      
                      
                      
                       
                      
                      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
                      
                       
                      
                      // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen)
                      
                      // if ( (devicename.search(/(CUX)|(K2)|(K3)|(V10)|(VK)|(:)/ig) == -1) ) { // Geräte mit diesen Strings im namen nicht beachten
                      
                      /*
                      
                      if (logging) {
                      
                      log('-------');
                      
                      log('Kanal: ' + name);
                      
                      log('Status: ' + status + '%'); 
                      
                      }
                      
                      */
                      
                       
                      
                      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
                      
                       
                      
                       
                      
                      // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen)
                      
                      // if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) { 
                      
                      /*
                      
                      if (logging) {
                      
                      log('-------');
                      
                      log('Kanal: ' + name);
                      
                      log('Status: ' + status); 
                      
                      }
                      
                      */
                      
                       
                      
                      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
                      textRaum.push(raumname.enumRooms); // <---- 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
                      
                       
                      
                      // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen)
                      
                      // if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) { 
                      
                      /*
                      
                      if (logging) {
                      
                      log('-------');
                      
                      log('Kanal: ' + name);
                      
                      log('Status: ' + status); 
                      
                      }
                      
                      */
                      
                       
                      
                      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
                      
                       
                      
                      // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen)
                      
                      // if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) { 
                      
                      /*
                      
                      if (logging) {
                      
                      log('-------');
                      
                      log('Kanal: ' + name);
                      
                      log('Status: ' + status); 
                      
                      }
                      
                      */
                      
                       
                      
                      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();
                      
                      });
                      
                      cacheSelectorMi.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();
                      
                      });
                      
                      cacheSelectorOn.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);
                      
                      });
                      
                      1 Reply Last reply Reply Quote 0
                      • M
                        mech last edited by

                        okay gelöst 🙂

                        Man muss den Log Part auf für den selector anlegen. Hier der Code falls mal jemand ähnlich unbegabt im JS ist.

                        f (logging) {
                        
                        log('++++++ Lichter Anzahl ++++ ');
                        
                        log('#### SCHALTER ##### ');
                        
                        }
                        
                        cacheSelectorOn.each(function (id, i) { // Schleife für jedes gefundenen Element *.POWER im Gewerk Licht
                        
                        1 Reply Last reply Reply Quote 0
                        • H
                          hannoi last edited by

                          Moin moin,

                          ich habe nach einem Systemumzug ein Problem mit meinem "Lichter zählen" Skript.

                          Das Skript läuft auch soweit wie es soll, nur 2 Lampen aus dem identischen Gewerk licht werden mit falschem Raumnamen aufgelistet: mit [object Object]:
                          Bildschirmfoto 2019-07-04 um 13.02.57.png

                          Hier das Skript:

                          /* Status Zahl Lichter
                          
                          zählt die Lichter in allen Räumen und meldet die Eingeschalteten namentlich
                          Daten kommen vom Gewerk "Licht"
                          */
                          const logging = true;
                          
                          const 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, 6, '.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
                          }
                          // 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);
                          });
                          

                          Das Skript findet alle Lichter aus dem Gewerk, das passt nur eben die Anzeige des Raumes nicht.
                          Hat noch jemand eine Idee?

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

                            @hannoi sagte:

                            Das Skript findet alle Lichter aus dem Gewerk

                            Wirklich ? Bei HomeMatic-Geräten wird "state" groß geschrieben:

                            const hmSTATE = $('channel[state.id=*.STATE](functions=licht)');
                            

                            und

                            	    checkLicht(id, 0, '.STATE');
                            
                            1 Reply Last reply Reply Quote 0
                            • H
                              hannoi last edited by

                              Sorry hatte ich nicht erwähnt, nutze die Tradfri Lampen. Dort wird der "state" kleingeschrieben.
                              Bildschirmfoto 2019-07-05 um 11.28.52.png

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

                                @hannoi
                                Mit dem Namen "on/off" kann das Skript nichts anfangen !

                                1 Reply Last reply Reply Quote 0
                                • H
                                  hannoi last edited by

                                  D.h. ich brauche dort eine weitere Konstante ?

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

                                    @hannoi
                                    Ändere den Datenpunktnamen analog der Struktur der HomeMatic-Namen in: "Kanalname.state". "Kanalname" steht für den Namen der jeweiligen Tradfri-Lampe.

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

                                    Support us

                                    ioBroker
                                    Community Adapters
                                    Donate

                                    365
                                    Online

                                    31.8k
                                    Users

                                    79.9k
                                    Topics

                                    1.3m
                                    Posts

                                    33
                                    156
                                    23198
                                    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