Mehrere DOIFS in einem? Sollte doch gehen, oder?

Begonnen von misux, 27 April 2018, 07:12:54

Vorheriges Thema - Nächstes Thema

misux

HI! Ich habe mal gelesen das es gehen soll, aber bei mir funktioniert das irgendwie nicht... Hab ich einen Fehler gemacht?


([HM_29B300:battery] eq "low")
(set Telegram message Taster im Flur: "Batterie leer!!!")
DOIF
([TerrassenTuer] eq "dimdown")
(set Telegram message Terrassen Tür "Batterie leer!!!")


Fehlermeldung:

DOIFBatterie DOIF: expected DOELSEIF or DOELSE:  DOIF ([TerrassenTuer] eq "dimdown")  (set Telegram message Terrassen Tür "Batterie leer!!!")

Brockmann

Zitat von: CommandRef
Syntax FHEM-Modus:
define <name> DOIF (<Bedingung>) (<Befehle>) DOELSEIF (<Bedingung>) (<Befehle>) DOELSEIF ... DOELSE (<Befehle>)
Das ist das massgebliche, egal was Du woanders gelesen zu haben glaubst.

misux

#2
Habs gefunden:

https://forum.fhem.de/index.php/topic,36889.msg291649.html#msg291649

Das kam von entwickler... Zählt das nicht mehr?

Damit könnte ich mir sehr viele DOIFS sparen...

Mehrere DOIF-Fälle:

define di DOIF (...) (...)
DOELSEIF (...) (...)
DOELSE (...)
DOIF (...) (...)
DOELSEIF (...) (...)
DOELSE (...)

DOELSEIF und DOELSE beziehen sich immer auf den vorhergehenden DOIF-Fall.

Ellert

Zitat von: misux am 27 April 2018, 07:25:13
Habs gefunden:

https://forum.fhem.de/index.php/topic,36889.msg291649.html#msg291649

Das kam von entwickler... Zählt das nicht mehr?

Damit könnte ich mir sehr viele DOIFS sparen...

Mehrere DOIF-Fälle:

define di DOIF (...) (...)
DOELSEIF (...) (...)
DOELSE (...)
DOIF (...) (...)
DOELSEIF (...) (...)
DOELSE (...)

DOELSEIF und DOELSE beziehen sich immer auf den vorhergehenden DOIF-Fall.

siehe https://wiki.fhem.de/wiki/DOIF#Entwicklungshistorie

blade-of-fire

Hallo zusammen,

ich habe ein ähnliches Problem und finde den Fehler nicht. Ich bin gerade dabei, mich mehr mit DOIF zu beschäftigen, um das ein oder andere notify abzulösen. Dazu habe ich ein Test dummy erstellt, den ich wie folgt mit DOIF ansteuere
([dev_residents:state] ne "home") (set licht_wohnzimmer_test off)
DOELSEIF ([daytime:lightstate] eq "off") (set licht_wohnzimmer_test off)
DOELSEIF ([dev_HarmonyHub:activity] eq "PowerOff") (set licht_wohnzimmer_test bewegungsmelder on)
DOELSEIF ([PlexKodiConnect_Wohnzimmer:state] eq "playing") (set licht_wohnzimmer_test plexplaying on)
DOELSEIF ([dev_residents:state] ne "gone") (set licht_wohnzimmer_test on)


Hier sind die Readings vom DOIF:

Device   dev_residents
cmd   5
cmd_event   dev_residents
cmd_nr   5
e_daytime_lightstate   off
e_dev_HarmonyHub_activity   PowerOff
e_dev_residents_state   home
mode   enabled
state   cmd_5


Wenn ich das richtig verstehe, sollte doch er doch in die 2. Bedingung (cmd 2) gehen, weil die erste Bedingung ([dev_residents:state]  ne "home") ja false ist, aber die zweite Bedingung ([daytime:lightstate] eq "off") ist true, genauso wie die 3. Bedingung. Warum springt er also auf die 5. Bedingung?

MFG,
Patrick
VM mit Ubuntu und FHEM-Instanz (Hauptinstanz)
FHEM2FHEM
Raspberry Pi 3 B+ mit Eigenbau-Platine + Relais-Platine + Cul-Stick + FHEMDuino

misux


misux

Bin mir nicht sicher, aber fehlen da nicht ein paar semikolone oder müssten die dinge zusammengeschrieben sein oder sind es 2 getrennte dinge??

licht_wohnzimmer_test bewegungsmelder
licht_wohnzimmer_test plexplaying

Wenns 2 Teile sind hätte ich sie so gelöst:
(set licht_wohnzimmer_test on) (set bewegungsmelder on)
(set licht_wohnzimmer_test on) (set plexplaying on)


Zitat von: blade-of-fire am 27 April 2018, 07:36:08
Hallo zusammen,

ich habe ein ähnliches Problem und finde den Fehler nicht. Ich bin gerade dabei, mich mehr mit DOIF zu beschäftigen, um das ein oder andere notify abzulösen. Dazu habe ich ein Test dummy erstellt, den ich wie folgt mit DOIF ansteuere
([dev_residents:state] ne "home") (set licht_wohnzimmer_test off)
DOELSEIF ([daytime:lightstate] eq "off") (set licht_wohnzimmer_test off)
DOELSEIF ([dev_HarmonyHub:activity] eq "PowerOff") (set licht_wohnzimmer_test bewegungsmelder on)
DOELSEIF ([PlexKodiConnect_Wohnzimmer:state] eq "playing") (set licht_wohnzimmer_test plexplaying on)
DOELSEIF ([dev_residents:state] ne "gone") (set licht_wohnzimmer_test on)


Hier sind die Readings vom DOIF:

Device   dev_residents
cmd   5
cmd_event   dev_residents
cmd_nr   5
e_daytime_lightstate   off
e_dev_HarmonyHub_activity   PowerOff
e_dev_residents_state   home
mode   enabled
state   cmd_5


Wenn ich das richtig verstehe, sollte doch er doch in die 2. Bedingung (cmd 2) gehen, weil die erste Bedingung ([dev_residents:state]  ne "home") ja false ist, aber die zweite Bedingung ([daytime:lightstate] eq "off") ist true, genauso wie die 3. Bedingung. Warum springt er also auf die 5. Bedingung?

MFG,
Patrick

blade-of-fire

Nach meinem Verständnis ist das ja im FHEM-Modus, also werden dort keine Semicolons benötigt, oder?

Zitat
licht_wohnzimmer_test bewegungsmelder
licht_wohnzimmer_test plexplaying

bewegungsmelder und plexplaying sind readings von licht_wohnzimmer_test.
VM mit Ubuntu und FHEM-Instanz (Hauptinstanz)
FHEM2FHEM
Raspberry Pi 3 B+ mit Eigenbau-Platine + Relais-Platine + Cul-Stick + FHEMDuino

misux

okay, aber wenn  bewegungsmelder und plexplaying eigenständige Devices sind warum dann nicht einfach

(set bewegungsmelder on)
(set plexplaying on)

ohne ales andere davor...?

Nix falsch verstehen... Sind bei mir reine Vermutungen weil ich selbst Anfänger bin also kann es sein das ich das komplett falsch verstehe...

So würde ich es testen und müsste auch gehen...
([dev_residents:state] ne "home") (set licht_wohnzimmer_test off)
DOELSEIF ([daytime:lightstate] eq "off") (set licht_wohnzimmer_test off)
DOELSEIF ([dev_HarmonyHub:activity] eq "PowerOff") (set bewegungsmelder on)
DOELSEIF ([PlexKodiConnect_Wohnzimmer:state] eq "playing") (set plexplaying on)
DOELSEIF ([dev_residents:state] ne "gone") (set licht_wohnzimmer_test on)

blade-of-fire

Man sollte sich nicht so auf die Readings versteifen. Das ist nur ein Test-Dummy, damit ich ich am Dummy sehen kann, welchen Zustand das DOIF liefert. Später sollen damit unterschiedliche Lichtszenarien geschaltet werden.

In dem Fall ist eigentlich egal, was in dem Befehlsteil steht, weil die Bedingung, obwohl sie wahr ist, übersprungen wird.
VM mit Ubuntu und FHEM-Instanz (Hauptinstanz)
FHEM2FHEM
Raspberry Pi 3 B+ mit Eigenbau-Platine + Relais-Platine + Cul-Stick + FHEMDuino

misux

Aber das ist doch glaube ich das Problem das de da mit drin stehen... Ich glaube deshalb überspringt er die beiden cmds...

blade-of-fire

Warum sollte das denn ein Problem sein? Solange der Device existiert und erfolgreich gesetzt werden kann. Insofern der Befehl ein Problem verursacht, würde ich einen entsprechenden Log-Eintrag erwarten, im Log stet aber gar nichts dazu.
VM mit Ubuntu und FHEM-Instanz (Hauptinstanz)
FHEM2FHEM
Raspberry Pi 3 B+ mit Eigenbau-Platine + Relais-Platine + Cul-Stick + FHEMDuino

Otto123

Hi,

ich interpretiere das Verhalten mal so:
dev_residents erzeugt einen Event und triggert das DOIF Modul. Im Modul wird erstmal nur nach dev_residents geschaut ob damit irgendwelche Bedingungen zutreffen. Der erste Zweig ist false der fünfte true -> fertig.
Ob das so die richtige Begründung ist weiß ich nicht!

Ich würde die Bedingungen einfach genauer definieren. Und eine Entscheidung auf ungleich zu fällen kann immer alle Fälle bedeuten. Eine Entscheidung auf gleich ist genau ein Fall.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

misux

Aha... Dann vermute ich das dev_residents eine anwesenheitserkennung ist...

Ich habe diese etwas anders gelöst und diese funktioniert wunderbar seit wochen!

ich habe zwei dummys erstellt "DavidHandy" "ChrissiHandy". Diese werden von PRESENCE modul der die Fritzbox überwacht auf present oder absent gesetzt:

Dann hab ich einen dummy "Haus" dieser wird vom DOIF auf present oder absent gesetzt:

([DavidHandy] eq "absent" and [ChrissiHandy] eq "absent") (set Haus absent)
DOELSE
(set Haus present)


Und auf diesen Dummy triggere ich meine Lichtsteuerung/Tabletsteuerung usw... Ich habe eindeutige werte die gesetzt sind .

Beispiel: Mein FTUI Tablet:

([Haus] eq "absent" or [23:00]) (set FHEMTablet off)
DOELSEIF
([Haus] eq "present" and [08:00-23:00]) (set FHEMTablet on)
DOELSEIF
([Tageslicht_indoor] eq "Nacht" and [?FHEMTablet:brightness] eq "80") (set FHEMTablet brightness 40) (set FHEMTablet url http://192.168.1.61:8083/fhem/ftui/index.html)
DOELSEIF
([Tageslicht_indoor] eq "Tag" and [?FHEMTablet:brightness] eq "40") (set FHEMTablet brightness 80) (set FHEMTablet url http://192.168.1.61:8083/fhem/ftui/index_weiss.html)
DOELSEIF
([?DavidFruehschicht] eq "on" and [?Tageslicht_indoor] eq "Nacht" and [?Haus] eq "present" and [04:00-04:30]) (set FHEMTablet on)
DOELSEIF
([?DavidFruehschicht] eq "off" and [?Tageslicht_indoor] eq "Nacht" and [?Haus] eq "present" and [05:00-05:45]) (set FHEMTablet on)
DOELSE
(set FHEMTablet off)

blade-of-fire

Ist zwar offtopic, aber ich benutze das Modul RESIDENTS, was ein sehr umfassendes Anwesenheitsmodul ist....

Für die Logik des Ablaufs sollte doch egal sein, aus welchem Grund die Bedingung Wahr oder Unwahr ist.
Habe jetzt nochmal getestet. Es ist wo folgt:
Wenn erste Bedingung wahr (dev_residents = "absent") --> cmd 1   !KORREKT!

Wenn ich nun dev_residents auf "home" stelle (--> 1. Bedingung = false), wird cmd 5 eingestellt, was meiner Meinung nach entsprechend der DOELSEIF Abfrage falsch ist.

Wenn ich nun set checkall betätige, wird die richtige Bedingung herangezogen und cmd 2 wird eingestellt. 
VM mit Ubuntu und FHEM-Instanz (Hauptinstanz)
FHEM2FHEM
Raspberry Pi 3 B+ mit Eigenbau-Platine + Relais-Platine + Cul-Stick + FHEMDuino