FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: abc2006 am 09 Januar 2021, 05:06:39

Titel: Gelöst: Events bei DOIF_Readings (oder auch nicht:)
Beitrag von: abc2006 am 09 Januar 2021, 05:06:39
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

Titel: Antw:Events bei DOIF_Readings (oder auch nicht:)
Beitrag von: Damian am 09 Januar 2021, 09:46:51
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
Titel: Antw:Events bei DOIF_Readings (oder auch nicht:)
Beitrag von: abc2006 am 09 Januar 2021, 09:55:18
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
Titel: Antw:Events bei DOIF_Readings (oder auch nicht:)
Beitrag von: Damian am 09 Januar 2021, 09:59:26
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.
Titel: Antw:Gelöst: Events bei DOIF_Readings (oder auch nicht:)
Beitrag von: abc2006 am 09 Januar 2021, 10:04:22
Kann man herausfinden, wer ein Event produziert hat?
Titel: Antw:Gelöst: Events bei DOIF_Readings (oder auch nicht:)
Beitrag von: Damian am 09 Januar 2021, 10:07:39
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".
Titel: Antw:Gelöst: Events bei DOIF_Readings (oder auch nicht:)
Beitrag von: abc2006 am 09 Januar 2021, 10:15:13
Ah, wegen dem fhem("setreading $SELF rate $b1"); wahrscheinlich. Muss ich mir daheim nochmal ansehen...
Titel: Antw:Gelöst: Events bei DOIF_Readings (oder auch nicht:)
Beitrag von: Damian am 09 Januar 2021, 10:35:12
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.