Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Suche nach einem funktionsfähigen Skript...

    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

    Suche nach einem funktionsfähigen Skript...

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

      Es gibt gerade im Skript-Bereich eine ganze Anzahl an unterschiedlichen Threads, die sich mit Teilaspekten eines einzigen Skriptes beschäftigen, bspw. das Zählen von Lichtern. Hatte ich auch im Einsatz, leicht an meine Bedürfnisse angepasst.
      Seit geraumer Zeit geht's halt nicht mehr, vermutlich wegen dem Befehl $cacheSelector.

      Lange Rede, kurzer Sinn: in allen Threads finden sich komplette Skripte, die bei mir alle nicht funktionieren.Bisher habe ich 17 getestet; teils mit Fehlermeldungen, teils ohne. Aber immer ohne dass auch nur ein einziger Wert ermittelt wurde.

      Gibt es eine Ecke, wo aktuelle und voll funktionsfähige Skripte zu finden sind? Oder zumindest eine Anleitung, was an meinem alten Skript genau zu ändern ist.

      Peoples paul53 2 Replies Last reply Reply Quote 0
      • Peoples
        Peoples @maloross last edited by Peoples

        @maloross sagte in Suche nach einem funktionsfähigen Skript...:

        Versuch mal meines das läuft bei mir und mein System ist eigentlich aktuell.

        Script anbei:

        // *******************************************************************************************************
        //
        // Beleuchtung komplett 
        //
        // ********************************************************************************************************
        
        
        // -----------------------------------------------------------------------------
        // allgemeine Variablen
        // -----------------------------------------------------------------------------
        var logging = false;  // Logging on/off
        var debug = false;  // Debug on/off
        var instanz = 'javascript.0';   instanz = instanz + '.';    // 
                                                                    //
        var pfad0 =   'Beleuchtung';      pfad0 = pfad0 + '.';        // Pfad der Beleuchtung innerhalb der Instanz 
        
        var cacheSelectorState =    $('[id=*.STATE](functions="Beleuchtung")'); // Lichtschalter
        var cacheSelectorLevel =    $('[id=*.LEVEL](functions="Beleuchtung")'); // Lichtdimmer
        //var cacheSelectorSonoff =   $('channel[state.id=*.POWER](functions="Beleuchtung")'); // Sonoff Lampen
        var cacheSelectorSonoff =   $('[id=*.POWER](functions="Beleuchtung")');
        var cacheSelectorHue =      $('[id=*.ON](functions="Beleuchtung")'); // HUE Lampen 
        var cacheSelectorYEELIGHT = $('[id=*.power](functions="Beleuchtung")'); // Yeelight Lampen 
        
        var time;
        
        //Lichtautomatik 
        var timer = [];
        var GeraeteListe = [];
        // -----------------------------------------------------------------------------
        // Objekte
        // -----------------------------------------------------------------------------
        // Objekt: Zeigt den Status der Beleuchtung (irgend ein Licht an?)
        createState(pfad0 + 'Status_Lichter',  {def:'false', type:'boolean', name:'Status Beleuchtung',});
        
        // Objekt: Zeigt den Zeitstempel der letzen Änderung
        createState(pfad0 + 'Status_Lichter_Zeitstempel',  {def:'', type:'string', name:'Zeitstempel Beleuchtung_',});
        
        // Objekt: Schalte alle Lichter in Abhängikeit des Status ein oder aus
        createState(pfad0 + 'Schalter_Lichter',  {def:'false', type: 'boolean',name: 'Schalter Beleuchtung',desc: 'Schaltet alle Lichter aus, und wenn alles aus ist alle ein'});
        
        // Objekt: Anzahl der vorhandenen Lichter
        createState(pfad0 + 'Anzahl_Lichter_gesamt', {def:0, min:0, type:'number', name: 'Anzahl aller Lichter'});
        
        // Objekt: Anzahl der eingeschalteten Lichter
        createState(pfad0 + 'Anzahl_Lichter_ein', {def: 0,min: 0, type:'number', name:'Anzahl der eingeschalteten Lichter'});
        
        // Objekt: Mit den Namen der eingeschalteten Lichter
        createState(pfad0 + 'Text', {def:' ', type:'string', name: 'Eingeschaltete Lichter'});
        
        // Objekt: Ansage für Sprachausgabe
        createState(pfad0 + 'Ansage', {def:' ', type:'string', name: 'Eingeschaltete Lichter (für Ansage aufbereitet)'});
        
        // Objekt: Liste der Räume mit eingeschalteten Lichtern
        createState(pfad0 + 'Raum', {def:' ', type: 'string', name: 'Räume mit eingeschalteten Lichter'});
        
        // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
        // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
        // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
        // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
        
        // #############################################################################
        // #                                                                           #
        // #  Funktion Prüfen der Beleuchtungsstati der einzelnen Aktoren              #
        // #  und generierung der Sprachausgabe                                        #
        // #                                                                           #
        // #############################################################################
        
        function checkDevices(obj) {
            // Zeitstempel
            var datum = formatDate(new Date(getState("javascript.0.Beleuchtung.Anzahl_Lichter_ein").lc), 'DD.MM.YYYY');
            var uhrzeit = formatDate(new Date(getState("javascript.0.Beleuchtung.Anzahl_Lichter_ein").lc), 'hh:mm:ss');
            var zeitstempel = datum +' um '+uhrzeit;
            
            // 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 Beleuchtung
                var obj = getObject(id);
                var name = getObject(id).common.name;
                var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element)
                var devicename = name.substring(0, name.indexOf(".STATE")); //.state aus Text entfernen
                var raumname = getObject(id, "rooms"); // <---- NEU
        
                if (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
            });
            
            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('#### SONOFF ##### ');
            cacheSelectorSonoff.each(function(id, i) { // Schleife für jedes gefundenen Element *.Power im Gewerk Beleuchtung
                var obj = getObject(id);
                var name = getObject(id).common.name;
                var status = getState(id).val; // Zustand *.POWER abfragen (jedes Element)
                var devicename = name.substring(0, name.indexOf(".POWER")); //.state aus Text entfernen
                var raumname = getObject(id, "rooms"); // <---- NEU
        
                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
            });
            if (logging) log('#### HUE ##### ');
            cacheSelectorHue.each(function(id, i) { // Schleife für jedes gefundenen Element *.STATE im Gewerk Beleuchtung
                var obj = getObject(id);
                var name = getObject(id).common.name;
                var status = getState(id).val; // Zustand *.ON abfragen (jedes Element)
                var devicename = name.substring(0, name.indexOf(".ON")); //.state aus Text entfernen
                var raumname = getObject(id, "rooms"); // <---- NEU
        
                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
            });
            if (logging) log('#### HUE ##### ');
            cacheSelectorYEELIGHT.each(function(id, i) { // Schleife für jedes gefundenen Element *.STATE im Gewerk Beleuchtung
                var obj = getObject(id);
                var name = getObject(id).common.name;
                var status = getState(id).val; // Zustand *.power abfragen (jedes Element)
                var devicename = name.substring(0, name.indexOf(".power")); //.state aus Text entfernen
                var raumname = getObject(id, "rooms"); // <---- NEU
        
                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
            });
            // 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(pfad0 + 'Text', textLichterAn.join(',<br>')); // Schreibt die aktuelle Namen der eingeschalteten Lichter
            setState(pfad0 + 'Anzahl_Lichter_ein', textLichterAn.length); // Schreibt die aktuelle Anzahl der eingeschalteten Lichter
            setState(pfad0 + 'Anzahl_Lichter_gesamt', anzahlLichter); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Licht
            // setState(pfad0 + 'Raum', textRaum.join(',<br>')); // Räume, in denen Licht brennt // <---- NEU
            setState(pfad0 + 'Raum', textRaum.join(', ')); // Räume, in denen Licht brennt // <---- NEU
            
            if(anzahlLichterAn > 0){
                setState(instanz + pfad0 + 'Status_Lichter', true);
                setState(instanz + pfad0 + "Status_Lichter_Zeitstempel", zeitstempel);
            }
            else{
                setState(instanz + pfad0 + 'Status_Lichter', false);
                setState(instanz + pfad0 + "Status_Lichter_Zeitstempel", zeitstempel);
            }
        }
        
        // #############################################################################
        // #                                                                           #
        // # Funktion schalten aller Aktoren des Gewerks Beleuchtung einzelnen Aktoren #
        // #                                                                           #
        // #############################################################################
        
        function switchDevices(dp) {
            cacheSelectorState.each(function(id, i) { // Schleife für jedes gefundenen Element *.STATE im Gewerk Licht
                var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element)
              if(dp){
                    if(!status) setState(id, true);
                }
                else{
                    if(status)setState(id, false);
                }
            });
            
            cacheSelectorLevel.each(function(id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht
                var status = getState(id).val; // Zustand *.LEVEL abfragen (jedes Element)
                if(dp){
                    if(parseFloat(status) === 0) setState(id, 100);
                }
                else{
                    if(parseFloat(status) > 0) setState(id, 0);
                }
            });
            cacheSelectorSonoff.each(function(id, i) { // Schleife für jedes gefundenen Sonoff Element im Gewerk Licht
                var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element)
              if(dp){
                    if(!status) setState(id, true);
                }
                else{
                    if(status)setState(id, false);
                }
            });
            cacheSelectorYEELIGHT.each(function(id, i) { // Schleife für jedes gefundenen Yeelight Element im Gewerk Licht
                var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element)
              if(dp){
                    if(!status) setState(id, true);
                }
                else{
                    if(status)setState(id, false);
                }
            });
        }
        
        
        // 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();
        });
        cacheSelectorHue.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();
        });
        cacheSelectorSonoff.on(function(obj) { // bei Zustandänderung *.POWER von Sonoff Lampen im Gewerk Licht
            if (logging) log('Auslösender Sonoff: ' + 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();
        });
        
        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(pfad0 + 'Text', function(obj) {
            var text = obj.state.val;
            text = (getState(pfad0 + 'Anzahl_Lichter_gesamt').val > 0) ? 'Lichter eingeschaltet: ' + strip_tags(text) : 'Alle Lichter sind ausgeschaltet';
            setState(pfad0 + 'Ansage', text);
        });
        
        // #############################################################################
        // #                                                                           #
        // # Alle Lichter Aus / Ein schalten                                           #
        // #                                                                           #
        // #############################################################################
        
        //Hier können alle Lichter ein/aus geschaltet werden
        on("javascript.0.Beleuchtung.Schalter_Lichter", function(dp) { 
              if(getState("javascript.0.Beleuchtung.Status_Lichter").val){
               switchDevices(false);
            }  
            else{
                switchDevices(true);
            }
               
        });
        
        
        maloross 1 Reply Last reply Reply Quote 0
        • paul53
          paul53 @maloross last edited by

          @maloross sagte:

          Seit geraumer Zeit geht's halt nicht mehr

          Seit welcher Kombination der Versionen von js-controller und Javascript-Adapter ?

          1 Reply Last reply Reply Quote 0
          • maloross
            maloross @Peoples last edited by

            Guten Morgen,

            @paul53 Javaskript läuft bei mir mit Version 4.1.12, der Controller mit mit 2.1.1
            Ich versuche alles immer aktuell zu halten; allerdings installiere ich neue Versionen nicht gleich bei Erscheinen, sondern erst 1-2 Wochen später.

            @Peoples vielen Dank, es läuft - das wird jetzt meine Vorlage für das Zählen anderer Zustände.

            paul53 1 Reply Last reply Reply Quote 1
            • paul53
              paul53 @maloross last edited by

              @maloross sagte:

              Javaskript läuft bei mir mit Version 4.1.12, der Controller mit mit 2.1.1

              Diese Kombination hat offenbar Probleme mit dem $Selector.

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

                @paul53
                Ja, ich habe die Diskussion im Thread durchgelesen, dass es damit problematisch zu sein scheint.
                Ich habe zum Glück bisher nur relativ einfach gestrickte Blockly, das Lichtzählen-Skript, dass ich auch für das Zählen anderer Verbraucher einsetzte, ist das umfangreichste und aufwendigste - zumindest bei mir.

                1 Reply Last reply Reply Quote 0
                • maloross
                  maloross last edited by

                  Ich habe einen Zwave Double Switch als Lichtschalter. Da Skripting für mich noch absolutes Neuland ist und zum besseren Verständnis für mich: ich muss ich im Skript
                  1. Zwei Variablen definieren
                  bb46b54d-a3b6-472e-86e6-40e8a70b8efe-image.png

                  2. Dazu die Schleife gemäß diesem Muster

                  // Schleife für jedes gefundenen Element *.Power im Gewerk Beleuchtung
                      if (logging) log('#### ZWAVE1 ##### ');
                      cacheSelectorZwave1.each(function(id, i) {         
                  	var obj = getObject(id);
                          var name = getObject(id).common.name;
                  usw.
                  

                  3. Trigger einfügen

                  cacheSelectorZwave1.on(function(obj) { 
                      if (logging) log('Auslösender Zwave1: ' + obj.id + ': ' + obj.state.val);
                      checkDevices();
                  });
                  

                  Der Rest kann so bleiben, wie er ist. Ist meine Logik soweit korrekt?

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

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  840
                  Online

                  31.8k
                  Users

                  80.0k
                  Topics

                  1.3m
                  Posts

                  javascript
                  3
                  7
                  524
                  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