NEWS
[gelöst] on() mit Vergleich und erst nach X Sekunden
-
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 -
@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); } });
-
@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); } });
-
@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! -
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!