Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Raumlüftung einzeln loggen

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Raumlüftung einzeln loggen

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

      Hi,

      ich habe in jedem Raum Fenster mit mindestens zwei Flügeln. An jedem habe ich einen eigenen Fensterkontakt angebracht. Ich würde gerne erfassen, wann das letzte mal gelüftet wurde und wie lange.

      Idealerweise mit einem Skript, das alle Fenstersensoren überwacht und das bei Änderungen dynamisch schaut, wie der Zustand der anderen Sensoren des gleichen Zimmer sind um zu ermitteln ob alle Sensoren zu sind (also das Lüften beendet wurde) oder ob mind. ein Sensor offen ist, das Lüften also beginnt.

      Wie kann ich mir zu einem Sensor den Raum holen, den er zu gewiesen ist und dann dazu alle Fenstersensoren dieses Raums ermitteln um dann da durch zu itterieren. Leider ist mein Verständnis der Selektoren und javascript da sehr begrenzt.

      Vielleicht kann mir da jemand mit ein paar Codesnipseln weiterhelfen.

      Falls sich jemand findet, vielen dank schonmal

      paul53 Chris 1 2 Replies Last reply Reply Quote 0
      • paul53
        paul53 @martinschm last edited by paul53

        @martinschm sagte: zu einem Sensor den Raum holen, den er zu gewiesen ist

        Wie ist der Raum zugewiesen? Dem Kanal oder nur dem Datenpunkt für den Fensterkontakt? Bitte Beispiel-Datenpunkt mit Baum zeigen!

        @martinschm sagte in Raumlüftung einzeln loggen:

        ein paar Codesnipseln

        Javascript oder Blockly?

        Beispiel Javascript für HM-Kontakte:

        const idsFenster = $('channel[state.id=*.STATE](rooms=wohnen)(functions=fenster)');
        const idDauer = '0_userdata.0.Wohnen.Fenster.Offendauer';
        const idLueften = '0_userdata.0.Wohnen.Fenster.Lueftung'; 
        
        var merker = false;
        var start = Date.now();
        
        idsFenster.on(function() {
            let offen = false;
            idsFenster.each(function(id) {
                if(getState(id).val) offen = true;
            });
            if(offen) {
                if(!merker) start = Date.now();
            } else {
                let dauer = Date.now() - start;
                setState(idDauer, formatDate(dauer, 'hh:mm:ss'), true);
            };
            merker = offen;
            setState(idLueften, offen, true);
        });
        
        M 1 Reply Last reply Reply Quote 0
        • M
          martinschm @paul53 last edited by

          Hi @paul53 ,

          danke für dein Skript. Wenn ich das richtig interpretiere, werden alle Fenster (functions=fenster) in allen Räumen die (wohnen) zugeordnet sind selektiert.

          Ähnlich könnte ich mir vermutlich auch alle Fenster eines speziellen Raums selektieren und die durch itterieren.

          ebff2e78-2e2d-431a-a057-894516730624-image.png

          Ich hab den ganzen Kanal einem Zimmer zu geordnet und dazu bei Funktion eine mal Fenster dem ganzen Kanal (von früher noch) und spezifisch dem State für Offen noch die Funktion windowStatus, weil ich dies in einem anderen Skript speziell auswerte, das mir die offenen Fenster zählt.

          Javascript oder Blockly?

          Blockly ist einfacher, aber ich fuchs mich auch durch das javascript durch.

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

            @martinschm sagte: Ähnlich könnte ich mir vermutlich auch alle Fenster eines speziellen Raums selektieren

            Wenn alle Fenster(kontakte) unter "alias.0.Fenster" zu finden sind, kann man es auch anders eingrenzen.

            Blockly_temp.JPG

            Funktion formatDiff(ms, format):

            return formatDate(ms, format);
            
            M 1 Reply Last reply Reply Quote 1
            • M
              martinschm @paul53 last edited by

              @paul53 said in Raumlüftung einzeln loggen:

              @martinschm sagte: Ähnlich könnte ich mir vermutlich auch alle Fenster eines speziellen Raums selektieren

              Wenn alle Fenster(kontakte) unter "alias.0.Fenster" zu finden sind, kann man es auch anders eingrenzen.

              Blockly_temp.JPG

              Funktion formatDiff(ms, format):

              return formatDate(ms, format);
              

              Ist es auch möglich, den Selector dynamisch zu erstellen ?

              Hatte überlegt, bei Änderung des windowstatus, den Raum des Sensors zu ermitteln und dann den Selector dynamisch mit dem Raumnamen zu versehen.

              function listWindows(room) {
              
                  const idsFenster = $('channel[state.id=*.ACTUAL](rooms='+ room +')(functions=windowstatus)');
                  log("Aktion in Raum " + room);
              
                  idsFenster.each(function(id) {
                      //if(getState(id).val) offen = true;
                      log("Fenster im Raum " + id + " " + idsFenster[id]);
                  });  
              }
              
              function registerSubscription()
              {
              $('state(functions=windowstatus)').on(function(obj) {
              //RaumErmitteln(obj);
                  log(obj.channelId + " " + getObject(obj.channelId,"rooms").enumNames);
                  listWindows (getObject(obj.channelId,"rooms").enumNames);
              });
              }
              

              Die Ermittlung des Raums klappt und wird auch korrekt übergeben. Ich bekomme dann aber keine Auflistung der Fenster ausgegeben. Ist bei meinem Selektor etwas falsch ?

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

                @martinschm
                .enumNames liefert ein Array. Deshalb

                    listWindows (getObject(obj.channelId,"rooms").enumNames[0]);
                

                Außerdem muss der Name exakt so geschrieben wie in der ID der Aufzählung (Groß- / Kleinschreibung). Beispiel ID: enum.rooms.Arbeitszimmer

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

                  @paul53 said in Raumlüftung einzeln loggen:

                  listWindows (getObject(obj.channelId,"rooms").enumNames[0]);

                  Hi,

                  das mit dem [0] habe ich angepasst. Die Exakte Schreibweise sollte ja sicher gestellt sein, da ich den Namen per Befehl auslese und dann als Parameter weiter gebe, da kann ja also kein Tippfehler oder so passieren.

                  Allerdings scheint der Selektor nicht zu funktionieren. idsFenster.lenght ist immer 0, habe beide Varianten probiert.

                  function listWindows(room) {
                  
                      const idsFenster = $('channel[state.id=*.ACTUAL](rooms='+ room +')(functions=windowstatus)');
                      //const idsFenster = $('alias.0.Fenster.*(rooms='+ room);
                      
                      log("Aktion in Raum " + room + " " + idsFenster.length);
                  
                      for(let i = 0; i < idsFenster.length; i++) 
                      { 
                          log("Fenster im Raum " + i + " " + idsFenster[i]);
                      }   
                  }
                  
                  function registerSubscription()
                  {
                  $('state(functions=windowstatus)').on(function(obj) {
                  
                      //log(obj.channelId + " " + getObject(obj.channelId,"rooms").enumNames[0]);
                      listWindows (getObject(obj.channelId,"rooms").enumNames[0]);
                  });
                  }
                  
                  paul53 1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 @martinschm last edited by paul53

                    @martinschm sagte: Die Exakte Schreibweise sollte ja sicher gestellt sein, da ich den Namen per Befehl auslese

                    Du verwendest den Namen, aber der Selektor braucht den letzten Teil der ID, der sich in Groß- / Kleinschreibung oder sogar in der Sprache vom Namen unterscheiden kann. Beispiel (Name: "Küche"):

                    enum_kitchen.JPG

                    Der Selektor braucht rooms=kitchen.

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

                      @paul53 said in Raumlüftung einzeln loggen:

                      @martinschm sagte: Die Exakte Schreibweise sollte ja sicher gestellt sein, da ich den Namen per Befehl auslese

                      Du verwendest den Namen, aber der Selektor braucht den letzten Teil der ID, der sich in Groß- / Kleinschreibung oder sogar in der Sprache vom Namen unterscheiden kann. Beispiel (Name: "Küche"):

                      enum_kitchen.JPG

                      Der Selektor braucht rooms=kitchen.

                      Ja ok, ich glaub ich versteh das "Problem". Kann ich mir denn statt dem "Klarnamen" auch die ID des Raums geben lassen, damit es besser funktioniert?

                      So hat es jetzt erstmal geklappt, das ich beide Fenster des einen Raums bekomme.

                      function listWindows(room) {
                      
                          //const idsFenster = $('channel[state.id=*.ACTUAL](rooms='+ room +')(functions=windowstatus)');
                          //const idsFenster = $('channel[state.id=*.ACTUAL](rooms=Arbeitszimmer)(functions=windowstatus)');
                          //const idsFenster = $('alias.0.Fenster.*(rooms='+ room);
                          const idsFenster = $('alias.0.Fenster.*(rooms='+room+')(functions=windowstatus)');
                      
                          
                          log("Aktion in Raum " + room + " " + idsFenster.length);
                      
                          for(let i = 0; i < idsFenster.length; i++) 
                          { 
                              log("Fenster im Raum " + i + " " + idsFenster[i]);
                          }   
                      }
                      
                      paul53 2 Replies Last reply Reply Quote 0
                      • paul53
                        paul53 @martinschm last edited by paul53

                        @martinschm sagte: statt dem "Klarnamen" auch die ID des Raums geben lassen

                        Versuche mal:

                            listWindows(getObject(obj.channelId,"rooms").enumIds[0].split('.')[2]);
                        

                        oder

                            listWindows(getObject(obj.channelId,"rooms").enumIds[0].substring(11));
                        
                        1 Reply Last reply Reply Quote 0
                        • paul53
                          paul53 @martinschm last edited by

                          @martinschm sagte: "Klarnamen"

                          Den Namen kann man innerhalb der Funktion wieder ermitteln, nachdem der Selektor gebildet wurde.

                          function listWindows(room) {
                              const idsFenster = $('alias.0.Fenster.*.ACTUAL(rooms=' + room + ')');
                              room = getObject('enum.rooms.' + room).common.name; // Raumname
                          
                          1 Reply Last reply Reply Quote 0
                          • paul53
                            paul53 @martinschm last edited by paul53

                            @martinschm sagte: möglich, den Selector dynamisch zu erstellen ?

                            Vorschlag:

                            $('alias.0.Fenster.*.ACTUAL').on(function(dp) {
                                let room = getObject(dp.channelId,"rooms").enumIds[0];
                                const ids = $('alias.0.Fenster.*.ACTUAL(rooms=' + room.substring(11) + ')');
                                room = getObject(room).common.name; // Raumname
                                const path = '0_userdata.0.Fenster.' + room;
                                const idLueften = path + '.Lueftung'; 
                            
                                let offen = false;
                                ids.each(function(id) {
                                    if(getState(id).val) offen = true;
                                });
                                if(!offen) { // letztes Fenster im Raum geschlossen 
                                    let dauer = Date.now() - getState(idLueften).lc;
                                    setState(path + '.Offendauer', formatDate(dauer, 'hh:mm:ss'), true);
                                };
                                setState(idLueften, offen, true);
                            });
                            
                            1 Reply Last reply Reply Quote 0
                            • Chris 1
                              Chris 1 @martinschm last edited by

                              @martinschm said in Raumlüftung einzeln loggen:

                              ich habe in jedem Raum Fenster mit mindestens zwei Flügeln. An jedem habe ich einen eigenen Fensterkontakt angebracht. Ich würde gerne erfassen, wann das letzte mal gelüftet wurde und wie lange.

                              Ich hab oft Ideen, welche andere etwas merkwürdig finden.
                              Schön, dass es mir auch mal so geht, dann kann ich die Leute bei mir besser verstehen 😆

                              Da "Lüften" ja ein weder objektiv, noch subjektiv fassbares Ergebnisse (Daten) liefert, wenn man die Anzahl der Fenster und die Dauer nimmt (zumal - bisher - kein Durchzug erfasst wird), möchte ich mir die Freiheit erlauben und Dir einen Gedankenanstoß? Vorschlag? machen.

                              Was hälst Du von der Idee die allgemeine/gefühlte Luftqualität durch Messung von Luftfeuchte plus ggf Gas-/Partikel-Messung zu ermitteln? Da bräuchtest Du pro Zimmer nur 1 Sensoren-Set (Temp/Hum vermutlich eh schon je Zimmer vorhanden) und würdest im Mittel schnell sehen, welcher Raum der Übeltäter ist, so dass Dir kaskadiert vermittelt werden könnte, wo Lüften angesagt ist.

                              Gruss von der Ostsee
                              Chris

                              M 1 Reply Last reply Reply Quote 0
                              • M
                                martinschm @Chris 1 last edited by

                                @chris-1 said in Raumlüftung einzeln loggen:

                                @martinschm said in Raumlüftung einzeln loggen:

                                ich habe in jedem Raum Fenster mit mindestens zwei Flügeln. An jedem habe ich einen eigenen Fensterkontakt angebracht. Ich würde gerne erfassen, wann das letzte mal gelüftet wurde und wie lange.

                                Ich hab oft Ideen, welche andere etwas merkwürdig finden.
                                Schön, dass es mir auch mal so geht, dann kann ich die Leute bei mir besser verstehen 😆

                                Da "Lüften" ja ein weder objektiv, noch subjektiv fassbares Ergebnisse (Daten) liefert, wenn man die Anzahl der Fenster und die Dauer nimmt (zumal - bisher - kein Durchzug erfasst wird), möchte ich mir die Freiheit erlauben und Dir einen Gedankenanstoß? Vorschlag? machen.

                                Was hälst Du von der Idee die allgemeine/gefühlte Luftqualität durch Messung von Luftfeuchte plus ggf Gas-/Partikel-Messung zu ermitteln? Da bräuchtest Du pro Zimmer nur 1 Sensoren-Set (Temp/Hum vermutlich eh schon je Zimmer vorhanden) und würdest im Mittel schnell sehen, welcher Raum der Übeltäter ist, so dass Dir kaskadiert vermittelt werden könnte, wo Lüften angesagt ist.

                                Gruss von der Ostsee
                                Chris

                                Hi Chris,

                                danke für den Impuls. Temp Sensoren hab ich in fast jedem Raum. Mir geht es allerdings auch so darum zu wissen wann in welchem Raum das letzte mal "frische" Luft rein gekommen ist. Außerdem soll in einem zweiten Schritt, darauf hingewiesen werden, wenn das Fenster vielleicht -bei Außentemperaturen unter 8 Grad - zu lange gelüftet wird und alles auskühlt.

                                Viele Grüße
                                Martin

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

                                Support us

                                ioBroker
                                Community Adapters
                                Donate

                                1.1k
                                Online

                                31.7k
                                Users

                                79.7k
                                Topics

                                1.3m
                                Posts

                                3
                                14
                                465
                                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