DOELSEIF löst nicht aus. Verständnisfrage?

Begonnen von patlabor, 18 Mai 2019, 21:51:28

Vorheriges Thema - Nächstes Thema

patlabor

Hallo zusammen,

ich versuche seit ein paar Tagen ein DOIF zum laufen zu bekommen, aber es will mir nicht gelingen. Vermutlich verstehe ich irgendwas falsch. DOIF ist ja dermaßen mächtig und hat eine sehr umfangreiche Dokumentation das man schon mal den Überblick verlieren kann.
Ich versuche eine "Bewohner schläft" Erkennung per DOIF zu erstellen.
Der gesamte Raum wird per Homezone auf Anwesenheit überwacht, das klappt auch super zuverlässig. Ausserdem kann ich per presence erkennen, ob der eigentliche Bewohner des Raumes im Haus ist, ob das Licht im Zimmer eingeschaltet ist, und ob das Fernsehen läuft.
Habe mir jetzt folgendes DOIF zusammengebastelt:

define di_vc_asleep DOIF ([20:00-10:00] and [zo_vc] eq "present" and [presence_tv_vc] eq "absent" and [li_vc] eq "off" and [rr_vc:presence] eq "present")
(set rr_vc asleep)
DOELSEIF
([rr_vc:presence] eq "present") (set rr_vc state home)

Aber irgendwie will das nicht so funktionieren. Jeden Tag pünktlich um 20 Uhr wechselt rr_vc auf asleep unabhängig davon, ob jemand im Zimmer ist, das Licht an ist, oder der TV läuft. Ach wenn ich dann bewusst den Raum betrete und das Licht einschalte, löst die 2. Bedingung nicht aus.
Ich verstehe das DOIF so:
Zwischen 20 Uhr und 10 Uhr wird überprüft ob die Zone (zo_vc) überhaupt "belegt" ist, ob das Fernsehn [presence_tv_vc] und das Licht (li_vc) ausgeschaltet sind und ob der eigentlich Bewohner [rr_vc) zuhause ist. Ist das der Fall, wird rr_vc auf asleep gesetzt.
Die Idee ist die, das wenn jemand nach 20 Uhr in diesem Zimmer ist, kann es eigentlich fast nur der Bewohner des Zimmers sein, vorrausgesetzt, er ist auch zuhause, wenn dann noch Licht und TV aus sind, kann ich eigentlich davon ausgehen, das der Bewohner schläft.
Das DOELSEIF versetehe ich so:
Ist eine der o.g. Bedingungen anders, also Licht an, TV an, oder die Homezone in irgendeinem anderene Zustand als present, wird rr_vc auf home gesetzt, vorausgesetzt rr_vc ist auch tatsächlich zuhause.
Wo habe ich hier meinen Denkfehler?

amenomade

Mach mal ein vollständiges "list" des DOIFs ("list di_vc_asleep" in Fhem eingeben), wenn es deiner Meinung nach nicht korrekt geschaltet hat.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Ellert

Zitatset rr_vc state home
Lässt sich state tatsächlich auf diese Weise setzen?

patlabor

#3
Guten Morgen zusammen,

heute Morgen aufgestanden und da hatte ich dann gerade wieder den Salat. Laut Homezone war das Zimmer leer, was auch den Tatsachen entspricht, trotzdem wurde Bedingung 2 nicht ausgelöst.

Anbei mal ein list:

Internals:
DEF        ([20:00-10:00] and [zo_vc] eq "present" and [presence_tv_vc] eq "absent" and [li_vc] eq "off" and [rr_vc:presence] eq "present")
(set rr_vc asleep)
DOELSEIF
([rr_vc:presence] eq "present") (set rr_vc state home)
FUUID      5c97512e-f33f-3d24-ef9e-3d152edc7fbae1be
MODEL      FHEM
NAME       di_vc_asleep
NR         200
NTFY_ORDER 50-di_vc_asleep
STATE      cmd_1
TYPE       DOIF
VERSION    18890 2019-03-13 18:56:41
READINGS:
2019-05-19 07:42:30   Device          zo_vc
2019-05-19 07:13:51   cmd             1
2019-05-19 07:13:51   cmd_event       zo_vc
2019-05-19 07:13:51   cmd_nr          1
2019-05-19 06:42:56   e_li_vc_STATE off
2019-05-19 06:13:30   e_presence_tv_vc_STATE absent
2019-05-18 17:04:03   e_rr_vc_presence present
2019-05-19 07:42:30   e_zo_vc_STATE absent
2019-05-19 07:13:51   state           cmd_1
2019-05-18 10:00:00   timer_01_c01    18.05.2019 20:00:00
2019-05-18 10:00:00   timer_02_c01    19.05.2019 10:00:00
Regex:
accu:
attr:
cmdState:
wait:
waitdel:
condition:
0          ::DOIF_time($hash,0,1,$wday,$hms) and ::InternalDoIf($hash,'zo_vc','STATE') eq "present" and ::InternalDoIf($hash,'presence_tv_vc','STATE') eq "absent" and ::InternalDoIf($hash,'li_vc','STATE') eq "off" and ::ReadingValDoIf($hash,'rr_vc','presence') eq "present"
1          ::ReadingValDoIf($hash,'rr_vc','presence') eq "present"
days:
devices:
0           zo_vc presence_tv_vc li_vc rr_vc
1           rr_vc
all         zo_vc presence_tv_vc li_vc rr_vc
do:
0:
0          set rr_vc asleep
1:
0          set rr_vc state home
2:
helper:
event      condition: closed
globalinit 1
last_timer 2
sleeptimer -1
timerdev   zo_vc
timerevent condition: open
triggerDev zo_vc
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: zo_vc
state: cmd_1
timerevents:
condition: open
timereventsState:
condition: open
triggerEvents:
condition: closed
triggerEventsState:
condition: closed
internals:
0           zo_vc:STATE presence_tv_vc:STATE li_vc:STATE
all         zo_vc:STATE presence_tv_vc:STATE li_vc:STATE
interval:
0          -1
1          0
intervalfunc:
intervaltimer:
itimer:
localtime:
0          1558202400
1          1558252800
perlblock:
readings:
0           rr_vc:presence
1           rr_vc:presence
all         rr_vc:presence
realtime:
0          20:00:00
1          10:00:00
time:
0          20:00:00
1          10:00:00
timeCond:
0          0
1          0
timer:
0          0
1          0
timers:
0           0  1
trigger:
triggertime:
1558252800:
localtime  1558252800
hash:
uiState:
uiTable:
Attributes:
do         always
room       ViktorInternals:
DEF        ([20:00-10:00] and [zo_vc] eq "present" and [presence_tv_vc] eq "absent" and [li_vc] eq "off" and [rr_vc:presence] eq "present")
(set rr_vc asleep)
DOELSEIF
([rr_vc:presence] eq "present") (set rr_vc state home)
FUUID      5c97512e-f33f-3d24-ef9e-3d152edc7fbae1be
MODEL      FHEM
NAME       di_vc_asleep
NR         200
NTFY_ORDER 50-di_vc_asleep
STATE      cmd_1
TYPE       DOIF
VERSION    18890 2019-03-13 18:56:41
READINGS:
2019-05-19 07:42:30   Device          zo_vc
2019-05-19 07:13:51   cmd             1
2019-05-19 07:13:51   cmd_event       zo_vc
2019-05-19 07:13:51   cmd_nr          1
2019-05-19 06:42:56   e_li_vc_STATE off
2019-05-19 06:13:30   e_presence_tv_vc_STATE absent
2019-05-18 17:04:03   e_rr_vc_presence present
2019-05-19 07:42:30   e_zo_vc_STATE absent
2019-05-19 07:13:51   state           cmd_1
2019-05-18 10:00:00   timer_01_c01    18.05.2019 20:00:00
2019-05-18 10:00:00   timer_02_c01    19.05.2019 10:00:00
Regex:
accu:
attr:
cmdState:
wait:
waitdel:
condition:
0          ::DOIF_time($hash,0,1,$wday,$hms) and ::InternalDoIf($hash,'zo_vc','STATE') eq "present" and ::InternalDoIf($hash,'presence_tv_vc','STATE') eq "absent" and ::InternalDoIf($hash,'li_vc','STATE') eq "off" and ::ReadingValDoIf($hash,'rr_vc','presence') eq "present"
1          ::ReadingValDoIf($hash,'rr_vc','presence') eq "present"
days:
devices:
0           zo_vc presence_tv_vc li_vc rr_vc
1           rr_vc
all         zo_vc presence_tv_vc li_vc rr_vc
do:
0:
0          set rr_vc asleep
1:
0          set rr_vc state home
2:
helper:
event      condition: closed
globalinit 1
last_timer 2
sleeptimer -1
timerdev   zo_vc
timerevent condition: open
triggerDev zo_vc
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: zo_vc
state: cmd_1
timerevents:
condition: open
timereventsState:
condition: open
triggerEvents:
condition: closed
triggerEventsState:
condition: closed
internals:
0           zo_vc:STATE presence_tv_vc:STATE li_vc:STATE
all         zo_vc:STATE presence_tv_vc:STATE li_vc:STATE
interval:
0          -1
1          0
intervalfunc:
intervaltimer:
itimer:
localtime:
0          1558202400
1          1558252800
perlblock:
readings:
0           rr_vc:presence
1           rr_vc:presence
all         rr_vc:presence
realtime:
0          20:00:00
1          10:00:00
time:
0          20:00:00
1          10:00:00
timeCond:
0          0
1          0
timer:
0          0
1          0
timers:
0           0  1
trigger:
triggertime:
1558252800:
localtime  1558252800
hash:
uiState:
uiTable:
Attributes:
do         always
room       ViktorInternals:
DEF        ([20:00-10:00] and [zo_vc] eq "present" and [presence_tv_vc] eq "absent" and [li_vc] eq "off" and [rr_vc:presence] eq "present")
(set rr_vc asleep)
DOELSEIF
([rr_vc:presence] eq "present") (set rr_vc state home)
FUUID      5c97512e-f33f-3d24-ef9e-3d152edc7fbae1be
MODEL      FHEM
NAME       di_vc_asleep
NR         200
NTFY_ORDER 50-di_vc_asleep
STATE      cmd_1
TYPE       DOIF
VERSION    18890 2019-03-13 18:56:41
READINGS:
2019-05-19 07:42:30   Device          zo_vc
2019-05-19 07:13:51   cmd             1
2019-05-19 07:13:51   cmd_event       zo_vc
2019-05-19 07:13:51   cmd_nr          1
2019-05-19 06:42:56   e_li_vc_STATE off
2019-05-19 06:13:30   e_presence_tv_vc_STATE absent
2019-05-18 17:04:03   e_rr_vc_presence present
2019-05-19 07:42:30   e_zo_vc_STATE absent
2019-05-19 07:13:51   state           cmd_1
2019-05-18 10:00:00   timer_01_c01    18.05.2019 20:00:00
2019-05-18 10:00:00   timer_02_c01    19.05.2019 10:00:00
Regex:
accu:
attr:
cmdState:
wait:
waitdel:
condition:
0          ::DOIF_time($hash,0,1,$wday,$hms) and ::InternalDoIf($hash,'zo_vc','STATE') eq "present" and ::InternalDoIf($hash,'presence_tv_vc','STATE') eq "absent" and ::InternalDoIf($hash,'li_vc','STATE') eq "off" and ::ReadingValDoIf($hash,'rr_vc','presence') eq "present"
1          ::ReadingValDoIf($hash,'rr_vc','presence') eq "present"
days:
devices:
0           zo_vc presence_tv_vc li_vc rr_vc
1           rr_vc
all         zo_vc presence_tv_vc li_vc rr_vc
do:
0:
0          set rr_vc asleep
1:
0          set rr_vc state home
2:
helper:
event      condition: closed
globalinit 1
last_timer 2
sleeptimer -1
timerdev   zo_vc
timerevent condition: open
triggerDev zo_vc
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: zo_vc
state: cmd_1
timerevents:
condition: open
timereventsState:
condition: open
triggerEvents:
condition: closed
triggerEventsState:
condition: closed
internals:
0           zo_vc:STATE presence_tv_vc:STATE li_vc:STATE
all         zo_vc:STATE presence_tv_vc:STATE li_vc:STATE
interval:
0          -1
1          0
intervalfunc:
intervaltimer:
itimer:
localtime:
0          1558202400
1          1558252800
perlblock:
readings:
0           rr_vc:presence
1           rr_vc:presence
all         rr_vc:presence
realtime:
0          20:00:00
1          10:00:00
time:
0          20:00:00
1          10:00:00
timeCond:
0          0
1          0
timer:
0          0
1          0
timers:
0           0  1
trigger:
triggertime:
1558252800:
localtime  1558252800
hash:
uiState:
uiTable:
Attributes:
do         always
room       Viktor


Leider bin ich mir immer noch nicht ganz sicher ob ich die Logik dahinter richtig verstanden habe.
In dem Moment wo sich zo_vi von present auf irgend etwas anderes ändert, weil der Bewohner das Zimmer verlassen hat, überprüft das DOIF alle Bedingungen in 1, hier ist dann in diesem  Moment alles wahr, außer zo_vi eq present also springt er weiter zur 2. Abfrage, hier wird nur abgefragt, ob der Bewohner überhaupt IRGENDWO im Haus ist, was ja immer noch wahr ist, also sollte doch cmd 2 auslösen.

OdfFhem

Hallo,

angenommen, der Fernseher wechselt seinen STATE; dann wird der 1.Bedingungsblock ausgewertet. Trifft die Bedingung nicht zu, wird der 2.Bedingungsblock geprüft - hier hat sich aber nichts geändert, da es ja kein Ereignis für [rr_vc:presence] gab. Folglich passiert gar nichts.

Füge doch einfach mal am Ende einen (im Zweifel leeren) DOELSE-Zweig ein, dann sieht man ja, welcher der dann 3 Zweige ausgeführt wird.

patlabor

#5
Zitat von: OdfFhem am 19 Mai 2019, 09:14:22
Hallo,

angenommen, der Fernseher wechselt seinen STATE; dann wird der 1.Bedingungsblock ausgewertet. Trifft die Bedingung nicht zu, wird der 2.Bedingungsblock geprüft - hier hat sich aber nichts geändert, da es ja kein Ereignis für [rr_vc:presence] gab. Folglich passiert gar nichts.

Genau sowas habe ich befürchtet.
Wie bekomme ich es dann hin, das wenn eine beliebige Bedingung aus der 1. Bedingung nicht wahr ist, aber [rr_vc:presence] present ist, der 2. Zweig ausgeführt wird?
Stehe hier jetzt irgendwie auf dem Schlauch.

Nachtrag: Dein Hinweis warum die 2. Bedingung nie abgearbeitet wird, hat mich endlich weiter gebracht. Das Attribut checkall muss auf event stehen, dann wird zumindest die 2. Bedingung ausgeführt.
Jetzt muss ich nur noch auf heute Abend warten, und aufpassen was passiert, wenn das Zimmer leer ist. Bisher war es immer so das einfach Bedingung 1 ausgeführt wurde, wenn nach 20 Uhr, Licht und TV aus und der Bewohner zuhause.

amenomade

#6
Steht sogar im CommandRef:
ZitatZu beachten ist, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event das dazughörige Device bzw. die dazugehörige Triggerzeit beinhalten.
Kein Event auf rr_vc:presence = kein cmd_2

Mögliche Lösung:
([20:00-10:00] and [zo_vc] eq "present" and [presence_tv_vc] eq "absent" and [li_vc] eq "off" and [rr_vc:presence] eq "present")
    (set rr_vc asleep)
DOELSE
    ( IF ([rr_vc:presence] eq "present")
         (set rr_vc state home))

Somit triggern die andere Devices und die Zeit die 2. Bedingung mit.

Alternativ:
DOELSEIF ([rr_vc:presence] eq "present" and ([10:01-19:59] or [zo_vc] ne "present" or [presence_tv_vc] ne "absent" or [li_vc] ne "off"))
    (set rr_vc state home)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus