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

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [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

      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

                                      920
                                      Online

                                      31.7k
                                      Users

                                      79.7k
                                      Topics

                                      1.3m
                                      Posts

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