DOIF und Zeitspanne der Änderung eines Readings

Begonnen von fetzz, 20 Mai 2016, 20:45:27

Vorheriges Thema - Nächstes Thema

fetzz

Hallo.

Gerne würde ich eine einfaches DOIF umsetzen, allerdings funktioniert es nicht so wie ich es mir vorstelle.
Hier die Bedingung:

Ich würde gerne einen Wert in einem Dummy ändern,wenn ein weiterer Dummy 30 Sekunden den Wert nicht ändert.
Hier ist mein Ansatz:

define Backup_Status DOIF ([Backup_Dummy:state:sec] > 30) (set Stromstatus ok)
attr Backup_Status do always


Wenn ich nun manuell den Dummy Backup_Dummy mit set Backup_Dummy ok ändere,
müsste ja nach 30 Sekunden der Wert state im Gerät Stromstatus auf ok gehen.

Dies passiert aber nicht.
Wo liegt mein Fehler?

Wenn ich allerdings das Zeichen > durch < ersetze, wechselt der Dummy Stromstatus sofort den Wert,wenn ich das Dummy Backup_Dummy ändere. Also so wie es sein sollte.

Danke für die Hilfe

Damian

Zitat von: fetzz am 20 Mai 2016, 20:45:27
Hallo.

Gerne würde ich eine einfaches DOIF umsetzen, allerdings funktioniert es nicht so wie ich es mir vorstelle.
Hier die Bedingung:

Ich würde gerne einen Wert in einem Dummy ändern,wenn ein weiterer Dummy 30 Sekunden den Wert nicht ändert.
Hier ist mein Ansatz:

define Backup_Status DOIF ([Backup_Dummy:state:sec] > 30) (set Stromstatus ok)
attr Backup_Status do always


Wenn ich nun manuell den Dummy Backup_Dummy mit set Backup_Dummy ok ändere,
müsste ja nach 30 Sekunden der Wert state im Gerät Stromstatus auf ok gehen.

Dies passiert aber nicht.
Wo liegt mein Fehler?

Wenn ich allerdings das Zeichen > durch < ersetze, wechselt der Dummy Stromstatus sofort den Wert,wenn ich das Dummy Backup_Dummy ändere. Also so wie es sein sollte.

Danke für die Hilfe

So wird es nicht funktionieren.

[Backup_Dummy:state:sec] ist zum Zeitpunkt der Triggerung immer Null.

Was du möchtest ist wahrscheinlich so etwas:

http://fhem.de/commandref_DE.html#DOIF_do_resetwait

Gruß

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

fetzz

Hallo,

Danke für die schnelle Antwort, als einzelne Bedingung bekomme ich nun das Ergebniss, wie ich es gerne hätte.
Danke schon mal. ;D

Nun meine Idee beides in eine DOIF zu bekommen,allerdings funktiniert dies nicht so wie geacht.

Grundidee:
Ich werte einen Maileingang auf einen bestimmten Betreff aus und schreibe dann eine Statusmeldung in den Dummy, sollte die Meldung länger als x-Sekunden ausbleiben, wechselt der Status der Meldung.

Hier meine Versuche:
define Backup_Status DOIF
([FhemMail:Subject] =~ "RPi-FHEM: Backup erfolgreich beendet")(set Backup_Dummy Erfolgreich)
DOELSEIF
([Backup_Dummy])(set Backup_Dummy Fehler)
attr Backup_Status do resetwait
attr Backup_Status wait 0:30


Ist dies überhaupt so möglich?

CoolTux

Was genau soll denn die zweite Bedingung sein? So triggers Du auf das selbe Device wo Du auch den Status für schreibst.  ???
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

fetzz

Die zweite Bedingung sollte lauten, wenn länger als die Zeitspanne x keine Triggerung(oder Statusänderung an dem Dummy) vorgenommen worden ist, ändere den Status auf "Fehler"

CoolTux

Keine Ahnung ob das mit DOIF geht. Da bin ich erstmal raus.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

choenig

Hi,

ich hole das hier nochmal hoch, weil es hier um das Problem geht, welches ich besprechen möchte. (Wieder in den Sinn gekommen ist es mir aufgrund von https://forum.fhem.de/index.php/topic,67642.0.html)

Zitat von: fetzz am 20 Mai 2016, 20:45:27
Hier ist mein Ansatz:

define Backup_Status DOIF ([Backup_Dummy:state:sec] > 30) (set Stromstatus ok)
attr Backup_Status do always


Das hier beschriebene Beispiel ist sehr einfach und kann sicherlich sehr einfach anders gelöst werden.

Zitat von: Damian am 21 Mai 2016, 08:42:03
So wird es nicht funktionieren.

[Backup_Dummy:state:sec] ist zum Zeitpunkt der Triggerung immer Null.
Damian

Allerdings benutze ich Ausdrücke wie "[Backup_Dummy:state:sec] > 30" auch gerne innerhalb von komplexeren DOIFs und da wäre es wirklich schön, wenn es hier möglich wäre, dass das DOIF für einen solchen Fall einen internen Timer anlegt, der den Ausdruck dann triggert, wenn die Zeit > 30 Sekunden ist.

Was ich sagen möchte ist, dass sich DOIF in einem solchen Fall selber darum kümmert, dass ein Trigger ausgelöst wird, auch wenn das Device natürlich kein Event generiert.

Wäre sowas denkbar?

LG
Christian

CoolTux

Keine Ahnung ob ich genau verstanden habe was du meinst. Aber selber triggern kann DOIF sich bereits. Thema $self. Musst mal in der Commandref schauen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

choenig

Hi,

mein Problem ist, dass ein "[Backup_Dummy:state:sec] > 30" zur Zeit wenig Sinn macht, da das DOIF ja nur triggert, wenn Backup_Dummy:state geändert wird. Und dann ist natürlich das :sec == 0 und der Ausdruck ist false. Wenn jetzt die 30 Sekunden vergangen sind, wird der Audruck zwar true, aber das DOIF wird halt nicht ausgeführt, weil einfach kein Trigger da ist :-).

Ich habe komplexere DOIFs, da helfe ich mir so:
([:01] and [Backup_Dummy:state:sec] > 30)

Hier sorgt halt das [:01], dass immerwieder getriggert wird.

Ein manueller Workaround könnte sein, bei der Änderung von Backup_Dummy:state einen at-Job zu starten, der nach 30 Sekunden (irgendwie) das DOIF triggert.

Jetzt verständlicher? Ich befürchte nicht :-\

LG
Christian

CoolTux

Hallo Christian,

Ich befürchte das muss sich ein DOIF User mal anschauen was Du da machen willst.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Damian

Zitat von: choenig am 25 Februar 2017, 12:33:50
Hi,

ich hole das hier nochmal hoch, weil es hier um das Problem geht, welches ich besprechen möchte. (Wieder in den Sinn gekommen ist es mir aufgrund von https://forum.fhem.de/index.php/topic,67642.0.html)

Das hier beschriebene Beispiel ist sehr einfach und kann sicherlich sehr einfach anders gelöst werden.

Allerdings benutze ich Ausdrücke wie "[Backup_Dummy:state:sec] > 30" auch gerne innerhalb von komplexeren DOIFs und da wäre es wirklich schön, wenn es hier möglich wäre, dass das DOIF für einen solchen Fall einen internen Timer anlegt, der den Ausdruck dann triggert, wenn die Zeit > 30 Sekunden ist.

Was ich sagen möchte ist, dass sich DOIF in einem solchen Fall selber darum kümmert, dass ein Trigger ausgelöst wird, auch wenn das Device natürlich kein Event generiert.

Wäre sowas denkbar?

LG
Christian

Du willst doch 30 Sekunden nachdem das Ereignis eingetreten ist etwas tun, richtig?

Warum nimmst du dann nicht das wait-Attribut?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

choenig

Hi,

bei meinen simplen DOIFs mache ich das mit dem wait-Attribut, aber bei komplexeren ist das eher ein Problem. Ich suche mal eins heraus, wo ich damit gescheitert bin. Das werde ich aber vermutlich erst morgen schaffen.

Alaaf und LG
Christian

choenig

Sodele,

ich habe durch Damian angespornt gefühlt und habe eines meiner komplizierteren DOIFs umgestellt und nutze nun das wait-Attribut :).

Ich werde mal beobachten, ob es so funktioniert, wie ich will.

LG
Christian