NEWS
Alarm Script mit ON/OFF einer Steckdose
-
Folgende Thematik:
Ich habe eine Netatmo Station, die in eine externe SQL-DB ihre Werte speichert, dank der Netatmo API. Gelegentlich kommt es aber vor, dass das Teil sich aufhängt oder was auch immer und keine Daten mehr sendet. Unglücklicherweise bekome ich das manchmal erst Stunden später mit und ärgere mich dann über fehlende Daten in der Datenbank..
Nun lasse ich mir alle 2 Minuten mittels Node-Red den Zeitstempel des letzten DB Eintrages in einen Datenpunkt packen. Dieser wird mit meinem kleinen Script mit dem Zeitstempel der aktuellen Zeit verglichen. Wenn der Abstand zu groß ist, wird eine Email an mich versendet und die Tasmota Steckdose wo die Netatmo dran hängt, ausgeschaltet und 10 Sekunden später wieder angeschaltet.
So weit so gut. Mein Problem ist aber, dass die Netatmo mitunter 10 Minuten später erst ihren ersten Datensatz ausspuckt. In dieser Zeit bekomme ich also mehrere Mails und die Netatmo wird mehrmals an und aus geschaltet und ist in einer Art Dauer-AN/AUS. Mein Script reagiert auf den von Node-Red geholten Timestamp...
Wie kann man so eine Dauerschleife vermeiden? Muss ich mir einen zusätzlichen Datenpunkt einbauen, der so eine Art "Wartungsmodus" darstellt, welcher von dem Script vor Ablauf zuerst geprüft wird? Natürlich könnte ich auch die ganzen Zeiten so anpassen, dass das Script nicht mehrmals läuft, aber das klingt wenig elegant...
Wie macht Ihr so etwas?
const id_Netatmo_ts = 'node-red.0.Netatmo_LastEntry'; const id_Netatmo_diff = 'node-red.0.Netatmo_LastEntry_Diff'; on({id: id_Netatmo_ts, change: 'any'}, function (obj) { let ts_now = Math.round(new Date().getTime() / 1000) let ts_netatmo = getState(id_Netatmo_ts).val; let diff_minuten = Math.round(((ts_now - ts_netatmo) / 60)); //console.log("Diffenrenz in Minuten: " + diff_minuten); setState(id_Netatmo_diff, diff_minuten, true); function wiederAN () { setState("sonoff.0.Tasmota-Netatmo.POWER",true); } if (diff_minuten > 1) { setState("sonoff.0.Tasmota-Netatmo.POWER",false); setTimeout(wiederAN, 10000); // 10 Sekunden sendTo("email", { to: "blub@gmx.net", subject: "Alaaaarm", text: "Letzter Netatmo Datensatz wurde vor " + diff_minuten + " Minuten in die Datenbank geschrieben. \n Neustart! \n" }); }; });
Grüße
Kai -
@xdelta Ich überprüfe Inaktivität meist super simpel mit der trigger Node. Da brauch ich keine Zeitstempel und nichts. Die trigger Node ist so konfiguriert, dass sei am Anfang also bei der 1. Nachricht "true" rausschickt (kann man auch sein lassen), dann nach der Zeitspanne die ich überwachen will "false", falls keine neue Nachricht kommt. Damit gibts keine Schleifen und der ganze Mechanismus wird erst dann angetriggert, wenn einmal eine Nachricht angekommen ist.
In Deinem Fall würde also nach 2 Minuten eine Mail getriggert, wenn das der zu überwachende Zeitraum ist. Sobald dann aber keine Aktivität mehr stattfindet wird auch nichts mehr getriggert.
So das ist alles:
Der Inaktivitätszeitraum, ab dem Alarm geschlagen wird, ist natürlich beliebig.
-
Ich bin davon ausgegangen, dass Netatmo auch direkt was in einen Datenpunkt (node-red.0.Netatmo_LastEntry) schreibt - deshalb die Idee mit dem Trigger.
Wenn ich Dein Skript richtig interpretiere, wird dies ja angetriggert, wenn sich in dem Datenpunkt was ändert. Und wie gesagt, das kannst ja dann auch mit einer iobroker IN node überwachen.Theoretisch kannst Du den Trigger auch umdrehen. In dem Fall würde Deine Funktion immer wegen Zeitüberschreitung Alarm schlagen. Der Trigger sendet nur einmal eine Nachricht zu Beginn/Start und würde erst wieder zurückgesetzt, wenn keine Nachrichten mehr kommen (also keine Zeitüberschreitungen mehr stattfinden). Ist beides möglich.
-
Besten Dank für den Ansatz! Das node sehe ich mir direkt mal an. Klingt auf jeden Fall deutlich eleganter als immer mehr Variablen hin und her zu setzen...
Grüße
Kai