NEWS
Alarmmeldung, sofern viele unreach in kurzer Zeit. Kann ein Könner drauf gucken?
-
Hallo zusammen,
als Ergänzung meines Alarmanlagenskripts schwebt mir vor, einen Alarm einzubauen, sofern innerhalb kurzer Zeit (definierbar, z.B. 10 Sekunden) eine Menge X der Sensoren plötzlich "unreach" melden.
Das könnte in meiner laienhaften Vorstellung der Fall sein, falls jemand mit einem Jammer sich dem Haus nähert. Zugegeben, wer so vorbereitet ist, der wird wohl auch sonst sich kaum aufhalten lassen, aber sei es drum. Es schadet ja nicht.
Mein Problem besteht darin, dass ich zum einen den Trigger "unreach" nutzen muss, andererseits danach das Skript sich ja nicht mehr selber triggern soll. Außerdem lässt sich so ein Skript wohl nur schwer testen (wie Glasbruchsensoren auch :lol: ), daher wäre ich dankbar, wenn ein paar von den Könnern hier einmal draufgucken
Gedachter Ablauf:
Sensor 1 (im Sinne von "der erste") wird unerreichbar, CCU2 merkt das Unreachmeldung in iobroker wird gesetzt und triggered das Skript Timer startet, bspl. 10 Sekunden Am Ende des Timers wird function ausgeführt, die nochmal über alle Sensoren (aus "Verschluss") läuft und zählt. Sofern count > z.B. 3 --> telegram
Hier ist mein Ansatz (ich tippe den gerade im Forum zusammen, Flüchtigkeitsfehler also garantiert enthalten):
// VARIABLEN var triggered = false; // Var als Bedingung, damit während der Laufzeit nicht ständig neu getriggered wird var timing = 15; // Zeit in Sekunden, nach deren Ablauf durchgezählt wird var minCount = 3; // Mindestanzahl an unreach Meldungen im definierten Gewerk die erreicht sein müssen, um Alarm auszulösen var nachricht; // Telegram Nachricht var cacheSelectorUNREACH = $('channel[state.id=*.UNREACH](functions="Verschluss")'); // Test soll sich nur auf die sicherheitsrelevanten Sensoren beziehen, kein Alarm wg. ausgestöpselter Steckdosen o.ä. // TRIGGER cacheSelectorUNREACH.on(function(obj) { if(!triggered) { setTimeout(countUNREACH(obj), timing * 1000); triggered = true; } }); // FUNCTION function countUNREACH(obj) { var count = 0; cacheSelectorUNREACH.each(function (id, i) { var status = getState(id).val; if (status === true) { ++count; }); triggered = false; if(count >= minCount){ nachricht = "Ungewöhnliche Anzahl von Unreach-Meldungen. Insgesamt " +count +" Sensoren nicht erreichbar"; sendTo('telegram.0', nachricht); } } }
Funktioniert das so, habe ich etwas übersehen?
Vielen Dank vorab
-
Die Callback-Funktion in setTimeout wird falsch aufgerufen.
setTimeout(countUNREACH, timing * 1000);
Die Funktion countUNREACH() benötigt keinen Übergabeparameter, der nicht in der Funktion ausgewertet wird
function countUNREACH() {
Bei der Abfrage von status fehlt die schließende geschweifte Klammer oder (da nur ein Kommando) ohne Klammern
if (status) ++count;
-
Hallo Paul,
vielen Dank für die Rückmeldungen, werde ich anpassen.
Falsch ist glaube ich meine "if(!triggered)" Abfrage, oder? ich starte ja mit triggered = false, d.h. die Abfrage prüft auf true und würde damit niemals stimmen. Denn true wird ja erst später gesetzt
// VARIABLEN var triggered = false; // Var als Bedingung, damit während der Laufzeit nicht ständig neu getriggered wird var timing = 15; // Zeit in Sekunden, nach deren Ablauf durchgezählt wird var minCount = 3; // Mindestanzahl an unreach Meldungen im definierten Gewerk die erreicht sein müssen, um Alarm auszulösen var nachricht; // Telegram Nachricht var cacheSelectorUNREACH = $('channel[state.id=*.UNREACH](functions="Verschluss")'); // Test soll sich nur auf die sicherheitsrelevanten Sensoren beziehen, kein Alarm wg. ausgestöpselter Steckdosen o.ä. // TRIGGER cacheSelectorUNREACH.on(function() { if(triggered == false) { setTimeout(countUNREACH, timing * 1000); triggered = true; } }); // FUNCTION function countUNREACH() { var count = 0; cacheSelectorUNREACH.each(function (id, i) { var status = getState(id).val; if (status === true) ++count; }); triggered = false; if(count >= minCount){ nachricht = "Ungewöhnliche Anzahl von Unreach-Meldungen. Insgesamt " +count +" Sensoren nicht erreichbar"; sendTo('telegram.0', nachricht); } } }
-
Falsch ist glaube ich meine "if(!triggered)" Abfrage, oder? ich starte ja mit triggered = false, d.h. die Abfrage prüft auf true und würde damit niemals stimmen. `
Nein, die Abfrage if(!triggered) prüft auf false und entspricht der Abfrage if(triggered == false).Unter sendTo() ist eine schließende geschweifte Klammer zuviel. Das müsste allerdings schon der JS-Editor anmeckern ?
-
Hallo Paul,
Ich dachte, "!" würde immer negieren; und da ich initial "triggered = false" setze, war ich der Meinung, es prüft auf ungleich false, mithin true. Danke fürs richtigstellen. Edit: bei genauerer Überlegung hätte ich mir das auch denken können. Da habe ich mich selbst verschlimmbessert…
Kann gut sein, dass eine Klammer fehlt oder zuviel ist. Wie gesagt habe ich es nicht im JS Editor geschrieben sondern nur hier im Forum, bin nicht daheim.
Von der Logik her passt aber alles?
Danke dir!
Steffen