Werden event_Readings bei $SELF:Reading aktualisiert?

Begonnen von Morgennebel, 05 November 2019, 13:09:58

Vorheriges Thema - Nächstes Thema

Morgennebel

Moin Moin,


ich habe folgendes DOIF, bei dem die event_Readings nicht aktualisiert werden:

RAW:

defmod DI_RainGaugeStats DOIF ([+:10])\
    (setreading $SELF RainOldValue [$SELF:RainNewValue,0],\
     setreading $SELF RainNewValue [ESP_RainGauge:monotonic,0],\
     setreading $SELF niederschlag {([$SELF:RainNewValue]-[$SELF:RainOldValue])}, ## mm\
     setreading $SELF DailyRain {([$SELF:DailyRain]+[$SELF:niederschlag])})       ## mm\
DOELSEIF ([00:00:01])\
    (setreading $SELF DailyRain 0.000)
attr DI_RainGaugeStats do always
attr DI_RainGaugeStats event_Readings 1hourDiff: [$SELF:RainNewValue:inc6], 3hourDiff: [$SELF:RainNewValue:inc18], 6hourDiff: [$SELF:RainNewValue:inc36]


List:

Internals:
   DEF        ([+:10])
    (setreading $SELF RainOldValue [$SELF:RainNewValue,0],
     setreading $SELF RainNewValue [ESP_RainGauge:monotonic,0],
     setreading $SELF niederschlag {([$SELF:RainNewValue]-[$SELF:RainOldValue])}, ## mm
     setreading $SELF DailyRain {([$SELF:DailyRain]+[$SELF:niederschlag])})       ## mm
DOELSEIF ([00:00:01])
    (setreading $SELF DailyRain 0.000)
   FUUID      5dbfda44-f33f-4ba1-1a0c-e01dcb62f0a85193
   MODEL      FHEM
   NAME       DI_RainGaugeStats
   NOTIFYDEV  DI_RainGaugeStats,global
   NR         84944
   NTFY_ORDER 50-DI_RainGaugeStats
   STATE      cmd_1
   TYPE       DOIF
   VERSION    20268 2019-09-28 21:00:39
   Helper:
     DBLOG:
       niederschlag:
         DBLOG:
           TIME       1572955200.02951
           VALUE      0
       state:
         DBLOG:
           TIME       1572955200.03452
           VALUE      cmd_1
   READINGS:
     2019-11-05 10:47:31   1hourDiff       0
     2019-11-05 10:47:31   3hourDiff       0
     2019-11-05 10:47:31   6hourDiff       0
     2019-11-05 13:00:00   DailyRain       3.302
     2019-11-05 13:00:00   RainNewValue    5.588
     2019-11-05 13:00:00   RainOldValue    5.588
     2019-11-05 13:00:00   cmd             1
     2019-11-05 13:00:00   cmd_event       timer_1
     2019-11-05 13:00:00   cmd_nr          1
     2019-11-04 17:24:02   mode            enabled
     2019-11-05 13:00:00   niederschlag    0
     2019-11-05 13:00:00   state           cmd_1
     2019-11-05 13:00:00   timer_01_c01    05.11.2019 13:10:00
     2019-11-05 00:00:01   timer_02_c02    06.11.2019 00:00:01
   Regex:
     accu:
       DI_RainGaugeStats:
         accu:
           RainNewValue ^DI_RainGaugeStats$:^RainNewValue:
     event_Readings:
       DI_RainGaugeStats:
         1hourDiff:
           RainNewValue ^DI_RainGaugeStats$:^RainNewValue:
         3hourDiff:
           RainNewValue ^DI_RainGaugeStats$:^RainNewValue:
         6hourDiff:
           RainNewValue ^DI_RainGaugeStats$:^RainNewValue:
   accu:
     DI_RainGaugeStats RainNewValue:
       dim        360
       value:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday)
     1          ::DOIF_time_once($hash,1,$wday)
   days:
   do:
     0:
       0          setreading DI_RainGaugeStats RainOldValue [DI_RainGaugeStats:RainNewValue,0],      setreading DI_RainGaugeStats RainNewValue [ESP_RainGauge:monotonic,0],      setreading DI_RainGaugeStats niederschlag {([DI_RainGaugeStats:RainNewValue]-[DI_RainGaugeStats:RainOldValue])},       setreading DI_RainGaugeStats DailyRain {([DI_RainGaugeStats:DailyRain]+[DI_RainGaugeStats:niederschlag])}
     1:
       0          setreading DI_RainGaugeStats DailyRain 0.000
     2:
   event_Readings:
     1hourDiff   ::ReadingValDoIf($hash,'DI_RainGaugeStats','RainNewValue','','inc6')
     3hourDiff   ::ReadingValDoIf($hash,'DI_RainGaugeStats','RainNewValue','','inc18')
     6hourDiff   ::ReadingValDoIf($hash,'DI_RainGaugeStats','RainNewValue','','inc36')
   helper:
     DEVFILTER  ^global$|^DI_RainGaugeStats$
     NOTIFYDEV  global|DI_RainGaugeStats
     event      timer_1
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   
     timerevent timer_1
     triggerDev
     timerevents:
       timer_1
     timereventsState:
       timer_1
     triggerEvents:
       timer_1
     triggerEventsState:
       timer_1
   interval:
   intervalfunc:
   localtime:
     0          1572955800
     1          1572994801
   realtime:
     0          13:10:00
     1          00:00:01
   time:
     0          +:10
     1          00:00:01
   timeCond:
     0          0
     1          1
   timer:
     0          0
     1          0
   timers:
     0           0
     1           1
   triggertime:
     1572955800:
       localtime  1572955800
       hash:
     1572994801:
       localtime  1572994801
       hash:
   uiState:
   uiTable:
Attributes:
   do         always
   event_Readings 1hourDiff: [$SELF:RainNewValue:inc6], 3hourDiff: [$SELF:RainNewValue:inc18], 6hourDiff: [$SELF:RainNewValue:inc36]
   room       Aussen,SYS_Events


Statt inc in den event_Readings hatte ich auch diff probiert. Ebenfalls keine Reaktion.

event_Readings, damit die neuen Werte ins DBLOG kommen und ich ein Diagramm machen kann...

Danke, -MN
Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA

Damian

#1
Du möchtest in event_Readings auf selbst produzierte Events reagieren.

Dazu musst du selftrigger-Attribut setzen.

Edit: Ich würde diese Aufgabe im Perlmodus programmieren, ohne event_Readings, ohne selftrigger, ohne do always, ohne setreading, dort gibt es die Perl-Funktion set_Reading, die eigene Readings setzen kann, die Funktionalität inc6 usw. ist dort genauso gegeben. Abgesehen davon würde die Ausführung wesentlich performanter sein und weniger Systemlast produzieren.


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Morgennebel

Dankeschön,


da kenne ich nun 50% der DOIF Commandref recht gut, aber selftrigger habe ich bisher überlesen :)

Danke auch für den Hinweis mit dem Perl-Modus. Ehrlich gesagt, mag ich den originalen DOIF-Modus einfach lieber. Die kleine Aufgabe hier wird alle 10 Minuten erledigt und der Rechner dümpelt bei 0.06% Auslastung dahin - wahrscheinlich durch DBLog.

Danke, -MN
Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA

Damian

#3
Zitat von: Morgennebel am 06 November 2019, 07:51:20
Dankeschön,


da kenne ich nun 50% der DOIF Commandref recht gut, aber selftrigger habe ich bisher überlesen :)

Danke auch für den Hinweis mit dem Perl-Modus. Ehrlich gesagt, mag ich den originalen DOIF-Modus einfach lieber. Die kleine Aufgabe hier wird alle 10 Minuten erledigt und der Rechner dümpelt bei 0.06% Auslastung dahin - wahrscheinlich durch DBLog.

Danke, -MN

Es ist normal, dass man gerne etwas nutzt, wo man sich schon besser auskennt. Dennoch ist diese Aufgabenstellung prädestiniert für den Perl-Modus, denn es werden viele Readings umkopiert bzw. neu berechnet. In FHEM-Modus finden oft Ersetzungen in Befehlssequenzen statt, die Nebenwirkungen haben können, gerade  wenn Berechnungen auf einander aufbauen. Zusätzlich muss man nicht Events produzieren, wenn man sie nicht braucht.

Perlmodus ist aber auch keine Wissenschaft, so würde es im Perlmodus aussehen (im DEF-Editor reinkopieren):

DOIF {[+:10];
   set_Reading ("RainOldValue",get_Reading ("RainNewValue",0));
   set_Reading ("RainNewValue", ReadingsVal("ESP_RainGauge","monotonic",0),1);
   set_Reading ("niederschlag", get_Reading("RainNewValue")-get_Reading("RainOldValue"));
   set_Reading ("DailyRain", get_Reading ("DailyRain")+get_Reading("niederschlag"));
}

{
   set_Reading ("1hourDiff",[$SELF:RainNewValue:inc6]);
   set_Reading ("3hourDiff",[$SELF:RainNewValue:inc18]);
   set_Reading ("6hourDiff",[$SELF:RainNewValue:inc36]);
}

{[00:00:01];
  set_Reading ("DailyRain",0);
}

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF