Ich benutze - sehr dankbar für den Aufschlag von Damian - meine Zähler für Strom und PV mit diesem DOIF aus, das ich aus diesem Forum kopiert habe:
Internals:
.AttrList disable:0,1 loglevel:0,1,2,3,4,5,6 notexist checkReadingEvent:0,1 addStateEvent:1,0 weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiState:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading
DEF subs {
## device, reading
push (@{$_counter},["Strom","Zaehlerstand"]); ## Strom-Zähler
push (@{$_counter},["Solar","Zaehlerstand"]); ## Einspeise-Zähler
push (@{$_counter},["PV","etotal"]); ## Solarzähler des PV
sub midnight { ## Diese Funktion wird um Mitternacht ausgeführt
my ($device,$reading,$mday,$yday)=@_;
set_Reading("$device.$reading.day_counter",ReadingsVal($device, $reading,0),1);
set_Reading("$device.$reading.last_day",get_Reading("$device.$reading.day",0));
set_Reading("$device.$reading.day",0);
if ($mday == 1) {
set_Reading("$device.$reading.month_counter",ReadingsVal($device, $reading,0));
set_Reading("$device.$reading.last_month",get_Reading("$device.$reading.month",0));
set_Reading("$device.$reading.month",0);
}
if ($yday == 1) {
set_Reading("$device.$reading.year_counter",ReadingsVal($device, $reading,0));
set_Reading("$device.$reading.last_year",get_Reading("$device.$reading.year",0));
set_Reading("$device.$reading.year",0);
}
}
sub init_readings {
my ($device,$reading)=@_;
if (!get_Reading("$device.$reading.day_counter","")) { ## Initialisierung der Readings
## aktuellen Zählerstand initialisieren
set_Reading ("$device.$reading.day_counter",ReadingsVal($device,$reading,0));
set_Reading ("$device.$reading.month_counter",ReadingsVal($device,$reading,0));
set_Reading ("$device.$reading.year_counter",ReadingsVal($device,$reading,0));
set_Reading ("$device.$reading.day",0); ## aktueller Tagesverbrauch
set_Reading ("$device.$reading.month",0); ## aktueller Monatsverbrauch
set_Reading ("$device.$reading.year",0); ## aktueller Jahresverbrauch
set_Reading ("$device.$reading.last_day",0); ## Verbrauch des letzten Tages
set_Reading ("$device.$reading.last_month",0); ## Verbrauch des letzten Monats
set_Reading ("$device.$reading.last_year",0); ## Verbrauch des letzten Jahres
}
}
} ## Ende subs-Block
mid {[23:59:59]; ## Sicherung der Daten um Mitternacht
for (my $i=0;$i<@{$_counter};$i++) {
midnight($_counter[$i][0],$_counter[$i][1],$mday,$yday); ## Für jeden Zähler wird die Funktion midnight aufgerufen
}
}
init { ## initialisierung aller Readings
for (my $i=0;$i<@{$_counter};$i++) { ## Für jeden Zähler werden Readings über die Funktion init_readings initialisiert
init_readings($_counter[$i][0],$_counter[$i][1]);
}
}
DEF TPL_stat (
day_count_$1_$2 { ## bei einem Event des Zählers, wird der tägliche, monatliche und jährliche Verbrauch im jeweiligen Reading festgehalten
## $1 Zählerdevice, $2 Zählerreading
set_Reading ("$1.$2.day",int(([$1:$2,0]-get_Reading("$1.$2.day_counter",1))*1000)/1000);
set_Reading ("$1.$2.month",int(([$1:$2,0]-get_Reading("$1.$2.month_counter",0))*1000)/1000);
set_Reading ("$1.$2.year",int(([$1:$2,0]-get_Reading("$1.$2.year_counter",0))*1000)/1000);
}
)
## Pro Zähler wird über eine FOR-Schleife ein day_count_<Device>_<Reading>-Block generiert
FOR(@{$_counter},TPL_stat($1$1,$1$2)) ## $1$1 entspricht dem Device, $1$2 entspricht dem Reading
FUUID 621259ad-f33f-e1df-6aad-fa75b1679f248329
MODEL Perl
NAME DI_CN_Strom
NOTIFYDEV PV,Strom,DI_CN_Strom,Solar,global
NR 248
NTFY_ORDER 50-DI_CN_Strom
STATE initialized
TYPE DOIF
VERSION 26444 2022-09-25 16:29:19
eventCount 985
.attraggr:
.attrminint:
CHANGED:
Netto: -508.14
CHANGEDWITHSTATE:
Netto: -508.14
DOIF_Readings:
Netto ::ReadingValDoIf($hash,'Strom','grid_power','','d')-::ReadingValDoIf($hash,'Solar','Einspeisung','','d')
Helper:
DBLOG:
Eigenverbrauch:
logdb:
TIME 1667118189.83712
VALUE 98.8679245283019
Netto:
logdb:
TIME 1667118129.56798
VALUE -335.57
READINGS:
2022-10-28 22:30:42 .col_72_DI_CN_Strom_Netto_168_times 1666398478,1666405491,1666409745,1666425020,1666432190,1666438322,1666444043,1666451109,1666461306,1666468301,1666476696,1666488815,1666494853,1666506987,1666517719,1666524349,1666528559,1666534803,1666549036,1666554031,1666560861,1666572242,1666582830,1666590419,1666600326,1666606395,1666613088,1666624217,1666635370,1666636283,1666651638,1666657863,1666667697,1666673700,1666685946,1666689174,1666698937,1666708691,1666716223,1666721300,1666735724,1666740920,1666744834,1666760600,1666768857,1666774522,1666786402,1666790547,1666802144,1666809599,1666814387,1666820578,1666828919,1666844450,1666853972,1666858038,1666866446,1666870955,1666879457,1666888434,1666896955,1666908333,1666918493,1666924268,1666935668,1666946397,1666952861,1666957705,1666968506,1666972284,1666981205,1666988467
2022-10-28 22:30:42 .col_72_DI_CN_Strom_Netto_168_values 62,435,1510,-599.14,1106,-1722.29,1408,-106.47,2168,145,850,74,526,1514,-542.83,1680,-1072.43,1460,44,1490,46,544,60,1600,-1037.17,1630,-1917.41,767,85,907,42,419,31,1612,-703.84,723,-1757.58,2042,46,1394,82,382,775,1574,-245,1340,-1675.37,0,818,1687,100,846,72,1515,90,1370,-1277.47,1560,-487.73,927,116,806,70,557,1655,-671.94,669.44,-1391,1526,84.22,860.22,99.22
2022-10-30 09:23:45 Device Solar
2022-10-30 09:23:09 Eigenverbrauch 98.8679245283019
2022-10-30 09:23:49 Netto -508.14
2022-10-30 09:23:09 PV.etotal.day 0.01
2022-10-30 09:22:22 PV.etotal.day_counter 2544.425
2022-10-30 09:22:22 PV.etotal.last_day 0.022
2022-10-16 11:45:01 PV.etotal.last_month 0
2022-10-16 11:45:01 PV.etotal.last_year 0
2022-10-30 09:23:09 PV.etotal.month 86.927
2022-10-16 11:45:01 PV.etotal.month_counter 2457.509
2022-10-30 09:23:09 PV.etotal.year 86.927
2022-10-16 11:45:01 PV.etotal.year_counter 2457.509
2022-10-30 09:23:45 Solar.Zaehlerstand.day 0.011
2022-10-30 09:22:22 Solar.Zaehlerstand.day_counter 5068.041
2022-10-30 09:22:22 Solar.Zaehlerstand.last_day 0.009
2022-10-01 23:59:59 Solar.Zaehlerstand.last_month 220.662
2022-10-30 09:23:45 Solar.Zaehlerstand.month 132.393
2022-10-01 23:59:59 Solar.Zaehlerstand.month_counter 4935.6596
2022-10-30 09:23:45 Solar.Zaehlerstand.year 2080.1
2022-03-03 08:02:51 Solar.Zaehlerstand.year_counter 2987.9523
2022-07-16 23:59:59 Strom.Zaehlerstand 1201.755
2022-10-30 09:22:22 Strom.Zaehlerstand.day 0
2022-10-30 09:22:22 Strom.Zaehlerstand.day_counter 13316.8328477
2022-10-30 09:22:22 Strom.Zaehlerstand.last_day 0.002
2022-10-01 23:59:59 Strom.Zaehlerstand.last_month 72.813
2022-10-30 09:22:22 Strom.Zaehlerstand.month 80.086
2022-10-01 23:59:59 Strom.Zaehlerstand.month_counter 13236.7462975
2022-10-30 09:22:22 Strom.Zaehlerstand.year 2027.343
2022-03-03 08:07:24 Strom.Zaehlerstand.year_counter 11289.4894939
2022-10-30 09:23:09 block_day_count_PV_etotal executed
2022-10-30 09:23:45 block_day_count_Solar_Zaehlerstand executed
2022-10-30 09:22:22 block_day_count_Strom_Zaehlerstand executed
2022-10-30 09:17:51 block_init executed
2022-10-30 09:22:22 block_mid executed
2022-10-30 09:23:09 e_PV_etotal 2544.436
2022-10-30 09:23:45 e_Solar_Zaehlerstand 5068.0527
2022-10-30 09:22:22 e_Strom_Zaehlerstand 13316.8328477
2022-10-30 09:20:34 mode enabled
2022-10-30 09:23:09 stat_EigenverbrauchDay Min: -5647.2222222222199 Avg: -102.9759457573388 Max: 100.0000000000000
2022-10-29 23:59:55 stat_EigenverbrauchDayLast Min: 39.8981603153745 Avg: 99.9972174752168 Max: 100.0000000000000
2022-10-30 09:23:09 stat_EigenverbrauchHour Min: -618.9368770764120 Avg: -355.8385419079656 Max: 100.0000000000000
2022-10-30 08:59:55 stat_EigenverbrauchHourLast Min: -5647.2222222222199 Avg: -1831.9237752292263 Max: 100.0000000000000
2022-10-30 09:23:09 stat_EigenverbrauchMonth Min: -57162.2779519331016 Avg: -147.4001230738250 Max: 100.0000000000000
2022-09-30 23:59:55 stat_EigenverbrauchMonthLast Min: 22.6587052168448 Avg: 44.0773390971354 Max: 97.6190476190476 (since: 2022-09-11_13:48:49 )
2022-10-30 09:23:09 stat_EigenverbrauchYear Min: -57162.2779519331016 Avg: -71.3148400115134 Max: 100.0000000000000 (since: 2022-09-11_13:48:49 )
2022-10-18 12:08:04 state initialized
2022-10-30 00:00:00 timer_01_c01 31.10.2022 23:59:59
Regex:
DOIF_Readings:
Solar:
Netto:
Einspeisung ^Solar$:^Einspeisung:
Strom:
Netto:
grid_power ^Strom$:^grid_power:
accu:
collect:
DI_CN_Strom:
collect:
Netto ^DI_CN_Strom$:^Netto:
cond:
PV:
0:
1:
2:
3:
4:
etotal ^PV$:^etotal:
Solar:
0:
1:
2:
3:
Zaehlerstand ^Solar$:^Zaehlerstand:
4:
Strom:
0:
1:
2:
Zaehlerstand ^Strom$:^Zaehlerstand:
3:
4:
event_Readings:
DI_CN_Strom:
Eigenverbrauch:
Solar.Zaehlerstand.day ^DI_CN_Strom$:^Solar.Zaehlerstand.day:
PV:
Eigenverbrauch:
etoday ^PV$:^etoday:
uiTable:
DI_CN_Strom:
DI_CN_Strom_uiTable_c_0_0_0_0:
Netto ^DI_CN_Strom$:^Netto:
card:
collect:
DI_CN_Strom Netto:
168:
animate 0
dim 72
hours 168
last -504.28
last_v 1572.22
last_value -542.83
max_value 2042
max_value_slot 22
max_value_time 1666708691
min_value -1917.41
min_value_slot 11
min_value_time 1666613088
name DI_CN_Strom
reading Netto
time 1667118229
value -508.14
times:
1666524349
1666528559
1666534803
1666549036
1666554031
1666560861
1666572242
1666582830
1666590419
1666600326
1666606395
1666613088
1666624217
1666635370
1666636283
1666651638
1666657863
1666667697
1666673700
1666685946
1666689174
1666698937
1666708691
1666716223
1666721300
1666735724
1666740920
1666744834
1666760600
1666768857
1666774522
1666786402
1666790547
1666802144
1666809599
1666814387
1666820578
1666828919
1666844450
1666853972
1666858038
1666866446
1666870955
1666879457
1666888434
1666896955
1666908333
1666918493
1666924268
1666935668
1666946397
1666952861
1666957705
1666968506
1666972284
1666981205
1666991215
1666997819
1667005200
undef
undef
undef
undef
undef
1667061001
1667067084
1667078521
1667088515
1667093199
1667103462
1667107697
1667118229
values:
1680
-1072.43
1460
44
1490
46
544
60
1600
-1037.17
1630
-1917.41
767
85
907
42
419
31
1612
-703.84
723
-1757.58
2042
46
1394
82
382
775
1574
-245
1340
-1675.37
0
818
1687
100
846
72
1515
90
1370
-1277.47
1560
-487.73
927
116
806
70
557
1655
-671.94
669.44
-1391
1526
84.22
860.22
45.22
400.22
48.22
undef
undef
undef
undef
undef
966.22
92.22
846.22
113.22
576.22
80.22
1572.22
-508.14
condition:
0 ::DOIF_time_once($hash,0,$wday); for (my $i=0;$i<@{$hash->{var}{counter}};$i++) {
midnight($hash->{var}{counter}[$i][0],$hash->{var}{counter}[$i][1],$mday,$yday); }
1 for (my $i=0;$i<@{$hash->{var}{counter}};$i++) { init_readings($hash->{var}{counter}[$i][0],$hash->{var}{counter}[$i][1]);
}
2 set_Reading ("Strom.Zaehlerstand.day",int((::ReadingValDoIf($hash,'Strom','Zaehlerstand','0')-get_Reading("Strom.Zaehlerstand.day_counter",1))*1000)/1000);
set_Reading ("Strom.Zaehlerstand.month",int((::ReadingValDoIf($hash,'Strom','Zaehlerstand','0')-get_Reading("Strom.Zaehlerstand.month_counter",0))*1000)/1000);
set_Reading ("Strom.Zaehlerstand.year",int((::ReadingValDoIf($hash,'Strom','Zaehlerstand','0')-get_Reading("Strom.Zaehlerstand.year_counter",0))*1000)/1000);
3 set_Reading ("Solar.Zaehlerstand.day",int((::ReadingValDoIf($hash,'Solar','Zaehlerstand','0')-get_Reading("Solar.Zaehlerstand.day_counter",1))*1000)/1000);
set_Reading ("Solar.Zaehlerstand.month",int((::ReadingValDoIf($hash,'Solar','Zaehlerstand','0')-get_Reading("Solar.Zaehlerstand.month_counter",0))*1000)/1000);
set_Reading ("Solar.Zaehlerstand.year",int((::ReadingValDoIf($hash,'Solar','Zaehlerstand','0')-get_Reading("Solar.Zaehlerstand.year_counter",0))*1000)/1000);
4 set_Reading ("PV.etotal.day",int((::ReadingValDoIf($hash,'PV','etotal','0')-get_Reading("PV.etotal.day_counter",1))*1000)/1000);
set_Reading ("PV.etotal.month",int((::ReadingValDoIf($hash,'PV','etotal','0')-get_Reading("PV.etotal.month_counter",0))*1000)/1000);
set_Reading ("PV.etotal.year",int((::ReadingValDoIf($hash,'PV','etotal','0')-get_Reading("PV.etotal.year_counter",0))*1000)/1000);
days:
defs:
tpl:
TPL_stat
day_count_$1_$2 { set_Reading ("$1.$2.day",int(([$1:$2,0]-get_Reading("$1.$2.day_counter",1))*1000)/1000);
set_Reading ("$1.$2.month",int(([$1:$2,0]-get_Reading("$1.$2.month_counter",0))*1000)/1000);
set_Reading ("$1.$2.year",int(([$1:$2,0]-get_Reading("$1.$2.year_counter",0))*1000)/1000);
}
event_Readings:
Eigenverbrauch 100/::ReadingValDoIf($hash,'PV','etoday')*(::ReadingValDoIf($hash,'PV','etoday')-::ReadingValDoIf($hash,'DI_CN_Strom','Solar.Zaehlerstand.day'))
helper:
NOTIFYDEV PV,Strom,DI_CN_Strom,Solar,global
_98_statistics Statistik
event Einspeisung: 508.14
globalinit 1
last_timer 1
sleeptimer -1
triggerDev Solar
triggerEvents:
Einspeisung: 508.14
triggerEventsState:
Einspeisung: 508.14
internals:
interval:
intervalfunc:
localtime:
0 1667257199
perlblock:
0 mid
1 init
2 day_count_Strom_Zaehlerstand
3 day_count_Solar_Zaehlerstand
4 day_count_PV_etotal
readings:
all Strom:Zaehlerstand Solar:Zaehlerstand PV:etotal
realtime:
0 23:59:59
time:
0 23:59:59
timeCond:
0 0
timer:
0 0
timers:
0 0
trigger:
triggertime:
1667257199:
localtime 1667257199
hash:
uiState:
uiTable:
dev DI_CN_Strom
header
<table uitabid='DOIF-DI_CN_Strom' class=' block wide uiTabledoif doif-DI_CN_Strom ' style='border-top:none;'>
package package ui_Table;
reading Netto
shownodeviceline Aktuell
table:
0:
0:
0:
0 package ui_Table;::DOIF_Widget($hash,$reg,'DI_CN_Strom_uiTable_c_0_0_0_0',card(::ReadingValDoIf($hash,'DI_CN_Strom','Netto','','col1w'),undef,undef,970,1030,0,120,"Wh",[(1007,30,1019,120,1030,60)],0,'150,,,','0,0,1,8,',"50,35,45,35,50,35"),"")
tc:
td:
0:
tr:
var:
counter:
ARRAY(0x6a64748)
ARRAY(0x6a64670)
ARRAY(0x6a64520)
Attributes:
DOIF_Readings Netto:[Strom:grid_power:d]-[Solar:Einspeisung:d]
DbLogExclude .*
DbLogInclude Netto,Strom.Zaehlerstand.day_counter,Solar.Zaehlerstand.day_counter,PV.etotal.day_counter,Eigenverbrauch
event_Readings Eigenverbrauch:100/[PV:etoday]*([PV:etoday]-[$SELF:Solar.Zaehlerstand.day])
room Energie
uiTable {
package ui_Table;
$SHOWNODEVICELINE = "Aktuell";
}
card([$SELF:Netto:col1w],undef,undef,970,1030,0,120,"Wh",[(1007,30,1019,120,1030,60)],0,'150,,,','0,0,1,8,',"50,35,45,35,50,35")
Da ich gelernt habe, dass setReading nur ein event auslöst, habe ich in der Mitternachtsfunktion in der Zeile für das Erzeugen der Daycounter den Paramater "1" angehängt.
Darauf lauert ein Filelog, dass mir die Werte in ein log schreibt. Das funktioniert sehr gut, doch nach unterschiedlich vielen Tagen wird nicht mehr gelogt, obwohl ein Event geschrieben wird, die das Listing zeigt. Da habe ich das sub "mid" von Hand ausgelöst um 9:22 Uhr.
Ich vermute einen Zusammenhang mit shutdown restart, der nach einem Update notwendig wurde. Nach Tagen kriege ich durch Neudefinition des FileLogs immer irgendwie das Logging wieder "scharf", aber die Ursache verstehe ich nicht.
Das dazugehörige FileLog:
Internals:
DEF ./log/Strom-%Y.log DI_CN_Strom:Strom.Zaehlerstand.day_counter:.*|DI_CN_Strom:Solar.Zaehlerstand.day_counter:.*|DI_CN_Strom:PV.etotal.day_counter:.*
FD 17
FUUID 6212aff6-f33f-e1df-1dc5-b2ed5bd8a41eafe3
NAME FL_Strom
NOTIFYDEV DI_CN_Strom
NR 249
NTFY_ORDER 50-FL_Strom
REGEXP DI_CN_Strom:Strom.Zaehlerstand.day_counter:.*|DI_CN_Strom:Solar.Zaehlerstand.day_counter:.*|DI_CN_Strom:PV.etotal.day_counter:.*
STATE active
TYPE FileLog
currentlogfile ./log/Strom-2022.log
eventCount 1
logfile ./log/Strom-%Y.log
READINGS:
2022-10-27 23:59:59 linesInTheFile 502
Attributes:
room Energie
verbose 3
Any idea?
Christian
Zitat von: cwagner am 30 Oktober 2022, 09:38:34
habe ich in der Mitternachtsfunktion in der Zeile für das Erzeugen der Daycounter den Paramater "1" angehängt.
Darauf lauert ein Filelog, dass mir die Werte in ein log schreibt.
Werte zu einem bestimmten Zeitpunkt in ein Log zu schreiben, löse ich immer per at und addLog().
Am Listing kann man nur sehen, dass das Reading um 09:22:22 geschrieben wurde, ob ein Event erzeugt wurde, kann man am Listing nicht sehen.
Grundsätzlich sollte set_Reading immer ein Event erzeugen, wenn es mit eins aufgerufen wurde (event-on-change-reading sehe ich bei dir nicht), daher gehe ich davon aus, dass ein Event erzeugt wird. Das kannst man ja im Event-Monitor sehen, wenn du den Block ausführst.
Wenn also ein Event kommt, dieses aber nicht geloggt wird, dann stimmt etwas mit dem Logging nicht.
In der aktuellen Version im Wiki wird im init-Block auch das Logging aufgesetzt - das ist bei dir nicht der Fall. Du benutzt offenbar dbLog.
Danke Euch beiden für die Hinweise, denen ich heute um Mitternacht ;-) nachgehe...
Christian
Was mir noch aufgefallen ist.
Du hast den Aufruf der Mitternachtsroutine auf 23:59:59 vorgezogen. Damit kann sie nicht richtig funktionieren, weil dort geschaut wird, ob ein neuer Monat beginnt ($mday == 1) bzw. ein neues Jahr ($yday == 1).
Das hat vermutlich nichts mit deinem Problem zu tun, aber du wirst heute (31.10) ein weiteres bekommen.