Syntaxfrage: Wie sequence trigger in notify mit IF Schleife

Begonnen von Fritz Muster, 23 November 2015, 22:58:42

Vorheriges Thema - Nächstes Thema

Fritz Muster

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
RasPi 3B+, Stretch, Fhem 5.9, DBlog SQLite
HMLAN, mapleCUN MAX/WMBus, mapleSduino 868/433/868
HM Sensoren/Aktoren ,Technoline TX 29 DTH-IT, TFA 30.3155WD, MAX!
Hour Counter, Astro, EletricityCounter, Statistics, Charting Frontend, TabletUI, Modbus

Ellert

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.

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

@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] ;)

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Fritz Muster

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
RasPi 3B+, Stretch, Fhem 5.9, DBlog SQLite
HMLAN, mapleCUN MAX/WMBus, mapleSduino 868/433/868
HM Sensoren/Aktoren ,Technoline TX 29 DTH-IT, TFA 30.3155WD, MAX!
Hour Counter, Astro, EletricityCounter, Statistics, Charting Frontend, TabletUI, Modbus

Ellert

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

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




Fritz Muster

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
RasPi 3B+, Stretch, Fhem 5.9, DBlog SQLite
HMLAN, mapleCUN MAX/WMBus, mapleSduino 868/433/868
HM Sensoren/Aktoren ,Technoline TX 29 DTH-IT, TFA 30.3155WD, MAX!
Hour Counter, Astro, EletricityCounter, Statistics, Charting Frontend, TabletUI, Modbus

Ellert

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?