[gelöst] DOELSEIF zweig will nicht auslösen

Begonnen von Stelaku, 21 Februar 2021, 18:23:48

Vorheriges Thema - Nächstes Thema

Stelaku

Hallo alle zusammen

Zur Steuerung eines Rolladenmotors habe ich in meiner Live Instanz 5 einzelne Device´s eingerichtet um diese zu Steueren.
Ein dummy zur Status Anzeige mit icon fts_shutter
ein DOIF mit dem Icon control_arrow_down zum direkten ansteuern für runter
ein DOIF mit dem icon control_arrow_up zum direkten hochfahren
ein DOIF in den ich die Endabschaltpunkte für hoch und runter festlege
und ein DOIF in dem ich die Taster für hoch und runter abfrage und dann die jeweiligen GPIO´s schalte.

Jetzt habe ich es mir in den Kopf gesetzt das alles in einem DOIF zu vereinen.
Bis auf die Endabschaltung habe ich das auch schon hinbekommen.

In meinem Haupt DOIF wird ein reading hoch und runtergezählt und beim erreichen von 100 oder 10 soll die Endabschaltung erfolgen.

hier mal mein Haupt DOIF aus der raw_definition

defmod Rollo_Stephan DOIF ([Taster:hoch] eq "on" and ([Rollo_Stephan:Status] =~ "fährt_hoch" or [Rollo_Stephan:Status] =~ "fährt_runter")) ## stop Fahrtrichtung hoch\
(\
set GPIO26 off,\
set GPIO27 off,\
setreading $SELF Status oben_stop_{([$SELF:Status:d])}\
)\
DOELSEIF\
([Taster:hoch] eq "on") ## Start Fahrtrichtung hoch\
(\
IF ([GPIO26] eq"off")(set GPIO26 on),\
IF ([GPIO27] eq"on")(set GPIO27 off),\
IF ([$SELF:Status:d] > 10) (setreading $SELF Status fährt_hoch_{([$SELF:Status:d] -10)}),\
IF ([$SELF:Status:d] == 10) (setreading $SELF Status oben_stop_{([$SELF:Status:d])})\
)\
\
\
DOELSEIF\
([Taster:runter] eq "on" and ([Rollo_Stephan:Status] =~ "fährt_hoch" or [Rollo_Stephan:Status] =~ "fährt_runter")) ## Stop Fahrtrichtung runter\
(set GPIO26 off)\
(\
set GPIO27 off,\
setreading $SELF Status unten_stop_{([$SELF:Status:d])}\
)\
\
DOELSEIF\
([Taster:runter] eq "on") ## Start Fahrtrichtung runter\
(\
IF ([$SELF:Status:d] < 100) (setreading $SELF Status fährt_runter_{([$SELF:Status:d] +10)}),\
IF ([$SELF:Status:d] == 100) (setreading $SELF Status unten_stop_{([$SELF:Status:d] )}),\
IF ([GPIO27] eq "off")(set GPIO27 on)\
)\
(\
IF ([GPIO26] eq"off")(set GPIO26 on),\
\
)\
\
DOELSEIF\
([$SELF:Status] eq "unten_stop_100") \
(set GPIO26 off)\
(set GPIO27 off) ### cmd 5 runter Abschaltung über Endpunkt\
DOELSEIF\
([$SELF:Status] eq "oben_stop_10")\
(set GPIO26 off) ### cmd 6 rauf Abschaltung über Endpunkt
attr Rollo_Stephan devStateIcon 1.fährt_hoch_100:fts_shutter_100@red\
1.fährt_hoch_90:fts_shutter_90@red\
1.fährt_hoch_80:fts_shutter_80@red\
1.fährt_hoch_70:fts_shutter_70@red\
1.fährt_hoch_60:fts_shutter_60@red\
1.fährt_hoch_50:fts_shutter_50@red\
1.fährt_hoch_40:fts_shutter_40@red\
1.fährt_hoch_30:fts_shutter_30@red\
1.fährt_hoch_20:fts_shutter_20@red\
1.fährt_hoch_10:fts_shutter_10@red\
\
1.fährt_runter_100:fts_shutter_100@red\
1.fährt_runter_90:fts_shutter_90@red\
1.fährt_runter_80:fts_shutter_80@red\
1.fährt_runter_70:fts_shutter_70@red\
1.fährt_runter_60:fts_shutter_60@red\
1.fährt_runter_50:fts_shutter_50@red\
1.fährt_runter_40:fts_shutter_40@red\
1.fährt_runter_30:fts_shutter_30@red\
1.fährt_runter_20:fts_shutter_20@red\
1.fährt_runter_10:fts_shutter_10@red\
\
1.unten_stop_100:fts_shutter_100\
1.unten_stop_90:fts_shutter_90\
1.unten_stop_80:fts_shutter_80\
1.unten_stop_70:fts_shutter_70\
1.unten_stop_60:fts_shutter_60\
1.unten_stop_50:fts_shutter_50\
1.unten_stop_40:fts_shutter_40\
1.unten_stop_30:fts_shutter_30\
1.unten_stop_20:fts_shutter_20\
1.unten_stop_10:fts_shutter_10\
\
1.oben_stop_100:fts_shutter_100\
1.oben_stop_90:fts_shutter_90\
1.oben_stop_80:fts_shutter_80\
1.oben_stop_70:fts_shutter_70\
1.oben_stop_60:fts_shutter_60\
1.oben_stop_50:fts_shutter_50\
1.oben_stop_40:fts_shutter_40\
1.oben_stop_30:fts_shutter_30\
1.oben_stop_20:fts_shutter_20\
1.oben_stop_10:fts_shutter_10\
\
## ARROW DOWN\
\
2.fährt_hoch.*:control_arrow_down:cmd_1\
2.fährt_runter.*:control_arrow_down@RED:cmd_3\
2.unten_stop.*:control_arrow_down:cmd_4\
2.oben_stop.*:control_arrow_down:cmd_4\
## ARROW UP\
\
3.fährt_hoch.*:control_arrow_up@RED:cmd_1\
3.fährt_runter.*:control_arrow_up:cmd_3\
3.unten_stop.*:control_arrow_up:cmd_2\
3.oben_stop.*:control_arrow_up:cmd_2\

attr Rollo_Stephan group Rollo_Stephan
attr Rollo_Stephan readingList Laufzeit
attr Rollo_Stephan repeatcmd :\
[$SELF:Laufzeit:d]/10*1:\
:\
[$SELF:Laufzeit:d]/10*1\

attr Rollo_Stephan room Stephan
attr Rollo_Stephan setList Laufzeit:5&nbsp;;sek,10&nbsp;;sek,11&nbsp;;sek,12&nbsp;;sek,13&nbsp;;sek,14&nbsp;;sek,15&nbsp;;sek,16&nbsp;;sek,17&nbsp;;sek,18&nbsp;;sek,19&nbsp;;sek,20
attr Rollo_Stephan stateFormat 1:Status\
&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;\
3:Status\
<br>&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;\
2:Status
attr Rollo_Stephan wait :\
:\
0,0.1:\
0,0.1:\
0,0.1
attr Rollo_Stephan webCmd Laufzeit

setstate Rollo_Stephan 1:unten_stop_100\
&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;\
3:unten_stop_100\
<br>&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;\
2:unten_stop_100
setstate Rollo_Stephan 2021-02-21 14:51:54 Device Taster
setstate Rollo_Stephan 2021-02-21 10:56:28 Laufzeit 16 sek
setstate Rollo_Stephan 2021-02-21 17:17:56 Status unten_stop_100
setstate Rollo_Stephan 2021-02-21 17:17:57 cmd 5.2
setstate Rollo_Stephan 2021-02-21 17:17:57 cmd_event Rollo_Stephan
setstate Rollo_Stephan 2021-02-21 17:17:57 cmd_nr 5
setstate Rollo_Stephan 2021-02-21 17:17:57 cmd_seqnr 2
setstate Rollo_Stephan 2021-02-21 17:17:56 e_Rollo_Stephan_Status unten_stop_100
setstate Rollo_Stephan 2021-02-21 14:51:33 e_Taster_hoch off
setstate Rollo_Stephan 2021-02-21 14:51:54 e_Taster_runter off
setstate Rollo_Stephan 2021-02-21 13:37:17 mode enabled
setstate Rollo_Stephan 2021-02-21 17:17:57 state cmd_5
setstate Rollo_Stephan 2021-02-21 17:17:57 wait_timer no timer



1.            Do Fall Taster für hoch stopt die Fahrt nach oben und speichert den stand in das reading Status
2. DOELSEIF Fall Taster für hoch startet die Fahrt nach oben und zählt das reading Status runter
3. DOELSEIF Fall Taster für runter stopt die Fahrt nach unten und speichert den stand in das reading Status
4. DOELSEIF Fall Taster für runter startet die Fahrt nach unten und zählt das reading Status rauf
5. DOELSEIF Fall stopt die Fahrt nach unten durch das Reading Status wenn der Wert unten_stop_100 hat
6. DOELSEIF Fall stopt die Fahrt nach oben durch das Reading Status wenn der Wert oben_stop_10 hat

Das Reading für den Status kann folgende Werte haben
                                                                             
oben_stop_10 bis 100
unten_stop_10 bis 100
fährt_runter_10 bis 100
fährt_hoch_10 bis 100

Mein Problem ist jetzt das ich es nicht hinbekomme das der 5. oder 6. DOELSEIF Zweig ausgelöst wird obwohl das Reading Status die erforderlichen EVENT´s unten_stop100 oder oben_stop_10 hat.
Wenn der Rollo fährt wird der DOELSEIF Zweig durch repeatcmd so lange wiederholt bis cmd 5 oder cmd 6 auslösen.
SO weit die Therorie.
In der Praxis bleibt das DOIF im 4. oder 2. DOELSEIF Zweig stecken und wiederholt diesen endlos.

Erst durch ein zweites DOIF welches auf den Status des Haupt DOIF´s horch und bei erfüllter Bedingung das Reading für Rollo_Stephan unten_stop_100 sendet wird der 5. DOELSEIF Zweig für das stoppen der Fahrt nach unten gesetzt.
Für Oben natürchlich dann auch.

Hier das zweite DOIF aus der raw_definition

defmod Rollo_Stephan_Endpunkte DOIF ([Rollo_Stephan:Status] eq "unten_stop_100" or [Rollo_Stephan:Status] eq "fährt_runter_100")\
() ## cmd 1 Endpunkt Abschaltung unten\
(setreading Rollo_Stephan Status unten_stop_{([Rollo_Stephan:Status:d])})\
DOELSEIF\
([Rollo_Stephan:Status] eq "oben_stop_10" or [Rollo_Stephan:Status] eq "fährt_hoch_10")\
() ## cmd 1 Endpunkt Abschaltung oben\
(,setreading Rollo_Stephan Status oben_stop_{([Rollo_Stephan:Status:d])})\
DOELSE
attr Rollo_Stephan_Endpunkte disable 0
attr Rollo_Stephan_Endpunkte do always
attr Rollo_Stephan_Endpunkte group Rollo_Stephan
attr Rollo_Stephan_Endpunkte room Stephan
attr Rollo_Stephan_Endpunkte wait 0,2:0,2
attr Rollo_Stephan_Endpunkte widgetOverride wait:textField-long

setstate Rollo_Stephan_Endpunkte cmd_1
setstate Rollo_Stephan_Endpunkte 2021-02-21 17:17:56 Device Rollo_Stephan
setstate Rollo_Stephan_Endpunkte 2021-02-21 17:17:56 cmd 1.2
setstate Rollo_Stephan_Endpunkte 2021-02-21 17:17:56 cmd_event Rollo_Stephan
setstate Rollo_Stephan_Endpunkte 2021-02-21 17:17:56 cmd_nr 1
setstate Rollo_Stephan_Endpunkte 2021-02-21 17:17:56 cmd_seqnr 2
setstate Rollo_Stephan_Endpunkte 2021-02-21 17:17:56 e_Rollo_Stephan_Status unten_stop_100
setstate Rollo_Stephan_Endpunkte 2021-02-21 17:17:53 mode enabled
setstate Rollo_Stephan_Endpunkte 2021-02-21 17:17:56 state cmd_1
setstate Rollo_Stephan_Endpunkte 2021-02-21 17:17:56 wait_timer no timer


Ich habe auch versucht dieses zweite DOIF durch ein im Haupt DOIF angelegtes userreading zu ersetzten. Dieses sollte die benötigten Event für stop etwas verzögert erzeugen.
Leider war dieses nicht besonders erfolgreich. Es funktionierte einmalig. Fhem ging dann auf 100% CPU und war nur noch durch Netztrennung wieder erreichbar.
Und ich glaube da ist auch das Problem. Selbstriggerung ???
Das Attr selftrigger habe ich auch ohne Erfolg ausprobiert.

Vieleicht kann mir noch einer einen Tip geben um doch noch alles in einem DOIF zu vereinen.

Viele Grüße

Stephan

Ellert

Das Attribut selftrigger müsstest Du verwenden, wegen des Triggers auf [$SELF:Status] in den letzten beiden Zweigen, alternativ das Setzen von [$SELF:Status] über sleep  vom DOIF entkoppeln.

Stelaku

Hallo Ellert

Vielen dank für Deine Antwort.

Wenn ich das attr selftrigger verwende bekomme ich folgendes ergebnis.
Fahrt nach oben cmd_2

Das reading für Status wird hochgezählt bis es 10 erreicht. cmd_6 für fahrt stop wird kurz gesetzt und dann fällt es zurück in cmd_2
und dann wieder auf cmd_6 und so weiter. Das hat zufolge das GPIO26 immer wieder an und ausgeschaltet wird.

anbei einen Auszug aus dem eventmonitor.


2021-02-21 20:36:53 DOIF Rollo_Stephan wait_timer: no timer
2021-02-21 20:36:53 DOIF Rollo_Stephan Status: fährt_hoch_20
2021-02-21 20:36:53 DOIF Rollo_Stephan e_Rollo_Stephan_Status: fährt_hoch_20
2021-02-21 20:36:53 DOIF Rollo_Stephan cmd_nr: 2
2021-02-21 20:36:53 DOIF Rollo_Stephan cmd_seqnr: 1
2021-02-21 20:36:53 DOIF Rollo_Stephan cmd: 2.1
2021-02-21 20:36:53 DOIF Rollo_Stephan cmd_event: set_cmd_2
2021-02-21 20:36:53 DOIF Rollo_Stephan cmd_2_1
2021-02-21 20:36:53 DOIF Rollo_Stephan wait_timer: 21.02.2021 20:36:54 cmd_2_2 set_cmd_2
2021-02-21 20:36:54 DOIF Rollo_Stephan wait_timer: no timer
2021-02-21 20:36:54 DOIF Rollo_Stephan cmd_nr: 2
2021-02-21 20:36:54 DOIF Rollo_Stephan cmd_seqnr: 2
2021-02-21 20:36:54 DOIF Rollo_Stephan cmd: 2.2
2021-02-21 20:36:54 DOIF Rollo_Stephan cmd_event: set_cmd_2
2021-02-21 20:36:54 DOIF Rollo_Stephan cmd_2
2021-02-21 20:36:54 DOIF Rollo_Stephan wait_timer: 21.02.2021 20:36:55 cmd_2_1 set_cmd_2
2021-02-21 20:36:55 DOIF Rollo_Stephan wait_timer: no timer
2021-02-21 20:36:55 DOIF Rollo_Stephan Status: fährt_hoch_10
2021-02-21 20:36:55 DOIF Rollo_Stephan e_Rollo_Stephan_Status: fährt_hoch_10
2021-02-21 20:36:55 DOIF Rollo_Stephan cmd_nr: 2
2021-02-21 20:36:55 DOIF Rollo_Stephan cmd_seqnr: 1
2021-02-21 20:36:55 DOIF Rollo_Stephan cmd: 2.1
2021-02-21 20:36:55 DOIF Rollo_Stephan cmd_event: set_cmd_2
2021-02-21 20:36:55 DOIF Rollo_Stephan cmd_2_1
2021-02-21 20:36:55 DOIF Rollo_Stephan wait_timer: 21.02.2021 20:36:56 cmd_2_2 set_cmd_2
2021-02-21 20:36:56 DOIF Rollo_Stephan wait_timer: no timer
2021-02-21 20:36:56 RPI_GPIO GPIO26 off
2021-02-21 20:36:56 DOIF Rollo_Stephan Status: oben_stop_10
2021-02-21 20:36:56 DOIF Rollo_Stephan e_Rollo_Stephan_Status: oben_stop_10
2021-02-21 20:36:56 DOIF Rollo_Stephan cmd_nr: 6
2021-02-21 20:36:56 DOIF Rollo_Stephan cmd: 6
2021-02-21 20:36:56 DOIF Rollo_Stephan cmd_event: Rollo_Stephan
2021-02-21 20:36:56 DOIF Rollo_Stephan cmd_6
2021-02-21 20:36:56 DOIF Rollo_Stephan cmd_nr: 2
2021-02-21 20:36:56 DOIF Rollo_Stephan cmd_seqnr: 2
2021-02-21 20:36:56 DOIF Rollo_Stephan cmd: 2.2
2021-02-21 20:36:56 DOIF Rollo_Stephan cmd_event: set_cmd_2
2021-02-21 20:36:56 DOIF Rollo_Stephan cmd_2
2021-02-21 20:36:56 DOIF Rollo_Stephan wait_timer: 21.02.2021 20:36:57 cmd_2_1 set_cmd_2
2021-02-21 20:36:57 DOIF Rollo_Stephan wait_timer: no timer
2021-02-21 20:36:57 RPI_GPIO GPIO26 on
2021-02-21 20:36:57 DOIF Rollo_Stephan cmd_nr: 2
2021-02-21 20:36:57 DOIF Rollo_Stephan cmd_seqnr: 1
2021-02-21 20:36:57 DOIF Rollo_Stephan cmd: 2.1
2021-02-21 20:36:57 DOIF Rollo_Stephan cmd_event: set_cmd_2
2021-02-21 20:36:57 DOIF Rollo_Stephan cmd_2_1
2021-02-21 20:36:57 DOIF Rollo_Stephan wait_timer: 21.02.2021 20:36:58 cmd_2_2 set_cmd_2
2021-02-21 20:36:58 DOIF Rollo_Stephan wait_timer: no timer
2021-02-21 20:36:58 RPI_GPIO GPIO26 off
2021-02-21 20:36:58 DOIF Rollo_Stephan Status: oben_stop_10
2021-02-21 20:36:58 DOIF Rollo_Stephan e_Rollo_Stephan_Status: oben_stop_10
2021-02-21 20:36:58 DOIF Rollo_Stephan cmd_nr: 6
2021-02-21 20:36:58 DOIF Rollo_Stephan cmd: 6
2021-02-21 20:36:58 DOIF Rollo_Stephan cmd_event: Rollo_Stephan
2021-02-21 20:36:58 DOIF Rollo_Stephan cmd_6
2021-02-21 20:36:58 DOIF Rollo_Stephan cmd_nr: 2
2021-02-21 20:36:58 DOIF Rollo_Stephan cmd_seqnr: 2
2021-02-21 20:36:58 DOIF Rollo_Stephan cmd: 2.2
2021-02-21 20:36:58 DOIF Rollo_Stephan cmd_event: set_cmd_2
2021-02-21 20:36:58 DOIF Rollo_Stephan cmd_2
2021-02-21 20:36:58 DOIF Rollo_Stephan wait_timer: 21.02.2021 20:37:00 cmd_2_1 set_cmd_2


Ich habe hier auch schon im Ausführungsteil von cmd_2_1 einen wait timer von 0.5 ohne Erfolg gesetzt.

Es sieht so aus als wenn repeatcmd durch das wechsel in cmd_6 nicht beeindruckt ist und trotzdem cmd_2 immer wiederholt ?

das mit den sleep Befehl in meinem Ausführungsteil habe ich noch nicht funktionierend hinbekommen.
Vieleicht kannst Du mir sagen wie ich den hier mit reinbekomme.


(IF ([$SELF:Status:d] == 10) (setreading $SELF Status oben_stop_{([$SELF:Status:d])})



Gruß

Stephan

Stelaku

Ich habe noch ein wenig rumprobiert

wenn ich den zweiten DOELSEIF nicht mit repeatcmd sondern mit mehreren waits laufen lassen wird bei selftrigger cmd_6 auch kurz getriggert GPIO26 geht auf off.
Aber dann greift auch wieder der komischerweise noch laufende wait timer für cmd_2. Nur das diesmal GPIO26 nicht auf on geht weil das DOIF den nächsten wait fall triggert.


DOELSEIF
([Taster:hoch] eq "on") ## Start Fahrtrichtung hoch
(
IF ([GPIO26] eq"off")(set GPIO26 on),
IF ([GPIO27] eq"on")(set GPIO27 off),
IF ([$SELF:Status:d] > 10) (setreading $SELF Status fährt_hoch_{([$SELF:Status:d] -10)}))
(IF ([$SELF:Status:d] > 10) (setreading $SELF Status fährt_hoch_{([$SELF:Status:d] -10)}))
(IF ([$SELF:Status:d] > 10) (setreading $SELF Status fährt_hoch_{([$SELF:Status:d] -10)}))
(IF ([$SELF:Status:d] > 10) (setreading $SELF Status fährt_hoch_{([$SELF:Status:d] -10)}))
(IF ([$SELF:Status:d] > 10) (setreading $SELF Status fährt_hoch_{([$SELF:Status:d] -10)}))
(IF ([$SELF:Status:d] > 10) (setreading $SELF Status fährt_hoch_{([$SELF:Status:d] -10)}))
(IF ([$SELF:Status:d] > 10) (setreading $SELF Status fährt_hoch_{([$SELF:Status:d] -10)}))
(IF ([$SELF:Status:d] > 10) (setreading $SELF Status fährt_hoch_{([$SELF:Status:d] -10)}))
(IF ([$SELF:Status:d] > 10) (setreading $SELF Status fährt_hoch_{([$SELF:Status:d] -10)}))
(IF ([$SELF:Status:d] > 10) (setreading $SELF Status fährt_hoch_{([$SELF:Status:d] -10)}))


wait für diesen Zweig habe ich so gesetzt 
0,1,1,1,1,1,1,1,1,1,1

so würde es funktionieren ist aber nicht schön.

Gruß

Stephan

Stelaku

Hallo Ellert

jetzt habe ich es hinbekommen. Es funktioniert mit einem sleep so wie Du schon geschrieben hast.
Ich habe das sleep jetzt erfolgreich im Ausführungsteil eingefügt.

(IF ([$SELF:Status:d] == 10) ((sleep 0.1) setreading $SELF Status oben_stop_{([$SELF:Status:d])})

Das funktioniert jetzt auch ohne selftrigger und vorallen es wird nicht mehr ins cmd_2 zurückgesprungen.

Vielen dank für den Tip.


Gruß

Stephan


Ellert

Ein allein stehendes sleep wird blockieren ausgeführt siehe Bemerkung https://commandref.fhem.de/commandref_DE.html#sleep

demnach so
(sleep 0.1;setreading $SELF Status oben_stop_{([$SELF:Status:d])})

Stelaku

Hallo Ellert

Leider funktioniert das nicht mit Deinem Vorschlag das sleep mit einem Semikolon an das setreading zu binden. Da bekomme ich nicht das gewünschte reading Status oben_stop_10
sondern  die Ausgabe Status oben_stop_10) und das DOIF ist wieder in einer nicht endenen Schleife. Und im log steht dan das für den sleep Befehl die rechte Klammer fehlt.

(IF ([$SELF:Status:d] == 10) (sleep 0.1;setreading $SELF Status oben_stop_[$SELF:Status:d]))

log Ausgabe

2021.02.22 16:25:25 2: Rollo_Stephan: IF ([Rollo_Stephan:Status:d] == 10) (sleep 0.1;setreading Rollo_Stephan Status oben_stop_[Rollo_Stephan:Status:d]): IF: no right bracket: (sleep 0.1




Änder ich jetzt die Einbindung des sleep auf


(IF ([$SELF:Status:d] == 10) (sleep 0.1);setreading $SELF Status oben_stop_[$SELF:Status:d])

erzeugt dann diesen log Eintrag

2021.02.22 16:28:17 1: WARNING: sleep without additional commands is deprecated and blocks FHEM



Komischerweise funktioniert nur der Befehl wie ich ihn zuvor schon hatte


(IF ([$SELF:Status:d] == 10) ((sleep 0.1)setreading $SELF Status oben_stop_[$SELF:Status:d]))


Ich hab jetz mal zum testen den sleep Befehl auf 60 gestellt um zu sehen ob das jetzt in Fhem was blockiert ?
Ich bekomme in den 60 Sekunden keinen log eintrag das Fhem blockiert wird und ich kann auch alles ander
in Fhem erreichen. Das Reading Status wird auch erst nach 60 Sekunden auf den Wert oben_stop_10 gesetzt.
Ich weiß nicht aber für mich sieht das alles normal aus.

Ist das vieleicht so eine eigenheit vom DOIF ?


Viele Grüsse

Stephan

Ellert

In DOIF funktioniert , und ; als Befehlstrenner, ob das auch in dem Befehl IF funktioniert kann ich nicht sagen, s. https://commandref.fhem.de/commandref_DE.html#IF

Bei einem define at sind ;; zu verwenden, möglich dass das auch für sleep gilt.

Damian

#8
Zitat von: Ellert am 23 Februar 2021, 10:50:20
In DOIF funktioniert , und ; als Befehlstrenner, ob das auch in dem Befehl IF funktioniert kann ich nicht sagen, s. https://commandref.fhem.de/commandref_DE.html#IF

Bei einem define at sind ;; zu verwenden, möglich dass das auch für sleep gilt.

Beim IF-Befehl funktioniert im Gegensatz zum DOIF kein Semikolon. Wenn man im IF ein Semikolon eingeben würde, dann würde der FHEM-Parser alles hinter dem Semikolon abschneiden und nicht zum IF-Befehl durchreichen.

Deswegen habe ich mal im IF eine Sonderbehandlung für sleep eingebaut:

Beim IF-Befehl funktioniert sleep mit Komma dahinter nicht blockierend - aber nur dort!!!
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Stelaku

Vielen dank für eure hilfe

Es funktioniert jetzt auch ohne klammern nur mit einem Komma getrennt. Sehr schön


(IF ([$SELF:Status:d] == 10) (sleep 0.1,setreading $SELF Status oben_stop_[$SELF:Status:d]))


Dann kann ich mich jetzt daran machen alle meine Rollo´s in der Live Instanz mit nur noch jeweils einem DOIF zu steuern.

Viele Grüsse

Stephan

Damian

Zitat von: Stelaku am 23 Februar 2021, 14:16:03
Vielen dank für eure hilfe

Es funktioniert jetzt auch ohne klammern nur mit einem Komma getrennt. Sehr schön


(IF ([$SELF:Status:d] == 10) (sleep 0.1,setreading $SELF Status oben_stop_[$SELF:Status:d]))


Dann kann ich mich jetzt daran machen alle meine Rollo´s in der Live Instanz mit nur noch jeweils einem DOIF zu steuern.

Viele Grüsse

Stephan

Für solche "Generalisierungsaufgaben" würde ich DOIF-Perl nutzen. Dort kannst du vor allem mit einer Template-Definition gleich mehrere gleichartige DOIFs generieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Stelaku

Hallo Damian

Vielen dank für den Hinweis auf Template. Da habe ich mich noch garnicht mit befasst. Das FHEM-Wiki dazu habe ich schon mal überflogen und werde mich mal daran probieren.

Viele Grüsse

Stephan