Aktion, wenn innerhalb einer Zeitspanne ein Wert überschritten wird

Begonnen von Damian, 28 Februar 2016, 21:50:59

Vorheriges Thema - Nächstes Thema

Damian

Weil ich zuletzt nach einem Lösungsansatz für die Anforderung im Betreff gefragt wurde - hier ein Vorschlag zur Lösung:

Voraussetzung: ein Sensor liefert zyklisch seine Daten in nicht zu langen Abständen

define di_hum DOIF (([Aussensensor:humidity]-[di_hum:letzte]) > 10)
  (set msg blabla, setreading di_hum letzte [Aussensensor:humidity])
DOELSE
  (setreading di_hum letzte [Aussensensor:humidity])

attr di_temp notexist 100
attr di_temp cmdpause 600


Hier wird eine Aktion "set msg blabla" ausgelöst, wenn die Feuchtigkeit innerhalb von mindestens 600 Sekunden um mindestens 10 % angestiegen ist.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Habe ich ähnlich, aber ich habe diese Funktion in die 99_myUtils ausgelagert, weil ich den Anstieg selbst
((Wert.alt-Wert.neu)/(Zeit(Wert.alt)-Zeit(Wert.neu)))
auswerte, nicht nur diese eine Wert-Zeit-Kombination. Und das ist mir für's DOIF zu "dick" geworden.

BTW: kann ich das Ergebnis zwischenspeichern und dann dieses verwenden?
DOIF ([trigger] and ({funktion-welche-ein-Reading-setzt} > x)) (Part1)
DOELSEIF ([trigger] and (?[gesetztes_Reading] < y)) (Part2)

Oder gibt es da Beschränkungen bzgl. der zeitlichen Abfolge?

Nochwas zu (setreading di_hum letzte [Aussensensor:humidity]): wird der Trigger da nicht erneut ausgelöst?

Damian

Zitat von: Per am 28 Februar 2016, 22:42:20
Habe ich ähnlich, aber ich habe diese Funktion in die 99_myUtils ausgelagert, weil ich den Anstieg selbst
((Wert.alt-Wert.neu)/(Zeit(Wert.alt)-Zeit(Wert.neu)))
auswerte, nicht nur diese eine Wert-Zeit-Kombination. Und das ist mir für's DOIF zu "dick" geworden.

BTW: kann ich das Ergebnis zwischenspeichern und dann dieses verwenden?
DOIF ([trigger] and ({funktion-welche-ein-Reading-setzt} > x)) (Part1)
DOELSEIF ([trigger] and (?[gesetztes_Reading] < y)) (Part2)

Oder gibt es da Beschränkungen bzgl. der zeitlichen Abfolge?

Nochwas zu (setreading di_hum letzte [Aussensensor:humidity]): wird der Trigger da nicht erneut ausgelöst?

Zwischenspeichern kannst du etwas im Ausführungsteil z. B. in einem eigenen Reading deines DOIFs. So habe ich in meiner Lösung den aktuellen Wert im Reading "letzte" gespeichert, den ich dann wieder in der Bedingung auswerte.
Perl-Variablen sind schlecht zu verwenden, das sie nur innerhalb eines Blocks/Bedingung verwendbar sind.

Selbsttriggerung wird vom Modul unterbunden.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Zitat von: Damian am 28 Februar 2016, 22:55:12So habe ich in meiner Lösung den aktuellen Wert im Reading "letzte" gespeichert, den ich dann wieder in der Bedingung auswerte.
Aber erst im nächsten Durchgang, bei meinem Beispiel im gleichen, deshalb die Nachfrage.

Zitat von: Damian am 28 Februar 2016, 22:55:12Selbsttriggerung wird vom Modul unterbunden.
Meine Unsicherheit beruht auf dem "endlichen Automaten".

Damian

Zitat von: Per am 28 Februar 2016, 23:04:48
Aber erst im nächsten Durchgang, bei meinem Beispiel im gleichen, deshalb die Nachfrage.
Meine Unsicherheit beruht auf dem "endlichen Automaten".

Du brauchst doch immer erst einen Durchlauf, um den ersten Wert dir zu merken, um dann im nächsten einen Vergleich anstellen zu können.

Für den endlichen Automaten stand eine vereinfachte Abfrage des eigenen Zustands im Vordergrund, die Triggerung kommt normalerweise von außen.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF