FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Fritz Muster am 23 November 2015, 22:58:42

Titel: Syntaxfrage: Wie sequence trigger in notify mit IF Schleife
Beitrag von: Fritz Muster am 23 November 2015, 22:58:42
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
Titel: Antw:Syntaxfrage: Wie sequence trigger in notify mit IF Schleife
Beitrag 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.
Titel: Antw:Syntaxfrage: Wie sequence trigger in notify mit IF Schleife
Beitrag von: Damian am 25 November 2015, 17:58:12
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
Titel: Antw:Syntaxfrage: Wie sequence trigger in notify mit IF Schleife
Beitrag von: Ellert am 25 November 2015, 18:54:28
@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] ;)
Titel: Antw:Syntaxfrage: Wie sequence trigger in notify mit IF Schleife
Beitrag von: Damian am 25 November 2015, 18:58:58
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
Titel: Antw:Syntaxfrage: Wie sequence trigger in notify mit IF Schleife
Beitrag von: Fritz Muster am 27 November 2015, 10:42:03
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
Titel: Antw:Syntaxfrage: Wie sequence trigger in notify mit IF Schleife
Beitrag von: Ellert am 27 November 2015, 13:34:16
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



Titel: Antw:Syntaxfrage: Wie sequence trigger in notify mit IF Schleife
Beitrag von: Fritz Muster am 01 Dezember 2015, 11:50:12
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
Titel: Antw:Syntaxfrage: Wie sequence trigger in notify mit IF Schleife
Beitrag von: Ellert am 01 Dezember 2015, 12:31:32
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?