[GELÖST] event_Readings und [device:Reading:diff]

Begonnen von daedalus0815, 02 März 2019, 12:37:18

Vorheriges Thema - Nächstes Thema

daedalus0815

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




Damian

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

daedalus0815

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

Damian

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