Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Aufzählung, Script wird bei Änderungen nicht neu gestartet

    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

    Aufzählung, Script wird bei Änderungen nicht neu gestartet

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

      Hi,
      ich bin dabei mir eine Aufzählung für die Beleuchtung zu erstellen. Die Darstellung in der Vis funktioniert zwar aber
      eine Veränderung wird leider nur erkannt, wenn ich das Script manuell starte.
      ich versuche über Selektor eine on funktion, so sollte das script neu starten . wenn ein Schalter betätigt wurde.
      $("state(functions=Beleuchtung)").on(function(obj) {
      listEnumDevices();
      };

      Beleuchtung ist die Aufzählung funktion.

      es geht um sonoff.

      Name = Dves_xxxxx.POWER
      Typ=state
      Rolle =switch
      Raum = frei
      Funktion=Beleuchtung

      ich hoffe die angaben helfen euch .

      ich bin für jede Hilfe dankbar

      LG

      MR

      bahnuhr paul53 2 Replies Last reply Reply Quote 0
      • bahnuhr
        bahnuhr Forum Testing Most Active @Matze R last edited by

        @matze-r

        anbei ein Script was schon seit 8 Jahren einwandfrei funktioniert:

        /* 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: http://forum.iobroker.net/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?f=21&t=473&start=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 = false;
        
        var idAnzahlEin = 'javascript.0.System.Zusammenfassung.Licht.Anzahl_ein',
            idAnzahl =    'javascript.0.System.Zusammenfassung.Licht.Anzahl',
            idText =      'javascript.0.System.Zusammenfassung.Licht.Text',
            idRaum =      'javascript.0.System.Zusammenfassung.Licht.Raum', // <---- NEU
            idAnsage =    'javascript.0.System.Zusammenfassung.Licht.Ansage';
        
        var cacheSelectorState = $('channel[state.id=*.STATE](functions="Licht")'); // Gewerk Licht
        var cacheSelectorLevel = $('channel[state.id=*.LEVEL](functions="Licht")');
        
        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 
        }); 
        
          // Funktion: Doppelte Einträge aus Array entfernen (für Räume) www.okco.de (c) codemaster
        function deleteDuplicates(arr) { 
            var temp = {}; 
            for (var i = 0; i < arr.length; i++) temp[arr[i]] = true; 
            var r = []; 
            for (var k in temp) r.push(k); 
            return r;
        }
        
        // Array mit Lichternamen sortieren
        textLichterAn.sort();
        textRaum = deleteDuplicates(textRaum);
        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(',<br>')); // 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();
        });
        
        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 sind ausgeschaltet';
        setState(idAnsage, text);
        });
        
        
        

        einfach anpassen an deine Verhältnisse.

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

          @matze-r sagte: functions=Beleuchtung

          Die ID ist "enum.functions.Beleuchtung", also ist "Beleuchtung" richtig geschrieben?

          1 Reply Last reply Reply Quote 0
          • Matze R
            Matze R last edited by

            Hi,
            @paul53
            ich habe es dank dir hinbekommen. Ich hatte bei der Erstellung der Aufzählungs Kategorie Name und Id unterschiedlich
            benannt. Bei dem Datenpunkt wurde unter function der Name gezeigt aber für Selektor eine on funktion,braucht man
            die ID , da hatte ich mich vertan.

            @bahnuhr ,

            Cooles script ,aber das muss ich erstmal langsam analysieren was da alles passiert.
            Das wird interessant wenn ich dann alle Shellys , also Dimmer RGB2 shelly 1 etc. überwachen mus, dann werde ich wohl mist dem kleinen Programm nicht hinkommen.

            Also danke euch beiden, ihr habt mir sehr geholfen

            LG

            MR

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

            Support us

            ioBroker
            Community Adapters
            Donate

            425
            Online

            31.8k
            Users

            80.0k
            Topics

            1.3m
            Posts

            3
            4
            138
            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