Hallo in die Runde,
ich versuche gerade in einer IF Schleife ein sequence zu verarbeiten. Aber irgendwie will es mir nicht gelingen. Mein Code sieht wie folgt aus
define seqHoftorLiReStopp FbNicoleBtn2:trigger:.* 15 FbNicoleBtn2:trigger:.*
define ntfHoftorLiRe notify FbNicoleBtn2:trigger:.*
IF ([seqHoftorLiReStopp:trigger])
(set AktGarageHoftorLi on-for-timer 1, set AktGarageHoftorRe on-for-timer 1)
ELSE
({fhem("set AktGarageHoftorLi on-for-timer 1;;define tmp_time at +00:00:05 set AktGarageHoftorRe on-for-timer 1")})
Was soll der Code machen? Der Handsender Button FbNicoleBtn2 soll beim einmaligen drücken in die ELSE Bedingung springen, den AktGarageHoftorLi sofort schalten und den AktGarageHoftorRe zeitverzögert schalten. Wenn ich innerhalb von 15 Sekunden den Handsender Button FbNicoleBtn2 nochmals betätige, sollen die beiden Aktoren sofort schalten. Das Problem ist, der Code springt stets in die IF Bedingung. Soll heißen es schalten stets die beiden Aktoren sofort. Ich denke meine Syntax
IF ([seqHoftorLiReStopp:trigger])
ist nicht richtig.
Hat jemand eine Idee?
Grüße Fritz
Ich würde es mit einem DOIF lösen.
define mydi DOIF ([Btn2] eq "on" and [Btn2:state:sec] < 15) (set ...Re... ) ##fast gleichzeitig
DOELSEIF ([Btn2] eq "on") (set ...Li...) (set ...Re...) ##Re verzögert
attr mydi wait 0:0,5
attr mydi do always
Der Code ist unvollständig und ungetestet, die genaue Syntax findest Du in der deutschen Commandref.
Zitat von: Ellert am 25 November 2015, 14:09:43
Ich würde es mit einem DOIF lösen.
define mydi DOIF ([Btn2] eq "on" and [Btn2:state:sec] < 15) (set ...Re... ) ##fast gleichzeitig
DOELSEIF ([Btn2] eq "on") (set ...Li...) (set ...Re...) ##Re verzögert
attr mydi wait 0:0,5
attr mydi do always
Der Code ist unvollständig und ungetestet, die genaue Syntax findest Du in der deutschen Commandref.
Wird wohl so nicht funktionieren, da [Btn2:state:sec] beim Auslösen des Triggers von Btn2 immer Null ist.
So etwas lässt sich aber mit dem DOIF-Attribut
waitdel und
waitsame realisieren. Dazu gibt es zwei Shutters-Beispiele in der Commandref zu DOIF
Gruß
Damian
@Damian: Ja, da habe ich mich durch
ZitatBei Readingangaben kann die Zeitspanne mit [<Device>:<Reading>:sec] in Sekunden seit der letzten Änderung bestimmt werden
in die Irre leiten lassen. Aber, um die Idee zu retten, würde es funktionieren, statt
[Btn2:state:sec] < 15
das so zu schreiben
(time_str2num( ReadingsTimestamp("Btn2", "state", 0))-time_str2num(OldTimestamp("Btn2"))) < 15
?
Es fehlt irgendwie ein [<Device>:<Reading>:oldsec] ;)
Zitat von: Ellert am 25 November 2015, 18:54:28
@Damian: Ja, da habe ich mich durch in die Irre leiten lassen. Aber, um die Idee zu retten, würde es funktionieren, statt [Btn2:state:sec] < 15
das so zu schreiben (time_str2num( ReadingsTimestamp("Btn2", "state", 0))-time_str2num(OldTimestamp("Btn2"))) < 15
?
Es fehlt irgendwie ein [<Device>:<Reading>:oldsec] ;)
ja, müsste so gehen. Die Idee mit oldsec könnte ich beim nächsten Update umsetzen. ;)
Gruß
Damian
Hallo und danke für die Hinweise. Aber der DIOF ich ich stehen schon seit Beginn auf Kriegsfuss. Ich habe auch schon in anderen "Projekte" kein einziges Mal den DOIF in den Griff gekriegt. :-[
Habe mir jetzt auf die schnelle ein Hilfsdummy gebaut, welcher vom sequence gefüttert wird. Ich brauche die Funktion dringend, da die Dame des Hauses auf den Hof fahren möchte ;)
Werde aber weiter versuchen den trigger des sequence ohne Umwege in der IF Schleife zu verwenden.
Grüße Fritz
Du müsstest nur Deine Bezeichner, statt meiner Abkürzungen einbauen und die Änderung aus meinem 2. Beitrag einsetzen.
Es lohnt sich mit dem DOIF Frieden zu schliessen.
Zu Deiner Eingangs gestellten Frage:
Ich habe Sequence noch nicht verwendet, wo verwendest Du das Modul?
Zitatdefine seqHoftorLiReStopp FbNicoleBtn2:trigger:.* 15 FbNicoleBtn2:trigger:.*
Hier müsstest Du eine Fehlermeldung bekommen, es fehlt <type>, s. http://fhem.de/commandref_DE.html#define (http://fhem.de/commandref_DE.html#define)
Die IF-Syntax entspricht im Wesentlichen einer Teilmenge der DOIF-Syntax.
ZitatIF ([seqHoftorLiReStopp:trigger])
Hier fragst Du ob [seqHoftorLiReStopp:trigger] wahr ist, also ungleich 0,"",undef. Ist das gewollt? Wie unterscheiden sich die Trigger bei einmaligem und zweimaligem Knopfdruck? Danach müsstest Du in der Bedingung fragen.
Zitat(set AktGarageHoftorLi on-for-timer 1, set AktGarageHoftorRe on-for-timer 1)
Hier verwendest Du die typische IF-Syntax, warum nicht auch hier?
Zitat({fhem("set AktGarageHoftorLi on-for-timer 1;;define tmp_time at +00:00:05 set AktGarageHoftorRe on-for-timer 1")})
Ist nicht falsch, einfacher wäre es so:
(set AktGarageHoftorLi on-for-timer 1, define tmp_time at +00:00:05 set AktGarageHoftorRe on-for-timer 1)
besser wäre es, hier auch -temporary zu verwenden, also
define -temporary tmp_time at +00:00:05 set AktGarageHoftorRe on-for-timer 1
Hallo Ellert,
Du hast wahrscheinlich Recht, ein Frieden mit DOIF wäre sicher lohnenswert. Aber so viele Versuche und immer wieder Frust ;)
Und vielen Dank für die Tipps und Hinweise, habe den Code soweit vereinfacht, sodas ich nicht mehr in die Perl Ebene springe und dann wieder zurück. Auch das mit dem -temporary, Danke!
ZitatZitat
define seqHoftorLiReStopp FbNicoleBtn2:trigger:.* 15 FbNicoleBtn2:trigger:.*
Hier müsstest Du eine Fehlermeldung bekommen, es fehlt <type>, s. http://fhem.de/commandref_DE.html#define
Da bin ich mir nicht ganz sicher. In der commandref steht zum sequence
Zitatdefine <name> sequence <re1> <timeout1> <re2> [<timeout2> <re3> ...]
So wie ich das sehe bedarf es keinem <type>
Grüße Fritz
Zitatdefine seqHoftorLiReStopp FbNicoleBtn2:trigger:.* 15 FbNicoleBtn2:trigger:.*
Der Gerätetyp ist hier nicht angegeben, daher meine Frage:
ZitatIch habe Sequence noch nicht verwendet, wo verwendest Du das Modul?