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. [gelöst] on() mit Vergleich und erst nach X Sekunden

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.4k

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

Geplant Angeheftet Gesperrt Verschoben JavaScript
5 Beiträge 2 Kommentatoren 393 Aufrufe 2 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.
  • F Offline
    F Offline
    flachdachdecker
    schrieb am zuletzt editiert von flachdachdecker
    #1

    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

    paul53P 2 Antworten Letzte Antwort
    0
    • F 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

      paul53P Offline
      paul53P Offline
      paul53
      schrieb am zuletzt editiert von paul53
      #2

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

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

      1 Antwort Letzte Antwort
      0
      • F 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

        paul53P Offline
        paul53P Offline
        paul53
        schrieb am zuletzt editiert von
        #3

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

        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

        F 1 Antwort Letzte Antwort
        0
        • paul53P paul53

          @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 Offline
          F Offline
          flachdachdecker
          schrieb am zuletzt editiert von
          #4

          @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 Antwort Letzte Antwort
          0
          • F Offline
            F Offline
            flachdachdecker
            schrieb am zuletzt editiert von
            #5

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

            703

            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