Wie auf Verschachtelung von DOIF/IF verzichten?

Begonnen von FunkOdyssey, 19 Januar 2017, 17:58:17

Vorheriges Thema - Nächstes Thema

FunkOdyssey

Hallo, ich habe hin und wieder DOIFs, in denen ich mit IF im Ausführungsteil eines DOIFs weitere Bedingungen vergleichen muss.

([FbCallMonitor:event] eq "ring")
(
IF ([Dreambox:state] eq "on")
msg screen Anruf von [FbCallMonitor:external_name] [FbCallMonitor:external_number],
IF ([rr_Bewohner1] eq "home")
msg push @rr_Bewohner1 Anruf von [FbCallMonitor:external_name] [FbCallMonitor:external_number] O[{"Pushover_SOUND":"bike"}],
IF ([rr_Bewohner2] eq "home")
msg push @rr_Bewohner2 Anruf von [FbCallMonitor:external_name] [FbCallMonitor:external_number]
)


Dies alles in der DOIF-Bedingung zu überprüfen kann ich (scheinbar) nicht, da schließlich jede Bedingung wahr werden kann.


(
[FbCallMonitor:event] eq "ring" and [Dreambox:state] eq "on"
)
(
msg screen Anruf von [FbCallMonitor:external_name] [FbCallMonitor:external_number]
)
DOELSEIF
(
[FbCallMonitor:event] eq "ring" and [rr_Bewohner1] eq "home")
)
(
msg push @rr_Bewohner1 Anruf von [FbCallMonitor:external_name] [FbCallMonitor:external_number] O[{"Pushover_SOUND":"bike"}]
)
DOELSEIF
(
[FbCallMonitor:event] eq "ring" and [rr_Bewohner2] eq "home")
)
(
msg push @rr_Bewohner2 Anruf von [FbCallMonitor:external_name] [FbCallMonitor:external_number]
)


Ich dachte nun, dass ich das mit dem neuen Attribut "checkall" umsetzen könnte. Aber laut Doku folgendem Hinweis in der Doku, wird das auch wohl nicht möglich sein:
ZitatZu beachten ist, dass bei einer wahren Bedingung die dazugehörigen Befehle ausgeführt werden und die Abarbeitung immer beendet wird - es wird also grundsätzlich immer nur ein Befehlszweig ausgeführt und niemals mehrere.

Habe ich einen Denkfehler oder muss ich bei der "unsauberen DOIF/IF"-Syntax bleiben?

Damian

Warum meinst du wäre die Benutzung von IF "unsauber"?

Die Benutzung von IF innerhalb eines DOIF-Moduls ist explizit im DOIF-Modul berücksichtigt, daher kann man IF als Ergänzung zu DOIF ansehen, zumal bei IF weitgehend die gleiche Syntax benutzt wird.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FunkOdyssey

Ich dachte, dass mein obiger Code ein wenig unelegant wäre und ich nur den "sauberen" Weg nicht finde.

Damian

Zitat von: FunkOdyssey am 19 Januar 2017, 18:10:24
Ich dachte, dass mein obiger Code ein wenig unelegant wäre und ich nur den "sauberen" Weg nicht finde.

Wenn man mehrere unabhängige Fälle innerhalb eines DOIF-Zweigs ausführen möchte, ist das, meiner Meinung nach, die sauberste Lösung, wenn man es nicht direkt in Perl programmieren möchte.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FunkOdyssey