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
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
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 (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
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 (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
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
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
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
Vielen Dank!
Auch ich konnte mein Anliegen lösen und ungleich eleganter lösen als per watchdog.
Gruß, Thomas
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
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
Doppelpost ist nicht sehr nett
https://forum.fhem.de/index.php/topic,53923.msg455809.html#msg455809
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
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.
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)
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.
Ich habe heute mal über die Sache nachgedacht und einige Versuche gestartet...
Derzeitiger Stand:
Für die temperaturunabhängige Schaltungen:
define Schaltplan_Poolpumpe DOIF ([08:30-10:30] or [13:00-15:30]) (set EDI_Poolpumpe on) DOELSE (set EDI_Poolpumpe off)
Für die temperaturabhängigen Schaltungen:
define Schaltplan_Poolpumpe_23 DOIF ([10:30-11:00] or [16:00-17:00]) (set EDI_Poolpumpe on) DOELSEIF ([Temperaturen:Pooltemperatur]<23) (set EDI_Poolpumpe off) DOELSE (set EDI_Poolpumpe off)
Wait: 0:120
Habe noch nicht alles getestet - aber ich denke es funktioniert so wie ich es möchte.
Ich frage mich ob es zu einem Problem führt, wenn 2 DOIFś eine Pumpe steuern. Die Zeitvorgaben müssen natürlich aufeinander abgestimmt sein.