Hauptmenü

Frage zu Verzögerungen

Begonnen von tomspatz, 11 Juli 2017, 08:42:56

Vorheriges Thema - Nächstes Thema

tomspatz

ZitatSollen Verzögerungen innerhalb von Befehlsfolgen stattfinden, so müssen diese Kommandos in eigene Klammern gesetzt werden, das Modul arbeitet dann mit Zwischenzuständen.

Beispiel: Bei einer Befehlssequenz, hier: (set lamp1 on, set lamp2 on), soll vor dem Schalten von lamp2 eine Verzögerung von einer Sekunde stattfinden. Die Befehlsfolge muss zunächst mit Hilfe von Klammerblöcke in eine Befehlssequenz aufgespalten werden: (set lamp1 on)(set lamp2 on). Nun kann mit dem wait-Attribut nicht nur für den Beginn der Sequenz, sondern für jeden Klammerblock eine Verzögerung, getrennt mit Komma, definieren werden, hier also: wait 0,1. Damit wird lamp1 sofort, lamp2 eine Sekunde danach geschaltet. Die Verzögerungszeit bezieht sich immer auf den vorherigen Befehl.

Das ist mir bewusst, doch wenn ich das Beispiel gesamt verzögern möchte, ist es dann:
(set lamp1 on, set lamp2 on)
wait 5


Oder MUSS man die Befehlskette immer aufspalten sobald irgend eine Verzögerung gewollt ist?

LG
Tom

nils_

Zitat von: tomspatz am 11 Juli 2017, 08:42:56
Oder MUSS man die Befehlskette immer aufspalten sobald irgend eine Verzögerung gewollt ist?
nein ich denke das musst du nicht machen. das ausspalten war ja für das beispiel gemeint. (vor schalten von Lampe 2 soll eine Pause sein....)

dein Code
(set lamp1 on, set lamp2 on)
wait 5

sollte dann den gesamten block verzögern, d.h. 5 sekunden warten und dann beide befehle ausführen.

viele Wege in FHEM es gibt!

Papaloewe

Ist nicht eher das richtig?
wait 0,5

amenomade

Zitat von: Papaloewe am 11 Juli 2017, 13:27:35
Ist nicht eher das richtig?
wait 0,5

Nein. Das erste war richtig. Wenn du nur ein Klammerset hast, dann brauchst Du nur ein Timer.

()()() => wait x,y,z
() => wait x
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Papaloewe

ok, ich lag falsch, denn ich hatte Folgendes im Kopf:
ZitatBeispieldefinition bei mehreren DO-Blöcken mit Befehlssequenzen:

DOIF (Bedingung1)
(set ...) ## erster Befehl der ersten Sequenz soll um eine Sekunde verzögert werden
(set ...) ## zweiter Befehl der ersten Sequenz soll um 2 Sekunden nach dem ersten Befehl verzögert werden
DOELSEIF (Bedingung2)
(set ...) ## erster Befehl der zweiten Sequenz soll um 3 Sekunden verzögert werden
(set ...) ## zweiter Befehl der zweiten Sequenz soll um 0,5 Sekunden nach dem ersten Befehl verzögert werden

attr <DOIF-module> wait 1,2:3,0.5

In diesem Beispieil handelt es sich um mehrere einzelne SET's und nicht um zwei innerhalb einer Klammer ;-).

tomspatz

OK

ich bin davon ausgegangen das wenn man eine Verzögerung einbauen möchte das Klammerset grundsätzlich gesplittet werden muss.

LG
Tom

Per

Falls du einen Zweig mit set xxx_doif cmd_2 aufrufen UND die Verzögerung haben möchtest, dann musst du splitten und die erste Klammer leer lassen. Aber nur dann.

Mazz78

#7
An dieser Stelle würde ich mich gerne mit einklinken...

Ich habe ein aktuelles Bsp. dazu und ich bekomm`s nicht hin.

define J_Essen_bei_Hitze DOIF ([Temperatur_Sued_T1_T2:temperature] >8 ) (set J_Essen 0;set J_Essen 2) DOELSEIF([00:00])
attr wait 0,65:0


Ist eigentlich ganz simpel.
Wenn die Delta-Temperatur von T1 und T2 des Diff.-Temperatursensors größer 8 Kelvin ist, dann fahre die Jalousie auf Position 0 (ganz geschlossen) und anschließend auf Pos. 2.

Als Erklärung:
Beim nach oben fahren der Jalousie, werden zuerst die Lamellen horizontal gelegt, dann würde die Jalousie nach oben fahren.
In Pos.2 ist die Jalosie immernoch ganz unten aber die Lamellen horizontal.
Die angegebene Zeit von 65sec im attr wait wird benötigt um die Jalousie von Pos. 100 (ganz geöffnet) bis zur Pos. 0 zu fahren

So wie der Code oben steht, fährt die Jalousie von Pos. 100 (ganz offen) direkt auf Pos. 2.
Da das Anfahren der Pos. 0 ausgelassen wird, ist die Jalousie nicht ganz unten und die Lamellen stehen noch vertikal.  :(

Ich hoffe das versteht man so   ???

Lange Rede kurzer Sinn: Ich brauch zwischen set J_Essen 0 und set J_Essen 2 eine Pause von 65 sek.

Hat jemand Vorschläge ?  :-[


PS: Abends mit Sunset funktioniert`s mit sleep tadellos

define J_Essen_Sunset *{sunset(-5900,"17:00","21:00")} { fhem ("set J_Essen 0; sleep 65; set J_Essen 2")}

RaPi 4 / Buster / FHEM 6
CUL868 / JeeLink868
Banana M1 (Bananian) + ser2net + Stiebel Eltron LWZ403
FIRMATA -> Gartenbewässerung /-licht
ALEXA

Frank_Huber

Setze die set in jeweils eigene klammern. Dann wait 0,65

Gesendet von meinem S3_32 mit Tapatalk


Ma_Bo

Zitat von: Mazz78 am 17 August 2017, 22:50:55
An dieser Stelle würde ich mich gerne mit einklinken...

Ich habe ein aktuelles Bsp. dazu und ich bekomm`s nicht hin.

define J_Essen_bei_Hitze DOIF ([Temperatur_Sued_T1_T2:temperature] >8 ) (set J_Essen 0;set J_Essen 2) DOELSEIF([00:00])
attr wait 0,65:0


Ist eigentlich ganz simpel.
Wenn die Delta-Temperatur von T1 und T2 des Diff.-Temperatursensors größer 8 Kelvin ist, dann fahre die Jalousie auf Position 0 (ganz geschlossen) und anschließend auf Pos. 2.

Als Erklärung:
Beim nach oben fahren der Jalousie, werden zuerst die Lamellen horizontal gelegt, dann würde die Jalousie nach oben fahren.
In Pos.2 ist die Jalosie immernoch ganz unten aber die Lamellen horizontal.
Die angegebene Zeit von 65sec im attr wait wird benötigt um die Jalousie von Pos. 100 (ganz geöffnet) bis zur Pos. 0 zu fahren

So wie der Code oben steht, fährt die Jalousie von Pos. 100 (ganz offen) direkt auf Pos. 2.
Da das Anfahren der Pos. 0 ausgelassen wird, ist die Jalousie nicht ganz unten und die Lamellen stehen noch vertikal.  :(

Ich hoffe das versteht man so   ???

Lange Rede kurzer Sinn: Ich brauch zwischen set J_Essen 0 und set J_Essen 2 eine Pause von 65 sek.

Hat jemand Vorschläge ?  :-[


PS: Abends mit Sunset funktioniert`s mit sleep tadellos

define J_Essen_Sunset *{sunset(-5900,"17:00","21:00")} { fhem ("set J_Essen 0; sleep 65; set J_Essen 2")}



Befehle in DOIF werden mit ( , ) getrennt und nicht mit ( ; ).


define J_Essen_Sunset *{sunset(-5900,"17:00","21:00")} { fhem ("set J_Essen 0; sleep 65; set J_Essen 2")}


Dieses Beispiel kann so nicht funktionieren, da entweder ein at oder ein notify oder sonst was angegeben werden muss.

Und wie schon von Frank_Huber gesagt, versuch es mal so:

define J_Essen_bei_Hitze DOIF ([Temperatur_Sued_T1_T2:temperature] >8 ) (set J_Essen 0)(set J_Essen 2) DOELSEIF([00:00])
attr wait 0,65:0


Eigentlich dürfte das DOELSEIF nicht funktionieren, da ein Leerzeichen zwischen DOELSEIF und ( sein muss, soweit ich weiss.
Somit müsste es so aussehen:

define J_Essen_bei_Hitze DOIF ([Temperatur_Sued_T1_T2:temperature] >8 ) (set J_Essen 0)(set J_Essen 2) DOELSEIF ([00:00])
attr wait 0,65:0


Grüße Marcel
NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

nils_

Zitat von: Ma_Bo am 18 August 2017, 00:12:06
Eigentlich dürfte das DOELSEIF nicht funktionieren, da ein Leerzeichen zwischen DOELSEIF und ( sein muss, soweit ich weiss.
ich glaube das muß nicht (bin aber auch nicht sicher  ::) )


Zitat von: Mazz78 am 17 August 2017, 22:50:55
Die angegebene Zeit von 65sec im attr wait wird benötigt um die Jalousie von Pos. 100 (ganz geöffnet) bis zur Pos. 0 zu fahren

und wenn die Jalousie mal klemmt und etwas länger braucht?
du könntest auch ein DOELSEIF dazu packen was dann auf den Wert der Jalousie reagiert.
also:
- Temperaturdifferenz --> fahre auf 0
- Jalousie ist auf 0 (und ich war vorher in Temperaturdifferenzcheck) -> fahre auf 2
- sonst (0 Uhr) -> mache nix
viele Wege in FHEM es gibt!