Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [gelöst] on() mit Vergleich und erst nach X Sekunden

    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

    [gelöst] on() mit Vergleich und erst nach X Sekunden

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

      Hallo Zusammen,
      ich bin noch ganz frisch am Programmieren lernen und tue mich mit on() etwas schwer.

      Ich will etwas ähnliches machen wie hier: https://forum.iobroker.net/topic/62207/on-id-mit-timer-kombiniert-mehrfacher-aufruf/10

      Ich möchte, wenn ein Fenster bei unterschreiten einer Temperatur länger offen ist als "timeout" eine Nachricht schicken auslösen. Diese Nachricht soll dann solange ein mal die Minute kommen bis das Fenster wieder geschlossen ist.

      Die Idee: Sobald der Sensor auf "true" geht (Fenster is offen), und der Timeout abgelaufen ist (tsGe) starte die Funktion sendviasignal.

      on({ id: "hm-rpc.0.KEQ0006299.1.SENSOR", val: true, tsGe: new Date().getTime() + timeout }, function (obj) {
          schedule('* * * * *', function () {
              sendviasignal("Fenster X ist länger als " + Date().getTime() - hm.rpc.0.KEQ0006299.1.SENSOR.lc + " offen");
          })
      });
      

      Leider funkioniert das mit "tsGe: new Date().getTime() + timeout" nicht so wie ich mir das gedacht habe 🙂 Hat jemand eine Idee wie man das realisieren könnte?

      Grüße,
      Fachdachdecker

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

        @flachdachdecker sagte: länger offen ist als "timeout"

        Dafür verwendet man setTimeout().

        @flachdachdecker sagte in on() mit Vergleich und erst nach X Sekunden:

        Nachricht soll dann solange ein mal die Minute kommen bis das Fenster wieder geschlossen ist.

        Das macht man mit setInterval() und clearInterval().

        Etwa so:

        // IDs anpassen!
        const idFenster = 'hm-rpc.0.KEQ0006299.1.SENSOR';
        const idTemp  = 'xyz';
        const delay = 10; // Minuten
        
        var timer = null;
        var interval = null;
        
        on(idFenster, function(dp) {
            if(dp.state.val) {
                timer = setTimeout(function() {
                    if(getState(idTemp).val < 16) {
                        interval = setInterval(function() {
                            // Nachricht "Fenster X ist seit " + Math.round((Date.now() - dp.state.lc) / 60000) + " Minuten offen"
                        }, 60000);
                    }
                }, 60000 * (delay - 1));
            } else { // Fenster schließt
                clearTimeout(timer);
                clearInterval(interval);
            }
        });
        
        1 Reply Last reply Reply Quote 0
        • paul53
          paul53 @flachdachdecker last edited by

          @flachdachdecker
          Version nur mit Intervall:

          // IDs anpassen!
          const idFenster = 'hm-rpc.0.KEQ0006299.1.SENSOR';
          const idTemp  = 'xyz';
          const delay = 10; // Minuten
          
          var interval = null;
          
          on(idFenster, function(dp) {
              if(dp.state.val) {
                  let cnt = 0;
                  interval = setInterval(function() {
                      cnt++;
                      if(cnt >= delay && getState(idTemp).val < 16) {
                          // Nachricht "Fenster X ist seit " + Math.round((Date.now() - dp.state.lc) / 60000) + " Minuten offen"
                      }
                  }, 60000);
              } else { // Fenster schließt
                  clearInterval(interval);
              }
          });
          
          F 1 Reply Last reply Reply Quote 0
          • F
            flachdachdecker @paul53 last edited by

            @paul53 Du bist mein Held! Ich habe mich für die 2. Variante entschieden - macht genau das was ich will und ist für mich als ungeübten noch gut lesbar!
            Vielen Dank!

            1 Reply Last reply Reply Quote 0
            • F
              flachdachdecker last edited by

              Falls jemand Interesse an der kompletten Lösung hat (Verbesserungsvorschläge willkommen).

              Aufgabe: Sende jede Minute eine Nachricht wenn bestimmte Fenster länger als X Minuten offen ist und die Aussentemperatur kleiner als "activeTemp" ist. Das hilft meiner vergesslichen Familie viel Heizenergie zu sparen 🙂

              const aFenster = [
                  {
                      "id": "hm-rpc.0.KEQ0006299.6.SENSOR",
                      "descr": "in der Küche Richtung Garten"
                  },
                  {
                      "id": "hm-rpc.0.KEQ0006287.1.SENSOR",
                      "descr": "im HWR"
                  },
                  {
                      "id": "hm-rpc.0.KEQ0006287.6.SENSOR",
                      "descr": "im Wohnzimmer links"
                  },
                  {
                      "id": "hm-rpc.0.KEQ0006287.12.SENSOR",
                      "descr": "im Wohnzimmer rechts"
                  }
              ];
              const idTemp = 'hm-rpc.1.NEQ0773998.1.TEMPERATURE';  // Aussentemperatur
              const activeTemp = 15;
              const delay = 5; // Minuten solange im Intervall unten 60000 steht
              var interval = null;
              
              
              aFenster.forEach(Fenster => on(Fenster.id, function (dp) {
                  if (getState(dp.id).val) {
                      console.log("Fenster " + Fenster.descr + " geoeffnet");
                      let cnt = 0;
                      interval = setInterval(function () {
                          cnt++;
                          // wenn Counter größer als delay && Aussentemperatur kleiner als activeTemp
                          if (cnt >= delay && getState(idTemp).val < activeTemp) {
                              var duration = Math.round((Date.now() - dp.state.lc) / 60000)
              
                              // sende Nachricht ins Log, oder via telegram, oder lass Alexa schimpfen..
                              console.log("Das Fenster " + Fenster.descr + " ist schon " + duration + " Minuten offen."); 
                          }
                      }, 60000);
                  } else { // Fenster schließt
                      clearInterval(interval);
                      console.log("Fenster " + Fenster.descr + " geschlossen");
                  }
              })); 
              
              

              Danke noch mal @paul53!

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

              Support us

              ioBroker
              Community Adapters
              Donate

              929
              Online

              31.9k
              Users

              80.2k
              Topics

              1.3m
              Posts

              2
              5
              232
              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