NEWS
Pushover senden mit zeitlichem Versatz
-
Hallo zusammen,
momentan nutze ich ein Skript, das mir eine Pushover-Nachricht sendet, wenn die Alarmanlage scharf ist und eine Bewegung festgestellt wird.
var idMotion = "hm-rpc.0.KEQ084xxxx.1.MOTION"; // Bewegungsmelder Diele Datenpunkt MOTION var idAlarm = "hm-rega.0.26xxx"/*Alarmanlage*/; on({id:idAlarm, change:'ne', val: true}, function () { warten(); }); function warten() { setTimeout(waittime, 1 * 500); // Warteschleife, 1 * 500 Millisekunden und rufe dann waittime auf } function waittime() { var Alarm = getState(idAlarm).val; if (Alarm === true) sendTo("pushover.0", "Alarmanlage AKTIVIERT"); } on({id:idMotion, val: true}, function () { var Alarm = getState(idAlarm).val; if (Alarm === true) sendTo("pushover.1", "Alarmanlage AKTIVIERT und Diele: Motion"); });
Jetzt würde ich das Skript gerne so umbauen, dass folgendes passiert.
Wenn Alarmanlage scharf und Bewegung entdeckt, warte x Sekunden. Wird die Alarmanlage innerhalb von x Sekunden deaktiviert sende keine Pushover-Nachricht. Bleibt die Alarmanlage nach x Sekunden noch scharf, sende eine Pushover-Nachricht.
Hat jemand eine Idee, wie ich das Skript abändern muss?
Vielen Dank im Voraus.
Martin
-
Hallo,
abgesehen von dem umständlichen Konstrukt mit den Funktionen warten() und waittime() kannst du ein setTimeout von X Sekunden vor die pushover-Sendung setzen. Wenn dann die Alarmanlagen in der Zwischenzeit auf false geht, kannst du den Timeout mit clearTimeout löschen.
Hier mal mein Versuch:
var idMotion = "hm-rpc.0.KEQ084xxxx.1.MOTION"; // Bewegungsmelder Diele Datenpunkt MOTION var idAlarm = "hm-rega.0.26xxx"/*Alarmanlage*/; var timer = null; // Timervariable setzen und nullen (bei jedem Skriptstart) on({ id:idAlarm, change:'ne' }, function (obj) { setTimeout(function() { if (obj.state.val) sendTo("pushover.0", "Alarmanlage AKTIVIERT"); // verzögerte Meldung if (!obj.state.val) { sendTo("pushover.0", "Alarmanlage DEAKTIVIERT"); // optionale Verzögerte Meldung if(timer) clearTimeout(timer); // anderen Timer aus Motion löschen timer = null; // anderen Timer nullen } }, 1000 * 0.5); // halbe Sekunde bis Ausführung }); on({ id:idMotion, val: true }, function () { var alarm = getState(idAlarm).val; // Zustand Alarmanlage aktuell abholen timer = setTimeout(function() { // Verzögerung starten (alles in geschweiften Klammern wird verzögert) timer = null; // verzögert Timer nullen if (alarm) sendTo("pushover.1", "Alarmanlage AKTIVIERT und Diele: Motion"); // verzögert Nachricht senden }, 1000 * 10); // Verzögerungseinstellungen; Meldung über Bewegung erst nach 10s });
Wenn die Alarmanlage eingeschaltet wird (vermutlich bei true von Boolean Typ Homematic-Variable), dann wird verzögert eine Meldung über das EInschalten geschickt (0.5 Sekunden oder 500ms später). Ebenso beim Ausschalten (kannst du auskommentieren).
Wenn bei aktivierter Alarmanlage eine Bewegung erkannt wird, dann startet in der zweiten on-Subscription ein Timer (10s oder 10000 Millisekunden). Wenn diese Zeit abgelaufen ist, wird der Timer sicherheitshalber genullt und eine Pushnachricht geschickt, dass eine Bewegung erkannt wurde. Statt 10s kannste natürlich auch eine kürzere Zeit nehmen. Wenn nun während dieser 10s die Alarmanlage deaktiviert wird, dann wird der gestartete Timer abgebrochen und die eigentlich anstehenden Aufgaben aus den geschweiften Klammern werden nicht abgearbeitet.
Damit beide on-Subscriptions auf die timer-Variable zugreifen können, wird sie ganz oben im Skript deklariert (var timer = null).
Das Skript bitte nicht in "global", sondern in "common" speichern. Nenne es doch einfach "Alarmanlage".
Man kann es später einfach erweitern, um weitere Bewegungsmelder einzubauen oder zB die Zeiten mitzuschicken, wann der Alarm ausgelöst wurde ("Alarmanlage EIN und Bewegung in Diele (vor 10s)"). Ich gehe davon aus, es dient dazu, keinen Fehlalarm zu provozieren, wenn man selbst beim Betreten der Wohnung in den Bewegungsmelderbereich kommt.
Gib mal Feedback
Gruß
Pix
-
Hallo Pix,
du bist mein Held, was würde ich dafür tun programmieren zu können. Dein Skript hat zu 100% meinen Vorstellungen entsprochen.
Der Grund weshalb ich eine Verzögerung möchte ist in der Tat, die Vermeidung eines Fehlalarms.
Echt unglaublich wie einem hier geholfen wird …. tausend Dank.
<u>Anderes Thema:</u>
Momentan habe ich für jeden TFK (Tür-Fenster-Kontakt) ein eigenes Skript (das gleiche wie beim Motion-Alarm in der Diele), um bei einem offenen Kontakt auch eine Pushover zu senden.
Mit Sicherheit kann man alle TFK in einem Skript zusammenfassen, richtig? Wenn es keine Umstände machen sollte, würde ich mich freuen wenn du mir noch einmal unter die Arme greifen könntest.
Wichtig wäre, dass der auslösende TFK auch mit seinem Namen in der Pushover mitgeschickt wird.
z.B. Alarmanlage AKTIVIERT und Gästebad: Fenster OFFEN
Schönen Abend und Gruß
Martin
-
Hallo,
schön, dass es läuft.
Sind die TFK alle einem Gewerk zugeordnet? Dann ist es einfach und man muss keine Ausnahmen festlegen (Ausnahme können umgebaute TFK für sonstige Aufgaben oder so sein). Notfalls leg in der HM ein Gewerk an. Bespielname: "Alarmsensor".
Pix
-
@pix:Hallo,
schön, dass es läuft.
Sind die TFK alle einem Gewerk zugeordnet? Dann ist es einfach und man muss keine Ausnahmen festlegen (Ausnahme können umgebaute TFK für sonstige Aufgaben oder so sein). Notfalls leg in der HM ein Gewerk an. Bespielname: "Alarmsensor".
Pix `
Hallo Pix,Bisher verwende ich die TFK nur an Türen und Fenstern. Also kein "Fremdeinsatz". Alle TFK sind einem Gewerk zugeordnet.
Gruß Martin
Gesendet von iPhone mit Tapatalk
-
Suchfunktion nutzen, dann muss pix das nicht für dich machen.
Er hat hier ein komplettes Skript gepostet.