NEWS
Skript setzt wert nicht richtig zurück
-
Das Problem was ich auch nicht verstehe, ich möchte unten ein Status setzen und zurück setzen wenn der Bewegungsmelder gesetzt ist.
Die onMethode reagiert leider jedesmal wenn das If durchlaufen wird, deshalb möchte ich es nur setzten wenn es false ist und dann nur zurück setzen wenn es wieder true ist.
Leider macht es das hier nicht.
const idAnwesend = "javascript." + instance + ".Anwesend"; createState(idAnwesend , false, { read: true, write: true, desc: "", type: "boolean", def: 0 }); if (getState("mqtt.0.ESP_Easy.Bewegungsmelder.Switch").val && !getState(idAnwesend).val) { setState(idAnwesend,true); } if (getState(idAnwesend).val && !getState("mqtt.0.ESP_Easy.Bewegungsmelder.Switch").val) { setState(idAnwesend,false); } //Telegram Nachicht senden on({id: idAnwesend, val: true}, function (obj) { sendTo("telegram", "send", { text: ([ 'ANWESENDHEITS ALARM' ].join('')) }); });
-
Hallo,
die IF-Abfragen werden nur beim Skriptstart durchlaufen, nicht bei einer Auslösung von on() auf Anwesenheit.
Richtig ist, dass du die Anwesenheit mit on() überwachst. Wenn die wechselt, wird ein telegram gesendet. Super.
Es fehlt die Überwachung des MQTT-Datenpunktes. Wenn der sich auf true ändert (Bewegung) und abwesend -> Anwesenheit.
Ob es Sinn macht, wenn bei gesetzter Anwesenheit der Melder auf false geht auch die Anwesenheit auf false zu setzen, sei mal dahingestellt.
Im createState() ist auch noch ein kleiner Fehler: Typ ist boolean, def (default) sollte daher false nicht 0 sein.
const idAnwesend = "javascript." + instance + ".Anwesend"; createState(idAnwesend , false, { read: true, write: true, name: "Anwesenheit", // Name desc: "", type: "boolean", def: false, role: "switch" // Rolle }); const idMelder = "mqtt.0.ESP_Easy.Bewegungsmelder.Switch"; on(idMelder, function(obj) { let anwesenheit = getState(idAnwesend).val; if (obj.state.val && !anwesenheit) setState(idAnwesend, true); // wenn abwesend und Melder löst neu aus if (!obj.state.val && anwesenheit) setState(idAnwesend, false);// wenn anwesend und Melder geht neu zurück auf false }); //Telegram Nachicht senden on({id: idAnwesend, val: true}, function (obj) { sendTo("telegram", "send", { text: ([ 'ANWESENDHEITS ALARM' ].join('')) }); });
Kannst du sagen, was die Anwendung ist? Protokollierst du nur die Ereignisse des Melders? Denn so werden eigentlich nur die beiden Datenpunkte synchronisiert.
Gruß
Pix
-
Die Anwendung soll quasi als Alarmanlage dienen.
Sobald jemand am Melder vorbei läuft versendet es eine Nachricht.
prüfe jetzt mit on() den Status bevor ich eine If-Abfrage setze.
Mann kann mit sicherheit auch direkt auf die Telegram Nachricht gehen, aber evtl will ich noch einen zwischenschritt einbauen, das möchte ich mir dadurch noch offen lassen.
const idAnwesend = "javascript." + instance + ".Anwesend"; createState(idAnwesend , false, { read: true, write: true, desc: "", type: "boolean", def: false }); on({id: "mqtt.0.ESP_Easy.Bewegungsmelder.Switch"}, function (obj) { if (getState("mqtt.0.ESP_Easy.Bewegungsmelder.Switch").val == 1) { setState(idAnwesend,true); } if (getState("mqtt.0.ESP_Easy.Bewegungsmelder.Switch").val == 0) { setState(idAnwesend,false); } }); //Telegram Nachicht senden on({id: idAnwesend, val: true}, function (obj) { sendTo("telegram", "send", { text: ([ 'ANWESENDHEITS ALARM', '\n' ].join('')) }); });