DOIF aber Befehl erst nach Wartezeit ausführen?

Begonnen von Bytechanger, 05 März 2016, 22:04:50

Vorheriges Thema - Nächstes Thema

Bytechanger

Hallo,

ich möchte folgendes Szenaria ausführen:
Nachdem ein Reading geändert wurde, soll eine gewisse Zeit gewartet , dann eine Befehlsfolge ausgeführt werden!

Konkret:
Die Haustür meldet "open" dann 180 Sekunden warten, dann, wenn weitere Bedingungen vorliegen Befehle ausführen!

Bisher habe ich das Problem, dass z.B. ein DOIF mit WAIT beim Eintreten des Readings die WAITZeit wartet und dann erst ausgeführt wird, wenn das Reading NOCH zutrifft!

also:

DOIF ([EG_Haustuer:state] eq "open") ( {  machwas })
mit attr wait 180


Führt  dazu, dass zwar zunächst beim Ändern des Readings 180 Sekunden gewartet wird, danach ist aber die Tür wieder zu und "machwas" wird nicht ausgeführt!

Dachte schon mal ein ein fhem("sleep 180");; was aber zu einem Blocken von Fhem führt...
Es gibt bestimmt eine einfache Lösung... ich kenne sie nur nicht!

Greets

Byte

Damian

#1
Zitat von: Bytechanger am 05 März 2016, 22:04:50
Hallo,

ich möchte folgendes Szenaria ausführen:
Nachdem ein Reading geändert wurde, soll eine gewisse Zeit gewartet , dann eine Befehlsfolge ausgeführt werden!

Konkret:
Die Haustür meldet "open" dann 180 Sekunden warten, dann, wenn weitere Bedingungen vorliegen Befehle ausführen!

Bisher habe ich das Problem, dass z.B. ein DOIF mit WAIT beim Eintreten des Readings die WAITZeit wartet und dann erst ausgeführt wird, wenn das Reading NOCH zutrifft!

also:

DOIF ([EG_Haustuer:state] eq "open") ( {  machwas })
mit attr wait 180


Führt  dazu, dass zwar zunächst beim Ändern des Readings 180 Sekunden gewartet wird, danach ist aber die Tür wieder zu und "machwas" wird nicht ausgeführt!

Dachte schon mal ein ein fhem("sleep 180");; was aber zu einem Blocken von Fhem führt...
Es gibt bestimmt eine einfache Lösung... ich kenne sie nur nicht!

Greets

Byte

z. B. nur auf Trigger reagieren:

DOIF ([EG_Haustuer:"open"]) ( {  machwas })
mit attr wait 180


Edit: und do always setzen damit kein Zustandswechsel erfolgt

Gruß

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

ThomasMagnum

Hallo Bytechanger,

ich bin ebenfalls auf der Suche solch einer Funktionalität und habe versucht dies mit einem Watchdog zu lösen was nicht wirklich klappt. Ich hatte die Tage hierzu ebenfalls einen Thread eröffnet (https://forum.fhem.de/index.php/topic,50204.0.html. Bin aber noch nicht dazu gekommen das Thema weiter zu verfolgen.

Sofern du eine funktionierende Lösung via DOIF hinbekommst bin ich sehr an einer Lösung interessiert.

Vielen Dank, Thomas

Damian

Zitat von: ThomasMagnum am 06 März 2016, 13:38:40
Hallo Bytechanger,

ich bin ebenfalls auf der Suche solch einer Funktionalität und habe versucht dies mit einem Watchdog zu lösen was nicht wirklich klappt. Ich hatte die Tage hierzu ebenfalls einen Thread eröffnet (https://forum.fhem.de/index.php/topic,50204.0.html. Bin aber noch nicht dazu gekommen das Thema weiter zu verfolgen.

Sofern du eine funktionierende Lösung via DOIF hinbekommst bin ich sehr an einer Lösung interessiert.

Vielen Dank, Thomas

define di DOIF ([EG_Haustuer:state] eq "open") ( set bla on)
attr di wait 180
attr di do always


wo ist das Problem?

Gruß

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

ThomasMagnum

Kein echtes Problem, ich hab nur noch keine Idee wie ich nach Ablauf der 180 Sekunden einen weiteren Status prüfen kann und je nach Rückmeldung dies oder jenes passiert.
Wenn ich Bytechanger richtig verstanden habe ist dies ja auch sein Anliegen.

Thomas

Damian

Zitat von: ThomasMagnum am 06 März 2016, 14:25:47
Kein echtes Problem, ich hab nur noch keine Idee wie ich nach Ablauf der 180 Sekunden einen weiteren Status prüfen kann und je nach Rückmeldung dies oder jenes passiert.
Wenn ich Bytechanger richtig verstanden habe ist dies ja auch sein Anliegen.

Thomas

Dann hast du die Möglichkeit ein IF einzusetzen:

define di DOIF ([EG_Haustuer:state] eq "open") ( set bla on) (IF (Bedingung) (set bla1 on) ELSE (set bla2 on))
attr di wait 180
attr di do always
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Bytechanger

Hi,

das "do always" war der Trick! Danke.
Für einen Newbie finde ich es manchmal schwer, genau das Verhalten des DOIF anhand der Doku im Wiki zu erkennen.

z.B die genauen Unterschiede vonv:
timerWithWait
waitdel
wait
do resetwait
habe ich nicht wirklich verstanden.

Greets

Byte

ThomasMagnum

Vielen Dank!
Auch ich konnte mein Anliegen lösen und ungleich eleganter lösen als per watchdog.

Gruß, Thomas

Damian

Zitat von: Bytechanger am 07 März 2016, 06:08:47
Hi,

das "do always" war der Trick! Danke.
Für einen Newbie finde ich es manchmal schwer, genau das Verhalten des DOIF anhand der Doku im Wiki zu erkennen.

z.B die genauen Unterschiede vonv:
timerWithWait
waitdel
wait
do resetwait
habe ich nicht wirklich verstanden.

Greets

Byte

Kommt bestimmt noch.

Man kann erst mal klein anfangen und sich dann steigern. Vieles davon gab es vor einem Jahr noch gar nicht. :)

Gruß

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

MadMax75

Hallo zusammen,

ich habe ein ähnliche Problem.

Ich möchte eine Poolpumpe zeitgesteuert schalten. Mein derzeitiger DOIF Code:

(([08:30-10:30] or [13:00-15:30] or [19:00-20:00]) or ([11:00-12:00] or [16:00-17:00]) and ([Temperaturen:Pooltemperatur]>=25) or ([05:00-06:30] or [20:00-21:30]) and ([Temperaturen:Pooltemperatur]>=28) or ([22:00-23:00]) and ([Temperaturen:Pooltemperatur]>=30)) (set EDI_Poolpumpe on) DOELSE (set EDI_Poolpumpe off)

Die Poolpumpe wird bei fixen Zeiträumen geschaltet. Zusätzliche Laufzeiten ergeben sich in Abhängigkeit der Pooltemperatur. Das funktioniert soweit ganz gut.
Leider ist meine Pooltemperaturmessung nicht direkt im Pool sondern in der Leitung nach der Pumpe (im Technikraum). Wenn die Pumpe steht, zeigt die Temperaturmessung nicht die eigentliche Pooltemperatur an. Wenn nun ein Zeitraum kommt, wo die Pumpe laufen soll.

Ich möchte nun die Pumpe bei den zusätzlichen Temperatur-Zeitfenstern ca. 2 min einschalten, anschließend die Temperatur messen und dann entscheiden ob die Pumpe nun laufen soll oder nicht.

Bin mit der syntax nicht vertraut. Weiter ist mir wait und waitwithtimer ebenfalls nicht vertraut.

Wer kann helfen?

mfg
Markus

CoolTux

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

MadMax75

Korrekt - bin voll dabei.

Leider habe ich noch immer keine Lösung gefunden. Beim Stöbern im Forum bin ich auf diesen Beitrag gestoßen.

Du könntest mir jedoch gerne die eine oder andere Hilfe geben.
Bin für jeden Hinweis dankbar


CoolTux

Meine Empfehlung wäre eine ordentliche Messung direkt da wo Du die Referenz benötigst. Einen anderen Hinweis möchte ich nicht geben weil es in meinen Augen keinen Sinn macht.
Du gi st Zeiten und Temperaturen vor um etwas zu erreichen. Wahrscheinlich unnötiges laufen der Pumpe und dennoch möchtest Du nur für ne Messung Deine Pumpe laufen lassen. Macht in meinen Augen keinen Sinn.
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

MadMax75

Das mit dem Ort der Messung ist korrekt. Leider ist das beim Pool nicht so einfach zu machen. Die einzige Stelle wo das vernünftig einzubauen war, ist im Technikraum nach der Pumpe.
Ist es mit DOIF möglich die Pumpe 2 min zu starten und anschließend mit der Temp. zu entscheiden ob sie weiterlaufen soll oder nicht?

Versucht habe ich schon viele Varianten - leider nicht mit dem gewünschten Ergebnis.

Wait, bzw waitwithtimer in Kombination mit IF sollte doch möglich sein - die Frage ist nur wie (zumindest für mich)

CoolTux

Mach es in einem extra DOIF. Die Frage die sich mir stellt wäre, wann willst Du immer die Pumpe laufen lassen.


([Temperaturen:Pooltemperatur] < 25) (set EDI_Poolpumpe on; Set EDI_Poolpumpe on IF( (Temperaturen:Pooltemperatur) > 25) )
attr DOIF wait 0,300


Bitte Informiere Dich über DOIF und IF. Dieser Code ist nur zur Anschauung. Ich kenne mich mit der IF Syntax nicht aus. Bitte beachte FHEM IF und Perl if.
Aber rein logisch sollte es so gehen.
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