NEWS

Suche nach einem funktionsfähigen Skript...


  • Starter

    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.



  • @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 sagte:

    Seit geraumer Zeit geht's halt nicht mehr

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


  • Starter

    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.



  • @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.


  • Starter

    @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.


  • Starter

    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?


Log in to reply
 

Suggested Topics

1.9k
Online

32.0k
Users

38.7k
Topics

524.9k
Posts