FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: RockThisParty am 24 April 2018, 08:32:29

Titel: DOIF im falschen Status??
Beitrag von: RockThisParty am 24 April 2018, 08:32:29
Guten Morgen!

Ich fürchte, da steckt ein Anfängerfehler drin ... aber ich komme nicht drauf:

Internals:
   DEF        (([Stefan] eq "on") && ([Kerstin] eq "on"))
(set MsgDevices "iPhone,Kerstin")
DOELSEIF ([Kerstin] eq "on")
(set MsgDevices "Kerstin")
DOELSEIF ([Stefan] eq "on")
(set MsgDevices "iPhone")
DOELSE(set MsgDevices "")
   MODEL      FHEM
   NAME       MsgAnwesend
   NR         357
   NTFY_ORDER 50-MsgAnwesend
   STATE      off
   TYPE       DOIF
   READINGS:
     2018-04-24 07:55:24   Device          Kerstin
     2018-04-24 07:55:24   cmd             4
     2018-04-24 07:55:24   cmd_event       Kerstin
     2018-04-24 07:55:24   cmd_nr          4
     2018-04-24 07:55:24   e_Kerstin_STATE off
     2018-04-23 22:02:24   e_Stefan_STATE  on
     2018-04-23 08:44:22   mode            enabled
     2018-04-24 07:55:24   state           off
   Regex:
   condition:
     0          (InternalDoIf($hash,'Stefan','STATE') eq "on") && (InternalDoIf($hash,'Kerstin','STATE') eq "on")
     1          InternalDoIf($hash,'Kerstin','STATE') eq "on"
     2          InternalDoIf($hash,'Stefan','STATE') eq "on"
   devices:
     0           Stefan Kerstin
     1           Kerstin
     2           Stefan
     all         Stefan Kerstin
   do:
     0:
       0          set MsgDevices "iPhone,Kerstin"
     1:
       0          set MsgDevices "Kerstin"
     2:
       0          set MsgDevices "iPhone"
     3:
       0          set MsgDevices ""
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      off
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   Kerstin
     timerevent off
     triggerDev Kerstin
     timerevents:
       off
     timereventsState:
       state: off
     triggerEvents:
       off
     triggerEventsState:
       state: off
   internals:
     0           Stefan:STATE Kerstin:STATE
     1           Kerstin:STATE
     2           Stefan:STATE
     all         Stefan:STATE Kerstin:STATE
   itimer:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   cmdState   on|on|on|off
   do         always
   room       Start,Zentral


Es geht um das Thema Anwesenheit.
Das DOIF soll, den State on haben, wenn Kerstin oder Stefan zuhause sind, sonst off. Außerdem soll das dummy MsgDevices die dargestellten Werte annehmen.

Wie man oben sieht, ist state off und MsgDevices leer, obwohl Stefan = on  :-[

Kann mir bitte jemand eine Tipp geben? Ich hatte auch schon mal richtige Stati und kapiere nicht, warum es ?manchmal? nicht klappt  :'(

Vielen Dank,
Stefan
Titel: Antw:DOIF im falschen Status??
Beitrag von: eisman am 24 April 2018, 09:24:09
Nochmal Hi

([Stefan:state] eq "on" and [Kerstin:state] eq on)

usw...

gruss
Titel: Antw:DOIF im falschen Status??
Beitrag von: Frank_Huber am 24 April 2018, 09:27:23
Moin,

würde bei den DOELSEIFs noch jeweils das zweite Handy reinnehmen.

DOELSEIF ([Kerstin] eq "on" and [Stefan] eq "off") (set ...)
DOELSEIF ([Stefan] eq "on" and [Kerstin] eq "off") (set ...)
Titel: Antw:DOIF im falschen Status??
Beitrag von: Damian am 24 April 2018, 09:37:56
Zitat von: eisman am 24 April 2018, 09:24:09
Nochmal Hi

([Stefan:state] eq "on" and [Kerstin:state] eq on)

usw...

gruss

Das wird nicht helfen, eher:

DEF        ([Stefan] eq "on" or [Kerstin] eq "on")
( IF (([Stefan] eq "on") and ([Kerstin] eq "on")(set MsgDevices "iPhone,Kerstin") ELSE (
     IF DOELSEIF ([Kerstin] eq "on") (set MsgDevices "Kerstin") ELSE (
       IF ([Stefan] eq "on") (set MsgDevices "iPhone")
     )
  )
)
DOELSE(set MsgDevices "")

attr cmdState on|off
Titel: Antw:DOIF im falschen Status??
Beitrag von: nils_ am 24 April 2018, 09:47:10
Zitat von: Damian am 24 April 2018, 09:37:56
Das wird nicht helfen, eher:

[quote ]DEF        ([Stefan] eq "on" or [Kerstin] eq "on")
( IF (([Stefan] eq "on") and ([Kerstin] eq "on")(set MsgDevices "iPhone,Kerstin") ELSE (
     IF DOELSEIF ([Kerstin] eq "on") (set MsgDevices "Kerstin") ELSE (
       IF ([Stefan] eq "on") (set MsgDevices "iPhone")
     )
  )
)
DOELSE(set MsgDevices "")

attr cmdState on|off[/quote ]
das markierte ist zuviel denke ich :)

//edit:
code-tags zu quote-tags geändert wegen markierung  :(
Titel: Antw:DOIF im falschen Status??
Beitrag von: eisman am 24 April 2018, 13:12:10
Zitat von: Damian am 24 April 2018, 09:37:56
Das wird nicht helfen, eher:

DEF        ([Stefan] eq "on" or [Kerstin] eq "on")
( IF (([Stefan] eq "on") and ([Kerstin] eq "on")(set MsgDevices "iPhone,Kerstin") ELSE (
     IF DOELSEIF ([Kerstin] eq "on") (set MsgDevices "Kerstin") ELSE (
       IF ([Stefan] eq "on") (set MsgDevices "iPhone")
     )
  )
)
DOELSE(set MsgDevices "")

attr cmdState on|off


Hast natürlich  recht, bin heute morgen auf'm Sprung gewesen...

Ich würde auch nicht auf die Idee kommen, in einer doif noch mit einer if else  abfrage arbeiten...

([device:attribut] eq "on" and [device:attribut] eq "on") (set...)
DOELSEIF
([device:attribut] eq "on" and [device:attribut] eq "off") (set...)
DOELSEIF
([device:attribut] eq "off" and [device:attribut] eq "on") (set...)
DOELSE (set.....)


Gruss
Titel: Antw:DOIF im falschen Status??
Beitrag von: RockThisParty am 24 April 2018, 21:27:11
Danke für die Vorschläge! Ich probiere es aus (mal startend mit der Variante von Damian) und werde berichten!
:)
Grüße,
Stefan
Titel: Antw:DOIF im falschen Status??
Beitrag von: RockThisParty am 25 April 2018, 17:15:08
Hi!
Rein in FHEM wollte es nicht klappen ... irgendwie hat die "and"-Bedingung ums Verrecken nicht funktioniert.
Nun also in Perl, so scheint es zu gehen:
([Stefan] eq "on" or [Kerstin] eq "on")
({if ((ReadingsVal("Stefan","state","off") eq "on") && (ReadingsVal("Kerstin","state","off") eq "on"))
{fhem("set MsgDevices iphone,Kerstin");}
else {
if (ReadingsVal("Stefan","state","off") eq "on")
{fhem("set MsgDevices iphone");}
else {if (ReadingsVal("Kerstin","state","off") eq "on")
{fhem("set MsgDevices Kerstin");}
}
}
}) DOELSE(set MsgDevices "")


Danke für Eure Unterstützung!
Titel: Antw:DOIF im falschen Status??
Beitrag von: Damian am 25 April 2018, 21:31:25
Zitat von: RockThisParty am 25 April 2018, 17:15:08
Hi!
Rein in FHEM wollte es nicht klappen ... irgendwie hat die "and"-Bedingung ums Verrecken nicht funktioniert.

klar, da waren ja noch Fehler drin:

DEF        ([Stefan] eq "on" or [Kerstin] eq "on")
( IF (([Stefan] eq "on") and ([Kerstin] eq "on")(set MsgDevices "iPhone,Kerstin") ELSE (
     IF DOELSEIF ([Kerstin] eq "on") (set MsgDevices "Kerstin") ELSE (
       IF ([Stefan] eq "on") (set MsgDevices "iPhone")
     )
  )
)
Titel: Antw:DOIF im falschen Status??
Beitrag von: RockThisParty am 26 April 2018, 09:41:23
Hallo Damian,

die Fehler hatte ich gefunden und auch umfangreich (und gezielt abgespeckte Varianten) getestet. Das FHEM-IF verarbeitet nach meinem Eindruck weder "&&" noch "and" in der Bedinungen, jedenfalls war das in allen Versuchen - auch mit und ohne diverser Klammer-Ebenen - immer "false", die einfachen IF-Abfragen in Deinem Vorschlag haben funktioniert, auch das Triggern.

Danke,
Stefan
Titel: Antw:DOIF im falschen Status??
Beitrag von: nils_ am 26 April 2018, 10:52:54
Zitat von: RockThisParty am 26 April 2018, 09:41:23
die Fehler hatte ich gefunden und auch umfangreich (und gezielt abgespeckte Varianten) getestet. Das FHEM-IF verarbeitet nach meinem Eindruck weder "&&" noch "and" in der Bedinungen, jedenfalls war das in allen Versuchen - auch mit und ohne diverser Klammer-Ebenen - immer "false", die einfachen IF-Abfragen in Deinem Vorschlag haben funktioniert, auch das Triggern.
die IF-Abfragen im Beispiel von Damian sind doch FHEM-IF  :o :o


funktioniert denn jetzt alles bei dir ?
Titel: Antw:DOIF im falschen Status??
Beitrag von: RockThisParty am 26 April 2018, 12:00:38
Sieht so aus, als wenn es mit der Perl-Version jetzt stabil funktioniert.

Dass der Vorschlag von Damian FHEM-IF war, ist klar, damit hat ja - auch nach Korrektur der Syntax-bzw. Tipp-Fehler der erste Teil der Abfrage

IF (([Stefan] eq "on") and ([Kerstin] eq "on")(set MsgDevices "iPhone,Kerstin") ELSE ...

funktioniert. Es wurde immer direkt in den ELSE teil gesprungen auch wenn beide Bedingungen eindeutig hätten wahr sein müssen.
In der Commandref habe ich auch nirgends einen Hinweis gefunden, dass man im FHEM-IF mehrere Bedingungen verknüpfen kann. Hatte es nur angenommen, weil das ja sonst immer überall geht  ;)

Wenn es bis heute Abend läuft, wie gewollt, mache ich diese Anfrage zu   :)
Titel: Antw:DOIF im falschen Status??
Beitrag von: nils_ am 26 April 2018, 12:51:05
Zitat von: RockThisParty am 26 April 2018, 12:00:38
Dass der Vorschlag von Damian FHEM-IF war, ist klar, damit hat ja - auch nach Korrektur der Syntax-bzw. Tipp-Fehler der erste Teil der Abfrage

IF (([Stefan] eq "on") and ([Kerstin] eq "on")(set MsgDevices "iPhone,Kerstin") ELSE ...

funktioniert. Es wurde immer direkt in den ELSE teil gesprungen auch wenn beide Bedingungen eindeutig hätten wahr sein müssen.
in deinem code-schnipsel fehlt eine klammer!
IF (([Stefan] eq "on") and ([Kerstin] eq "on"))(set MsgDevices "iPhone,Kerstin") ELSE ...

hattest du das auch korrigiert??
nur ne frage, es läuft ja bei dir sonst (mit perl)

Zitat von: RockThisParty am 26 April 2018, 12:00:38
In der Commandref habe ich auch nirgends einen Hinweis gefunden, dass man im FHEM-IF mehrere Bedingungen verknüpfen kann. Hatte es nur angenommen, weil das ja sonst immer überall geht  ;)

aus der commandref (beispiel bei IF https://fhem.de/commandref_DE.html#IF )
ZitatZeitabhängig schalten: In der Zeit zwischen 20:00 und 22:00 Uhr soll das Licht ausgehen, wenn es an war und ich den Raum verlasse:
define n_lamp_off notify sensor IF ($hms gt "20:00" and $hms lt "22:00" and [sensor] eq "absent") (set lamp:FILTER=STATE!=off off)
da stehen schon mehrere bedingungen. das sollte also gehen :)
Titel: Antw:DOIF im falschen Status??
Beitrag von: RockThisParty am 27 April 2018, 09:27:02
Moin!

Ja, die Klammer hatte ich ergänzt und auch verschiedene Varianten mit unterschiedlicher Klammersetzung getestet.

Bzgl. Commandref hatte ich wohl Tomaten auch den Augen  8)  ;)

Ich teste das demnächst mal mit komplett neu angelegten Devices ... nur zum Wissen/ Verstehen ... :)

Viele Grüße
Stefan
Titel: Antw:DOIF im falschen Status??
Beitrag von: RockThisParty am 28 April 2018, 19:13:40
So ... nun habe ich das noch mal mit komplett "frischen" devices und frischem Code getestet und kann vermelden: funktioniert. Habe wohl in den 99 probierten Varianten die funktionierende nicht erwischt  8) >:(

So jedenfalls funktioniert es:
(([test_1:state] eq "on") || ([test_2:state]))
(IF (([test_1] eq "on") and ([test_2] eq "on"))
(set Test on)
ELSE( set Test off))
Titel: Antw:DOIF im falschen Status??
Beitrag von: Damian am 28 April 2018, 19:17:44
Zitat von: RockThisParty am 28 April 2018, 19:13:40
So ... nun habe ich das noch mal mit komplett "frischen" devices und frischem Code getestet und kann vermelden: funktioniert. Habe wohl in den 99 probierten Varianten die funktionierende nicht erwischt  8) >:(

So jedenfalls funktioniert es:
(([test_1:state] eq "on") || ([test_2:state]))
(IF (([test_1] eq "on") and ([test_2] eq "on"))
(set Test on)
ELSE( set Test off))


Dabei sind einige Klammern überflüssig:

([test_1:state] eq "on" or [test_2:state])
(IF ([test_1] eq "on" and [test_2] eq "on")
(set Test on)
ELSE( set Test off))



Titel: Antw:DOIF im falschen Status??
Beitrag von: Per am 02 Mai 2018, 11:42:01
Zitat von: Damian am 24 April 2018, 09:37:56
Das wird nicht helfen, eher:
Mich würde mal interessieren, warum die Ursprungsvariante nicht geht (gehen soll)?!
Titel: Antw:DOIF im falschen Status??
Beitrag von: Damian am 02 Mai 2018, 14:49:27
Zitat von: Per am 02 Mai 2018, 11:42:01
Mich würde mal interessieren, warum die Ursprungsvariante nicht geht (gehen soll)?!

Die andere Variante geht natürlich auch, wenn man auch die anderen Kombinationen aufzählt, bei zwei Namen kann man es machen, das ergibt hier insgesamt drei Abfragen (siehe Vorschlag von Frank_Huber). Allerdings würde man bei drei oder vier Namen schnell die Übersicht der möglichen Kombination verlieren.
Titel: Antw:DOIF im falschen Status??
Beitrag von: Frank_Huber am 02 Mai 2018, 14:57:45
Zitat von: Damian am 02 Mai 2018, 14:49:27Allerdings würde man bei drei oder vier Namen schnell die Übersicht der möglichen Kombination verlieren.
Hier würde sich dann evtl ein Structure Device anbieten.
Titel: Antw:DOIF im falschen Status??
Beitrag von: Damian am 02 Mai 2018, 23:07:10
Falls tiefere Hierarchien benötigt werden, würde ich es heute mit DOIF-Perl realisieren:

Bsp:

DOIF { if ([device1] eq "on") {
         if ([device2] eq "on") {
           if ([device3] eq "on") {
           ...
           }
         }
       }
     }


Alle angegebenen Devices triggern hier.