FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: grappa24 am 31 Mai 2019, 08:44:26

Titel: [gelöst] DOIF mit mehreren Anweisungen und wait
Beitrag von: grappa24 am 31 Mai 2019, 08:44:26
Hallo zusammen,

ich hab ein DOIF mit mehreren Anweisungen und wait Attribut. Anw1 setzt (leider) die DOIF-Bedingung auißer Kraft, so dass die weiteren Anweisungen (Anw2, Anw3) nicht mehr ausgeführt werden; kann man das verhindern? Ich möchte, dass alle drei Anweisungen ausgeführt werden.

(Bedingung) (Anw1)(Anw2)(Anw3)
wait 0,10,10

Titel: Antw:DOIF mit mehreren Anweisungen und wait
Beitrag von: Shadow3561 am 31 Mai 2019, 09:27:34
Wie wäre es wenn du mal den Code von deinem DOIF postest?
Titel: Antw:DOIF mit mehreren Anweisungen und wait
Beitrag von: grappa24 am 31 Mai 2019, 09:49:37
mach ich gerne, der würde m.E. aber nur verwirren. Die Frage ist doch klar: Werden bei DOIFs mit mehreren Aktionen (mit wait verzögert) alle Anweisungen bis zum Ende ausgeführt, auch wenn eine der Anweisungen dafür sorgt, dass die Bedingung für das DOIF nicht mehr erfüllt ist?

Ich vereinfache meinen Code mal und stelle ihn dann ein.
Titel: Antw:DOIF mit mehreren Anweisungen und wait
Beitrag von: the ratman am 31 Mai 2019, 10:28:45
hat mich nun auch interessiert und ich habs mal soi getestetdefmod test DOIF ([$SELF:x] eq "ja") (say 1, setreading $SELF x nein)(say 2)(say 3)
attr test do always
attr test readingList x
attr test setList x:ja,nein
attr test wait 0,3,3


und brav zählt mein say-befehl von 1 bis 3
Titel: Antw:DOIF mit mehreren Anweisungen und wait
Beitrag von: Damian am 31 Mai 2019, 11:15:17
Zitat von: grappa24 am 31 Mai 2019, 09:49:37
mach ich gerne, der würde m.E. aber nur verwirren. Die Frage ist doch klar: Werden bei DOIFs mit mehreren Aktionen (mit wait verzögert) alle Anweisungen bis zum Ende ausgeführt, auch wenn eine der Anweisungen dafür sorgt, dass die Bedingung für das DOIF nicht mehr erfüllt ist?

Ich vereinfache meinen Code mal und stelle ihn dann ein.

Ist nicht ganz klar.  Denn die Bedingung kann ruhig mal nicht erfüllt sein und alle Anweisungen werden dennoch ausgeführt, nämlich dann, wenn es keinen DOELESE-Fall gibt. ;)

Vermutlich meinst du aber, dass eine andere Bedingung erfüllt wird, so dass ein Zustandswechsel erfolgt und dann die restlichen Anweisungen nicht ausgeführt werden.

Es kommt also auf die korrekte Formulierung des Problems an :)

In solchen Fällen kann man ruhig sleep verwenden, aber bitte mit Semikolon dahinter und nicht mit Komma:

(Anw1,sleep 10;Anw2;sleep 10;Anw3)
Titel: Antw:DOIF mit mehreren Anweisungen und wait
Beitrag von: Damian am 31 Mai 2019, 11:19:04
Zitat von: the ratman am 31 Mai 2019, 10:28:45
hat mich nun auch interessiert und ich habs mal soi getestetdefmod test DOIF ([$SELF:x] eq "ja") (say 1, setreading $SELF x nein)(say 2)(say 3)
attr test do always
attr test readingList x
attr test setList x:ja,nein
attr test wait 0,3,3


und brav zählt mein say-befehl von 1 bis 3

Hier kann dir nichts passieren, weil du keinen Zustandswechsel hast ;)
Titel: Antw:DOIF mit mehreren Anweisungen und wait
Beitrag von: grappa24 am 31 Mai 2019, 11:28:42
hey cool, danke Euch. Hier noch mein Code

defmod notifier_Flower_Sens DOIF ([Dracaena] eq "error" && [DracaenaMini] eq "error" && [PampasgrassLinks] eq "error" && [PampasgrassRechts] eq "error" && [RiesenChinaSchilf] eq "error") ({system("sudo hciconfig hci0 down")},{system("sudo hciconfig hci0 up")},{ Log 1, "Flower Sens Error - hci0 neu gestartet" })(get Dracaena.* sensorData)(get Pampasgrass.* sensorData)(get RiesenChinaSchilf sensorData) DOELSE
attr notifier_Flower_Sens do always
attr notifier_Flower_Sens wait 0,10,10,10


wobei der erste get Befehl (get Dracaena.* sensorData) dafür sorgt, dass der state von Dracaena von "error" auf "active" wechselt und - wie gesagt - der zweite und dritte get-Befehl nicht mehr ausgeführt werden.
Titel: Antw:DOIF mit mehreren Anweisungen und wait
Beitrag von: grappa24 am 31 Mai 2019, 16:31:19
Heureka ;D    Der Tipp mit dem sleep war gut  8)
defmod notifier_Flower_Sens DOIF (...) (...) (get Dracaena sensorData;; sleep 10;; get DracaenaMini sensorData;; sleep 10;; get PampasgrassLinks sensorData;; sleep 10;; get PampasgrassRechts sensorData;; sleep 10;; get RiesenChinaSchilf sensorData) DOELSE
attr notifier_Flower_Sens do always
Titel: Antw:[gelöst] DOIF mit mehreren Anweisungen und wait
Beitrag von: Per am 03 Juni 2019, 12:45:47
Alternativ:
defmod notifier_Flower_Sens DOIF (...) \
(get Dracaena sensorData) \
DOELSE
(get DracaenaMini sensorData) \
(get PampasgrassLinks sensorData) \
(...)
attr notifier_Flower_Sens wait 0:10,10,...

Ohne do always!
Wobei ich mir für diese Sensoren eine DOIF-Aggregation oder eine Fhem-Structure vorstellen kann.
Titel: Antw:[gelöst] DOIF mit mehreren Anweisungen und wait
Beitrag von: grappa24 am 03 Juni 2019, 14:53:17
Nur noch mal zum Hintergrund, wozu ich die "Verzögerung" mit sleep benötige: Wenn meine 5 Sensoren alle gleicheitig abgefragt werden, geht das BTLE Interface des RasPi in die Knie .... :(