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
Sollte doch mit sleep (http://fhem.de/commandref_DE.html#sleep) gehen, oder?
set Jal_KU_Ost level 60; sleep 120; set Jal_KU_Ost winkel 50
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
Schau mal hier (http://forum.fhem.de/index.php/topic,45937.msg377007.html#msg377007)
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
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>)
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?
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
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.
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