Hallo ich bin noch ziemlich neu in dem Thema DOELSEIF.
Ich möchte gerne über TabletUI meine Jalousien auf 25% oder 50% öffnen lassen.
Es gestaltet sich aber schwieriger als ich gedacht habe daher bräuchte ich etwas Unterstützung wie ich die Sache am Besten einfach und übersichtlich in ein DOIF packen kann.
Bei mir habe ich zentral eine S7 verbaut zu der die Taster und Ansteuerung der Jalousien laufen.
Ein wenig Logik wegen Auf/Zu bei Tasterdruck und Wartezeit vor Richtungsumkehr sowie Stellung in % habe ich in der S7 gelöst.
Das schalten aus FHEM mache ich über einen Trigger Auf/Zu funktioniert auch wunderbar.
Nun möchte ich für jede Jalousie 2 zusätzliche Buttons einfügen die mir die Jalousie auf 25% oder 50% fahren.
Ich müsste ja also nur den Dummy abfragen welcher gedrückt wurde dann die Stellung vergleichen und bei erreichen mit etwas Hysterese nochmals einen Trigger absetzen und den Dummy wieder zurück schalten. Ich darf die trigger Funktion während des Vergleiches ja nicht wieder ausführen lassen da bei trigger in gleiche Laufrichtung die Jalousie wieder stoppt und startet.
Sollte in dem Moment des Laufens zu 25 doch der Button 50 betätigt oder die Richtung auf/zu betätigt/geändert werden möchte ich das auch berücksichtigen.
Des Weiteren überlege ich ob man das in einem DOIF verpackt oder pro Richtung oder in wie weit man das vereinen kann.
Hoffe es ist einigermaßen zu verstehen was ich meine.
Habe auch schonmal etwas rumprobiert aber funktioniert noch nicht zufriedenstellend und ist wahrscheinlich auch vollkommen weird xD.
([JS_Buero25:state] eq "on" and [JS_Buero50:state] eq "off" and [RM_BUERO] < 30 and [RM_BUERO] > -1 and (![$SELF:cmd]) eq "1" and (![doif_JS_Buero25Zu:cmd]) eq "1")
(set BueroAuf trigger)
DOELSEIF ([JS_Buero25:state] eq "on" and [JS_Buero50:state] eq "off" and [RM_BUERO] < 30 and [RM_BUERO] > 20 and (![doif_JS_Buero25Zu:cmd]) eq "2")
(set JS_Buero25 off, set BueroAuf trigger)
([JS_Buero25:state] eq "on" and [JS_Buero50:state] eq "off" and [RM_BUERO] < 101 and [RM_BUERO] > 30 and (![$SELF:cmd]) eq "1" and (![doif_JS_Buero25Auf:cmd]) eq "1")
(set BueroZu trigger)
DOELSEIF ([JS_Buero25:state] eq "on" and [JS_Buero50:state] eq "off" and [RM_BUERO] < 30 and [RM_BUERO] > 20 and (![doif_JS_Buero25Auf:cmd]) eq "2")
(set JS_Buero25 off, set BueroZu trigger)
Was meinst Du im Klartext mit sowas:
(![$SELF:cmd]) eq "1"
?
EDIT: und vielleicht folgendes besser erklären:
ZitatIch müsste ja also nur den Dummy abfragen welcher gedrückt wurde dann die Stellung vergleichen und bei erreichen mit etwas Hysterese nochmals einen Trigger absetzen und den Dummy wieder zurück schalten. Ich darf die trigger Funktion während des Vergleiches ja nicht wieder ausführen lassen da bei trigger in gleiche Laufrichtung die Jalousie wieder stoppt und startet.
Sollte in dem Moment des Laufens zu 25 doch der Button 50 betätigt oder die Richtung auf/zu betätigt/geändert werden möchte ich das auch berücksichtigen.
Ein Beispiel-Ablauf mit Werten, oder eine Folge von Bedingung => Massnahme (use case)
Das sollte eigentlich den Status sprich commands des DOIFs auswerten.
$SELF sollte das eigene DOIF meinen und cmd den command der ansteht und das ! für nicht.
Indem Fall soll sich der cmd nur einmal ausgeführt werden, da die Jalousie ja schon läuft und erst noch einmal getriggert werden wenn sie zwischen 30 und 20 ist.
Aber vll gibt es da ja auch elegantere Lösungen (z.B. cmd nur einmal in jedem Schritt abzusetzten oö).
ich weiß bloß nicht wie man das machen würde xD.
Zitat von: amenomade am 17 Januar 2020, 21:59:41
Was meinst Du im Klartext mit sowas:
(![$SELF:cmd]) eq "1"
?
EDIT: und vielleicht folgendes besser erklären: Ein Beispiel-Ablauf mit Werten, oder eine Liste von Bedingung => Massnahme
Allso ich stelle mir die einfache Version erstmal so vor.
RM_BUERO ist die Rückmeldung Jalousie 0 ist ZU 100 ist AUF
JS_BUERO25 ist der Dummy den ich aus TabletUI in fhem schalte, kann den state on oder off annehmen.
JS_BUERO50 ist der Dummy den ich aus TabletUI in fhem schalte, kann den state on oder off annehmen ist das gleiche bloß das das andere doif mit 50% ausgewertet werden soll.
BueroAuf ist ein S7_DWrite in ein DB innerhalb der S7. Ich reagiere darauf wie mit den Tastern im Haus bei erst beim loslassen nach betätigen fahren die jalousien bedeutet signalwechsel 0-1-0
BueroAuf ist ein S7_DWrite in ein DB innerhalb der S7. Genau das gleiche in die andere Richtung. Steuer ich aus fhem eigentlich nur in trigger da die timer der laufzeit in der s7 angestossen werden und ablaufen.
doif_JS_Buero25Auf ist das DOIF um die Jalousie in Richtung AUF zu fahren sollte die RM unter 25 liegen
doif_JS_Buero25Zu ist das DOIF um die Jalousie in Richtung ZU zu fahren sollte die RM über 25 liegen (das müsste ich halt beides auch für 50 anlegen, ist mir aber alles n bissle viel und geht bestimmt kompakter)
Beispiel Jalosuie ist auf 10% und soll aber auf 25% gesteuert werden
Drücke das switch icon auf tablet ui der steuert den dummy JS_BUERO25 das aktiviert die beiden DOIFS. In dennen wird jetzt unterschieden ob die RM größer als 25 oder kleiner als 25 ist. In diesem Fall kleiner also muss das DOIF doif_JS_Buero25Auf ansprechen und einen trigger auf BueroAuf geben und die Jalousie fährt. Die RM steigt sobald diese annähernd gleich sind soll nochmal ein trigger auf BueroAuf gesteuert werden damit die Jalousie stoppt. so da die Jalousie nun die gewünschte stellung hat soll der dummy JS_BUERO25 wieder zurück gesetzt werden. Soweit die Überlegung.
Hoffe das konnte helfen.
Hmmm... scheint mir sehr kompliziert. Hast Du schon das Modul ROLLO geguckt? https://fhem.de/commandref_DE.html#ROLLO
Damit könntest Du direkt "set.... pct 25" oder "set.... pct 50" ausführen. Und zwar direkt aus FTUI
Aber gut... Vorschlag, nicht getestet:
([JS_Buero25] eq "on" and [?JS_Buero50] eq "off" and [RM_BUERO] < 20 and [RM_BUERO] > -1)
(set BueroAuf trigger)
DOELSEIF ([JS_Buero25] eq "on" and [?JS_Buero50] eq "off" and [RM_BUERO] < 101 and [RM_BUERO] > 30)
(set BueroZu trigger)
DOELSEIF ([JS_Buero25] eq "on" and [?JS_Buero50] eq "off" and [RM_BUERO] < 30 and [RM_BUERO] > 20)
(IF ([$SELF] eq "cmd1")(set BueroAuf trigger) ELSE (set BueroZu trigger)
(set JS_Buero25 off)
DOELSEIF ([JS_Buero50] eq "on" and [?JS_Buero25] eq "off" and [RM_BUERO] < 45 and [RM_BUERO] > -1)
(set BueroAuf trigger)
DOELSEIF ([JS_Buero50] eq "on" and [?JS_Buero25] eq "off" and [RM_BUERO] < 101 and [RM_BUERO] > 55)
(set BueroZu trigger)
DOELSIF ([JS_Buero50] eq "on" and [?JS_Buero25] eq "off" and [RM_BUERO] < 55 and [RM_BUERO] > 45)
(IF ([$SELF] eq "cmd4")(set BueroAuf trigger) ELSE (set BueroZu trigger)
(set JS_Buero50 off)
DOELSE
Sowas ist aber sehr unperformant: man muss permanent RM_BUERO triggern lassen