Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Problem älteres Fenster-Zählen Skript

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.5k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    990

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.3k

Problem älteres Fenster-Zählen Skript

Geplant Angeheftet Gesperrt Verschoben JavaScript
14 Beiträge 6 Kommentatoren 907 Aufrufe 5 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • B Offline
    B Offline
    Berlon
    schrieb am zuletzt editiert von
    #1

    Hallo Codierer,
    habe hier auf der Seite von ioBroker ein Skript gefunden das für mich goldrichtig ist. Nach einer kleinen Veränderung auf Verschluss funktioniert es auch. Aber leider nur mit Homematic Fensterkontakten. Die HomematicIP Fensterkontakte werden nicht erkannt.
    In meiner CCU ist der IP-Kontakt im Gewerk Verschluss mit drin.
    CCU-Verschluss.png
    In Objekten stellt der Kontakt den Zustand gegenüber der Homematic Kontakten aber anders dar.

    FTK-closed.png
    FTK-open.png

    /* System Zahl Fenster
     
    zählt die Fenster in allen Räumen und meldet die offenen Fenster namentlich
    Daten kommen vom Gewerk 'Fenster'
     
    erstellt: 17.06.2015 nach diesem Vorbild: http://forum.iobroker.net/viewtopic.php?f=21&t=869&sid=f9ba5657489ff431a1990884f90779c1#p6564
    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
    02.12.2015 Fehler beseitigt bei Anzahl Fenster, wenn offen (Unterscheidung RHS und TFK)
               Überprüfung des Zustandes (function fensterstatus) und Übergabe an Text
    25.01.2016 Fenster Nummer in Log korrigiert (+1)
    02.03.2016 Ansage für TTS aufbereitet
    02.07.2016 Regulärer Ausdruck (gierig) bei Aufbereitung für Ansage
    */
     
    function fensterstatus(zustand) {
        var meldung;
        switch (zustand) {
            case 1:
                meldung = 'RHS gekippt';
            break;
            case 2:
                meldung = 'RHS offen';
            break;
            case true:
                meldung = 'TFK offen';
            break;
            default:
                meldung = 'geschlossen';
            break;
        }
        return(meldung);
    }
     
    createState('zählen_Fenster.anzahlFenster', {     // wenn benötigt: Anzahl der vorhandenen Fenster
        type: 'number',
        min: 0,
        def: 0,
        role: 'value'
    });
    createState('zählen_Fenster.anzahlFensterauf', {  // Anzahl der Fenster, die auf sind als Variable unter Javascript.0 anlegen
        type: 'number',
        min: 0,
        def: 0,
        role: 'value'
    });
    createState('zählen_Fenster.textFensterauf', {      // Anzahl der offenen Fenster und deren Namen als Variable unter Javascript.0 anlegen
        type: 'string',
        def: ' ',
        role: 'value'
    });    
     
    var cacheSelectorState  = $('channel[state.id=*.STATE](functions="Fenster")');
     
    function countFenster(obj) {
         // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Fenster auf 0
        var anzahlFenster = 0;
        var anzahlFensterauf = 0;
        var textFensterauf = [];
     
        log('Auslösender Aktor: ' + obj.id + ': ' + obj.newState.val);              // Info im Log, welcher Zustand sich geändert hat
       
        cacheSelectorState.each(function (id, i) {                                  // Schleife für jedes gefundenen Element *.STATE im Gewerk Fenster
            var status = getState(id).val;                                          // Zustand *.STATE abfragen (jedes Element)
            var obj    = getObject(id);
            var name = getObject(id).common.name;
            var devicename = name.substring(0, name.indexOf(".STATE"));             //.state aus Text entfernen
            if (status /*TFK*/ || status === 1 || status === 2 /*RHS*/) {  // wenn Zustand offen, dann wird die Anzahl der Fenster hochgezählt
                 ++anzahlFensterauf;
                 textFensterauf.push(devicename + ' (' + fensterstatus(status) + ')');  // Name und Zustand zum Array hinzufügen
            }                
            log('Fenster #' + (i+1) + ': ' + devicename + ' ' + fensterstatus(status)/* + ' (' + status + ' / ' + typeof status + ')'*/);
            ++anzahlFenster;                                                        // Zählt die Anzahl der vorhandenen Fenster unabhängig vom Status
        }); 
      
        // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben
            log("Text: " + textFensterauf);
            log("Anzahl Fenster: " + anzahlFenster + " - davon Fenster auf: " +  anzahlFensterauf);
     
        // die ermittelten Werte werden als javascript.0. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
        setState("zählen_Fenster.textFensterauf", textFensterauf.join(',<br>'));    // Schreibt die aktuelle Namen der offenen Fenster
        setState("zählen_Fenster.anzahlFensterauf", textFensterauf.length);         // Schreibt die aktuelle Anzahl der offenen Fenster
        setState("zählen_Fenster.anzahlFenster", anzahlFenster);                    // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Fenster
    }
     
    cacheSelectorState.on(function(obj) {    // bei Zustandänderung *. STATE im Gewerk Fenster
        countFenster(obj);
    });
     
    // Variable für Ansage aufbereiten
    createState('zählen_Fenster.textFensteraufAnsage', {
        type: 'string',
        def: ' ',
        role: 'value'
    });  
    // Anzahl der Fenster, die auf sind, für Ansage aufbereitet
    var idQuelle = 'javascript.0.zählen_Fenster.textFensterauf',
        idAnsage = 'javascript.0.zählen_Fenster.textFensteraufAnsage';
     
    on(idQuelle, function (obj) {
        var text = obj.state.val;
        text = text.replace(/RHS/g, 'Drehgriff');
        text = text.replace(/TFK/g, 'Reedkontakt');
        text = (text.length > 1) ? 'Geöffnete Fenster: ' + text : 'Alle Fenster sind verschlossen';
        setState(idAnsage, text);
    });
    

    Ich vermute mal, das das Problem in der Zeile 67 steckt und dort auf die IP-Kontakte erweitert werden müsste. Aber wie?

    Gruß
    Bernd

    CodierknechtC 1 Antwort Letzte Antwort
    0
    • B Berlon

      Hallo Codierer,
      habe hier auf der Seite von ioBroker ein Skript gefunden das für mich goldrichtig ist. Nach einer kleinen Veränderung auf Verschluss funktioniert es auch. Aber leider nur mit Homematic Fensterkontakten. Die HomematicIP Fensterkontakte werden nicht erkannt.
      In meiner CCU ist der IP-Kontakt im Gewerk Verschluss mit drin.
      CCU-Verschluss.png
      In Objekten stellt der Kontakt den Zustand gegenüber der Homematic Kontakten aber anders dar.

      FTK-closed.png
      FTK-open.png

      /* System Zahl Fenster
       
      zählt die Fenster in allen Räumen und meldet die offenen Fenster namentlich
      Daten kommen vom Gewerk 'Fenster'
       
      erstellt: 17.06.2015 nach diesem Vorbild: http://forum.iobroker.net/viewtopic.php?f=21&t=869&sid=f9ba5657489ff431a1990884f90779c1#p6564
      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
      02.12.2015 Fehler beseitigt bei Anzahl Fenster, wenn offen (Unterscheidung RHS und TFK)
                 Überprüfung des Zustandes (function fensterstatus) und Übergabe an Text
      25.01.2016 Fenster Nummer in Log korrigiert (+1)
      02.03.2016 Ansage für TTS aufbereitet
      02.07.2016 Regulärer Ausdruck (gierig) bei Aufbereitung für Ansage
      */
       
      function fensterstatus(zustand) {
          var meldung;
          switch (zustand) {
              case 1:
                  meldung = 'RHS gekippt';
              break;
              case 2:
                  meldung = 'RHS offen';
              break;
              case true:
                  meldung = 'TFK offen';
              break;
              default:
                  meldung = 'geschlossen';
              break;
          }
          return(meldung);
      }
       
      createState('zählen_Fenster.anzahlFenster', {     // wenn benötigt: Anzahl der vorhandenen Fenster
          type: 'number',
          min: 0,
          def: 0,
          role: 'value'
      });
      createState('zählen_Fenster.anzahlFensterauf', {  // Anzahl der Fenster, die auf sind als Variable unter Javascript.0 anlegen
          type: 'number',
          min: 0,
          def: 0,
          role: 'value'
      });
      createState('zählen_Fenster.textFensterauf', {      // Anzahl der offenen Fenster und deren Namen als Variable unter Javascript.0 anlegen
          type: 'string',
          def: ' ',
          role: 'value'
      });    
       
      var cacheSelectorState  = $('channel[state.id=*.STATE](functions="Fenster")');
       
      function countFenster(obj) {
           // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Fenster auf 0
          var anzahlFenster = 0;
          var anzahlFensterauf = 0;
          var textFensterauf = [];
       
          log('Auslösender Aktor: ' + obj.id + ': ' + obj.newState.val);              // Info im Log, welcher Zustand sich geändert hat
         
          cacheSelectorState.each(function (id, i) {                                  // Schleife für jedes gefundenen Element *.STATE im Gewerk Fenster
              var status = getState(id).val;                                          // Zustand *.STATE abfragen (jedes Element)
              var obj    = getObject(id);
              var name = getObject(id).common.name;
              var devicename = name.substring(0, name.indexOf(".STATE"));             //.state aus Text entfernen
              if (status /*TFK*/ || status === 1 || status === 2 /*RHS*/) {  // wenn Zustand offen, dann wird die Anzahl der Fenster hochgezählt
                   ++anzahlFensterauf;
                   textFensterauf.push(devicename + ' (' + fensterstatus(status) + ')');  // Name und Zustand zum Array hinzufügen
              }                
              log('Fenster #' + (i+1) + ': ' + devicename + ' ' + fensterstatus(status)/* + ' (' + status + ' / ' + typeof status + ')'*/);
              ++anzahlFenster;                                                        // Zählt die Anzahl der vorhandenen Fenster unabhängig vom Status
          }); 
        
          // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben
              log("Text: " + textFensterauf);
              log("Anzahl Fenster: " + anzahlFenster + " - davon Fenster auf: " +  anzahlFensterauf);
       
          // die ermittelten Werte werden als javascript.0. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
          setState("zählen_Fenster.textFensterauf", textFensterauf.join(',<br>'));    // Schreibt die aktuelle Namen der offenen Fenster
          setState("zählen_Fenster.anzahlFensterauf", textFensterauf.length);         // Schreibt die aktuelle Anzahl der offenen Fenster
          setState("zählen_Fenster.anzahlFenster", anzahlFenster);                    // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Fenster
      }
       
      cacheSelectorState.on(function(obj) {    // bei Zustandänderung *. STATE im Gewerk Fenster
          countFenster(obj);
      });
       
      // Variable für Ansage aufbereiten
      createState('zählen_Fenster.textFensteraufAnsage', {
          type: 'string',
          def: ' ',
          role: 'value'
      });  
      // Anzahl der Fenster, die auf sind, für Ansage aufbereitet
      var idQuelle = 'javascript.0.zählen_Fenster.textFensterauf',
          idAnsage = 'javascript.0.zählen_Fenster.textFensteraufAnsage';
       
      on(idQuelle, function (obj) {
          var text = obj.state.val;
          text = text.replace(/RHS/g, 'Drehgriff');
          text = text.replace(/TFK/g, 'Reedkontakt');
          text = (text.length > 1) ? 'Geöffnete Fenster: ' + text : 'Alle Fenster sind verschlossen';
          setState(idAnsage, text);
      });
      

      Ich vermute mal, das das Problem in der Zeile 67 steckt und dort auf die IP-Kontakte erweitert werden müsste. Aber wie?

      Gruß
      Bernd

      CodierknechtC Online
      CodierknechtC Online
      Codierknecht
      Developer Most Active
      schrieb am zuletzt editiert von
      #2

      @berlon
      Pack doch alle entsprechenden Datenpunkte in eine Aufzählung
      7c20f574-6d5b-4d0b-8359-60cf37b5dc83-image.png
      und geh' dann mit 'nem Blockly ran
      a9e0c0e7-5b2e-499b-89f1-5362a379c425-image.png

      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

      Proxmox 9.1.1 LXC|8 GB|Core i7-6700
      HmIP|ZigBee|Tasmota|Unifi
      Zabbix Certified Specialist
      Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

      B R 2 Antworten Letzte Antwort
      0
      • CodierknechtC Codierknecht

        @berlon
        Pack doch alle entsprechenden Datenpunkte in eine Aufzählung
        7c20f574-6d5b-4d0b-8359-60cf37b5dc83-image.png
        und geh' dann mit 'nem Blockly ran
        a9e0c0e7-5b2e-499b-89f1-5362a379c425-image.png

        B Offline
        B Offline
        Berlon
        schrieb am zuletzt editiert von
        #3

        @codierknecht
        Mit Aufzählungen hatte ich noch nicht s zu tun. Muss ich mir erst mal anschauen wie das funktioniert.
        Werden beim Blockly auch die Raumnamen angezeigt?
        Wie bekäme ich die Ergebnisse in die Vis?
        Das Skript schreibt alles in einen Datenpunkt das ich mit einem Basic-String Widget darstelle.

        CodierknechtC 1 Antwort Letzte Antwort
        0
        • B Berlon

          @codierknecht
          Mit Aufzählungen hatte ich noch nicht s zu tun. Muss ich mir erst mal anschauen wie das funktioniert.
          Werden beim Blockly auch die Raumnamen angezeigt?
          Wie bekäme ich die Ergebnisse in die Vis?
          Das Skript schreibt alles in einen Datenpunkt das ich mit einem Basic-String Widget darstelle.

          CodierknechtC Online
          CodierknechtC Online
          Codierknecht
          Developer Most Active
          schrieb am zuletzt editiert von
          #4

          @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

          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

          Proxmox 9.1.1 LXC|8 GB|Core i7-6700
          HmIP|ZigBee|Tasmota|Unifi
          Zabbix Certified Specialist
          Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

          B 1 Antwort Letzte Antwort
          0
          • crunchipC Abwesend
            crunchipC Abwesend
            crunchip
            Forum Testing Most Active
            schrieb am zuletzt editiert von
            #5

            @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

            umgestiegen von Proxmox auf Unraid

            1 Antwort Letzte Antwort
            0
            • CodierknechtC Codierknecht

              @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 Offline
              B Offline
              Berlon
              schrieb am zuletzt editiert von
              #6

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

              CodierknechtC 1 Antwort Letzte Antwort
              0
              • bahnuhrB Online
                bahnuhrB Online
                bahnuhr
                Forum Testing Most Active
                schrieb am zuletzt editiert von
                #7

                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.


                Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
                Danke.
                gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
                ScreenToGif :https://www.screentogif.com/downloads.html

                1 Antwort Letzte Antwort
                0
                • B Berlon

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

                  CodierknechtC Online
                  CodierknechtC Online
                  Codierknecht
                  Developer Most Active
                  schrieb am zuletzt editiert von
                  #8

                  @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);
                  });
                  

                  "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                  Proxmox 9.1.1 LXC|8 GB|Core i7-6700
                  HmIP|ZigBee|Tasmota|Unifi
                  Zabbix Certified Specialist
                  Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                  B 1 Antwort Letzte Antwort
                  0
                  • CodierknechtC Codierknecht

                    @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 Offline
                    B Offline
                    Berlon
                    schrieb am zuletzt editiert von
                    #9

                    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

                    HomoranH 1 Antwort Letzte Antwort
                    0
                    • B Berlon

                      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

                      HomoranH Nicht stören
                      HomoranH Nicht stören
                      Homoran
                      Global Moderator Administrators
                      schrieb am zuletzt editiert von Homoran
                      #10

                      @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

                      kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                      Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                      der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                      B 1 Antwort Letzte Antwort
                      0
                      • HomoranH 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 Offline
                        B Offline
                        Berlon
                        schrieb am zuletzt editiert von
                        #11

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

                        Wieder was gelernt.

                        HomoranH 1 Antwort Letzte Antwort
                        0
                        • B Berlon

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

                          Wieder was gelernt.

                          HomoranH Nicht stören
                          HomoranH Nicht stören
                          Homoran
                          Global Moderator Administrators
                          schrieb am zuletzt editiert von
                          #12

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

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

                          ach was!

                          kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                          Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                          der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                          1 Antwort Letzte Antwort
                          0
                          • CodierknechtC Codierknecht

                            @berlon
                            Pack doch alle entsprechenden Datenpunkte in eine Aufzählung
                            7c20f574-6d5b-4d0b-8359-60cf37b5dc83-image.png
                            und geh' dann mit 'nem Blockly ran
                            a9e0c0e7-5b2e-499b-89f1-5362a379c425-image.png

                            R Offline
                            R Offline
                            Rushmed
                            Most Active
                            schrieb am zuletzt editiert von
                            #13

                            @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

                            CodierknechtC 1 Antwort Letzte Antwort
                            0
                            • R Rushmed

                              @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

                              CodierknechtC Online
                              CodierknechtC Online
                              Codierknecht
                              Developer Most Active
                              schrieb am zuletzt editiert von
                              #14

                              @rushmed
                              Geht nur per JS:

                              function getObjectName(const objectId) {
                                  return getObject(objectId).common.name;
                              }
                              

                              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                              Proxmox 9.1.1 LXC|8 GB|Core i7-6700
                              HmIP|ZigBee|Tasmota|Unifi
                              Zabbix Certified Specialist
                              Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                              1 Antwort Letzte Antwort
                              0
                              Antworten
                              • In einem neuen Thema antworten
                              Anmelden zum Antworten
                              • Älteste zuerst
                              • Neuste zuerst
                              • Meiste Stimmen


                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              309

                              Online

                              32.6k

                              Benutzer

                              82.3k

                              Themen

                              1.3m

                              Beiträge
                              Community
                              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                              ioBroker Community 2014-2025
                              logo
                              • Anmelden

                              • Du hast noch kein Konto? Registrieren

                              • Anmelden oder registrieren, um zu suchen
                              • Erster Beitrag
                                Letzter Beitrag
                              0
                              • Home
                              • Aktuell
                              • Tags
                              • Ungelesen 0
                              • Kategorien
                              • Unreplied
                              • Beliebt
                              • GitHub
                              • Docu
                              • Hilfe