[gelöst] DOIF mit mehreren Anweisungen und wait

Begonnen von grappa24, 31 Mai 2019, 08:44:26

Vorheriges Thema - Nächstes Thema

grappa24

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

Gebäudesicherheit/-komfort, PV-Prognose/Verbrauchssteuerung, Heizungssteuerung, Multimedia, ...
KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200, Netatmo, Nuki, SolarForecast, HEOS, Alexa-FHEM, ...
FHEM 6.4, 2 x RasPi 3B+, Debian Bullseye

Shadow3561

Wie wäre es wenn du mal den Code von deinem DOIF postest?

grappa24

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.
Gebäudesicherheit/-komfort, PV-Prognose/Verbrauchssteuerung, Heizungssteuerung, Multimedia, ...
KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200, Netatmo, Nuki, SolarForecast, HEOS, Alexa-FHEM, ...
FHEM 6.4, 2 x RasPi 3B+, Debian Bullseye

the ratman

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
→do↑p!dnʇs↓shit←

Damian

#4
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)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

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 ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

grappa24

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.
Gebäudesicherheit/-komfort, PV-Prognose/Verbrauchssteuerung, Heizungssteuerung, Multimedia, ...
KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200, Netatmo, Nuki, SolarForecast, HEOS, Alexa-FHEM, ...
FHEM 6.4, 2 x RasPi 3B+, Debian Bullseye

grappa24

#7
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
Gebäudesicherheit/-komfort, PV-Prognose/Verbrauchssteuerung, Heizungssteuerung, Multimedia, ...
KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200, Netatmo, Nuki, SolarForecast, HEOS, Alexa-FHEM, ...
FHEM 6.4, 2 x RasPi 3B+, Debian Bullseye

Per

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.

grappa24

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 .... :(
Gebäudesicherheit/-komfort, PV-Prognose/Verbrauchssteuerung, Heizungssteuerung, Multimedia, ...
KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200, Netatmo, Nuki, SolarForecast, HEOS, Alexa-FHEM, ...
FHEM 6.4, 2 x RasPi 3B+, Debian Bullseye