Hallo liebe Leute,
ich bastel mir jetzt meine Lüftungssteuerung zusammen.
Nach und nach füge ich weitere Funktionen hinzu.
Um die Lüftung täglich unabhängig von anderen Messwerten eine bestimmte Zeit laufen zu lassen, bin ich auf folgende Konstruktion gekommen:
defmod timer DOIF (([Modus:state] eq "timer") and ([Lueften] eq 0)) (set Lueften 1 , define qwertz at *{Value("LueftZeit")} set TemDiff 12 , set Modus auto)
Mich wunderte etwas, dass das überhaupt funtioniert.
Was "passiert" eigentlich mit dem at qwertz?
Ich kann das nirgendwo im Frontend sehen.
Kann ich das at auch irgenwie killen, wenn ich es früher beenden möchte?
Lassen sich auch andere Befehle schachteln z.B. mehrere Doifs?
Liebe Grüße
Ette
DOIF hat eine sehr komfortable Möglichkeit um nach dem ersten Befehl zeitverzögert einen zweiten Befehl auszuführen.
Dafür wird das Attribut wait verwendet.
Schaue es dir hier mal an: https://fhem.de/commandref_DE.html#DOIF_wait
Dieser Timer lässt sich auch beenden wenn auf cmd2 gewechselt wird.
Ansonsten hatte ich es so gelöst: (defmod at_$DEVICE at +00:30 set WZ_Rolladen_runter initialize)
Zitat von: ettettette am 07 November 2017, 07:43:12
Was "passiert" eigentlich mit dem at qwertz?
Ich kann das nirgendwo im Frontend sehen.
Hi Ette,
aus der Doku
ZitatHinweise:
wenn kein * angegeben wird, wird der Befehl nur einmal ausgeführt und der entsprechende at Eintrag danach gelöscht. In diesem Fall wird der Befehl im Statefile gespeichert (da er nicht statisch ist) und steht nicht im Config-File (siehe auch save).
Gruß Otto
Hallo liebe Leute,
ich bin jetzt deutlich weitergekommen, aber um meine Steuerung fertigzustellen, muss ich noch über folgende Hürde klettern.
Ein DOIF soll einen Lüfter einschalten und nach eine Zeit aus einem dummy wieder ausschalten.
gelöst habe ich das mit der "at"-Definition im DOIF-Zweig:
( ( [Sek_Lue2_24:state] ne "00:00:00" ) and ( [?Lue2] == 0) and ([?Modus:state] eq "auto"))
(set Lue2 1,set Nachricht Lue2_24 hat für [Sek_Lue2_24:state] eingeschaltet,
define Lue2_24_at at +[Sek_Lue2_24:state] {if ([Lue2] == 1 and [?Modus:state] eq "auto") {fhem ("set Lue2 0")}},
attr Lue2_24_at room Lueftraum)
DOELSE ()
Vor dem Ausschalten des Lüfters (set Lue2 0) soll aber getestet werden ob er nicht schon aus ist.
Wenn oben gelisteter Code gelaufen ist steht im at aber folgendes:
{if (1 == 1 and auto eq "auto") {fhem ("set Lue2 0")}}
Die Variablen werden also beim ausführen des DOIF schon in konkrete Werte übersetzt.
Wie kann ich das "at" definieren, so dass die Dummy in der Definition stehen bleiben?
Vielen Dank im Vorraus für eure Hilfe
Ette
Hi.
diesen Code wird at nicht verstehen, da musst Du komplett Perl nehmen.
Zitat{if ([Lue2] == 1 and [?Modus:state] eq "auto") {fhem ("set Lue2 0")}}
Nimm stattdessen Value()
Gruß Otto
Vielen Dank für die schnelle Hilfe:
( ( [Sek_Lue1_24:state] ne "00:00:00" ) and ( [?Lue1] == 0) and ([?Modus] eq "auto"))
(set Lue1 1,set Nachricht Lue1_24 hat für [Sek_Lue1_24:state] eingeschaltet,
define Lue1_24_at at +[Sek_Lue1_24:state] {if (value("Lue1") == 1 and value("Modus") eq "auto") {fhem ("set Lue1 0")}},
attr Lue1_24_at room Lueftraum)
DOELSE ()
leifert mir aber jetzt im logfile
ERROR evaluating {if (value("Lue1") == 1 and value("Modus") eq "auto") {fhem ("set Lue1 0")}}: Undefined subroutine &main::value called at (eval 12308) line 1.
Herzlichen Gruß
Ette
Groß versucht?
Value() nicht value() - spielt in Perl denke ich eine Rolle.
Gruß Otto