Hauptmenü

DOIF im falschen Status??

Begonnen von RockThisParty, 24 April 2018, 08:32:29

Vorheriges Thema - Nächstes Thema

RockThisParty

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

eisman

Nochmal Hi

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

usw...

gruss
1x FHEM Debian, Homematic,ZigBee,FS20 / 1X Raspberry, ConBee / 7x ESP
1x FHEM Debian, Homematic,Z2M             / 1X Raspberry, ConBee / 6x ESP
1x FHEM Debian,MQTT2                             / 1X Raspberry, i2c,onewire,gpio
1x auf Windows 2012 Hyper-V-S

Frank_Huber

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 ...)

Damian

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

nils_

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  :(
viele Wege in FHEM es gibt!

eisman

#5
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
1x FHEM Debian, Homematic,ZigBee,FS20 / 1X Raspberry, ConBee / 7x ESP
1x FHEM Debian, Homematic,Z2M             / 1X Raspberry, ConBee / 6x ESP
1x FHEM Debian,MQTT2                             / 1X Raspberry, i2c,onewire,gpio
1x auf Windows 2012 Hyper-V-S

RockThisParty

Danke für die Vorschläge! Ich probiere es aus (mal startend mit der Variante von Damian) und werde berichten!
:)
Grüße,
Stefan

RockThisParty

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!

Damian

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

RockThisParty

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

nils_

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 ?
viele Wege in FHEM es gibt!

RockThisParty

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   :)

nils_

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 :)
viele Wege in FHEM es gibt!

RockThisParty

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

RockThisParty

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))