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
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.
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
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);
}