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
Nochmal Hi
([Stefan:state] eq "on" and [Kerstin:state] eq on)
usw...
gruss
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 ...)
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
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 :(
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
Danke für die Vorschläge! Ich probiere es aus (mal startend mit der Variante von Damian) und werde berichten!
:)
Grüße,
Stefan
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!
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")
)
)
)
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
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 ?
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 :)
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 :)
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
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))
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))
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)?!
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.
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.
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.