Ereignis nach Verzögerung auslösen

Hallo

ich habe in einem anderen Thema mein Problem geschildert.
Deshalb mein Wunsch das die Timerfunktion in das Ereignis eingebaut wird.

kurze Funktionsbeschreibung:
wenn alle Bedingungen erfüllt sind startet der Timer zum Verzögern, fällt eine Bedingung wieder weg stoppt der Timer und das Ereignis wird nicht ausgelöst.

Beispiele für die Funktion:
Die Heizung soll nach Aussentemp eingeschaltet werden, aber erst wenn 24 Stunden die Temperatur unter Schwellwert liegt.
Ein Rollo soll zum Beschatten fahren, aber nur wenn der Helligkeitssensor 10 Minuten über Schwellwert liegt

Gruß
Jürgen

Ich hol den Funktionswunsch von testy einmal hoch.
Gibt es hierzu schon etwas um das ganze einfach umzusetzen?

Ich würde dies mit einem Ablaufplan realisieren :slight_smile:

Dort kannst du genau solch eine Verzögerung einbauen und die Bedingung testen.

paresy

Ich schaue es mir gerade an, das wäre das einfachste mit einem Ablaufplan, stimmt.

Der Ablaufplan fängt dann an loszulaufen, nachdem z.B. eine Variable aktualisiert wurde.
Dann kann ich sagen warte z.B. 10 Minuten bevor die nächste Aktion im Ablaufplan ausgeführt wird.
Nach 10 Minuten kann ich dann mit einer Wenn-Dann Aktion weitermachen und nochmal prüfen wie der Wert ist, das würde funktionieren.

Es wäre cool wenn ich das ganze als Script programmieren kann, da ich das ganze am Schluss auch gerne in ein Modul übernehmen würde.

Mein Anwendungsfall:
Eine Feuchtigkeitsüberwachung, wenn eine bestimmte Luftfeuchtigkeit z.B. 10 Minuten über einem bestimmten Grenzwert kommt, dann soll eine Variable geschalten werden und eine Meldung an den User gesendet werden.

Das ist an sich kein Problem, aber ich frage mich noch wie ich das ganze geschickt mache, da z.B. in den 10 Minuten das Script mehrfach ausgelöst wird, immer wenn ein Wert vom Temperatur-Sensor kommt, weil die Luftfeuchtigkeit in der Zeit mehrmals gemessen / übersendet wird. Dadurch wird das Script mehrfach ausgeführt. Damit wird der Timer dann wieder auf den initialen Wert von 10 Minuten gesetzt und es würde quasi nie zur Auslösung kommen.

(Hier hätte ich dann mit dem Ablaufplan glaub ich auch ein Problem, da dieser auch mehrfach getriggert werden würde, wenn ein neuer Wert übermittelt wird, was zu mehrfach Benachrichtigungen führen würde.)

Hast du noch eine Idee?

Was hältst du davon, für die erfüllte Bedingung (Temperatur etc) eine Hilfsvariable zu setzen? Dann kannst du erkennen ob der Timer gestartet werden muss oder nicht.

An eine Hilfsvariable habe ich auch schonmal gedacht, dafür könnte ich die Variable hernehmen die aktuell schon vorhanden ist und anzeigt, ob gelüftet werden muss oder nicht (Boolean) aber dann ist mir gestern noch etwas anderes eingefallen.

Folgendes:
Ich habe eine Variable, die geschalten wird je nachdem ob gelüftet werden muss oder nicht.
Sobald diese Variable auf „Lüften“ springt, ändert sich der Wert der Variable.

Jetzt kann ich mit „IPS_GetVariable“ die Variable auslesen und erhalte unter anderem die Info, wann sich der Wert der Variable zuletzt geändert hat. („VariableChanged“)

Somit habe ich den Unix-Timestamp von der letzten Werteänderung.
Anschließend kann immer von der aktuellen Uhrzeit (aktueller Unix Timestamp) - der Timestamp der letzten Werteänderung abgezogen werden.

Hier erhalte ich dann die Differenz die ich durch 60 Teile, anschließend habe ich die Minuten.
Diesen Minutenwert kann ich dann mit der eingestellten Verzögerung z.B. 15 Minuten vergleichen.
Sobald die 15 Minuten erreicht sind löst das ganze aus und ich erhalte die Benachrichtiung.

Die Bedingung sieht dann wie folgt aus:
Sobald die Variable einen bestimmten Status hat z.B. „Lüften“ und die Differenz zwischen aktuellem Timestamp + Timestamp seit der letzten Werteänderung größer als 15 Minuten, wird gemeldet.

Der Nachteil bei dieser Lösung ist das das Skript in einem bestimmten Intervall ausgeführt werden muss, damit das ganze hinsichtlich dem Zeit funktioniert.

Ich denke ich werde das mit der „Hilfsvariablen“ lösen, da das der besser Weg ist (meiner Meinung nach) wo kein Ereignis / Intervall nötigt ist um das Script zu triggern.

Meine Idee hat leider nicht so geklappt.
Ich habe es geschaft die Aktion erst nach der Verzögerung auszulösen, aber ab diesem Punkt wird die Aktion z.B. Push-Nachricht immer und immer wieder gesendet, was vermieden werden soll.

Gibt es noch andere Ansätze, aus den mit der Hilfsvariable?

Hast du jetzt ein ausgelöstes Ereignis?
Das hier ausprobiert?
IMG_20240713_170833
Michael

Hallo Michael,
ich versuche das ganze aktuell noch in PHP-Code umzusetzen, da es in ein Modul mit einfließen soll.

Ich denke ich werde auf die Hilfsvariable, wie von vorlkerm vorgeschlagen, zurückgreifen.
Gibt es eine Möglichkeit eine „versteckte Variable“ für Module anzulegen, so das diese genutzt werden kann aber nicht im Objektbaum erscheint. Sodass die Variable nicht gesehen wird?

Das Objekt selbst kann ich in der Visualisierung ja deaktivieren, aber dann wäre es immer noch im Objektbaum.

Für ein Modul ist das so relativ einfach umzusetzen.
Es gibt einen Buffer um Daten zwischenzuspeichern, dafür brauchst du keine Hilfsvariable im Objektbaum.

Das Modul registriert sich auf Variablen-Updates der Luftfeuchtigkeit Variable.
Damit bekommst du jede änderung/aktualisierung direkt im Modul mit.
Dort auswerten ob oberhalb Grenzwert und vorher unterhalb Grenzwert (beide Werte bekommst du in MessageSink) und entsprechend einen Timer starten, oder stoppen.

Michael

Vielen Dank für die erneute Hilfe.
Mit dem Buffer hat es jetzt geklappt, soweit funktioniert jetzt alles wie es soll.

Für das Modul werde ich demnächst ein Thema erstellen und es vorstellen.