Reihenfolge der Befehle

Begonnen von baukater, 13 November 2013, 19:26:05

Vorheriges Thema - Nächstes Thema

baukater

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
FB7490,Raspi 2/3,HM-Lan,Jeelink Classic (868),Logilink BT0015 Bluetooth 4.0, 2x mySmartUSB light,RS485USB , entities:272 device:14 channel:27 virtual:1, 6 x HM-LC-BL1-FM,4 x HM-LC-SW4-WM, 1 x HM-LC-SW2-FM,1 x Fensterkontakt,1 1x Türkontakt, 1 1x Bewegungsmelder, DECT-200,DECT100,6xAuthentic Xiaom

martinp876

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


baukater

#2
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.
FB7490,Raspi 2/3,HM-Lan,Jeelink Classic (868),Logilink BT0015 Bluetooth 4.0, 2x mySmartUSB light,RS485USB , entities:272 device:14 channel:27 virtual:1, 6 x HM-LC-BL1-FM,4 x HM-LC-SW4-WM, 1 x HM-LC-SW2-FM,1 x Fensterkontakt,1 1x Türkontakt, 1 1x Bewegungsmelder, DECT-200,DECT100,6xAuthentic Xiaom

martinp876

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?