NEWS
[gelöst] Alarm Skript mit Timer
-
Hi,
ich versuche mich gerade an einem Alarm Script für Türen, was mir nach Ablauf des Timers eine Mail senden soll (egal wie lange die Tür auf bleibt). Wird die Tür wieder vorher wieder verschlossen, soll der Timer gestoppt werden. Letztendlich will ich ein Script pro Fenster-/Türkontakt einsetzen und nur die ersten 2 Zeilen ändern.Das Script verhält sich aber etwas "magisch" - mal sendet es mehrmals eine Mail in nicht nachvollziehbaren Abständen - obwohl keine erneute Änderung des dp.states, mal nur einmal (wie gewollt). Magisch halt
Habe ich hier irgendwo einen (Denk-)Fehler drin? Beissen sich evtl. identisch benannte timerVariablen in verschiedenen Skripten?
var hmId = "hm-rpc.2.0000DBE99D0D53.1.STATE"; var alarmTimerMinuten = 2; var timeoutVar = null; on({id: hmId, change: "any"}, function(obj) { var status = getState(hmId).val; if (status === 1 || status === true) { timeoutVar = setTimeout(function() { sendTo("email", "Alarm!"); timeoutVar = null; }, (alarmTimerMinuten*60000)); } else if(timeoutVar) { clearTimeout(timeoutVar); timeoutVar = null; } });
Grüße
Kai -
@xdelta
Ändere besser Zeilen 6 bis 9 inon(hmId, function(dp) { // triggert bei Wertänderung if (dp.state.val) {
-
@paul53 said in Alarm Skript mit Timer:
@xdelta
Ändere besser Zeilen 6 bis 9 inon(hmId, function(dp) { // triggert bei Wertänderung if (dp.state.val) {
Ok, vielen Dank Paul!
Also so:
var hmId = "hm-rpc.2.0000DBE99D0D53.1.STATE"; var alarmTimerMinuten = 0.1; var timeoutVar = null; on(hmId, function(dp) { if (dp.state.val === 1 || dp.state.val === true) { timeoutVar = setTimeout(function() { sendTo("email", "Alarm - Testtür"); timeoutVar = null; }, (alarmTimerMinuten*60000)); } else if (timeoutVar) { clearTimeout(timeoutVar); timeoutVar = null; } });
-
@xdelta
Ja, du hast auf any reagiert und das ist jede Änderung des Datenpunktes, auch wenn es nur der Zeitstempel ist.Dein Vorhaben sollte sich als einfacher herausstellen wenn du dich mit folgenden Begriffen vertraut machst
selector, Aufzählungen, Funktionen
Unter Aufzählungen eine Funktion hinzufügen die für Fenster offen steht. Dann die dortige id ohne enum.functions. dort eintragen wo ich online stehen habe und den DP in der Objektübersicht diese Funktion zu weisen.
Nur ein Beispiel
const devices = $('state(functions=online)') for (let d of devices) log(d)
In deinem Fall wäre d dann das was in deinem Skript hmId ist
-
@ticaki said in Alarm Skript mit Timer:
@xdelta
Ja, du hast auf any reagiert und das ist jede Änderung des Datenpunktes, auch wenn es nur der Zeitstempel ist.Ahh! Ich dachte mir schon so etwas in der Art, weil auf irgendetwas musste ja reagiert worden sein - wusste aber nicht, dass auch der TS dazu gehört usw.!
Daher die "Magie" des ScriptsWieder was gelernt - danke! Auch für die Hausaufgaben - werde ich mich mit befassen!
vG
Kai