Hallo Forum,
nachdem statistics nicht das gemacht hat was ich wollte, bastel ich mir gerade eine Funktion zur Auswertung von Temperatur- und Verbrauchsverläufen. Die Berechnungen an sich funktionieren auch und sind in (mehreren) readings am jeweiligen Gerät zu finden. Dank des Codeschnippsels für die (zeitlich gewichtete)Mittlewertberechnung war das auch kein großes Problem.
Mein Ziel ist es, die ständigen Berechnungen ohne Event auszuführen, zu jeder Stunde (sowie Tag und Monat) aber immer das Reading mit Event zu setzen und somit ins Log aufzunehmen. Leider wird aber kein Event generiert, egal ob ich die Reading am Device per Bulk, readingsSingleUpdate, oder setreading aktualisiere.
Der Aufruf der kleinen Perl Funktion erfolgt über ein at (und darin alignTime mit 59:59:50) kurz vor jeder vollen Stunde und die wird auch gestartet und die Readings aktualisiert. Ein Event bleibt aber aus...
Der Code der Funktion an sich:
sub updateWerte_hour($)
{
# Loglevel für diese Funktion festlegen ab der Ausgaben ins (FHEM) Log erfolgen sollen
my $log_level = 1;
# Device bestimmen von dem der Funktionsaufruf ausgelöst wurde (=1. Übergabeparameter)
my ($aufrufendes_device) = @_;
# zugehörigen Hash des Devices bestimmen um auf dessen readings zugreifen zu können
my ($aufrufendes_device_hash) = $defs{$aufrufendes_device};
# Statusmeldung ins FHEM Log
Log3 ($aufrufendes_device, $log_level, "Update der ausgewerteten Temperaturwerte an Gerät $aufrufendes_device durchführen");
# bisher gespeicherte Temperaturwerte auslesen, bei Fehler wird ein default Wert angenommen
my ($min_temp_hour) = ReadingsNum($aufrufendes_device, "min_temp_hour", "100.0");
my ($max_temp_hour) = ReadingsNum($aufrufendes_device, "max_temp_hour", "-100.0");
my ($avg_temp_hour) = ReadingsNum($aufrufendes_device, "avg_temp_hour", "0.0");
my ($measured_temp) = ReadingsNum($aufrufendes_device, "measured-temp", "20.0");
readingsBeginUpdate($aufrufendes_device_hash);
my ($rv) = readingsBulkUpdate ($aufrufendes_device_hash, "min_temp_hour", $min_temp_hour, 1);
$rv = readingsBulkUpdate ($aufrufendes_device_hash, "max_temp_hour", $max_temp_hour, 1);
$rv = readingsBulkUpdate ($aufrufendes_device_hash, "avg_temp_hour", $avg_temp_hour, 1);
readingsEndUpdate($aufrufendes_device_hash, 1);
Log3 ($aufrufendes_device, $log_level, "Werte über Bulk war eben");
$rv = readingsSingleUpdate ($aufrufendes_device_hash, "min_temp_hour", $min_temp_hour, 1);
$rv = readingsSingleUpdate ($aufrufendes_device_hash, "max_temp_hour", $max_temp_hour, 1);
$rv = readingsSingleUpdate ($aufrufendes_device_hash, "avg_temp_hour", $avg_temp_hour, 1);
Log3 ($aufrufendes_device, $log_level, "Werte über Single war eben");
{fhem "setreading $aufrufendes_device min_temp_hour $min_temp_hour"};
{fhem "setreading $aufrufendes_device max_temp_hour $max_temp_hour"};
{fhem "setreading $aufrufendes_device avg_temp_hour $avg_temp_hour"};
Log3 ($aufrufendes_device, $log_level, "Werte über FHEM war eben");
# Statusmeldung ins FHEM Log
Log3 ($aufrufendes_device, $log_level, "Werte von $aufrufendes_device für Stundenwerte belegt, min=$min_temp_hour; max=$max_temp_hour; avg=$avg_temp_hour");
#zurücksetzen
readingsBeginUpdate($aufrufendes_device_hash);
$rv = readingsBulkUpdate ($aufrufendes_device_hash, "min_temp_hour", $measured_temp, 0);
$rv = readingsBulkUpdate ($aufrufendes_device_hash, "max_temp_hour", $measured_temp, 0);
readingsEndUpdate($aufrufendes_device_hash, 0);
# Statusmeldung ins FHEM Log
Log3 ($aufrufendes_device, $log_level, "Werte von $aufrufendes_device wurden auf aktuellen Wert $measured_temp zurückgesetzt für neuen Durchlauf");
}
Die Readings der min,- max und avg Stundenwerte werden brav (hier um 13:59:50) gesetzt, das zugehörige Device:
define OG_Arbeitszimmer_Heizung_ CUL_HM 3367AD
attr OG_Arbeitszimmer_Heizung_ .mId 0095
attr OG_Arbeitszimmer_Heizung_ IOgrp VCCU:Virtual_HmUART_DG
attr OG_Arbeitszimmer_Heizung_ actCycle 000:15
attr OG_Arbeitszimmer_Heizung_ actStatus alive
attr OG_Arbeitszimmer_Heizung_ autoReadReg 4_reqStatus
attr OG_Arbeitszimmer_Heizung_ commStInCh off
attr OG_Arbeitszimmer_Heizung_ event-on-change-reading battery,batteryLevel,desired-temp,measured-temp,motorErr,state,min_.*,max_.*,avg_.*
attr OG_Arbeitszimmer_Heizung_ expert defReg,allReg,rawReg
attr OG_Arbeitszimmer_Heizung_ firmware 1.5
attr OG_Arbeitszimmer_Heizung_ group Heizung,OG
attr OG_Arbeitszimmer_Heizung_ icon sani_heating
attr OG_Arbeitszimmer_Heizung_ model HM-CC-RT-DN
attr OG_Arbeitszimmer_Heizung_ room Arbeitszimmer
attr OG_Arbeitszimmer_Heizung_ serialNr LEQ1333139
attr OG_Arbeitszimmer_Heizung_ subType thermostat
attr OG_Arbeitszimmer_Heizung_ webCmd getConfig:clear msgEvents:burstXmit
# DEF 3367AD
# FUUID 64bbea45-f33f-a38a-5d22-8bc46c117266420f
# IODev Virtual_HmUART_DG
# LASTInputDev Virtual_HmUART_rack
# MSGCNT 8781
# NAME OG_Arbeitszimmer_Heizung_
# NR 198
# NTFY_ORDER 48-OG_Arbeitszimmer_Heizung_
# STATE CMDs_done
# TYPE CUL_HM
# Virtual_HmUART_DG_MSGCNT 4375
# Virtual_HmUART_DG_RAWMSG 05000038B686103367AD0000000AA0DE0E0040
# Virtual_HmUART_DG_RSSI -56
# Virtual_HmUART_DG_TIME 2023-11-26 14:03:59
# Virtual_HmUART_rack_MSGCNT 4406
# Virtual_HmUART_rack_RAWMSG 05000034B686103367AD0000000AA0DE0E0040
# Virtual_HmUART_rack_RSSI -52
# Virtual_HmUART_rack_TIME 2023-11-26 14:03:59
# channel_01 OG_Arbeitszimmer_Heizung__Weather
# channel_02 OG_Arbeitszimmer_Heizung__Climate
# channel_03 OG_Arbeitszimmer_Heizung__WindowRec
# channel_04 OG_Arbeitszimmer_Heizung__Clima
# channel_05 OG_Arbeitszimmer_Heizung__ClimaTeam
# channel_06 OG_Arbeitszimmer_Heizung__remote
# disableNotifyFn 1
# eventCount 1033
# lastMsg No:B6 - t:10 s:3367AD d:000000 0AA0DE0E0040
# protCondBurst forced_off
# protLastRcv 2023-11-26 14:03:59
# protRcv 4408 last_at:2023-11-26 14:03:59
# protSnd 20 last_at:2023-11-25 15:23:03
# protSndB 4 last_at:2023-11-19 17:46:20
# protState CMDs_done
# rssi_Virtual_HmUART_DG cnt:8 min:-60 max:-56 avg:-58.37 lst:-60
# rssi_at_Virtual_HmUART_DG cnt:4375 min:-69 max:-43 avg:-49.59 lst:-56
# rssi_at_Virtual_HmUART_rack cnt:4406 min:-58 max:-50 avg:-53.37 lst:-52
# OLDREADINGS:
# READINGS:
# 2023-11-18 19:40:44 Activity alive
# 2023-11-19 17:46:21 CommandAccepted yes
# 2023-07-22 16:51:06 D-firmware 1.5
# 2023-07-22 16:51:06 D-serialNr LEQ1333139
# 2023-11-25 15:23:03 IODev Virtual_HmUART_DG
# 2023-07-26 09:01:19 PairedTo 0xFDABCD
# 2023-07-22 16:53:44 R-backOnTime 10 s
# 2023-07-22 16:53:44 R-btnLock off
# 2023-07-22 16:53:44 R-burstRx on
# 2023-07-22 16:53:44 R-cyclicInfoMsg on
# 2023-07-22 16:53:44 R-cyclicInfoMsgDis 0
# 2023-07-22 16:53:44 R-globalBtnLock off
# 2023-07-22 16:53:44 R-localResDis off
# 2023-07-22 16:53:44 R-lowBatLimitRT 2.1 V
# 2023-07-22 16:53:44 R-modusBtnLock off
# 2023-07-22 16:53:44 R-pairCentral 0xFDABCD
# 2023-07-26 09:01:19 RegL_00. 00:00 01:01 02:01 09:01 0A:FD 0B:AB 0C:CD 0E:0A 0F:00 11:00 12:15 16:00 18:00 19:00 1A:00
# 2023-07-26 10:42:36 RegL_07.
# 2023-11-26 14:03:59 actuator 0
# 2023-11-26 13:59:50 avg_temp_hour 21.7
# 2023-11-26 14:03:59 battery ok
# 2023-11-26 14:03:59 batteryLevel 2.9
# 2023-08-19 11:39:33 cfgState ok
# 2023-11-25 15:23:03 commState CMDs_done
# 2023-11-26 14:03:59 desired-temp 20.0
# 2023-11-26 06:01:59 max_temp_day 22.2
# 2023-11-26 13:59:50 max_temp_hour 22.2
# 2023-11-26 06:01:59 max_temp_month 22.2
# 2023-11-26 14:03:59 measured-temp 22.2
# 2023-11-26 04:49:08 min_temp_day 19.1
# 2023-11-26 13:59:50 min_temp_hour 22.2
# 2023-11-26 04:49:08 min_temp_month 19.1
# 2023-11-26 14:03:59 motorErr ok
# 2023-07-26 08:56:16 powerOn 2023-07-26 08:56:16
# 2023-07-26 08:56:16 recentStateType info
# 2023-11-25 15:23:03 state CMDs_done
# 2023-11-25 15:23:03 time-request -
# helper:
# HM_CMDNR 182
# _98_statistics myStatDevice
# cSnd 11FDABCD3367AD860428,11FDABCD3367AD860428
# lastMsgTm 1701003839.2865
# mId 0095
# peerFriend -
# peerOpt -:thermostat
# regLst 0
# rxType 140
# supp_Pair_Rep 0
# cmds:
# TmplKey :no:1700332244.90095
# TmplTs 1700332244.90095
# cmdKey 0:1:0::OG_Arbeitszimmer_Heizung_:0095:01:
# cmdLst:
# assignHmKey noArg
# burstXmit noArg
# clear [({msgErrors}|msgEvents|rssi|attack|trigger|register|oldRegs|readings|all)]
# deviceRename -newName-
# fwUpdate -filename- [-bootTime-]
# getConfig noArg
# getDevInfo noArg
# getRegRaw (List0|List1|List2|List3|List4|List5|List6|List7) [-peerChn-]
# inhibit [(on|{off})]
# raw -data- [...]
# regBulk -list-.-peerChn- -addr1:data1- [-addr2:data2-]...
# regSet [(prep|{exec})] -regName- -value- [-peerChn-]
# reset noArg
# sysTime noArg
# tplDel -tplDel-
# tplSet_0 -tplChan-
# unpair noArg
# lst:
# condition slider,0,1,255
# peer
# peerOpt
# tplChan
# tplDel
# tplPeer
# rtrvLst:
# cmdList [({short}|long)]
# deviceInfo [({short}|long)]
# list [({normal}|full)]
# param -param-
# reg -addr- -list- [-peerChn-]
# regList noArg
# regTable noArg
# regVal -addr- -list- [-peerChn-]
# saveConfig [-filename-]
# tplInfo noArg
# expert:
# def 1
# det 1
# raw 1
# tpl 0
# io:
# flgs 0
# newChn +3367AD,00,01,00
# nextSend 1701003839.38201
# rxt 2
# vccu VCCU
# p:
# 3367AD
# 00
# 01
# 00
# prefIO:
# Virtual_HmUART_DG
# mRssi:
# mNo B6
# io:
# Virtual_HmUART_DG:
# -50
# -50
# Virtual_HmUART_rack:
# -52
# -52
# peerIDsH:
# prt:
# awake 0
# bErr 0
# brstWu 1
# sProc 0
# rspWait:
# q:
# qReqConf
# qReqStat
# role:
# dev 1
# prs 1
# rssi:
# Virtual_HmUART_DG:
# avg -58.375
# cnt 8
# lst -60
# max -56
# min -60
# at_Virtual_HmUART_DG:
# avg -49.5945142857142
# cnt 4375
# lst -56
# max -43
# min -69
# at_Virtual_HmUART_rack:
# avg -53.3722197004084
# cnt 4406
# lst -52
# max -50
# min -58
# shRegW:
# 07 04
# shadowReg:
# tmpl:
#
setstate OG_Arbeitszimmer_Heizung_ CMDs_done
setstate OG_Arbeitszimmer_Heizung_ 2023-07-22 16:51:06 .D-devInfo 00FFFF
setstate OG_Arbeitszimmer_Heizung_ 2023-07-22 16:51:06 .D-stc 59
setstate OG_Arbeitszimmer_Heizung_ 2023-11-18 19:30:44 .associatedWith OG_Arbeitszimmer_Heizung_,OG_Arbeitszimmer_Heizung__Clima,OG_Arbeitszimmer_Heizung__ClimaTeam,OG_Arbeitszimmer_Heizung__Climate,OG_Arbeitszimmer_Heizung__Weather,OG_Arbeitszimmer_Heizung__WindowRec,OG_Arbeitszimmer_Heizung__remote,OG_Arbeitszimmer_Heizung_
setstate OG_Arbeitszimmer_Heizung_ 2023-11-26 14:03:59 .protLastRcv 20231126140359
setstate OG_Arbeitszimmer_Heizung_ 2023-11-18 19:40:44 Activity alive
setstate OG_Arbeitszimmer_Heizung_ 2023-11-19 17:46:21 CommandAccepted yes
setstate OG_Arbeitszimmer_Heizung_ 2023-07-22 16:51:06 D-firmware 1.5
setstate OG_Arbeitszimmer_Heizung_ 2023-07-22 16:51:06 D-serialNr LEQ1333139
setstate OG_Arbeitszimmer_Heizung_ 2023-11-25 15:23:03 IODev Virtual_HmUART_DG
setstate OG_Arbeitszimmer_Heizung_ 2023-07-26 09:01:19 PairedTo 0xFDABCD
setstate OG_Arbeitszimmer_Heizung_ 2023-07-22 16:53:44 R-backOnTime 10 s
setstate OG_Arbeitszimmer_Heizung_ 2023-07-22 16:53:44 R-btnLock off
setstate OG_Arbeitszimmer_Heizung_ 2023-07-22 16:53:44 R-burstRx on
setstate OG_Arbeitszimmer_Heizung_ 2023-07-22 16:53:44 R-cyclicInfoMsg on
setstate OG_Arbeitszimmer_Heizung_ 2023-07-22 16:53:44 R-cyclicInfoMsgDis 0
setstate OG_Arbeitszimmer_Heizung_ 2023-07-22 16:53:44 R-globalBtnLock off
setstate OG_Arbeitszimmer_Heizung_ 2023-07-22 16:53:44 R-localResDis off
setstate OG_Arbeitszimmer_Heizung_ 2023-07-22 16:53:44 R-lowBatLimitRT 2.1 V
setstate OG_Arbeitszimmer_Heizung_ 2023-07-22 16:53:44 R-modusBtnLock off
setstate OG_Arbeitszimmer_Heizung_ 2023-07-22 16:53:44 R-pairCentral 0xFDABCD
setstate OG_Arbeitszimmer_Heizung_ 2023-07-26 09:01:19 RegL_00. 00:00 01:01 02:01 09:01 0A:FD 0B:AB 0C:CD 0E:0A 0F:00 11:00 12:15 16:00 18:00 19:00 1A:00
setstate OG_Arbeitszimmer_Heizung_ 2023-07-26 10:42:36 RegL_07.
setstate OG_Arbeitszimmer_Heizung_ 2023-11-26 14:03:59 actuator 0
setstate OG_Arbeitszimmer_Heizung_ 2023-11-26 13:59:50 avg_temp_hour 21.7
setstate OG_Arbeitszimmer_Heizung_ 2023-11-26 14:03:59 battery ok
setstate OG_Arbeitszimmer_Heizung_ 2023-11-26 14:03:59 batteryLevel 2.9
setstate OG_Arbeitszimmer_Heizung_ 2023-08-19 11:39:33 cfgState ok
setstate OG_Arbeitszimmer_Heizung_ 2023-11-25 15:23:03 commState CMDs_done
setstate OG_Arbeitszimmer_Heizung_ 2023-11-26 14:03:59 desired-temp 20.0
setstate OG_Arbeitszimmer_Heizung_ 2023-11-26 06:01:59 max_temp_day 22.2
setstate OG_Arbeitszimmer_Heizung_ 2023-11-26 13:59:50 max_temp_hour 22.2
setstate OG_Arbeitszimmer_Heizung_ 2023-11-26 06:01:59 max_temp_month 22.2
setstate OG_Arbeitszimmer_Heizung_ 2023-11-26 14:03:59 measured-temp 22.2
setstate OG_Arbeitszimmer_Heizung_ 2023-11-26 04:49:08 min_temp_day 19.1
setstate OG_Arbeitszimmer_Heizung_ 2023-11-26 13:59:50 min_temp_hour 22.2
setstate OG_Arbeitszimmer_Heizung_ 2023-11-26 04:49:08 min_temp_month 19.1
setstate OG_Arbeitszimmer_Heizung_ 2023-11-26 14:03:59 motorErr ok
setstate OG_Arbeitszimmer_Heizung_ 2023-07-26 08:56:16 powerOn 2023-07-26 08:56:16
setstate OG_Arbeitszimmer_Heizung_ 2023-07-26 08:56:16 recentStateType info
setstate OG_Arbeitszimmer_Heizung_ 2023-11-25 15:23:03 state CMDs_done
setstate OG_Arbeitszimmer_Heizung_ 2023-11-25 15:23:03 time-request -
Aber weder im Event Monitor
Events (Filter: .*Arbeitszimmer.*) FHEM log
2023-11-26 13:05:47 CUL_HM OG_Arbeitszimmer_Heizung_ measured-temp: 21.5
2023-11-26 13:05:47 CUL_HM OG_Arbeitszimmer_Heizung_ min_temp_hour: 21.5
2023-11-26 13:07:48 CUL_HM OG_Arbeitszimmer_Heizung__Clima ValvePosition: 7
2023-11-26 13:10:39 CUL_HM OG_Arbeitszimmer_Heizung__Clima ValvePosition: 8
2023-11-26 13:15:37 CUL_HM OG_Arbeitszimmer_Heizung_ measured-temp: 21.4
2023-11-26 13:15:37 CUL_HM OG_Arbeitszimmer_Heizung_ min_temp_hour: 21.4
2023-11-26 13:15:37 CUL_HM OG_Arbeitszimmer_Heizung_ avg_temp_hour: 21.6
2023-11-26 13:17:45 CUL_HM OG_Arbeitszimmer_Heizung__Clima ValvePosition: 9
2023-11-26 13:20:42 CUL_HM OG_Arbeitszimmer_Heizung__Clima ValvePosition: 11
2023-11-26 13:28:07 CUL_HM OG_Arbeitszimmer_Heizung_ measured-temp: 21.5
2023-11-26 13:31:11 CUL_HM OG_Arbeitszimmer_Heizung_ measured-temp: 21.6
2023-11-26 13:34:00 CUL_HM OG_Arbeitszimmer_Heizung__Clima ValvePosition: 10
2023-11-26 13:36:34 CUL_HM OG_Arbeitszimmer_Heizung_ measured-temp: 21.7
2023-11-26 13:36:34 CUL_HM OG_Arbeitszimmer_Heizung_ max_temp_hour: 21.7
2023-11-26 13:36:34 CUL_HM OG_Arbeitszimmer_Heizung_ avg_temp_hour: 21.5
2023-11-26 13:36:34 CUL_HM OG_Arbeitszimmer_Heizung__Clima ValvePosition: 9
2023-11-26 13:38:54 CUL_HM OG_Arbeitszimmer_Heizung_ measured-temp: 21.8
2023-11-26 13:38:54 CUL_HM OG_Arbeitszimmer_Heizung_ max_temp_hour: 21.8
2023-11-26 13:38:54 CUL_HM OG_Arbeitszimmer_Heizung_ avg_temp_hour: 21.6
2023-11-26 13:43:55 CUL_HM OG_Arbeitszimmer_Heizung_ measured-temp: 21.9
2023-11-26 13:43:55 CUL_HM OG_Arbeitszimmer_Heizung_ max_temp_hour: 21.9
2023-11-26 13:43:55 CUL_HM OG_Arbeitszimmer_Heizung__Clima ValvePosition: 7
2023-11-26 13:46:36 CUL_HM OG_Arbeitszimmer_Heizung_ measured-temp: 22.0
2023-11-26 13:46:36 CUL_HM OG_Arbeitszimmer_Heizung_ max_temp_hour: 22.0
2023-11-26 13:46:36 CUL_HM OG_Arbeitszimmer_Heizung__Clima ValvePosition: 4
2023-11-26 13:49:03 CUL_HM OG_Arbeitszimmer_Heizung_ measured-temp: 22.1
2023-11-26 13:49:03 CUL_HM OG_Arbeitszimmer_Heizung_ max_temp_hour: 22.1
2023-11-26 13:49:03 CUL_HM OG_Arbeitszimmer_Heizung__Clima ValvePosition: 3
2023-11-26 13:51:15 CUL_HM OG_Arbeitszimmer_Heizung__Clima ValvePosition: 1
2023-11-26 13:59:37 CUL_HM OG_Arbeitszimmer_Heizung_ measured-temp: 22.2
2023-11-26 13:59:37 CUL_HM OG_Arbeitszimmer_Heizung_ max_temp_hour: 22.2
2023-11-26 13:59:37 CUL_HM OG_Arbeitszimmer_Heizung_ avg_temp_hour: 21.7
2023-11-26 14:03:59 CUL_HM OG_Arbeitszimmer_Heizung__Clima ValvePosition: 0
noch im FHEM log
2023.11.26 13:05:47 3: Heizung_auswerten return value: 1
2023.11.26 13:15:37 3: Heizung_auswerten return value: 1
2023.11.26 13:28:07 3: Heizung_auswerten return value: 1
2023.11.26 13:30:44 3: HMinfo hm get:update :
2023.11.26 13:30:44 3: CUL_HM set ActionDetector update noArg
2023.11.26 13:30:44 3: CUL_HM set VCCU update noArg
2023.11.26 13:31:11 3: Heizung_auswerten return value: 1
2023.11.26 13:36:34 3: Heizung_auswerten return value: 1
2023.11.26 13:38:54 3: Heizung_auswerten return value: 1
2023.11.26 13:43:55 3: Heizung_auswerten return value: 1
2023.11.26 13:46:36 3: Heizung_auswerten return value: 1
2023.11.26 13:49:03 3: Heizung_auswerten return value: 1
2023.11.26 13:59:37 3: Heizung_auswerten return value: 1
2023.11.26 13:59:50 1: Update der ausgewerteten Temperaturwerte an Gerät OG_Arbeitszimmer_Heizung_ durchführen
2023.11.26 13:59:50 1: Werte über Bulk war eben
2023.11.26 13:59:50 1: Werte über Single war eben
2023.11.26 13:59:50 1: Werte über FHEM war eben
2023.11.26 13:59:50 1: Werte von OG_Arbeitszimmer_Heizung_ für Stundenwerte belegt, min=21.4; max=22.2; avg=21.7
2023.11.26 13:59:50 1: Werte von OG_Arbeitszimmer_Heizung_ wurden auf aktuellen Wert 22.2 zurückgesetzt für neuen Durchlauf
Und auch im Filelog nicht
define FileLog_OG_Arbeitszimmer_Heizung_ FileLog ./log/OG_Arbeitszimmer_Heizung_-%Y-%m.log OG_Arbeitszimmer_Heizung_:.*|OG_Arbeitszimmer_Heizung__Clima:.*
attr FileLog_OG_Arbeitszimmer_Heizung_ logtype text
attr FileLog_OG_Arbeitszimmer_Heizung_ nrarchive 3
attr FileLog_OG_Arbeitszimmer_Heizung_ room Arbeitszimmer
# DEF ./log/OG_Arbeitszimmer_Heizung_-%Y-%m.log OG_Arbeitszimmer_Heizung_:.*|OG_Arbeitszimmer_Heizung__Clima:.*
# FD 8
# FUUID 64bbea45-f33f-a38a-496b-e53bd9af32ba76d7
# NAME FileLog_OG_Arbeitszimmer_Heizung_
# NOTIFYDEV OG_Arbeitszimmer_Heizung__Clima,OG_Arbeitszimmer_Heizung_
# NR 199
# NTFY_ORDER 50-FileLog_OG_Arbeitszimmer_Heizung_
# REGEXP OG_Arbeitszimmer_Heizung_:.*|OG_Arbeitszimmer_Heizung__Clima:.*
# STATE active
# TYPE FileLog
# currentlogfile ./log/OG_Arbeitszimmer_Heizung_-2023-11.log
# logfile ./log/OG_Arbeitszimmer_Heizung_-%Y-%m.log
# READINGS:
# 2023-11-26 14:03:59 linesInTheFile 10616
#
setstate FileLog_OG_Arbeitszimmer_Heizung_ active
setstate FileLog_OG_Arbeitszimmer_Heizung_ 2023-11-26 14:03:59 linesInTheFile 10616
Das event on change lässt min, max und avg durch, das Filog hört auf alles (.*) was an Events ansteht. Bin ratlos warum kein Event generiert wird... Werde in 1 Stunde mal das event on change am Device löschen und bis 16Uhr warten um das noch als Fehlerquelle ausschließen zu können.
Freue mich aber über jeden Tipp, wie ich ein event ausgelöst bekomme, bzw. warum es unterdrückt wird.
Wenn das setreading wirklich ausgeführt wird, sollte auch ein event erzeugt werden.
Falls das nicht passiert, liegt das an dem device, in dem das reading gesetzt werden soll.
Also musst Du dort suchen.
In Deinem Code sind übrigens viel zu viele geschweifte Klammern, die da nicht hingehören:
{fhem "setreading $aufrufendes_device min_temp_hour $min_temp_hour"};
{fhem "setreading $aufrufendes_device max_temp_hour $max_temp_hour"};
{fhem "setreading $aufrufendes_device avg_temp_hour $avg_temp_hour"};
Die geschweiften Klammern in diesem Teil sind komplett überflüssig (um nicht zu sagen: falsch).
Zitat von: betateilchen am 26 November 2023, 15:18:53Die geschweiften Klammern in diesem Teil sind komplett überflüssig (um nicht zu sagen: falsch).
Da hast du völlig Recht und habe ich entfernt. Es bringt nichts Perl zu sagen, dass eigentlich FHEM was an Perl übergeben möchte...
Wie auch immer: auch die Perl Befehle davor müssten ein Event erzeugen (wenn ich die Doku und "1" am Ende richtig verstehe).
Zitat von: betateilchen am 26 November 2023, 15:18:53Falls das nicht passiert, liegt das an dem device, in dem das reading gesetzt werden soll.
Also musst Du dort suchen.
Nur wie? Das ist ein einfaches Heizkörperthermostat. Und außer der Einschränkugn auf bestimtem Events ist das nichts spezielles (die jetzt raus sind, 16Uhr mal abwarten)..
Grundsätzlich kann man die Funktionen um readingsUpdate() zwar als user einsetzen, sie sind aber eher für Modulentwickler gedacht. In der 99_myUtils.pm oder an anderen code-Stellen würde ich immer mit setreading arbeiten.
Du kannst doch Deine Funktion mit einem beliebigen device testen.
Lege doch einfach mal einen dummy an "define d1 dummy" und rufe dann die Funktion mit d1 auf.
Noch ein Tipp, der nix mit Deinem Problem zu tun hat: anstatt Deiner variablen "$log_level" und dem Aufruf von Log3(...) könntest Du auch einfach mit Debug(auszugebender Text) arbeiten, das loggt automatisch im Loglevel 1 und ist für solche Testszwecke einfacher zu verwenden.
Anbei ein Mitschnitt aus dem Event Monitor inkl. FHEM Log.
Events (Filter: .*Arbeitszimmer.*) FHEM log
2023-11-26 15:59:38 CUL_HM OG_Arbeitszimmer_Heizung actuator: 1
2023-11-26 15:59:38 CUL_HM OG_Arbeitszimmer_Heizung battery: ok
2023-11-26 15:59:38 CUL_HM OG_Arbeitszimmer_Heizung batteryLevel: 2.9
2023-11-26 15:59:38 CUL_HM OG_Arbeitszimmer_Heizung desired-temp: 20.0
2023-11-26 15:59:38 CUL_HM OG_Arbeitszimmer_Heizung measured-temp: 21.9
2023-11-26 15:59:38 CUL_HM OG_Arbeitszimmer_Heizung motorErr: ok
2023-11-26 15:59:38 CUL_HM OG_Arbeitszimmer_Heizung avg_temp_hour: 21.7
2023.11.26 15:59:50 1: Update der ausgewerteten Temperaturwerte an Gerät OG_Arbeitszimmer_Heizung durchführen
2023.11.26 15:59:50 1: Werte über Bulk war eben
2023.11.26 15:59:50 1: Werte über Single war eben
2023.11.26 15:59:50 1: Werte über FHEM war eben
2023.11.26 15:59:50 1: Werte von OG_Arbeitszimmer_Heizung für Stundenwerte belegt, min=21.4; max=22.0; avg=21.7
2023.11.26 15:59:50 1: Werte von OG_Arbeitszimmer_Heizung wurden auf aktuellen Wert 21.9 zurückgesetzt für neuen Durchlauf
2023-11-26 15:59:50 CUL_HM OG_Arbeitszimmer_Heizung min_temp_hour: 21.4
2023-11-26 15:59:50 CUL_HM OG_Arbeitszimmer_Heizung max_temp_hour: 22.0
2023-11-26 15:59:50 CUL_HM OG_Arbeitszimmer_Heizung avg_temp_hour: 21.7
2023-11-26 15:59:50 CUL_HM OG_Arbeitszimmer_Heizung min_temp_hour: 21.4
2023-11-26 15:59:50 CUL_HM OG_Arbeitszimmer_Heizung max_temp_hour: 22.0
2023-11-26 15:59:50 CUL_HM OG_Arbeitszimmer_Heizung avg_temp_hour: 21.7
2023-11-26 15:59:50 CUL_HM OG_Arbeitszimmer_Heizung min_temp_hour: 21.4
2023-11-26 15:59:50 CUL_HM OG_Arbeitszimmer_Heizung max_temp_hour: 22.0
2023-11-26 15:59:50 CUL_HM OG_Arbeitszimmer_Heizung avg_temp_hour: 21.7
Warum kommt kein Event am Device an? Ich verstehe es nicht und weiß nicht mehr wo ich suchen soll.
Heute Abend mit dem dummy, brauche erst einmal frische Luft und Gassi Runde im Halb-Hellen :-)
füge mal direkt vor jedem "setreading" cmd ein kurzes fhem-sleep ein.
fhem("sleep 0.1; setreading ...")
Zitat von: frank am 26 November 2023, 16:25:13füge mal direkt vor jedem "setreading" cmd ein kurzes fhem-sleep ein.
fhem("sleep 0.1; setreading ...")
leider keine Besserung
2023-11-26 16:52:52 CUL_HM OG_Arbeitszimmer_Heizung measured-temp: 21.3
2023-11-26 16:52:52 CUL_HM OG_Arbeitszimmer_Heizung min_temp_hour: 21.3
2023-11-26 16:52:52 CUL_HM OG_Arbeitszimmer_Heizung avg_temp_hour: 21.7
2023-11-26 16:55:40 CUL_HM OG_Arbeitszimmer_Heizung ValvePosition: 10
2023-11-26 16:58:12 CUL_HM OG_Arbeitszimmer_Heizung ValvePosition: 11
2023.11.26 16:59:50 1: Update der ausgewerteten Temperaturwerte an Gerät OG_Arbeitszimmer_Heizung durchführen
2023.11.26 16:59:50 1: Werte über Bulk war eben
2023.11.26 16:59:50 1: Werte über Single war eben
2023.11.26 16:59:50 1: Werte über FHEM war eben
2023.11.26 16:59:50 1: Werte von OG_Arbeitszimmer_Heizung mit Notify für Stundenwerte belegt, min=21.3; max=21.9; avg=21.7
2023.11.26 16:59:50 1: Werte von OG_Arbeitszimmer_Heizung wurden auf aktuellen Wert 21.3 zurückgesetzt für neuen Durchlauf
2023-11-26 16:59:50 CUL_HM OG_Arbeitszimmer_Heizung max_temp_hour: 21.9
und was hat der Test mit dem dummy ergeben?
Naja, du führts ja
readingsEndUpdate($aufrufendes_device_hash, 0);
aus. Sagst dem readingsEndUpdate also, dass es keine Event generieren soll. Da brauchst du dich nicht wundern!
$do_trigger
mandatory
Flag, ob entsprechende Events der einzelnen Readings getriggert werden sollen (Wert: 1). Wenn dieses Flag den Wert 0 oder undef besitzt, werden keine Events für alle Readings die seit dem Aufruf von readingsBeginUpdate() mittels readingsBulkUpdate() gesetzt wurden, erzeugt.
lg, Stefan
Keien Ahnung (und davon viel) was da los ist. Hatte das event-on-change-reading im Verdacht, aber da gab es um 17Uhr keine Verbesserung (hatte das komplett gelöscht). Setze ich es nun auf
(min_.*),(max_.*),(avg_.*),battery,batteryLevel,desired-temp,measured-temp,motorErr,state
und gebe auf der Kommandozeile ein setreading ein
setreading OG_Arbeitszimmer_Heizung min_temp_hour 21.1
so kommen die für min, max und avg auch durch und erzeugen wie gewünscht jeweils einen Logeintrag.
Führe ich das at über ein execNow testweise aus, so erhalten die Readings jeweils den aktuellen Zeitstempel im Device.
Habe dann testweise mal hartcoded 80 Grad in die Funktion reingeschrieben (anstatt $max_temp_hour) und siehe da: es gibt ein Event.
Nun fällt es mir auch wie Schuppen von den Augen: event-on-change-reading verhindert das. In der Perl Funktion gehe ich ja hin und lese den aktuellen Wert aus und schreibe ihn unmittelbar danach zurück. Aus FHEM Sicht ist der Wert unverändert, daher unterdrückt event-on-change-reading das zugehörige Event. Wer die Doku zu readingsSingleUpdate liest, sieht es auch: die "1" heißt nicht das ein Event kommt, sondern nur, dass keins unterdrückt wird. Ein nachgelagertes event-on-change-reading unterdrückt ein Event weiterhin, egal was im Perl Code steht.
Also Lösung für mein Problem: readings für die Werte (z.B- Temp_ohne_Log_...) und zusätzlich noch mal die gleichen Readings mit anderem Namen (z.b. Temp_mit_Log...). Die ohne Log werden für die Berechnugn genutzt und nicht in event-on-change-reading aufgenommen und fallen somit durchs Raster und erzeugen keine Events. zu jeder voleln Stunde werden die dann "umkopiert" von Temp_ohne_Log_... auf Temp_mit_Log..., wobei Temp_mit_Log... ins event-on-change-reading kommt. Kompliziert und nervig, aber ist dann so...
Also Thema gelöst, Anwenderfehler :-)
Wenn
Zitat von: Icinger am 26 November 2023, 17:22:20Naja, du führts ja
readingsEndUpdate($aufrufendes_device_hash, 0);
aus.
Ja, an einer Stelle wo ich halt kein Event haben möchte. Davor aber mit 1, also Event seitens Funktion freigegeben :-)
Zitat von: Betonklotz am 26 November 2023, 17:42:14Also Lösung für mein Problem:
Alle diese dämlichen event-on-* Attribute rausschmeissen.
Die sind so unnötig wie Fußpilz und schaffen mehr neue Probleme als sie (vermeintlich) lösen.
Zitat von: betateilchen am 26 November 2023, 18:25:31Alle diese dämlichen event-on-* Attribute rausschmeissen.
Die sind so unnötig wie Fußpilz und schaffen mehr neue Probleme als sie (vermeintlich) lösen.
Taj, würde ich gerne. Problem: einige Devices sind extrem geschwätzig und erzeugen alle x Sekunden Events, obwohl das völliger Schwachsinn ist. Da muss man dann eher das Device austauschen. Oder eben mit den event-on- Dingen arbeiten (und leben und fluchen und auch mal fluchend einen Sonntag verbringen...)