Hallo,
ich verstehe die neue :diff - Funktion nicht richtig.
Warum wird [device:Reading:diff] nie größer Null ?
-----------------------------------------------------------------------------
Im folgenden Beispiel erwarte ich, dass cmd_1 auch mal gezogen wird.....wo liegt mein Denkfehler ?
Die event-Reading werden ja aktualisiert ...
98_DOIF.pm 18706 2019-02-23 21:48:22Z
DANKE im voraus....
defmod Heizung_di_Test DOIF ( [$SELF:TempDiff:d] > 0) \
( setreading $SELF GT [$SELF:TempDiff:d] ) \
\
\
\
DOELSE\
( setreading $SELF LT [$SELF:TempDiff:d] ) \
\
attr Heizung_di_Test DbLogExclude .*
attr Heizung_di_Test event_Readings TempOLD:( OldReadingsNum('MOTION2',"temperature","10") ),\
TempDiff: ( [MOTION2:temperature:diff] ),\
TempSensor: ( ( [MOTION2:temperature:diff] < 5) * ([MOTION2:temperature:d1]+0.1) )\
attr Heizung_di_Test selftrigger wait
attr Heizung_di_Test startup set $SELF cmd_1
attr Heizung_di_Test stateFormat TempDiff
attr Heizung_di_Test wait 10
setstate Heizung_di_Test 0
setstate Heizung_di_Test 2019-03-02 12:19:46 LT 0
setstate Heizung_di_Test 2019-03-02 12:22:51 TempDiff 0
setstate Heizung_di_Test 2019-03-02 12:19:36 TempOLD 10
setstate Heizung_di_Test 2019-03-02 12:22:51 TempSensor 20.8
setstate Heizung_di_Test 2019-03-02 12:19:46 cmd 2
setstate Heizung_di_Test 2019-03-02 12:19:46 cmd_event Heizung_di_Test
setstate Heizung_di_Test 2019-03-02 12:19:46 cmd_nr 2
setstate Heizung_di_Test 2019-03-02 12:22:51 e_Heizung_di_Test_TempDiff 0
setstate Heizung_di_Test 2019-03-02 12:19:46 state cmd_2
setstate Heizung_di_Test 2019-03-02 12:19:46 wait_timer no timer
Internals:
CFGFN
DEF ( [$SELF:TempDiff:d] > 0)
( setreading $SELF GT [$SELF:TempDiff:d] )
DOELSE
( setreading $SELF LT [$SELF:TempDiff:d] )
FUUID 5c7a65dc-f33f-71f8-3917-a0e39594a04f1caa
MODEL FHEM
NAME Heizung_di_Test
NR 601
NTFY_ORDER 50-Heizung_di_Test
STATE 0
TYPE DOIF
VERSION 18706 2019-02-23 21:48:22
Helper:
DBLOG:
cmd:
MySQL:
TIME 1551525340.53799
VALUE 0
mode:
MySQL:
TIME 1551525340.53799
VALUE enabled
state:
MySQL:
TIME 1551525340.53799
VALUE initialized
OLDREADINGS:
READINGS:
2019-03-02 12:19:46 LT 0
2019-03-02 12:22:51 TempDiff 0
2019-03-02 12:19:36 TempOLD 10
2019-03-02 12:22:51 TempSensor 20.8
2019-03-02 12:19:46 cmd 2
2019-03-02 12:19:46 cmd_event Heizung_di_Test
2019-03-02 12:19:46 cmd_nr 2
2019-03-02 12:22:51 e_Heizung_di_Test_TempDiff 0
2019-03-02 12:19:46 state cmd_2
2019-03-02 12:19:46 wait_timer no timer
Regex:
accu:
MOTION2:
accu:
temperature ^MOTION2$:^temperature:
event_Readings:
Heizung_di_Test:
MOTION2:
TempDiff:
temperature ^MOTION2$:^temperature:
TempSensor:
temperature ^MOTION2$:^temperature:
accu:
MOTION2 temperature:
dim 2
value:
20.7
attr:
cmdState:
wait:
0:
10
waitdel:
condition:
0 ::ReadingValDoIf($hash,'Heizung_di_Test','TempDiff','','d') > 0
devices:
0 Heizung_di_Test
all Heizung_di_Test
do:
0:
0 setreading Heizung_di_Test GT [Heizung_di_Test:TempDiff:d]
1:
0 setreading Heizung_di_Test LT [Heizung_di_Test:TempDiff:d]
event_Readings:
TempDiff ( ::ReadingValDoIf($hash,'MOTION2','temperature','','diff') )
TempOLD ( OldReadingsNum('MOTION2',"temperature","10") )
TempSensor ( ( ::ReadingValDoIf($hash,'MOTION2','temperature','','diff') < 5) * (::ReadingValDoIf($hash,'MOTION2','temperature','','d1')+0.1) )
helper:
event TempDiff: 0
globalinit 1
last_timer 0
sleepdevice Heizung_di_Test
sleepsubtimer -1
sleeptimer -1
timerdev Heizung_di_Test
timerevent TempDiff: 0
triggerDev Heizung_di_Test
DOIF_eventas:
cmd_nr: 2
cmd: 2
cmd_event: Heizung_di_Test
state: cmd_2
timerevents:
TempDiff: 0
e_Heizung_di_Test_TempDiff: 0
timereventsState:
TempDiff: 0
e_Heizung_di_Test_TempDiff: 0
triggerEvents:
TempDiff: 0
e_Heizung_di_Test_TempDiff: 0
triggerEventsState:
TempDiff: 0
e_Heizung_di_Test_TempDiff: 0
internals:
itimer:
readings:
0 Heizung_di_Test:TempDiff
all Heizung_di_Test:TempDiff
trigger:
uiState:
uiTable:
Attributes:
DbLogExclude .*
event_Readings TempOLD:( OldReadingsNum('MOTION2',"temperature","10") ),
TempDiff: ( [MOTION2:temperature:diff] ),
TempSensor: ( ( [MOTION2:temperature:diff] < 5) * ([MOTION2:temperature:d1]+0.1) )
selftrigger wait
startup set $SELF cmd_1
stateFormat TempDiff
wait 10
hier nach:
accu:
MOTION2 temperature:
dim 2
value:
20.7
ist erst ein Wert ausgewertet worden, man braucht mindestens zwei (verschiedene) damit Differenz ungleich Null kommt.
Stimmt Damian.....,
Danke für die Info, jetzt weiß ich auch, wo man das findet.
Übrigens findet sich hier das Nachkommaproblem wieder: letztes Egebnis für [device:Reading:diff] war jetzt: -0.100000000000001
Mein Bugfix:
defmod Heizung_di_Test DOIF ( [$SELF:TempDiff:d1 > 0) \
( setreading $SELF GT [$SELF:TempDiff:d] ) \
\
\
\
DOELSE\
( setreading $SELF LT [$SELF:TempDiff:d1] ) \
\
Wenn man [$SELF:TempDiff:d] nicht protokolliert wird's etwas schwierig für Neulinge ....
DOIF ist ;D
Zitat von: daedalus0815 am 02 März 2019, 14:03:00
Stimmt Damian.....,
Danke für die Info, jetzt weiß ich auch, wo man das findet.
Übrigens findet sich hier das Nachkommaproblem wieder: letztes Egebnis für [device:Reading:diff] war jetzt: -0.100000000000001
Mein Bugfix:
defmod Heizung_di_Test DOIF ( [$SELF:TempDiff:d1 > 0) \
( setreading $SELF GT [$SELF:TempDiff:d] ) \
\
\
\
DOELSE\
( setreading $SELF LT [$SELF:TempDiff:d1] ) \
\
Wenn man [$SELF:TempDiff:d] nicht protokolliert wird's etwas schwierig für Neulinge ....
DOIF ist ;D
Ich denke eher, dass eine Differenz in Perl von zwei gleichen Zahlen Null ergibt, daher wird die Angabe d1 in der größer/kleiner Abfrage der Bedingung überflüssig sein.
Zum Protokollieren würde ich in event_Readings [Device:reading:diff] in die Perlfunktion round einpacken.