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.
    • M
      mech last edited by

      Hey,

      so wäre es dann ja richtig oder?

       var cacheSelectorState = $('channelstate.id=.Switch'); // Gewerk Licht
      
      1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @mech last edited by paul53

        @mech Versuche es mal so

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

          Prima vielen Dank. Das hat wohl zu Erfolg geführt.

          20:00:45.499	info	javascript.0 Stop script script.js.Lichter_EIN
          20:00:46.651	info	javascript.0 Start javascript script.js.Lichter_EIN
          20:00:46.652	info	javascript.0 script.js.Lichter_EIN: registered 3 subscriptions and 0 schedules
          20:00:48.652	info	javascript.0 script.js.Lichter_EIN: Auslöser Skriptstart
          20:00:48.652	info	javascript.0 script.js.Lichter_EIN: ++++++ Lichter Anzahl ++++
          20:00:48.652	info	javascript.0 script.js.Lichter_EIN: #### SCHALTER #####
          20:00:48.652	info	javascript.0 script.js.Lichter_EIN: #### DIMMER #####
          20:00:48.652	info	javascript.0 script.js.Lichter_EIN: ++++++ Lichter Anzahl ++++
          20:00:48.652	info	javascript.0 script.js.Lichter_EIN: #### SCHALTER #####
          20:00:48.652	info	javascript.0 script.js.Lichter_EIN: Text: ,
          20:00:48.652	info	javascript.0 script.js.Lichter_EIN: Anzahl Lichter: 2 # davon Lichter an: 2
          20:00:54.155	info	javascript.0 script.js.Lichter_EIN: Auslösender Schalter: shelly.0.SHSW-PM#B1D869#1.Relay0.Switch: false
          20:00:54.155	info	javascript.0 script.js.Lichter_EIN: ++++++ Lichter Anzahl ++++
          20:00:54.155	info	javascript.0 script.js.Lichter_EIN: #### SCHALTER #####
          20:00:54.155	info	javascript.0 script.js.Lichter_EIN: #### DIMMER #####
          20:00:54.155	info	javascript.0 script.js.Lichter_EIN: ++++++ Lichter Anzahl ++++
          20:00:54.155	info	javascript.0 script.js.Lichter_EIN: #### SCHALTER #####
          20:00:54.155	info	javascript.0 script.js.Lichter_EIN: Text:
          20:00:54.156	info	javascript.0 script.js.Lichter_EIN: Anzahl Lichter: 2 # davon Lichter an: 1
          

          Wie könnte ich den nun noch die Homematic "aktoren" abfragen? Dort habe ich leider bedingt durch eine Wechselschaltung noch 2 von laufen?

          Hast du da ggf. auch eine Lösung für mich?

          paul53 1 Reply Last reply Reply Quote 0
          • 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

                                          486
                                          Online

                                          31.7k
                                          Users

                                          79.8k
                                          Topics

                                          1.3m
                                          Posts

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