event_Reading im Event-Monitor sichtbar, schreibt aber nicht ins Log

Begonnen von Sany, 02 Juni 2019, 15:50:20

Vorheriges Thema - Nächstes Thema

Sany

Hallo zusammen,

ich habe ein Problem mit event_Reading: die events triggern nicht alles, was sie sollen.


Das DOIF wird von 2 Temperatur/Feuchte Sensoren im Garten und hinter dem Haus getriggert. Davon wird der Mittelwert von Temperatur und Feuchte gebildet und in zwei Readings des DOIF geschrieben (tempAvg und humAvg). Mit event_Readings möchte ich die beiden Readings nochmals glätten. Dies eigentlich nur, da ab und zu ein Wert der Sensoren "überhört" wird und dann per Rechnung nur der andere Sensor genommen wird. Bei großen Unterschieden der Temperatur würden ziemliche Zacken in der Kurve entstehen, per median5 werden die ausgebügelt.

Das funktioniert soweit ganz prima, nur folgendes tritt auf:

die event_Readings temperatur und humidity liefern im Event-Monitor events, aber die Werte werden nicht ins Log geschrieben. Das Log schreibt alles vom DOIF di_MasterClimate mit. Auch sonst sind keine event-on-xx eingetragen.

Hier mal das di_ClimateMaster Log:

2019-06-02_15:13:49 di_ClimateMaster MONITORhinten: OK
2019-06-02_15:13:49 di_ClimateMaster tempAvg: 30.95
2019-06-02_15:13:49 di_ClimateMaster TrendOATraw: 0.000160097426842546
2019-06-02_15:13:49 di_ClimateMaster humAvg: 20.55
2019-06-02_15:13:49 di_ClimateMaster MONITORgarten: OK
2019-06-02_15:13:49 di_ClimateMaster tempAvg: 30.95
2019-06-02_15:13:49 di_ClimateMaster humAvg: 20.55
2019-06-02_15:13:50 di_ClimateMaster LUXlog: 101
2019-06-02_15:15:45 di_ClimateMaster MONITORhinten: OK
2019-06-02_15:15:45 di_ClimateMaster tempAvg: 30.6
2019-06-02_15:15:45 di_ClimateMaster TrendOATraw: -0.00300951864365504
2019-06-02_15:15:46 di_ClimateMaster humAvg: 20.55
2019-06-02_15:15:46 di_ClimateMaster MONITORgarten: OK
2019-06-02_15:15:46 di_ClimateMaster tempAvg: 30.6
2019-06-02_15:15:46 di_ClimateMaster humAvg: 20.55
2019-06-02_15:15:46 di_ClimateMaster LUXlog: 101


dazu der Event-Monitor:

2019-06-02 15:13:49 DOIF di_ClimateMaster MONITORhinten: OK
2019-06-02 15:13:49 DOIF di_ClimateMaster TempTrendOAT: 0.576
2019-06-02 15:13:49 DOIF di_ClimateMaster humAvg: 20.55
2019-06-02 15:13:49 DOIF di_ClimateMaster humidity: 21.75
2019-06-02 15:13:49 DOIF di_ClimateMaster MONITORgarten: OK
2019-06-02 15:13:49 DOIF di_ClimateMaster tempAvg: 30.95
2019-06-02 15:13:49 DOIF di_ClimateMaster temperature: 30.9
2019-06-02 15:13:50 DOIF di_ClimateMaster humAvg: 20.55
2019-06-02 15:13:50 DOIF di_ClimateMaster humidity: 21.75
2019-06-02 15:13:50 DOIF di_ClimateMaster LUXlog: 101
2019-06-02 15:15:45 DOIF di_ClimateMaster MONITORhinten: OK
2019-06-02 15:15:46 DOIF di_ClimateMaster TempTrendOAT: -10.834
2019-06-02 15:15:46 DOIF di_ClimateMaster humAvg: 20.55
2019-06-02 15:15:46 DOIF di_ClimateMaster humidity: 20.55
2019-06-02 15:15:46 DOIF di_ClimateMaster MONITORgarten: OK
2019-06-02 15:15:46 DOIF di_ClimateMaster tempAvg: 30.6
2019-06-02 15:15:46 DOIF di_ClimateMaster temperature: 30.9
2019-06-02 15:15:46 DOIF di_ClimateMaster humAvg: 20.55
2019-06-02 15:15:46 DOIF di_ClimateMaster humidity: 20.55
2019-06-02 15:15:47 DOIF di_ClimateMaster LUXlog: 101

(Codetags und Farbe geht wohl nicht??)

und noch die Sensoren:

2019-06-02 15:13:50 HMS TF_OAT temperature: 28.1
2019-06-02 15:13:50 HMS TF_OAT humidity: 41.1
2019-06-02 15:13:50 HMS TF_OAT absFeuchte: 11.2
2019-06-02 15:13:50 HMS TF_OAT dewpoint: 13.6
2019-06-02 15:15:47 HMS TF_OAT2 temperature: 33.1
2019-06-02 15:15:47 HMS TF_OAT2 humidity: 0


Im Event-Monitor sieht man schön die temperatur und humidity, im Log stehen sie nicht drin.
Jetzt könnte man meinen, die Log-Definition ist nicht korrekt, dem ist aber nicht so. Wenn ich im DOIF auf "DEF" klicke und gleich danach "modify di_ClimateMaster" wird das Log korrekt geschrieben.

Log:

2019-06-02_15:24:04 di_ClimateMaster mode: enabled
2019-06-02_15:24:05 di_ClimateMaster temperature: 30.75
2019-06-02_15:24:05 di_ClimateMaster humidity: 20.4
2019-06-02_15:24:05 di_ClimateMaster absFeuchte: 6.4
2019-06-02_15:24:05 di_ClimateMaster dewpoint: 5.5


Event-Monitor:

2019-06-02 15:24:05 DOIF di_ClimateMaster mode: enabled
2019-06-02 15:24:05 DOIF di_ClimateMaster temperature: 30.75
2019-06-02 15:24:05 DOIF di_ClimateMaster humidity: 20.4
2019-06-02 15:24:05 DOIF di_ClimateMaster absFeuchte: 6.4
2019-06-02 15:24:05 DOIF di_ClimateMaster dewpoint: 5.5



dewpoint und absFeuchte kommen von Dewpoint, dies wird wohl auch nicht getriggert.
Ein weiteres DOIF, welches nur ein event_Reading auf di_ClimateMaster:tempAvg hat funtioniert korrekt, dh es rechnet den Median und schreibt auch in ein Log.


Hier die Module:

defmod di_ClimateMaster DOIF ## alle Klimawerte werden hier als Master eingetragen, andere Module sollten nur hierrauf zurückgreifen\
## Vorteil: ändert sich ein Sensor, muss nur dieser hier geändert werden, andere Module bleiben erhalten\
\
\
subs {\
sub AVG {\
my ($wert1 , $monitor1 , $wert2 , $monitor2) = @_;; ## Übergabe der Parameter\
\
## Berechnung:\
\
((($monitor1 eq "OK")?$wert1:0) + (($monitor2 eq "OK")?$wert2:0)) / (($monitor1 eq "OK" && $monitor2 eq "OK")?2:1);;\
\
} \
}\
\
{\
\
    {["^TF_OAT$:^temperature"];;\
      ## set_Reading('OAThinten',[?TF_OAT:temperature],0);;\
  ## set_Reading('HUMhinten',[?TF_OAT:humidity],0);;\
   set_Reading('MONITORhinten','OK',1);;\
   set_Exec('timerOAThinten',700,'set_Reading("MONITORhinten","FAIL",1)');;\
   \
   set_Reading('tempAvg',AVG([?TF_OAT:temperature],[?$SELF:MONITORhinten],[?TF_OAT2:temperature],[?$SELF:MONITORgarten]),1);;\
   set_Reading('humAvg',AVG([?TF_OAT:humidity],[?$SELF:MONITORhinten],[?TF_OAT2:humidity],[?$SELF:MONITORgarten]),1);;\
    }  \
\
    {["^TF_OAT2$:^temperature"];;\
      ## set_Reading('OATgarten',[?TF_OAT2:temperature],0);;\
  ## set_Reading('HUMgarten',[?TF_OAT2:humidity],0);;\
   set_Reading('MONITORgarten','OK',1);;\
   set_Exec('timerOATgarten',700,'set_Reading("MONITORgarten","FAIL",1)');;\
   \
   set_Reading('tempAvg',AVG([?TF_OAT:temperature],[?$SELF:MONITORhinten],[?TF_OAT2:temperature],[?$SELF:MONITORgarten]),1);;\
   set_Reading('humAvg',AVG([?TF_OAT:humidity],[?$SELF:MONITORhinten],[?TF_OAT2:humidity],[?$SELF:MONITORgarten]),1);;\
    }  \
\
     {[LuxSensorHM:"LuxLog"];;\
       set_Reading('LUXlog',[LuxSensorHM:LuxLog],1);;\
    }  \
\
}\
\

attr di_ClimateMaster DOIF_Readings TempTrendOAT:(sprintf("%.3f",[$SELF:TrendOATraw] * 60 *60))
attr di_ClimateMaster comment Temperature und humidity sind median5 von tempAvg bzw humAvg (Durchschnitt von Garten und hinten)
attr di_ClimateMaster event_Readings temperature:([$SELF:tempAvg:med5]),\
humidity:([$SELF:humAvg:med5])
attr di_ClimateMaster room Wetter
attr di_ClimateMaster stateFormat temperature °C @ humidity %rel
attr di_ClimateMaster userReadings TrendOATraw:tempAvg.* differential {ReadingsVal("$name","tempAvg",0);;}


das Logfile:

defmod FileLog_ClimateMaster FileLog ./log/ClimateMaster-%Y-%m.log di_ClimateMaster
attr FileLog_ClimateMaster room Wetter


und das weitere DOIF, das erfolgreich getriggert wird:

defmod OATmaster DOIF ##{\
##     if([":tempAvg"]){\
##       set_Reading('tmpAvg',[di_ClimateMaster:tempAvg],1);;\
##    }  \
##\
##}
attr OATmaster event_Readings temperature:[di_ClimateMaster:tempAvg:med5],\
humidity:[di_ClimateMaster:humAvg:med5]
attr OATmaster room Aussen
attr OATmaster stateFormat temperature °C


Es scheint, als wollten sich die event_Readings nicht von internen Readings korrekt triggern lassen, obwohl die auslösenden Readings bei updates einen roten Timestamp bekommen und im Event-Monitor auftauchen.
Es macht auch keinen Unterschied, ob ich den DOIF-Namen oder $SELF nutze.

Im Moment lebe ich mit der Lösung dem 2ten DOIF, damit bekomme ich meine Logs respektive Diagramme. Ich hätte aber gedacht, dass es so auch funktionieren müsste.

Wer findet den Fehler ;-)

Gruß

Sany
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Damian

Bei mit funktioniert auch diese Kombination aus set_Reading und event_Readings, auch Events von test und test2 erscheinen sauber im Event-Log.

ZitatDEF        {set_Reading("test",[FS:state],1)}
   MODEL      Perl
   NAME       di_testcmd
   NR         640
   NTFY_ORDER 50-di_testcmd
   STATE      cmd_1
   TYPE       DOIF
   VERSION    19302 2019-05-01 08:28:34
   READINGS:
    2019-06-02 18:04:36   Device          FS
     2019-06-02 18:04:36   block_01        executed
     2019-06-02 18:04:36   e_FS_state      off
     2019-06-02 18:03:13   mode            enabled
     2019-05-14 22:56:47   state           cmd_1
     2019-06-02 18:04:36   test            off
     2019-06-02 18:04:36   test2           off
   Regex:
     accu:
     event_Readings:
       di_testcmd:
         test2:
           test       ^di_testcmd$:^test:
   condition:
     0          set_Reading("test",::ReadingValDoIf($hash,'FS','state'),1)
   devices:
     0           FS
     all         FS
   event_Readings:
     test2       ::ReadingValDoIf($hash,'di_testcmd','test')
   helper:
     event      test: off
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev di_testcmd
     triggerEvents:
       test: off
       test2: off
     triggerEventsState:
       test: off
       test2: off
   internals:
   itimer:
   perlblock:
     0         
   readings:
     0           FS:state
     all         FS:state
   trigger:
   uiState:
   uiTable:
Attributes:
   event_Readings test2: [$SELF:test]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sany

Hallo Damian,

das ist ja das rätselhafte: die Events erscheinen im Event-Monitor (sei es nun im DOIF aufgerufen oder links aus dem Menü), aber sie werden nicht in das Logfile geschrieben und auch "dewpoint" triggert nicht darauf. Ich habe zum testen noch den LuxLog-Wert zu den event_Readings dazugebastelt: selber Effekt.
Wenn ich per Telnet inform timer meinem fhem zusehe kommen die Ergebnisse der event_Readings auch.

Und wenn Du ein FileLog anlegst mit deinem Testdevice:

defmod FileLog_di_testcmd FileLog ./log/di_testcmd-%Y-%m.log di_testcmd

wird da dann alles richtig geschrieben?


Im Moment behelfe ich mir mit dem 2ten DOIF, werde die nächsten Tage aber noch weiter probieren, auch noch mal ein anderes Test-DOIF anlegen.

Viele Grüße

Sany
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Damian

ja, bei mir wird test2 auch nicht geloggt.

DOIF erzeugt ja mit set_Reading ein Event, auf welches es selbst wieder reagiert und das zweite Reading test2 mit Event setzt.

Es werden dabei Standard-FHEM-Mechanismen genutzt (readingsBulkUpdate). Den Fall werde ich wohl im Developer-Board schildern müssen, das ist etwas für Rudi.

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

Sany

Danke für die Antwort. Da brauch ich ja erst mal nicht weiterzusuchen.

Schönen Abend!

Sany
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Damian

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