Guten Morgen zusammen,
Ich hab mal wieder eine Frage zu DOIF.
Funktion:
Das DOIF nimmt Werte von einem Durchflusssensor entgegen und berechnet mir die Leistung (mit anderen Werten von anderen Devices, zb Temperatur).
Nun habe ich einige DOIF_Readings angelegt, die ich gerne nutzen möchte:
In meiner Frage geht es um das unterschiedliche Verhalten zweier Readings, die meiner Meinung nach gleich definiert sind.
Als erstes hab ich mal wieder ein Update gemacht.
Hier sind die Definitionen der DOIF-Readings:
p1:([$SELF:rate]*3600*1.16*[$SELF:deltaT]),
power:([$SELF:p1:d0]),
literpromin:([$SELF:rate]*60)
Die beiden unteren Readings beziehen sich auf andere Readings des selben Devices, einmal p1, und einmal rate, wobei sich p1 selbst dann auch wieder auf rate bezieht.
p1 und literpromin erzeugen nun events (die dadurch auch geloggt werden). power erzeugt leider kein event (wodurch mir das Problem aufgefallen ist, denn die power wird nicht geloggt).
Hier ein Auszug aus dem Event-Monitor, wie man sieht ist power nicht vorhanden:
2021-01-09 05:01:57.195 DOIF DF_WMZ_HZG_main rate: 0.449396591339635
2021-01-09 05:01:57.195 DOIF DF_WMZ_HZG_main literprosec: 0.449396591339635
2021-01-09 05:01:57.195 DOIF DF_WMZ_HZG_main p1: 9026.83159573906
2021-01-09 05:01:57.195 DOIF DF_WMZ_HZG_main literpromin: 26.9637954803781
2021-01-09 05:01:57.197 DOIF DF_WMZ_HZG_main _lastdeltawork_sec: 15
2021-01-09 05:01:57.199 DOIF DF_WMZ_HZG_main lastdeltawork: 0.0384791666666667
2021-01-09 05:01:57.201 DOIF DF_WMZ_HZG_main work: 34.018141388889
2021-01-09 05:01:57.203 DOIF DF_WMZ_HZG_main cmd_nr: 1
2021-01-09 05:01:57.203 DOIF DF_WMZ_HZG_main cmd: 1
2021-01-09 05:01:57.203 DOIF DF_WMZ_HZG_main cmd_event: OWX_1D_18DC84000003
2021-01-09 05:01:57.203 DOIF DF_WMZ_HZG_main cmd_1
2021-01-09 05:02:12.104 DOIF DF_WMZ_HZG_main rate: 0.453408780455821
2021-01-09 05:02:12.104 DOIF DF_WMZ_HZG_main literprosec: 0.453408780455821
2021-01-09 05:02:12.104 DOIF DF_WMZ_HZG_main p1: 8652.99825702863
2021-01-09 05:02:12.104 DOIF DF_WMZ_HZG_main literpromin: 27.2045268273493
2021-01-09 05:02:12.105 DOIF DF_WMZ_HZG_main _lastdeltawork_sec: 15
2021-01-09 05:02:12.107 DOIF DF_WMZ_HZG_main lastdeltawork: 0.0381583333333333
2021-01-09 05:02:12.109 DOIF DF_WMZ_HZG_main work: 34.0562997222223
2021-01-09 05:02:12.112 DOIF DF_WMZ_HZG_main cmd_nr: 1
2021-01-09 05:02:12.112 DOIF DF_WMZ_HZG_main cmd: 1
2021-01-09 05:02:12.112 DOIF DF_WMZ_HZG_main cmd_event: OWX_1D_18DC84000003
2021-01-09 05:02:12.112 DOIF DF_WMZ_HZG_main cmd_1
2021-01-09 05:02:27.196 DOIF DF_WMZ_HZG_main rate: 0.463461939967779
2021-01-09 05:02:27.196 DOIF DF_WMZ_HZG_main literprosec: 0.463461939967779
2021-01-09 05:02:27.196 DOIF DF_WMZ_HZG_main p1: 8844.85597016589
2021-01-09 05:02:27.196 DOIF DF_WMZ_HZG_main literpromin: 27.8077163980667
2021-01-09 05:02:27.198 DOIF DF_WMZ_HZG_main _lastdeltawork_sec: 15
2021-01-09 05:02:27.201 DOIF DF_WMZ_HZG_main lastdeltawork: 0.0360541666666667
2021-01-09 05:02:27.203 DOIF DF_WMZ_HZG_main work: 34.092353888889
2021-01-09 05:02:27.205 DOIF DF_WMZ_HZG_main cmd_nr: 1
2021-01-09 05:02:27.205 DOIF DF_WMZ_HZG_main cmd: 1
2021-01-09 05:02:27.205 DOIF DF_WMZ_HZG_main cmd_event: OWX_1D_18DC84000003
2021-01-09 05:02:27.205 DOIF DF_WMZ_HZG_main cmd_1
2021-01-09 05:02:42.113 DOIF DF_WMZ_HZG_main rate: 0.464423048894317
2021-01-09 05:02:42.113 DOIF DF_WMZ_HZG_main literprosec: 0.464423048894317
2021-01-09 05:02:42.113 DOIF DF_WMZ_HZG_main p1: 8126.21443264537
2021-01-09 05:02:42.113 DOIF DF_WMZ_HZG_main literpromin: 27.865382933659
2021-01-09 05:02:42.115 DOIF DF_WMZ_HZG_main _lastdeltawork_sec: 15
2021-01-09 05:02:42.117 DOIF DF_WMZ_HZG_main lastdeltawork: 0.0368541666666667
2021-01-09 05:02:42.119 DOIF DF_WMZ_HZG_main work: 34.1292080555557
2021-01-09 05:02:42.121 DOIF DF_WMZ_HZG_main cmd_nr: 1
2021-01-09 05:02:42.121 DOIF DF_WMZ_HZG_main cmd: 1
Hier ein list:
Internals:
DEF (["^OWX_1D_18DC84000003$:^B_rate"])({
my ($a1,$b1) = split(" ", "$EVENT");
$b1 = $b1/52;
fhem("setreading $SELF rate $b1");
my $power = [$SELF:power:d];
my $lastdeltawork_sec = [$SELF:lastdeltawork:sec];
fhem("setreading $SELF _lastdeltawork_sec $lastdeltawork_sec");
my $work = [$SELF:work:d];
my $deltawork = (( $power * $lastdeltawork_sec ) / 3600 / 1000 );
my $totalwork = $deltawork + $work;
fhem("setreading $SELF lastdeltawork $deltawork");
fhem("setreading $SELF work $totalwork");
})
DOELSEIF([23:59])
(
setreading $SELF workDay [$SELF:work],
setreading $SELF work 0
)
DOIFDEV ^global$|^RE_TEMP_VorlaufHK$|^DF_WMZ_HZG_main$|^RE_TEMP_RuecklaufHK$|^OWX_1D_18DC84000003$
FUUID 5c844715-f33f-4040-7cd6-92841e952dc0661d
MODEL FHEM
NAME DF_WMZ_HZG_main
NR 394
NTFY_ORDER 50-DF_WMZ_HZG_main
STATE 5944 W
TYPE DOIF
VERSION 23466 2021-01-03 17:14:46
DOIF_Readings:
RL (::ReadingValDoIf($hash,'RE_TEMP_RuecklaufHK','temperature'))
VL (::ReadingValDoIf($hash,'RE_TEMP_VorlaufHK','temperature'))
deltaT (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','VL')-::ReadingValDoIf($hash,'DF_WMZ_HZG_main','RL'))
literpromin (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','rate')*60)
literprosec (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','rate'))
p1 (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','rate')*3600*1.16*::ReadingValDoIf($hash,'DF_WMZ_HZG_main','deltaT'))
power (::ReadingValDoIf($hash,'DF_WMZ_HZG_main','p1','','d0'))
Helper:
DBLOG:
lastdeltawork:
logdb:
TIME 1610165037.20825
VALUE 0.0272666666666667
literpromin:
logdb:
TIME 1610165037.20361
VALUE 27.8172978516508
READINGS:
2021-01-09 05:03:57 Device OWX_1D_18DC84000003
2021-01-09 05:03:43 RL 25.87
2021-01-09 05:03:44 VL 28.94
2021-01-09 05:03:57 _lastdeltawork_sec 15
2021-01-09 05:03:57 cmd 1
2021-01-09 05:03:57 cmd_event OWX_1D_18DC84000003
2021-01-09 05:03:57 cmd_nr 1
2021-01-09 05:03:44 deltaT 3.07
2021-01-09 05:03:57 lastdeltawork 0.0272666666666667
2021-01-09 05:03:57 literpromin 27.8172978516508
2021-01-09 05:03:57 literprosec 0.463621630860846
2021-01-09 04:52:18 mode enabled
2021-01-09 05:03:57 p1 5943.77766655792
2021-01-09 05:03:57 power 5944
2021-01-09 05:03:57 rate 0.463621630860846
2021-01-09 05:03:57 state cmd_1
2021-01-09 04:55:02 timer_01_c02 09.01.2021 23:59:00
2021-01-09 05:03:57 work 34.2831872222223
2021-01-08 23:59:00 workDay 154.32388749998
Regex:
DOIF_Readings:
DF_WMZ_HZG_main:
deltaT:
RL ^DF_WMZ_HZG_main$:^RL:
VL ^DF_WMZ_HZG_main$:^VL:
literpromin:
rate ^DF_WMZ_HZG_main$:^rate:
literprosec:
rate ^DF_WMZ_HZG_main$:^rate:
p1:
deltaT ^DF_WMZ_HZG_main$:^deltaT:
rate ^DF_WMZ_HZG_main$:^rate:
power:
p1 ^DF_WMZ_HZG_main$:^p1:
RE_TEMP_RuecklaufHK:
RL:
temperature ^RE_TEMP_RuecklaufHK$:^temperature:
RE_TEMP_VorlaufHK:
VL:
temperature ^RE_TEMP_VorlaufHK$:^temperature:
accu:
cond:
:
0:
"^OWX_1D_18DC84000003$:^B_rate" ^OWX_1D_18DC84000003$:^B_rate
attr:
cmdState:
wait:
waitdel:
condition:
0 ::EventDoIf('^OWX_1D_18DC84000003$',$hash,'^B_rate',0)
1 ::DOIF_time_once($hash,0,$wday)
days:
do:
0:
0 { my ($a1,$b1) = split(" ", "$EVENT"); $b1 = $b1/52; fhem("setreading DF_WMZ_HZG_main rate $b1"); my $power = [DF_WMZ_HZG_main:power:d]; my $lastdeltawork_sec = [DF_WMZ_HZG_main:lastdeltawork:sec]; fhem("setreading DF_WMZ_HZG_main _lastdeltawork_sec $lastdeltawork_sec"); my $work = [DF_WMZ_HZG_main:work:d]; my $deltawork = (( $power * $lastdeltawork_sec ) / 3600 / 1000 ); my $totalwork = $deltawork + $work; fhem("setreading DF_WMZ_HZG_main lastdeltawork $deltawork"); fhem("setreading DF_WMZ_HZG_main work $totalwork"); }
1:
0 setreading DF_WMZ_HZG_main workDay [DF_WMZ_HZG_main:work], setreading DF_WMZ_HZG_main work 0
2:
helper:
DEVFILTER ^global$|^RE_TEMP_VorlaufHK$|^DF_WMZ_HZG_main$|^RE_TEMP_RuecklaufHK$|^OWX_1D_18DC84000003$
NOTIFYDEV global|RE_TEMP_VorlaufHK|DF_WMZ_HZG_main|RE_TEMP_RuecklaufHK|OWX_1D_18DC84000003
event power: 6544,p1: 5943.77772337827,literprosec: 0.463621630860846,p1: 5943.77766655792,literpromin: 27.8172978516508
globalinit 1
last_timer 1
sleeptimer -1
timerdev OWX_1D_18DC84000003
timerevent B_rate: 24.108324804764
triggerDev DF_WMZ_HZG_main
DOIF_Readings_events:
power: 5944
DOIF_Readings_eventsState:
power: 5944
timerevents:
B_rate: 24.108324804764
timereventsState:
B_rate: 24.108324804764
triggerEvents:
power: 6544
p1: 5943.77772337827
literprosec: 0.463621630860846
p1: 5943.77766655792
literpromin: 27.8172978516508
power: 5944
triggerEventsState:
power: 6544
p1: 5943.77772337827
literprosec: 0.463621630860846
p1: 5943.77766655792
literpromin: 27.8172978516508
internals:
intervalfunc:
localtime:
0 1610233140
perlblock:
readings:
realtime:
0 23:59:00
time:
0 23:59:00
timeCond:
0 1
timer:
0 0
timers:
1 0
trigger:
triggertime:
1610233140:
localtime 1610233140
hash:
uiState:
uiTable:
Attributes:
DOIF_Readings VL:([RE_TEMP_VorlaufHK:temperature]),
RL:([RE_TEMP_RuecklaufHK:temperature]),
deltaT:([$SELF:VL]-[$SELF:RL]),
p1:([$SELF:rate]*3600*1.16*[$SELF:deltaT]),
power:([$SELF:p1:d0]),
literprosec:([$SELF:rate]),
literpromin:([$SELF:rate]*60)
DbLogInclude literpromin,power,lastdeltawork,workDay
do always
room Counter,FHEM2FHEM,Heizung,_doif
selftrigger all
stateFormat power W
Und ein Bild, auf dem man das auch schön sieht, häng ich ebenfalls an.
Vielleicht hab ich was übersehen - Über Hilfe würd ich mich freuen.
Grüße,
Stephan
DOIF_Readings erzeugen keine Events nach außen, sie sind dazu da im DOIF selbst diese zu verwenden, wenn etwas durchkommt, dann nur weil ein anderes Reading (hier: rate) zufällig zuvor ein Event erzeugt hat - das liegt an FHEM-Event-Logik selbst.
Wenn du Events haben willst, dann musst du statt DOIF_Reading das Attribut event_Readings nehmen, das hat die selbe Syntax.
https://fhem.de/commandref_DE.html#DOIF_event_Readings
Moin,
Danke für deine Antwort - Event readings hab ich jetzt auch benutzt. Fand/finde nur die Symptome ein bisschen unglücklich, hätte nicht gedacht, dass das solche Wechselwirkungen hat. Dann muss ich noch nochmal mit der Event-Logik beschäftigen😉
Alles klar,
Stephan
Zitat von: abc2006 am 09 Januar 2021, 09:55:18
Fand/finde nur die Symptome ein bisschen unglücklich, hätte nicht gedacht, dass das solche Wechselwirkungen hat.
Ich auch nicht, leider entstehen die Symptome außerhalb von DOIF. DOIF_readings werden immer
ohne Event-Flag gesetzt.
Kann man herausfinden, wer ein Event produziert hat?
Zitat von: abc2006 am 09 Januar 2021, 10:04:22
Kann man herausfinden, wer ein Event produziert hat?
Normalerweise der erste der Kette mit gleicher Uhrzeit, bei dir das Reading "rate".
Ah, wegen dem fhem("setreading $SELF rate $b1"); wahrscheinlich. Muss ich mir daheim nochmal ansehen...
Zitat von: abc2006 am 09 Januar 2021, 10:15:13
Ah, wegen dem fhem("setreading $SELF rate $b1"); wahrscheinlich. Muss ich mir daheim nochmal ansehen...
ja, FHEM selbst ordnet die folgenden Schreibbefehle des gleichen Moduls diesem Event zu, obwohl sie explizit kein Event produzieren sollen, ich habe mich schon mal mit dem Chef-Entwickler darüber ausgetauscht. Die Lösung ist aber nur mit Tricks (Löschen interner Flags) realisierbar, das ist mir aber zu heiß, weil ich die Nebenwirkungen nicht absehen kann.