Ich habe eine Abfolge von Befehlen für die Jalousien, die immer gleich ist: Jalousie ganz zu, 4 Sekunden warten, dann
Jalousie etwas öffnen. Damit kann ich genau einstellen wie die Lamellen stehen sollen, ohne dass ich deren Ausgangsstellung
kenne. Hierzu habe ich mir eine kleine Funktion geschrieben. Im Protokoll ist auch schön zu sehen ,dass diese im Abstand von 4 Sekunden
gefeuert wurden (in diesem Fall zwei Relais für Down und Up ). Im List der einzelnen Aktoren ist aber zu sehen,
dass die fast zeitgleich ausgeführt wurden. Da die Lamelle noch "fährt", kommt der zweite Befehl, der die Lamelle stellen soll, einem
Stop gleich und die Jalousie bleibt zu. Kann man das besser lösen und umgehen, so dass diese garantiert hintereinander mit wenig Zeitabstand ausgeführt werden?
sub turnBlade($$$)
{
my $Aktor = shift;
my $Level = shift;
my $Reset = shift;
my @driveTime = (0.0,0.2,0.3,0.5,0.7,0.95,1.1,1.3,1.5,1.7,2.0);
if ($Reset)
{
fhem("set ".$Aktor."_Down on-for-timer ".$glCloseTime."; sleep 4 ;set ".$Aktor."_Up on-for-timer ".$driveTime[$Level]);
}
else
{
fhem("set ".$Aktor."_Up on-for-timer ".$driveTime[$Level]);
}
}
2013.11.13 17:21:35 2: CUL_HM set Jal_Kueche_Down on-for-timer 1.8
2013.11.13 17:21:36 2: CUL_HM set Jal_Schlafz 0
2013.11.13 17:21:36 2: CUL_HM set Jal_WohnzEck1_Down on-for-timer 1.8
2013.11.13 17:21:36 2: CUL_HM set Jal_WohnzEck2_Down on-for-timer 1.8
2013.11.13 17:21:36 2: CUL_HM set Jal_WohnzTV_Down on-for-timer 3
2013.11.13 17:21:40 2: CUL_HM set Jal_Kueche_Up on-for-timer 0.3
2013.11.13 17:21:40 2: CUL_HM set Jal_WohnzEck1_Up on-for-timer 0.3
2013.11.13 17:21:40 2: CUL_HM set Jal_WohnzEck2_Up on-for-timer 0.3
Internals:
DEF 20F53F02
EVENTS 3
NAME Jal_WohnzEck1_Down
NR 331
STATE off
TYPE CUL_HM
chanNo 02
device Switch4_WZEck
Readings:
2013-11-13 17:21:39 CommandAccepted yes
2013-11-13 17:21:44 deviceMsg off (to broadcast)
2013-11-13 17:21:44 level 0 %
2013-11-13 17:21:44 pct 0
2013-11-10 17:25:06 running -
2013-11-13 17:21:44 state off
2013-11-13 17:21:44 timedOn off
Helper:
Role:
chn 1
Attributes:
expert 1
icon fts_shutter_down
model HM-LC-SW4-WM
peerIDs 00000000,
room EG
webCmd statusRequest:off:on-for-timer 3:on-for-timer 0.5
Internals:
DEF 20F57203
EVENTS 3
NAME Jal_Kueche_Up
NR 305
STATE off
TYPE CUL_HM
chanNo 03
device Switch4_Kueche
Readings:
2013-11-13 17:21:40 CommandAccepted yes
2013-11-13 17:21:43 deviceMsg off (to broadcast)
2013-11-13 17:21:43 level 0 %
2013-11-13 17:21:43 pct 0
2013-11-10 17:25:03 running -
2013-11-13 17:21:43 state off
2013-11-13 17:21:43 timedOn off
Helper:
Role:
chn 1
Attributes:
expert 1
icon fts_shutter_up
model HM-LC-SW4-WM
peerIDs 00000000,
room EG
webCmd statusRequest:off:on-for-timer 3:on-for-timer 0.5
Hallo baukater,
ja, kann man. Ist dei Frage, wie komplex man es will.
zum ersten würde mich die "4" stören. Ich kann nicht sehen, wo $lgCloseTime herkommt. Aber der sleep sollte doch sicher "$lgCloseTime + 4" sein?
Die anspruchsvollere, technisch genaueren Lösung würde das Ende des "on-for-timer" abwarten (per notify oder Abfrage/pollen) und dann die Lamellen drehen. Schiesst aber hier evtl über das Ziel hinaus da am Ende auch nichts anderes passiert.
fhem("set ".$Aktor."_Down on-for-timer ".$glCloseTime."; sleep ".($glCloseTime+4)." ;set ".$Aktor."_Up on-for-timer ".$driveTime[$Level]);
oder
fhem("set ".$Aktor."_Down on-for-timer ".$glCloseTime.";".\
"define ".$Aktor."_sleep at +".($glCloseTime+4).";set ".$Aktor."_Up on-for-timer ".$driveTime[$Level]);
Achtung: tippfehler möglich ;-) . Prinzip solle aber rüberkommen
Gruss Martin
Hallo Martin,
closeTime ist global, sind aber 1.8 Sekunden, die Zeit die die Lamelle maximal braucht, um komplett zu schließen. Deshalb warte ich
4 Sekunden ab, weil ich denke, dass das dann abgearbeitet ist. Ich habs mal jetzt versuchsweise auf 6 Sekunden gestellt, möchte aber eigentlich verhindert, dass die Wartezeit bis zum Öffnen zu lange ist, weil das Wohnzimmer in dieser Zeit abgedunkelt ist. Ein define ist ja eigentlich dasselbe, ich nehme mal an dass die Reihenfolge dann trotzdem zufällig sein kann, weil ja der erste Befehl schon verzögert ausgeführt wird.
Wenn ich ein temporäres notify erstelle, müsste ich ja genau den Moment abwarten, wo die Jalousie fährt "$Aktor on", um dann auf das
"notify $aktor:off" zu reagieren, auch Zufall. So zumindest mein erster gedanke. Oder vielleicht noch die Idee das Attribut des Aktors auf on-change-reading ändere, setzte zuerst den notify ab und mach dann die Jalousie zu. Könnte vielleicht klappen. Was meinst Du?
Nachtrag: Ich frag mich gerade, ob ein temporäres notify überhaupt geht.
die 4 sec sind nie so genau - fixe wartezeiten sind fast immer ein workaround. Wenn FHEM einmal wiederholen müsste kann das schon 4sec dauern - und es klappt nicht mehr.
Der Ablauf sollte also sein:
- fahre zu
- warte auf "fertig"
- kippe
==soweit korrekt?
event-on-change empfehle ich erst einmal grundsätzlich, also auch hier.
Du baust also ein notify das du mit dem Kommando definierst und das sich selbst löscht beim Aufruf. Es triggert auf das Ende des "zu" und fährt dann in die Stellung.
Verständlich soweit?