Hallo,
ich habe ein DOIF das mit Readingsage nicht arbeitet. Was ist mein Fehler?
([ku_rollo:pct] > 49 and ReadingsAge("ku_bwm","state",0) > 20 and [ku_bwm:state] eq "motion") (set Kuechenlicht on)
DOELSE
(set Kuechenlicht off)
Ohne ReadingsAge fuktioniert das DOIF. Vielleicht kann jemand helfen? Besten Dank.
Was mir als erstes einfällt: versucht doch mal
[ku_bwm:state:sec] > 20
https://commandref.fhem.de/commandref_DE.html#DOIF_Zeitspanne_eines_Readings_seit_der_letzten_Aenderung (https://commandref.fhem.de/commandref_DE.html#DOIF_Zeitspanne_eines_Readings_seit_der_letzten_Aenderung)
Falls das nicht hilft, poste bitte ein list von deinem Device incl. aussagekräftiger Beschreibung, was "nicht arbeitet" bedeutet.
Grüße,
Stephan
Hallo,
anbei das List:
Internals:
CFGFN
DEF ([ku_rollo:pct] > 49 and ReadingsAge("ku_bwm","state",0) > 3 and [ku_bwm:state] eq "motion") (set Kuechenlicht on)
DOELSE
(set Kuechenlicht off)
FUUID 5e401d97-f33f-5169-0acd-f1981b2d7263f27f
MODEL FHEM
NAME di_ku_li_rollo
NOTIFYDEV global,ku_rollo,ku_bwm
NR 16184
NTFY_ORDER 50-di_ku_li_rollo
STATE off
TYPE DOIF
VERSION 20929 2020-01-10 09:44:35
.attraggr:
.attrminint:
READINGS:
2020-02-09 23:53:43 Device ku_bwm
2020-02-09 23:53:23 cmd 2
2020-02-09 23:53:23 cmd_event ku_bwm
2020-02-09 23:53:23 cmd_nr 2
2020-02-09 23:53:43 e_ku_bwm_state motion
2020-02-09 23:53:03 mode enabled
2020-02-09 23:53:23 state off
2020-02-09 23:53:23 wait_timer no timer
Regex:
accu:
cond:
ku_bwm:
0:
state ^ku_bwm$:^state:
ku_rollo:
0:
pct ^ku_rollo$:^pct:
attr:
cmdState:
0:
on
1:
off
wait:
0:
0
1:
10
waitdel:
condition:
0 ::ReadingValDoIf($hash,'ku_rollo','pct') > 49 and ReadingsAge("ku_bwm","state",0) > 3 and ::ReadingValDoIf($hash,'ku_bwm','state') eq "motion"
do:
0:
0 set Kuechenlicht on
1:
0 set Kuechenlicht off
helper:
DEVFILTER ^global$|^ku_bwm$|^ku_rollo$
NOTIFYDEV global|ku_bwm|ku_rollo
event motion,reachable: 1,battery: 82
globalinit 1
last_timer 0
sleepdevice ku_bwm
sleepsubtimer -1
sleeptimer -1
timerdev ku_bwm
timerevent motion,reachable: 1,battery: 82
triggerDev ku_bwm
timerevents:
motion
reachable: 1
battery: 82
timereventsState:
state: motion
reachable: 1
battery: 82
triggerEvents:
motion
reachable: 1
battery: 82
triggerEventsState:
state: motion
reachable: 1
battery: 82
internals:
readings:
all ku_rollo:pct ku_bwm:state
trigger:
uiState:
uiTable:
Attributes:
cmdState on|off
devStateIcon on:general_an_fuer_zeit@green off|initialized:general_aus@red disabled:general_aus@grey
room DOIF,Küche
wait 0:10
Überlegung ist, dass das Licht erst dann angeht, wenn der Bewegungsmelder nach einer Zeit x ohne Bewegung ist und das Rollo über 50% geschlossen. Das als Hintergrund.
Wenn ich dich richtig verstehe, könnte es daran liegen, dass
a) Readingsage >3
und
b) bwm eq "motion"
niemals gleichzeitig zutreffen.
Sendet dein BWM ein Event, wenn *keine* Bewegung mehr erkannt wird?
Grüße,
Stephan
Guten Morgen,
wenn keine Bewegung mehr stattfindet springt der Bewegungsmelder auf nomotion.
Wenn ku_bwm:state auf "motion" geht, dann ist ReadingsAge("ku_bwm","state",0) gleich 0 (das Reading wurde eh gerade aktualisiert)
Was hälst du von dem Ansatz, wenn das Reading auf nomotion geht, den Rollo zu prüfen und ggf. ein paar Sekunden zu warten, und dann das Licht einzuschalten?
Grüße,
Stephan
Wenn x > 10:
([ku_bwm] eq "motion" and [?ku_rollo:pct] > 49 and [?$SELF] =~ "cmd2_2|initialized")
(set Kuechenlicht on)
DOELSEIF ([ku_bwm] eq "nomotion")
(set Kuechenlicht off)
()
wait 0:10,y
mit y = x-10
do resetwait dazu, wenn erneutes "motion" während das Licht noch an ist, dazu führen soll, dass das Licht länger an bleibt
Hallo,
danke für eure Rückmeldungen. Ich habe den Code jetzt mal reinkopiert. Das Licht geht nicht an. Hier das List:
Internals:
CFGFN
DEF ([ku_bwm] eq "motion" and [?ku_rollo:pct] > 49 and [?$SELF] =~ "cmd2_2|initialized")
(set Kuechenlicht on)
DOELSEIF ([ku_bwm] eq "nomotion")
(set Kuechenlicht off)
()
FUUID 5e41c636-f33f-5169-7a61-c2f80353be43a02b
MODEL FHEM
NAME ku_rollo_help
NOTIFYDEV ku_bwm,global
NR 2916
NTFY_ORDER 50-ku_rollo_help
STATE cmd_2
TYPE DOIF
VERSION 20929 2020-01-10 09:44:35
.attraggr:
.attrminint:
READINGS:
2020-02-11 19:41:43 Device ku_bwm
2020-02-11 19:30:28 cmd 2.2
2020-02-11 19:30:28 cmd_event ku_bwm
2020-02-11 19:30:28 cmd_nr 2
2020-02-11 19:30:28 cmd_seqnr 2
2020-02-11 19:41:43 e_ku_bwm_STATE nomotion
2020-02-11 19:28:05 mode enabled
2020-02-11 19:30:28 state cmd_2
2020-02-11 19:30:28 wait_timer no timer
Regex:
accu:
cond:
ku_bwm:
0:
&STATE ^ku_bwm$
1:
&STATE ^ku_bwm$
attr:
cmdState:
wait:
0:
0
1:
10
30
waitdel:
condition:
0 ::InternalDoIf($hash,'ku_bwm','STATE') eq "motion" and ::ReadingValDoIf($hash,'ku_rollo','pct') > 49 and ::InternalDoIf($hash,'ku_rollo_help','STATE') =~ "cmd2_2|initialized"
1 ::InternalDoIf($hash,'ku_bwm','STATE') eq "nomotion"
do:
0:
0 set Kuechenlicht on
1:
0 set Kuechenlicht off
1
2:
helper:
DEVFILTER ^global$|^ku_bwm$
NOTIFYDEV global|ku_bwm
event battery: 82,reachable: 1,nomotion
globalinit 1
last_timer 0
sleepdevice ku_bwm
sleepsubtimer -1
sleeptimer -1
timerdev ku_bwm
timerevent battery: 82,reachable: 1,nomotion
triggerDev ku_bwm
timerevents:
battery: 82
reachable: 1
nomotion
timereventsState:
battery: 82
reachable: 1
state: nomotion
triggerEvents:
battery: 82
reachable: 1
nomotion
triggerEventsState:
battery: 82
reachable: 1
state: nomotion
internals:
all ku_bwm:STATE ku_rollo_help:STATE
readings:
trigger:
uiState:
uiTable:
Attributes:
wait 0:10,30
Mit :sec hatte ich auch schon umgesetzt. Auch kein Erfolg. Würde ein dummy etwas nutzen? Wo die Sekunden/Zeit ausgelesen werden können? Ich hatte gedacht es würde ähnlich wie ein anderes DOIF funktionieren. Mit dem hier
(([00:00-06:00,+[1]:00]) and ReadingsAge("ku_bwm","state",0) > 3600 and [ku_strom_tv:state] eq "on") (set ku_strom_tv off) (set Pushnachricht msg 'Fernseher Küche...' '...sollte jetzt ausgeschsltet sein!')
prüfe ich stündlich ob noch Bewegung in der Küche war. Ansonsten schaltet er den TV aus. Dachte dass, das durch ,,motion" genauso erzielt werden kann.
Sorry, mein Schuld ;)
Statt
[?$SELF] =~ "cmd2_2|initialized"
eher
[?$SELF] =~ "cmd_2|initialized"