Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Problem älteres Fenster-Zählen 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

    Problem älteres Fenster-Zählen Skript

    This topic has been deleted. Only users with topic management privileges can see it.
    • Codierknecht
      Codierknecht Developer Most Active @Berlon last edited by

      @berlon sagte in Problem älteres Fenster-Zählen Skript:

      Werden beim Blockly auch die Raumnamen angezeigt?

      Nein - wie im Threadtitel angedeutet werden hier nur die offenen Fenster gezählt.
      Um damit zusätzlich eine Liste zu füllen, müsste das entsprechend erweitert werden.
      Kommt halt darauf an, was man haben möchte.
      Tatsächlich nur eine (Text) Liste der geöffneten Fenster?
      Oder doch eher den Status jedes einzelnen Fensters visualisieren.
      4a7f7080-2681-44fe-9bde-8f8120a1231f-image.png

      B 1 Reply Last reply Reply Quote 0
      • crunchip
        crunchip Forum Testing Most Active last edited by

        @berlon hab kein Homematic aber vllt ist https://github.com/Pittini/iobroker-Fensterauswertung etwas für dich
        https://forum.iobroker.net/topic/31674/vorlage-generisches-fensteroffenskript-vis

        1 Reply Last reply Reply Quote 0
        • B
          Berlon @Codierknecht last edited by

          @codierknecht
          Das Skript erstellt nur eine Textliste der geöffneten Fenster. Das würde mir reichen.

          @crunchip
          Schau ich mir mal an. Ist natürlich mächtig erweitert.

          Codierknecht 1 Reply Last reply Reply Quote 0
          • bahnuhr
            bahnuhr Forum Testing Most Active last edited by

            anbei mal Scripte von mir bzgl. Fenster, Bewegung und Licht.

            Diese Scripte gibt es schon seit Jahren (zumindest seit 7 Jahre) hier im Forum

            /* Status Zahl Bewegung
            
            zählt die Bewegung in allen Räumen und meldet die Eingeschalteten namentlich
            Daten kommen vom Gewerk "Bewegung"
            
            23.12.2016 Script von pix; geändert von Bahnuhr auf Bewegung
            */
            var logging = false;
            
            var idAnzahlEin = 'javascript.0.System.Zusammenfassung.Bewegung.Anzahl_ein',
               idAnzahl =    'javascript.0.System.Zusammenfassung.Bewegung.Anzahl',
               idRaum =      'javascript.0.System.Zusammenfassung.Bewegung.Raum';
            
            var cacheSelectorState = $('channel[state.id=*.MOTION](functions="Bewegungsmelder")'); // Gewerk Bewegungsmelder
            
            function checkDevices(obj) {
                // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht auf 0
               var anzahlBewegungAn = 0;
               var anzahlBewegung = 0;
               var textRaum = [];
               if (logging) {
                   log('++++++ Bewegung Anzahl ++++ ');
                   log('#### SCHALTER ##### ');
               }
               cacheSelectorState.each(function (id, i) {                       // Schleife für jedes gefundenen Element *.STATE im Gewerk Licht
                   var obj    = getObject(id);
                   var status = getState(id).val;                              // Zustand *.STATE abfragen (jedes Element)
                   var raumname = getObject(id, "rooms"); 
                           
                       if (logging) {
                           log('-------');
                           log('Kanal: ' + name);
                           log('Status: ' + status); 
                       }
                       if (status) {                                      // wenn Zustand = true, dann wird die Anzahl der Bewegung hochgezählt
                           ++anzahlBewegungAn;  
                           textRaum.push(raumname.enumNames); 
                       }
                       ++anzahlBewegung;                                            // Zählt die Anzahl der vorhandenen Bewegung unabhängig vom Status
               });
               
            
            // 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
               textRaum = deleteDuplicates(textRaum);
               textRaum.sort(); 
               // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben
               if (logging) log("Anzahl Bewegung: " + anzahlBewegung + " # davon Bewegung an: " + anzahlBewegungAn);
               // die ermittelten Werte werden als javascript.0. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
               setState(idAnzahl, anzahlBewegung);                 // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Bewegung
               setState(idAnzahlEin, anzahlBewegungAn); 
               setState(idRaum, textRaum.join(', '));         // Räume, in denen Bewegung ist
            }
            
            // Trigger
            cacheSelectorState.on(function(obj) {    // bei Zustandänderung *.STATE im Gewerk Bewegung
              if (logging) log('Auslösende Bewegung: ' + 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
            
            
            

            /* Status Zahl Heizung
            
            zählt die Heizung in allen Räumen und meldet die Eingeschalteten namentlich
            Daten kommen vom Gewerk "Heizung"
            
            23.12.2016 Vorlage von "pix" - geändert von bahnuhr auf Heizung
            */
            var logging = false;
            
            var idAnzahlEin = 'javascript.0.System.Zusammenfassung.Heizung.Anzahl_ein',
               idAnzahl =    'javascript.0.System.Zusammenfassung.Heizung.Anzahl',
               idRaum =      'javascript.0.System.Zusammenfassung.Heizung.Raum';
            
            var cacheSelectorLevel = $('channel[state.id=*.VALVE_STATE](functions="Heizung")'); // Gewerk Heizung
            
            function checkDevices(obj) {
                // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Heizung auf 0
               var anzahlHeizungAn = 0;
               var anzahlHeizung = 0;
               var textRaum = [];
               if (logging) log('++++++ Heizung Anzahl ++++ ');
               cacheSelectorLevel.each(function (id, i) {                     // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht
                   var obj = getObject(id);
                   var status = getState(id).val;                              // Zustand *.LEVEL abfragen (jedes Element)
                   var raumname = getObject(id, "rooms");
                   
                       if (logging) {
                           log('-------');
                           log('Kanal: ' + name);
                           log('Status: ' + status + '%'); 
                       }
                       if (parseFloat(status) > 0) {                               // Wenn Dimmwert über 0
                           ++anzahlHeizungAn;    
                           textRaum.push(raumname.enumNames);  
                       }
                       ++anzahlHeizung;                                            // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status
               });   
             
            
             // 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
               textRaum = deleteDuplicates(textRaum);
               textRaum.sort();
               // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben
               if (logging) log("Anzahl Heizung: " + anzahlHeizung + " # davon Heizung an: " + anzahlHeizungAn);
               // die ermittelten Werte werden als javascript.0. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
               setState(idAnzahlEin, anzahlHeizungAn);
               setState(idAnzahl, anzahlHeizung);                 // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Licht
               setState(idRaum, textRaum.join(', '));         // Räume, in denen Heizung an ist
            }
            
            // Trigger
            cacheSelectorLevel.on(function(obj) {    // bei Zustandänderung *.LEVEL im Gewerk Licht
              if (logging) log('Auslösende Heizung: ' + 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
            
            
            

            /* 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);
            });
            
            
            

            P.S.
            DP musst du natürlich selber anlegen.

            Vielleicht ist das ja das richtige.

            1 Reply Last reply Reply Quote 0
            • Codierknecht
              Codierknecht Developer Most Active @Berlon last edited by

              @berlon
              Ungetestet - kurz und schmerzlos 😉

              var count, windowList, state, parent;
              on({id: Array.prototype.slice.apply($("(functions=window)")), change: "ne"}, async function (obj) {
                count = 0;
                windowList = '';
                var state_list = Array.prototype.slice.apply($("(functions=window)"));
                for (var state_index in state_list) {
                  state = state_list[state_index];
                  if (getState(state).val) count++;
                  parent = state.substring(0, state.lastIndexOf('.'));
                  windowList += getObject(parent).common.name + '<br/>';
                }
                setState("0_userdata.0.fenster_offen", count);
                setState("0_userdata.0.fenster_liste", windowList);
              });
              
              B 1 Reply Last reply Reply Quote 0
              • B
                Berlon @Codierknecht last edited by

                wow,
                Danke erst mal für die vielen Möglichkeiten. Bin nun gerade mal an der Sache von Pittini dran.
                Habe da ein kleines Problem:
                in dem Bild von Pittini ist da ein Scroll Balken vorhanden, bei mir nicht.
                Habe das basic - html Widget genommen.
                Wie hat er da den Scroll Balken hingezaubert??

                fensteroffentut2c.png

                Pittini.png

                Homoran 1 Reply Last reply Reply Quote 0
                • Homoran
                  Homoran Global Moderator Administrators @Berlon last edited by Homoran

                  @berlon sagte in Problem älteres Fenster-Zählen Skript:

                  Wie hat er da den Scroll Balken hingezaubert??

                  Wahrscheinlich im Widget konfiguriert.

                  Vertical overflow -> scroll (o.ä.)

                  EDIT:
                  Lieber mal für dich gesucht, bevor du es nicht findest
                  Screenshot_20221206-154547_Firefox.jpg

                  B 1 Reply Last reply Reply Quote 0
                  • B
                    Berlon @Homoran last edited by

                    @homoran
                    Danke, gefunden.
                    Ist im Abschnitt CSS Allgemein -> overflow-y. Hier scroll auswählen. Falls es jemand interessiert

                    Wieder was gelernt.

                    Homoran 1 Reply Last reply Reply Quote 0
                    • Homoran
                      Homoran Global Moderator Administrators @Berlon last edited by

                      @berlon sagte in Problem älteres Fenster-Zählen Skript:

                      Ist im Abschnitt CSS Allgemein -> overflow-y. Hier scroll auswählen

                      ach was!

                      1 Reply Last reply Reply Quote 0
                      • R
                        Rushmed Most Active @Codierknecht last edited by

                        @codierknecht Hab dein Blockly übernommen. Funktioniert klasse.
                        Ich lass mir die Anzahl geöffneter Sensoren per Telegramm zuschicken.
                        Hast du ne ahnung wie ich noch die Namen der geöffneten Geräte in meine Nachricht bekommen kann?
                        Bin leider auf Blockly beschränkt, ansonsten könnte ich nur C&P.
                        9c21cc68-fa28-46f9-bc6c-ce3e86516d80-grafik.png

                        Codierknecht 1 Reply Last reply Reply Quote 0
                        • Codierknecht
                          Codierknecht Developer Most Active @Rushmed last edited by

                          @rushmed
                          Geht nur per JS:

                          function getObjectName(const objectId) {
                              return getObject(objectId).common.name;
                          }
                          
                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          769
                          Online

                          31.9k
                          Users

                          80.1k
                          Topics

                          1.3m
                          Posts

                          6
                          14
                          636
                          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