Wie starte ich eine Aktion erst nach Beendigung einer vorangegangenen Aktion?

Begonnen von bmwfan, 20 Dezember 2015, 16:37:48

Vorheriges Thema - Nächstes Thema

bmwfan

Hallo,

habe für meine Jalousiensteuerung das Modul 90_Jalousie.pm von gevoo genommen und angepaßt (90 Grad-Wendung, geschlossen bei Abwärtsbewegung, geöffnet bei Aufwärtsbewegung). Ich kann mit einem Befehl set Jal_KU_Ost level 60 die Jalousie auf den Level 60 fahren und dann mit einem set Jal_KU_Ost winkel 50 auf den Lamellenwinkel 50 ° stellen. Allerdings muss ich mit dem Winkelbefehl abwarten, bis der Levelbefehl ausgeführt ist und die Jalousie steht. Kommt der Winkelbefehl zu früh, bleibt die Jalousie an der momentanen Position stehen. Konnte es in PERL nicht lösen und habe in FHEM deswegen einen workaround mit einem DOIF erstellt (Code aus DEF).
([du_Rollo_Master] eq "an" and ([du_Tageslicht] eq "dunkel" and [22:00]))
({if (ReadingsVal("Jal_KU_Ost_03", "level", "100") != 0) {fhem("set Jal_KU_Ost level 0")}})
DOELSEIF ([du_Rollo_Master] eq "an" and ([du_Tageslicht] eq "dunkel" and [22:02]))
({if (ReadingsVal("Jal_KU_Ost_03", "level", "0") == 0) {fhem("set Jal_KU_Ost winkel 60")}})
DOELSEIF ([du_Rollo_Master] eq "an" and  ([du_Tageslicht] eq "hell" and [07:00-09:00|134] or [08:45-09:00|257]))
({if (ReadingsVal("Jal_KU_Ost_03", "level", "0") < 40) {fhem("set Jal_KU_Ost level 100")}})

Funktioniert auch, allerdings muss ich die Triggerzeit für das Stellen des Lamellenwinkels (hier 22_02) immer auf die Triggerzeit des Levels (hier 22:00) + 2 min stellen. Ist unschön und behindert die weitere Programmierung ziemlich.

Wie kann ich es so in FHEM programmieren, dass der Winkelbefehl automatisch nach Ablauf des Levelbefehls startet? Die Laufzeit des Levelbefehls hängt vom Soll- und Istlevel der Jalousie ab. Deswegen die + 2 min, da damit der längste Laufweg abgedeckt ist.

Hat jemand eine Idee?

Gruß Jürgen
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

kaihs

Sollte doch mit sleep gehen, oder?


set Jal_KU_Ost level 60; sleep 120; set Jal_KU_Ost winkel 50
Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation

bmwfan

Dann müßte der Code doch so aussehen
([du_Rollo_Master] eq "an" and ([du_Tageslicht] eq "dunkel" and [22:00]))
({if (ReadingsVal("Jal_KU_Ost_03", "level", "100") != 0) {fhem("set Jal_KU_Ost level 0";"sleep 120";"set Jal_KU_Ost winkel 60")}})
DOELSEIF ([du_Rollo_Master] eq "an" and  ([du_Tageslicht] eq "hell" and [07:00-09:00|134] or [08:45-09:00|257]))
({if (ReadingsVal("Jal_KU_Ost_03", "level", "0") < 40) {fhem("set Jal_KU_Ost level 100")}})


Ich bin bisher nur so weit gekommen, einen fhem-Befehl im DOIF auszuführen. Mehrere in einer Anweisung müßte ich doch wie geschrieben auflisten, oder stimmen die Hochkomma nicht?

Gruß Jürgen
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

Otto123

Schau mal hier

Da haben wir was interessantes diskutiert, das müsste Dir vielleicht auch helfen? Der HM Aktor quittiert den "level" nach der Ausführung, dass kannst Du Dir zu Nutze machen.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Ellert

ZitatWie kann ich es so in FHEM programmieren, dass der Winkelbefehl automatisch nach Ablauf des Levelbefehls startet?
Prinzipiell geht es so:

define di DOIF ([<dein Trigger>]) (set <Jalousiename> level <Wert_x>)
DOELSEIF ([<Jalousiename>:level] == <Wert_x>)  (set <Jalousiename> winkel <Wert_y>)

bmwfan

Hallo,
danke für die Tipps. Auf diese Ansätze wäre ich nie gekommen, da sie mir zu komplex sind. Auch in dem verlinkten Thread kann ich die Gedankengänge (noch) nicht nachvollziehen. Da fehlt mir dann doch der Background im Moment.

@Ellert: Habe Deinen Vorschlag getestet:
([du_jal] eq "an") (set Jal_KU_Ost level 80) DOELSEIF ([Jal_KU_Ost:level] == 80) (set Jal_KU_Ost winkel 60) DOELSEIF ([du_Jal] eq "aus") (set Jal_KU_Ost level 100) (aus DEF).
Reaktion:
Jalousie war ganz offen == level 100. Sie fährt dann ganz zu == level 0 und dann auf level 80 und dreht dann auf den angegeben Winkel. So weit gut, aber der einzige Schönheitsfehler ist jetzt, dass sie zuerst ganz zu fährt, bevor sie auf den angegeben level fährt und den Winkel stellt. Ich muß gestehen, dass ich das Verhalten nicht verstehe, wenn ich mir das DOIF anschaue. Hast Du eine Idee?

Gruß Jürgen

Ergänzung:
Zu früh gefreut. Die Reaktion war nur beim ersten Mal so. Jetzt fährt die Jalousie immer nur auf das level 80 und stellt den Winkel nicht. Habe versuchsweise attr do always beim DOIF angegeben, aber keine Änderung.

Ergänzung 2:
Habe in meinem Modul mitgeloggt.
Zitataktuelle Version ist jetzt V 0.00.09 von gevoo, modifiziert von bmwfan
2015-12-21_16:58:33 Jalousie_Level: Jal_KU_Ost Istlevel = 100
2015-12-21_16:58:33 myJalousie_Set_value<level: Jal_KU_Ost runter fahren auf 80
2015-12-21_16:58:33 myJalousie_Set_value:level: Jal_KU_Ost Level setzen auf 80 Höhe
2015-12-21_16:58:33 myJalousie_Set_Winkel: Jal_KU_Ost Istlevel = 80
2015-12-21_16:58:33 myJalousie_Set_Winkel: Jal_KU_Ost Sollwinkel = 67
2015-12-21_16:58:33 myJalousie_Set_Winkel: Jal_KU_Ost deltaW = 67
2015-12-21_16:58:33 myJalousie_Set_Winkel: Jal_KU_Ost Solllevel = 82.2905982905983
2015-12-21_16:58:33 myJalousie_Set_Winkel: Jal_KU_Ost Winkel auf 67 grad

Die Endstellung der Jalousie (level 80) wurde tatsächlich um 16:58:47 erreicht. Dann erst sollte das DOELSEIF ausgeführt werden, da dann ja erst der level auf 80 steht. Es wurde aber mit dem Ausführen de DOIF um 16:58:33 gleich mit ausgeführt, wie wenn der level schon mit 80 rückgemeldet wird??? Dadurch wird eine anderer Solllevel errechnet (winkelabhängig) und angefahren. Somit kommt als Rückmeldung auch nie der level 80 und das DOELSEIF triggert nicht.

So interpretiere ich es zumindest.

Noch eine Idee?
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

bmwfan

Problem gelöst:

Nachdem ich in meinem Modul 90_myJalousie.pm zwei setreading deaktiviert habe, geht es.
# fhem( "setreading $hash->{myJalousie}{aktor} level $value");
# fhem( "setreading $name level $value")
Ich vermute, dass ich in der Abfrage DOELSEIF genau das reading abgefragt habe, das ich in meinem Modul beim Befehl set Jal_KU_Ost level 80 gesetzt habe und was nicht dem tatsächlichen level im device entspricht. ([du_jal] eq "an") (set Jal_KU_Ost level 80) DOELSEIF ([Jal_KU_Ost_03:level] == 80) (set Jal_KU_Ost winkel 60) DOELSEIF ([du_jal] eq "aus") (set Jal_KU_Ost level 100)Dadurch wurde sofort der scheinbar erreichte Level rückgemeldet und sofort der Winkelbefehl abgesetzt. Nach dem deaktivieren wird jetzt der tatsächliche level aus dem device ausgelesen und erst nach dem Erreichen des levels der Winkelbefehl abgesetzt.

Besten Dank an alle Helfer.

Gruß Jürgen
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

Ellert

Ich selbst kenne das Modul und die Readings nicht, weil ich Somfy RTS mit TRX Light steuere. Daher hatte ich vorsichtigerweise geschrieben
ZitatPrinzipiell geht es so
, denn Wechselwirkungen sind aus der Ferne schlecht vorauszusehen.

bmwfan

Hallo Elelrt,

wie es sich gezeigt hat, hat die Lösung einen Nachteil. Der Winkelbefehl kommt nicht nur, wenn ich automatisch auf den gewünschten Level gefahren bin, sondern auch wenn ich über die Taster auf den Wert fahre. In dem Fall Level 0. Ich denke ich gehe einfach auf den Level 01, wenn ich automatisch zufahre. Dann ist bei manuellem Schliessen der level 0 und die Winkelstellung wird (hoffentlich) nicht angefahren.

Mal testen.

Gruß Jürgen
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd