Visualisierung von Verbräuchen

Begonnen von Damian, 16 Dezember 2024, 18:38:14

Vorheriges Thema - Nächstes Thema

Damian

Hier mal ein etwas größeres Codeschnipsel zum Visualisieren von Verbräuchen.

Voraussetzung ist jeweils ein Zähler, der, was auch immer, kontinuierlich hochzählt.

Es reicht die Angabe des Readings (push-Zeile am Anfang und TPL_Single-Zeile am Ende des Codes für die Visualisierung) und schon werden die Daten stündlich, täglich, monatlich, jährlich und in Dekaden gesammelt und visualisiert.

Layout meiner Definition siehe Screenshot.

defmod di_counter_new DOIF subs {\
##                     Device        Reading          hier die push-Zeilen löschen bzw. durch eigene Readings ersetzen\
  push (@{$_counter},["MQTT2_DVES_C58DCB","total_w"]);; ## Wasserzähler\
  push (@{$_counter},["MQTT2_DVES_C58DCB","total_pv"]);; ## Solarenergie\
  push (@{$_counter},["MQTT2_DVES_C58DCB","total_c"]);; ## Bezugszähler\
  push (@{$_counter},["MQTT2_DVES_C58DCB","total_f"]);; ## Einspeisezähler\
  push (@{$_counter},["MQTT2_DVES_C58DCB","total_gas"]);; ## Gaszähler  \
  push (@{$_counter},["di_tibber","costsSum"]);; ## Stromkosten \
  push (@{$_counter},["MQTT2_DVES_C58DCB","total_consum"]);; ## Stromverbrauch positiv\
  push (@{$_counter},["HM_Sw1_Pl_2_Pwr","energyCalc"]);; ## Server\
   \
## Die restliche Code-Definition muss nicht angepasst werden\
## Anpassung der Visualisierung wird im uiTable-Attribut weiter unten vorgenommen\
\
sub hour { ## Diese Funktion wird zur vollen Stunde ausgeführt\
  my ($device,$reading,$mday,$yday)=@_;;\
  set_Reading ("$device.$reading.hour_counter",ReadingsVal($device, $reading,0));;   \
  set_Reading ("$device.$reading.last_hour",get_Reading("$device.$reading.hour",0),1);;\
  set_Reading ("$device.$reading.hour",0,1);;\
  set_Reading ("$device.$reading.day",int((ReadingsVal($device, $reading,0)-(get_Reading("$device.$reading.day_counter",0)))*1000)/1000,1);;\
\
}\
\
sub midnight { ## Diese Funktion wird um Mitternacht ausgeführt\
  my ($device,$reading,$mday,$yday)=@_;;\
  set_Reading("$device.$reading.day_counter",ReadingsVal($device, $reading,0));;   \
  set_Reading("$device.$reading.last_day",get_Reading("$device.$reading.day",0),1);;\
  set_Reading("$device.$reading.day",0,1);;\
  set_Reading ("$device.$reading.month",int((ReadingsVal($device, $reading,0)-(get_Reading("$device.$reading.month_counter",0)))*1000)/1000,1);;\
  set_Reading ("$device.$reading.year",int((ReadingsVal($device, $reading,0)-(get_Reading("$device.$reading.year_counter",0)))*1000)/1000,1);;\
\
  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),1);;\
    set_Reading("$device.$reading.month",0,1);;\
    if ($yday == 0) {\
      set_Reading("$device.$reading.year_counter",ReadingsVal($device, $reading,0));;\
      set_Reading("$device.$reading.last_year",get_Reading("$device.$reading.year",0),1);;\
      set_Reading("$device.$reading.year",0,1);;\
    }\
  }\
}\
\
sub init_readings {\
  my ($device,$reading)=@_;;\
  if (get_Reading("$device.$reading.day_counter","") eq "") {   ## Initialisierung der Readings\
    ## aktuellen Zählerstand initialisieren\
    set_Reading("$device.$reading.last_counter",ReadingsVal($device, $reading,0));;\
    set_Reading("$device.$reading.hour_counter",ReadingsVal($device, $reading,0));;\
    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.hour",0);;          ## aktueller Stundenverbrauch\
    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_hour",0);;      ## Verbrauch der letzten Stunde\
    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\
## Log definieren\
    fhem ("defmod log.counter.$device.$reading FileLog ./log/counter.$device.$reading.log $SELF:$device.$reading.last_.*");;\
    fhem ("attr log.counter.$device.$reading room Filelogs");;\
  }\
}\
\
} ## Ende subs-Block\
\
get_data {                             ## Optionale Übernahme bestehender Daten aus dem Log\
for (my $i=0;;$i<@{$_counter};;$i++) \
{ ## my $i=3;;\
      ::DOIF_set_card_data ("$SELF","$SELF","$_counter[$i][0].$_counter[$i][1].last_hour","bar2day",-10,fhem("get log.counter.$_counter[$i][0].$_counter[$i][1] ./log/counter.$_counter[$i][0].$_counter[$i][1].log - 2000 3000 4:last_hour"));;\
    ::DOIF_set_card_data ("$SELF","$SELF","$_counter[$i][0].$_counter[$i][1].last_day","bar2month",-300,fhem("get log.counter.$_counter[$i][0].$_counter[$i][1] ./log/counter.$_counter[$i][0].$_counter[$i][1].log - 2000 3000 4:last_day"));;\
    ::DOIF_set_card_data ("$SELF","$SELF","$_counter[$i][0].$_counter[$i][1].last_month","bar2year",-300,fhem("get log.counter.$_counter[$i][0].$_counter[$i][1] ./log/counter.$_counter[$i][0].$_counter[$i][1].log - 2000 3000 4:last_month"));;\
::DOIF_set_card_data ("$SELF","$SELF","$_counter[$i][0].$_counter[$i][1].last_year","bar2decade",-300,fhem("get log.counter.$_counter[$i][0].$_counter[$i][1] ./log/counter.$_counter[$i][0].$_counter[$i][1].log - 2000 3000 4:last_year"));;\
}\
}\
\
\
hour {[:00];;                            ## Sicherung der Daten der letzten Stunde\
  for (my $i=0;;$i<@{$_counter};;$i++) { ## Für jeden Zähler wird die Funktion hour aufgerufen\
    hour($_counter[$i][0],$_counter[$i][1],$mday,$yday);;\
  }\
}\
\
\
\
midnight {[00:01];;                          ## Sicherung der Daten um Mitternacht\
  for (my $i=0;;$i<@{$_counter};;$i++) { ## Für jeden Zähler wird die Funktion midnight aufgerufen\
    midnight($_counter[$i][0],$_counter[$i][1],$mday,$yday);;\
  }\
}\
\
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 Verbrauch der Stunde im jeweiligen Reading festgehalten\
                    ##  $1 Zählerdevice, $2 Zählerreading\
\
      set_Reading ("$1.$2.last_counter",[$1:$2,0]);;\
      set_Reading ("$1.$2.hour",int(([$1:$2,0]-(get_Reading("$1.$2.hour_counter",0)))*1000)/1000,1);;\
  }\
)\
\
## 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
attr di_counter_new room Verbrauch
attr di_counter_new uiTable {package ui_Table;;} ## Optionale Visualisierung der Energie-Verbräuche/-Produktion im DOIF-Device\
\
## Template für die Darstellung eines Wertes, einzelne card-Aufrufe können auskommentiert werden\
DEF TPL_single (\
##card([$SELF:$2.$3.day:col1w],"$1",undef,$4,$5,$10,$11,"$12",undef,"1","130,fixedscaling,,footer,noycolor,halfring,220","0,0,0,0,2")| Wochendarstellung\
card([[$SELF:$2.$3.last_hour:bar2day-10],[$SELF:$2.$3.hour]],"$1 in $12/h",undef,$4/12,$5/12,$10,$11,["letzte","aktuell"],undef,"2","130,fixedscaling,,footer,noycolor,halfring,220","0,0,0,0,2")|\
card([[$SELF:$2.$3.last_day:bar2month-300],[$SELF:$2.$3.day]],"$12/Tag",undef,$4,$5,$10,$11,["letzter","aktuell"],undef,"1","130,fixedscaling,,footer,noycolor,halfring,220","0,0,0,0,2")|\
card([[$SELF:$2.$3.last_month:bar2year-300],[$SELF:$2.$3.month]],"$12/Monat",undef,$6,$7,$10,$11,["letzter","aktuell"],undef,"0","130,fixedscaling,,footer,noycolor,halfring,220","0,0,0,0,2")|\
card([[$SELF:$2.$3.last_year:bar2decade-300],[$SELF:$2.$3.year]],"$12/Jahr",undef,$8,$9,$10,$11,["letzter","aktuell"],undef,"0","130,fixedscaling,,footer,noycolor,halfring,220","0,0,0,0,2")\
)\
\
## Template für die Darstellung von zwei Werten, einzelne card-Aufrufe können auskommentiert werden\
DEF TPL_double (\
##card([[$SELF:$3.$4.day:col1w],[$SELF:$6.$7.day:col1w]],"$1",undef,$8,$9,$14,$15,["$2","$5"],undef,"1","130,fixedscaling,,footer,noycolor,noring,220","0,0,0,0,2")| Wochendarstellung\
card([[$SELF:$3.$4.last_hour:bar2day-10],[$SELF:$6.$7.last_hour:bar2day-10],[$SELF:$3.$4.hour],[$SELF:$6.$7.hour]],"$1/h",undef,$8/12,$9/12,$14,$15,["$2","$5","$2","$5"],undef,"2","130,fixedscaling,,footer,noycolor,noring,220","0,0,0,0,2")|\
card([[$SELF:$3.$4.last_day:bar2month-300],[$SELF:$6.$7.last_day:bar2month-300],[$SELF:$3.$4.day],[$SELF:$6.$7.day]],"pro Tag",undef,$8,$9,$14,$15,["$2","$5","$2","$5"],undef,"1","130,fixedscaling,,footer,noycolor,noring,220","0,0,0,0,2")|\
card([[$SELF:$3.$4.last_month:bar2year-300],[$SELF:$6.$7.last_month:bar2year-300],[$SELF:$3.$4.month],[$SELF:$6.$7.month]],"pro Monat",undef,$10,$11,$14,$15,["$2","$5","$2","$5"],undef,"0","130,fixedscaling,,footer,noycolor,noring,220","0,0,0,0,2")|\
card([[$SELF:$3.$4.last_year:bar2decade-300],[$SELF:$6.$7.last_year:bar2year-300],[$SELF:$3.$4.year],[$SELF:$6.$7.year]],"pro Jahr",undef,$12,$13,$14,$15,["$2","$5","$2","$5"],undef,"0","130,fixedscaling,,footer,noycolor,noring,220","0,0,0,0,2")\
)\
\
\
## Die Visualisierung einer Tabellenzeile wird über die obigen beiden Templates vorgenommen, hier zeilenweise anpassen/löschen:\
\
## Über das Template TPL_single wird jeweils pro card ein Wert visualisiert\
##          Überschrift,Device,Reading,minTag,maxTag,minMonat,maxMonat,minJahr,maxJahr,minColor,maxColor,Einheit\
TPL_single (Frischwasser,MQTT2_DVES_C58DCB,total_w,0,500,0,10000,0,80000,90,0,Liter)\
TPL_single (Gas,MQTT2_DVES_C58DCB,total_gas,0,10,0,250,0,2000,90,0,m³)\
TPL_single (PV,MQTT2_DVES_C58DCB,total_pv,0,30,0,600,0,5000,0,90,kWh)\
TPL_single (Einspeisung,MQTT2_DVES_C58DCB,total_f,0,30,0,600,0,5000,0,90,kWh)\
TPL_single (Bezug,MQTT2_DVES_C58DCB,total_c,-10,0,-300,0,-3000,0,0,90,kWh)\
TPL_single (Verbrauch,MQTT2_DVES_C58DCB,total_consum,-10,0,-300,0,-3000,0,0,90,kWh)\
TPL_single (Stromkosten,di_tibber,costsSum,0,4,0,90,0,1200,90,0,€)\
TPL_single (Server,HM_Sw1_Pl_2_Pwr,energyCalc,0,500,0,15000,0,30000,90,0,Wh)\
\
## Über das Template TPL_double werden jeweils pro card zwei Werte visualisiert\
##       Überschrift,Bezeichnung1,Device1,Reading1,Bezeichnung2,Device2,Reading2,minTag,maxTag,minMonat,maxMonat,minJahr,maxJahr,minColor,maxColor,Einheit\
##TPL_double (Heizenergie,Gesamt,vaillant,total_h,Wasser,vaillant,total_hwc,0,100,0,2000,0,20000,90,0,kWh)\
##TPL_double (Stromeinspeisung/Strombezug,Bezug,MQTT2_DVES_C58DCB,total_c,Einsp.,MQTT2_DVES_C58DCB,total_f,-10,25,-300,600,-3000,5000,0,90,kWh)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

privat58

Vielen Dank dafür, habe es als uiState genutzt um es im Floorplan darzustellen.
Eine Frage wäre nur, kann man die Farben rot und Grün vertauschen? Geringer Verbrauch grün, hoher Verbrauch rot.
Mit der Wiki tue ich mich etwas schwer, programmieren ist mehr "probieren" bei mir.
Dank erst einmal.

Damian

Zitat von: privat58 am 14 Januar 2025, 20:13:25Vielen Dank dafür, habe es als uiState genutzt um es im Floorplan darzustellen.
Eine Frage wäre nur, kann man die Farben rot und Grün vertauschen? Geringer Verbrauch grün, hoher Verbrauch rot.
Mit der Wiki tue ich mich etwas schwer, programmieren ist mehr "probieren" bei mir.
Dank erst einmal.

ja, das ist ja auch im Codeschnipsel vorgesehen:

##          Überschrift,Device,Reading,minTag,maxTag,minMonat,maxMonat,minJahr,maxJahr,minColor,maxColor,Einheit\
TPL_single (Frischwasser,MQTT2_DVES_C58DCB,total_w,0,500,0,10000,0,80000,90,0,Liter)

da musst du nur die beiden Zahlen vertauschen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

privat58

Vielen lieben Dank,
da sieht man es wieder mal: "Wer lesen kann ist klar im Vorteil" :-)
Ich hatte es nicht registriert.
mvh

cotecmania

Hallo Damian,

Danke dafür !

2 Fragen :
- Wenn ich das DOIF "di_counter_new" mit "rename" umbenenne, wird nichts mehr dargestellt. Benenne ich es wieder zurück gehts wieder.
  Wie kann ich es umbenennen ?
- Wie kann ich die Werte skalieren ? Ich habe als Reading Wh und möchte aber KWh im Diagramm darstellen also Werte/1000.
  Geht das ?

Gruss
Joe
FHEM auf RaspberryPI B (buster)
2xCUL868 für MAX/Slow_RF, HM-LAN, JeeLink
MAX!/HM-Thermostate, FS20/HM-Rolladenschalter, FS20-EM, LevelJet-Ölstandsmessung, PCA301, IT, KM271, IPCAM, FireTAB10 FTUI

Damian

Ich würde das DOIF-Device auf ein neues kopieren, das alte deaktivieren, das neue mit gewünschten eigenen Readings anpassen und starten. Wenn es nicht funktioniert, dann sind möglicherweise noch irgendwelche interne Bezüge zum alten drin, dann FHEM durchstarten (das alte muss deaktiviert sein)

Wenn du Werte skalieren willst, dann würde ich mir im ursprünglichen Device ein user-Reading definieren und dieses dann im DOIF-Device angeben.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cotecmania

Danke, werde ich testen ...

Das heisst ich darf/kann keine 2 oder mehr Devices dieser Art in FHEM anlegen ?
Dann habe ich ja die komplette Visualisierung in einem Device.
Dachte ich könnte eins anlegen für Solar, eins für die Steckdosen, etc ...
FHEM auf RaspberryPI B (buster)
2xCUL868 für MAX/Slow_RF, HM-LAN, JeeLink
MAX!/HM-Thermostate, FS20/HM-Rolladenschalter, FS20-EM, LevelJet-Ölstandsmessung, PCA301, IT, KM271, IPCAM, FireTAB10 FTUI

Damian

Das geht schon, du kannst in di_counter nur die Werte sammeln und in anderen DOIF-Devices die Darstellung über card vornehmen. Strom und Gas kommen aus di_counter, siehe Anhang.

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

satprofi

Frage zu den Images, kann man das in FTUI3 auch visualisieren?
Schaut schon toll aus.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Damian

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

rinaldos

Guten Morgen Damian,

ist es möglich im Bereich DEF_TPL_single die tägliche Visualisierung im Monat, so umzustellen, dass mir nicht mehr der vergangene Tag (1...31) angezeigt wird.

Ich vermute mal, es betrifft diese Zeile:
card([[$SELF:$2.$3.last_day:bar2month-300],[$SELF:$2.$3.day]],"$12/Tag",undef,$4,$5,$10,$11,["letzter","aktuell"],undef,"1","130,fixedscaling,,footer,noycolor,halfring,220","0,0,0,0,2")

Sobald ich bar2month auf bar1month setze, wird kein Balken mehr angezeigt. Ich bin auch schon durch dein WIKI vom uiTable gegangen und habe versucht alles möglich zu ändern. Nur irgendwie scheitere ich daran :-(

Bei der Codezeile darüber, bar2day habe ich es wie folgt abgeändert und es zeigt den gewünschten Effekt, immer nur den aktuellen Tag. So würde ich auch gerne die Monate (1...31) sowie das Jahr (Jan...Dez) haben.
card([[$SELF:$2.$3.last_hour:bar1day-10],[$SELF:$2.$3.hour]],"$1 in $12/h akt",undef,$4/12,$5/12,$10,$11,["letzte","aktuell"],undef,"2","150,fixedscaling,,footer,noycolor,halfring,320","0,0,0,0,2")|

Über einen Tip wäre ich sehr dankbar.


Lieben Gruß Ingo

P.S. Danke für den schönen Codeschnipsel der Visualisierung

Damian

bar1month sollte korrekt sein, allerdings musst du ggf. warten bis neue Werte eintrudeln oder diese mit https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Import,_%C3%84nderung_und_L%C3%B6schung_von_Diagrammdaten selber setzen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rinaldos

Danke schön für den Hinweis. Ich habe nun ein "init" durchgeführt, im Abschnitt get_data in der Zeile
    ::DOIF_set_card_data ("$SELF","$SELF","$_counter[$i][0].$_counter[$i][1].last_day","bar2month",-300,fhem("get log.counter.$_counter[$i][0].$_counter[$i][1] ./log/counter.$_counter[$i][0].$_counter[$i][1].log - 2000 3000 4:last_day"));;\

bar2month nach bar1month geändert. Die Daten aus dem Logfile neu einlesen lassen und schon waren alle Balken (so wie ich es mir vorgestellt habe) direkt wieder da. Dankeschön für den Denkanstoß. Anscheinend war ich nur zu ungeduldig um auf die Daten zu warten :-)

Lieben Gruß Ingo

Damian

Zitat von: rinaldos am 09 April 2025, 14:38:21Danke schön für den Hinweis. Ich habe nun ein "init" durchgeführt, im Abschnitt get_data in der Zeile
    ::DOIF_set_card_data ("$SELF","$SELF","$_counter[$i][0].$_counter[$i][1].last_day","bar2month",-300,fhem("get log.counter.$_counter[$i][0].$_counter[$i][1] ./log/counter.$_counter[$i][0].$_counter[$i][1].log - 2000 3000 4:last_day"));;\

bar2month nach bar1month geändert. Die Daten aus dem Logfile neu einlesen lassen und schon waren alle Balken (so wie ich es mir vorgestellt habe) direkt wieder da. Dankeschön für den Denkanstoß. Anscheinend war ich nur zu ungeduldig um auf die Daten zu warten :-)

Lieben Gruß Ingo

Die Option zum Einlesen der Daten aus dem Log, die ich in diesem Device zusätzlich eingebaut hatte, habe ich inzwischen verdrängt. Du hast die Option aber gefunden - das ist gut. Die Daten für die Visualisierung werden von der Card-Funktion in versteckten Readings des Devices gespeichert. Solange man nichts ändert und das System nicht abstürzt, reicht diese Vorgehensweise. Das zusätzliche Loggen der Daten und die Option diese im Notfall zu rekonstruieren, kann allerdings sehr nützlich sein.

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

cotecmania

Hallo Damian,

Ich dachte eigentlich mein Perl-Doif funktioniert, aber ich habe nun festgestellt, dass einige Events mehrfach im Logfile vorkommen.
Wie kann ich das lösen bzw. debuggen ?
Hier das Doif
Internals:
   DEF        ## Template zum speichern der Energiewerte eines auflaufenden Readings z.B. einer Shelly-Steckdose
DEF TPL_UpdateEnergy (

  ## Debug
  ########
  $1_Debug
  {
##    if ([$1:""]) {Log 1, "!!! Debug from $SELF !!! (Device: $DEVICE) (Event: $EVENT) (Tag: ".$mday.") RVenergy: ".ReadingsVal("$1","energy",0)}
  }
 
  ## Tagesdaten
  #############
  $1_EnergyDay 
  {
    ## Taeglichen Energieverbrauch aufsteigend in Reading schreiben
    if ([$1:"^$2:.*$"]) {fhem ("setreading $1 energy_day_ongoing ".(([?$1:$2]) - ([?$1:energy_morning,0])))}

    ## Energiestand morgens in Reading sichern. Alte auflaufende Tagesenergie vom Vortag loeschen. (Ist aber im logfile)
    if ([00:00:01]) {fhem ("setreading $1 energy_morning ".([?$1:$2])); fhem("setreading $1 energy_day_ongoing 0")}

    ## Taeglichen Energieverbrauch abends in separates Reading uebernehmen
    if ([23:59:40]) {fhem ("setreading $1 energy_day ".([?$1:energy_day_ongoing,0]))}

    ## Taeglichen Energieverbrauch dann wieder loeschen. (Verbleibt aber im Logfile)
##    if ([23:59:55]) {fhem ("deletereading $1 energy_day")}
  }

  ## Monatsdaten
  ##############
  $1_EnergyMonth
  {
    ## Am Monatsanfang die Monatssumme nullen
    if ([00:00:01] and ($mday == 1)) {fhem ("setreading $1 energy_month_ongoing 0")}

    ## Tagesenergie zum auflaufenden Monatsverbrauch addieren
    if ([23:59:45]) {fhem ("setreading $1 energy_month_ongoing ".(([?$1:energy_month_ongoing,0]) + ([?$1:energy_day_ongoing,0])))}

    ## Am Monatsende die Monatssumme als Reading speichern
    if ([23:59:47] and (strftime("%d", localtime(time+86400)) eq "01"))
    {
      fhem ("setreading $DEVICE energy_month [?$1:energy_month_ongoing]")
##      fhem ("deletereading $DEVICE energy_month");
    }
  }

  ## Jahresdaten
  ##############
  $1_EnergyYear
  {
    ## Jahresdaten
    ##############
    ## Am Jahresanfang die Jahressumme nullen
    if ([00:00:01] and ($yday == 0)) {fhem ("setreading $1 energy_year_ongoing 0")}

    ## Tagesenergie zum auflaufenden Jahresverbrauch addieren
    if ([23:59:50]) {fhem ("setreading $1 energy_year_ongoing ".(([?$1:energy_year_ongoing,0]) + ([?$1:energy_day_ongoing,0])))}

    ## Am Jahressende die Jahressumme als Reading speichern
    if ([23:59:52] and $md eq "12-31")
    {
      fhem ("setreading $DEVICE energy_year [?$1:energy_year_ongoing]")
##      fhem ("deletereading $DEVICE energy_year");
    }
  }

)

## Aufruf des Templates
##
##                 Device
## !!! ACHTUNG : Keine leerzeichen vor oder nach den Parametern (para1,para2,para3)
##                device    reading
TPL_UpdateEnergy (Shelly_01,energy)
TPL_UpdateEnergy (Shelly_03,energy)
TPL_UpdateEnergy (Shelly_04,energy)
TPL_UpdateEnergy (EZ1_Inverter1,total_energy)
TPL_UpdateEnergy (EZ1_Inverter2,total_energy)
TPL_UpdateEnergy (ShellyPro_3EM_1,Total_Energy_S)
## !!! ACHTUNG : Keine leerzeichen vor oder nach den Parametern (para1,para2,para3)


## ENDE


   FUUID      67a5cc3d-f33f-623c-8399-eea6944e95e39c96
   MODEL      Perl
   NAME       DI_EnergyManager
   NOTIFYDEV  EZ1_Inverter1,Shelly_04,Shelly_03,ShellyPro_3EM_1,Shelly_01,EZ1_Inverter2,global
   NR         1020
   NTFY_ORDER 50-DI_EnergyManager
   STATE      initialized
   TYPE       DOIF
   VERSION    29460 2024-12-29 20:25:48
   eventCount 71
   READINGS:
     2025-05-18 15:52:01   Device          ShellyPro_3EM_1
     2025-05-18 15:51:41   block_EZ1_Inverter1_EnergyDay executed
     2025-05-18 15:51:41   block_EZ1_Inverter2_EnergyDay executed
     2025-05-18 15:52:01   block_ShellyPro_3EM_1_EnergyDay executed
     2025-05-18 15:50:35   block_Shelly_01_EnergyDay executed
     2025-05-18 15:50:35   block_Shelly_03_EnergyDay executed
     2025-05-18 15:48:27   block_Shelly_04_EnergyDay executed
     2025-05-18 15:51:41   e_EZ1_Inverter1_events disabled: 0
     2025-05-18 15:51:41   e_EZ1_Inverter2_events disabled: 0
     2025-05-18 15:52:01   e_ShellyPro_3EM_1_events Returned_Energy_A: 27.79702 kWh,Purchased_Energy_B: 17.90265 kWh,Returned_Energy_B: 1.17326 kWh,Returned_Energy_C: 24.35751 kWh,Purchased_Energy_S: 27.59610 kWh,Returned_Energy_S: 53.32779 kWh,Total_Energy_S: -25.73169 kWh,Active_Power_calculated: -579.6 W ( -34776 Ws = -9.66 Wh in 60 s )
     2025-05-18 15:50:35   e_Shelly_01_events uptime: 4933547,inttemp: 21.45
     2025-05-18 15:50:35   e_Shelly_03_events network_rssi: -66,uptime: 3550256
     2025-05-18 15:48:27   e_Shelly_04_events current: 0.909,power: 208.2,energy: 132556.484,energy_lastMinute: 11.163235,voltage: 234.3
     2025-05-18 14:42:15   mode            enabled
     2025-05-18 14:42:15   state           initialized
     2025-05-18 14:42:15   timer_01_c02    19.05.2025 00:00:01
     2025-05-18 14:42:15   timer_02_c02    18.05.2025 23:59:40
     2025-05-18 14:42:15   timer_03_c03    19.05.2025 00:00:01
     2025-05-18 14:42:15   timer_04_c03    18.05.2025 23:59:45
     2025-05-18 14:42:15   timer_05_c03    18.05.2025 23:59:47
     2025-05-18 14:42:15   timer_06_c04    19.05.2025 00:00:01
     2025-05-18 14:42:15   timer_07_c04    18.05.2025 23:59:50
     2025-05-18 14:42:15   timer_08_c04    18.05.2025 23:59:52
     2025-05-18 14:42:15   timer_09_c06    19.05.2025 00:00:01
     2025-05-18 14:42:15   timer_10_c06    18.05.2025 23:59:40
     2025-05-18 14:42:15   timer_11_c07    19.05.2025 00:00:01
     2025-05-18 14:42:15   timer_12_c07    18.05.2025 23:59:45
     2025-05-18 14:42:15   timer_13_c07    18.05.2025 23:59:47
     2025-05-18 14:42:15   timer_14_c08    19.05.2025 00:00:01
     2025-05-18 14:42:15   timer_15_c08    18.05.2025 23:59:50
     2025-05-18 14:42:15   timer_16_c08    18.05.2025 23:59:52
     2025-05-18 14:42:15   timer_17_c10    19.05.2025 00:00:01
     2025-05-18 14:42:15   timer_18_c10    18.05.2025 23:59:40
     2025-05-18 14:42:15   timer_19_c11    19.05.2025 00:00:01
     2025-05-18 14:42:15   timer_20_c11    18.05.2025 23:59:45
     2025-05-18 14:42:15   timer_21_c11    18.05.2025 23:59:47
     2025-05-18 14:42:15   timer_22_c12    19.05.2025 00:00:01
     2025-05-18 14:42:15   timer_23_c12    18.05.2025 23:59:50
     2025-05-18 14:42:15   timer_24_c12    18.05.2025 23:59:52
     2025-05-18 14:42:15   timer_25_c14    19.05.2025 00:00:01
     2025-05-18 14:42:15   timer_26_c14    18.05.2025 23:59:40
     2025-05-18 14:42:15   timer_27_c15    19.05.2025 00:00:01
     2025-05-18 14:42:15   timer_28_c15    18.05.2025 23:59:45
     2025-05-18 14:42:15   timer_29_c15    18.05.2025 23:59:47
     2025-05-18 14:42:15   timer_30_c16    19.05.2025 00:00:01
     2025-05-18 14:42:15   timer_31_c16    18.05.2025 23:59:50
     2025-05-18 14:42:15   timer_32_c16    18.05.2025 23:59:52
     2025-05-18 14:42:15   timer_33_c18    19.05.2025 00:00:01
     2025-05-18 14:42:15   timer_34_c18    18.05.2025 23:59:40
     2025-05-18 14:42:15   timer_35_c19    19.05.2025 00:00:01
     2025-05-18 14:42:15   timer_36_c19    18.05.2025 23:59:45
     2025-05-18 14:42:15   timer_37_c19    18.05.2025 23:59:47
     2025-05-18 14:42:15   timer_38_c20    19.05.2025 00:00:01
     2025-05-18 14:42:15   timer_39_c20    18.05.2025 23:59:50
     2025-05-18 14:42:15   timer_40_c20    18.05.2025 23:59:52
     2025-05-18 14:42:15   timer_41_c22    19.05.2025 00:00:01
     2025-05-18 14:42:15   timer_42_c22    18.05.2025 23:59:40
     2025-05-18 14:42:15   timer_43_c23    19.05.2025 00:00:01
     2025-05-18 14:42:15   timer_44_c23    18.05.2025 23:59:45
     2025-05-18 14:42:15   timer_45_c23    18.05.2025 23:59:47
     2025-05-18 14:42:15   timer_46_c24    19.05.2025 00:00:01
     2025-05-18 14:42:15   timer_47_c24    18.05.2025 23:59:50
     2025-05-18 14:42:15   timer_48_c24    18.05.2025 23:59:52
     2025-05-18 15:52:01   warning         condition c22: Argument "-25.73169 kWh" isn't numeric in subtraction (-)

   Regex:
     accu:
     bar:
     barAvg:
     collect:
     cond:
       EZ1_Inverter1:
         0:
         1:
         10:
         11:
         12:
         13:
           &STATE     ^EZ1_Inverter1$
         14:
         15:
         16:
         17:
         18:
         19:
         2:
         20:
         21:
         22:
         23:
         3:
         4:
         5:
         6:
         7:
         8:
         9:
       EZ1_Inverter2:
         0:
         1:
         10:
         11:
         12:
         13:
         14:
         15:
         16:
         17:
           &STATE     ^EZ1_Inverter2$
         18:
         19:
         2:
         20:
         21:
         22:
         23:
         3:
         4:
         5:
         6:
         7:
         8:
         9:
       ShellyPro_3EM_1:
         0:
         1:
         10:
         11:
         12:
         13:
         14:
         15:
         16:
         17:
         18:
         19:
         2:
         20:
         21:
           &STATE     ^ShellyPro_3EM_1$
         22:
         23:
         3:
         4:
         5:
         6:
         7:
         8:
         9:
       Shelly_01:
         0:
         1:
           &STATE     ^Shelly_01$
         10:
         11:
         12:
         13:
         14:
         15:
         16:
         17:
         18:
         19:
         2:
         20:
         21:
         22:
         23:
         3:
         4:
         5:
         6:
         7:
         8:
         9:
       Shelly_03:
         0:
         1:
         10:
         11:
         12:
         13:
         14:
         15:
         16:
         17:
         18:
         19:
         2:
         20:
         21:
         22:
         23:
         3:
         4:
         5:
           &STATE     ^Shelly_03$
         6:
         7:
         8:
         9:
       Shelly_04:
         0:
         1:
         10:
         11:
         12:
         13:
         14:
         15:
         16:
         17:
         18:
         19:
         2:
         20:
         21:
         22:
         23:
         3:
         4:
         5:
         6:
         7:
         8:
         9:
           &STATE     ^Shelly_04$
   condition:
     0         
   
     1           
         if (::EventDoIf('Shelly_01',$hash,'^energy:.*$',1)) {fhem ("setreading Shelly_01 energy_day_ongoing ".((::ReadingValDoIf($hash,'Shelly_01','energy')) - (::ReadingValDoIf($hash,'Shelly_01','energy_morning','0'))))}

         if (::DOIF_time_once($hash,0,$wday)) {fhem ("setreading Shelly_01 energy_morning ".(::ReadingValDoIf($hash,'Shelly_01','energy'))); fhem("setreading Shelly_01 energy_day_ongoing 0")}

         if (::DOIF_time_once($hash,1,$wday)) {fhem ("setreading Shelly_01 energy_day ".(::ReadingValDoIf($hash,'Shelly_01','energy_day_ongoing','0')))}

       
     10         
         if (::DOIF_time_once($hash,18,$wday) and ($mday == 1)) {fhem ("setreading Shelly_04 energy_month_ongoing 0")}

         if (::DOIF_time_once($hash,19,$wday)) {fhem ("setreading Shelly_04 energy_month_ongoing ".((::ReadingValDoIf($hash,'Shelly_04','energy_month_ongoing','0')) + (::ReadingValDoIf($hash,'Shelly_04','energy_day_ongoing','0'))))}

         if (::DOIF_time_once($hash,20,$wday) and (strftime("%d", localtime(time+86400)) eq "01"))
    {
      fhem ("setreading $DEVICE energy_month ::ReadingValDoIf($hash,'Shelly_04','energy_month_ongoing')")
     }
 
     11         
                   if (::DOIF_time_once($hash,21,$wday) and ($yday == 0)) {fhem ("setreading Shelly_04 energy_year_ongoing 0")}

         if (::DOIF_time_once($hash,22,$wday)) {fhem ("setreading Shelly_04 energy_year_ongoing ".((::ReadingValDoIf($hash,'Shelly_04','energy_year_ongoing','0')) + (::ReadingValDoIf($hash,'Shelly_04','energy_day_ongoing','0'))))}

         if (::DOIF_time_once($hash,23,$wday) and $md eq "12-31")
    {
      fhem ("setreading $DEVICE energy_year ::ReadingValDoIf($hash,'Shelly_04','energy_year_ongoing')")
     }
 
     12         
   
     13         
         if (::EventDoIf('EZ1_Inverter1',$hash,'^total_energy:.*$',1)) {fhem ("setreading EZ1_Inverter1 energy_day_ongoing ".((::ReadingValDoIf($hash,'EZ1_Inverter1','total_energy')) - (::ReadingValDoIf($hash,'EZ1_Inverter1','energy_morning','0'))))}

         if (::DOIF_time_once($hash,24,$wday)) {fhem ("setreading EZ1_Inverter1 energy_morning ".(::ReadingValDoIf($hash,'EZ1_Inverter1','total_energy'))); fhem("setreading EZ1_Inverter1 energy_day_ongoing 0")}

         if (::DOIF_time_once($hash,25,$wday)) {fhem ("setreading EZ1_Inverter1 energy_day ".(::ReadingValDoIf($hash,'EZ1_Inverter1','energy_day_ongoing','0')))}

       
     14         
         if (::DOIF_time_once($hash,26,$wday) and ($mday == 1)) {fhem ("setreading EZ1_Inverter1 energy_month_ongoing 0")}

         if (::DOIF_time_once($hash,27,$wday)) {fhem ("setreading EZ1_Inverter1 energy_month_ongoing ".((::ReadingValDoIf($hash,'EZ1_Inverter1','energy_month_ongoing','0')) + (::ReadingValDoIf($hash,'EZ1_Inverter1','energy_day_ongoing','0'))))}

         if (::DOIF_time_once($hash,28,$wday) and (strftime("%d", localtime(time+86400)) eq "01"))
    {
      fhem ("setreading $DEVICE energy_month ::ReadingValDoIf($hash,'EZ1_Inverter1','energy_month_ongoing')")
     }
 
     15         
                   if (::DOIF_time_once($hash,29,$wday) and ($yday == 0)) {fhem ("setreading EZ1_Inverter1 energy_year_ongoing 0")}

         if (::DOIF_time_once($hash,30,$wday)) {fhem ("setreading EZ1_Inverter1 energy_year_ongoing ".((::ReadingValDoIf($hash,'EZ1_Inverter1','energy_year_ongoing','0')) + (::ReadingValDoIf($hash,'EZ1_Inverter1','energy_day_ongoing','0'))))}

         if (::DOIF_time_once($hash,31,$wday) and $md eq "12-31")
    {
      fhem ("setreading $DEVICE energy_year ::ReadingValDoIf($hash,'EZ1_Inverter1','energy_year_ongoing')")
     }
 
     16         
   
     17         
         if (::EventDoIf('EZ1_Inverter2',$hash,'^total_energy:.*$',1)) {fhem ("setreading EZ1_Inverter2 energy_day_ongoing ".((::ReadingValDoIf($hash,'EZ1_Inverter2','total_energy')) - (::ReadingValDoIf($hash,'EZ1_Inverter2','energy_morning','0'))))}

         if (::DOIF_time_once($hash,32,$wday)) {fhem ("setreading EZ1_Inverter2 energy_morning ".(::ReadingValDoIf($hash,'EZ1_Inverter2','total_energy'))); fhem("setreading EZ1_Inverter2 energy_day_ongoing 0")}

         if (::DOIF_time_once($hash,33,$wday)) {fhem ("setreading EZ1_Inverter2 energy_day ".(::ReadingValDoIf($hash,'EZ1_Inverter2','energy_day_ongoing','0')))}

       
     18         
         if (::DOIF_time_once($hash,34,$wday) and ($mday == 1)) {fhem ("setreading EZ1_Inverter2 energy_month_ongoing 0")}

         if (::DOIF_time_once($hash,35,$wday)) {fhem ("setreading EZ1_Inverter2 energy_month_ongoing ".((::ReadingValDoIf($hash,'EZ1_Inverter2','energy_month_ongoing','0')) + (::ReadingValDoIf($hash,'EZ1_Inverter2','energy_day_ongoing','0'))))}

         if (::DOIF_time_once($hash,36,$wday) and (strftime("%d", localtime(time+86400)) eq "01"))
    {
      fhem ("setreading $DEVICE energy_month ::ReadingValDoIf($hash,'EZ1_Inverter2','energy_month_ongoing')")
     }
 
     19         
                   if (::DOIF_time_once($hash,37,$wday) and ($yday == 0)) {fhem ("setreading EZ1_Inverter2 energy_year_ongoing 0")}

         if (::DOIF_time_once($hash,38,$wday)) {fhem ("setreading EZ1_Inverter2 energy_year_ongoing ".((::ReadingValDoIf($hash,'EZ1_Inverter2','energy_year_ongoing','0')) + (::ReadingValDoIf($hash,'EZ1_Inverter2','energy_day_ongoing','0'))))}

         if (::DOIF_time_once($hash,39,$wday) and $md eq "12-31")
    {
      fhem ("setreading $DEVICE energy_year ::ReadingValDoIf($hash,'EZ1_Inverter2','energy_year_ongoing')")
     }
 
     2           
         if (::DOIF_time_once($hash,2,$wday) and ($mday == 1)) {fhem ("setreading Shelly_01 energy_month_ongoing 0")}

         if (::DOIF_time_once($hash,3,$wday)) {fhem ("setreading Shelly_01 energy_month_ongoing ".((::ReadingValDoIf($hash,'Shelly_01','energy_month_ongoing','0')) + (::ReadingValDoIf($hash,'Shelly_01','energy_day_ongoing','0'))))}

         if (::DOIF_time_once($hash,4,$wday) and (strftime("%d", localtime(time+86400)) eq "01"))
    {
      fhem ("setreading $DEVICE energy_month ::ReadingValDoIf($hash,'Shelly_01','energy_month_ongoing')")
     }
 
     20         
   
     21         
         if (::EventDoIf('ShellyPro_3EM_1',$hash,'^Total_Energy_S:.*$',1)) {fhem ("setreading ShellyPro_3EM_1 energy_day_ongoing ".((::ReadingValDoIf($hash,'ShellyPro_3EM_1','Total_Energy_S')) - (::ReadingValDoIf($hash,'ShellyPro_3EM_1','energy_morning','0'))))}

         if (::DOIF_time_once($hash,40,$wday)) {fhem ("setreading ShellyPro_3EM_1 energy_morning ".(::ReadingValDoIf($hash,'ShellyPro_3EM_1','Total_Energy_S'))); fhem("setreading ShellyPro_3EM_1 energy_day_ongoing 0")}

         if (::DOIF_time_once($hash,41,$wday)) {fhem ("setreading ShellyPro_3EM_1 energy_day ".(::ReadingValDoIf($hash,'ShellyPro_3EM_1','energy_day_ongoing','0')))}

       
     22         
         if (::DOIF_time_once($hash,42,$wday) and ($mday == 1)) {fhem ("setreading ShellyPro_3EM_1 energy_month_ongoing 0")}

         if (::DOIF_time_once($hash,43,$wday)) {fhem ("setreading ShellyPro_3EM_1 energy_month_ongoing ".((::ReadingValDoIf($hash,'ShellyPro_3EM_1','energy_month_ongoing','0')) + (::ReadingValDoIf($hash,'ShellyPro_3EM_1','energy_day_ongoing','0'))))}

         if (::DOIF_time_once($hash,44,$wday) and (strftime("%d", localtime(time+86400)) eq "01"))
    {
      fhem ("setreading $DEVICE energy_month ::ReadingValDoIf($hash,'ShellyPro_3EM_1','energy_month_ongoing')")
     }
 
     23         
                   if (::DOIF_time_once($hash,45,$wday) and ($yday == 0)) {fhem ("setreading ShellyPro_3EM_1 energy_year_ongoing 0")}

         if (::DOIF_time_once($hash,46,$wday)) {fhem ("setreading ShellyPro_3EM_1 energy_year_ongoing ".((::ReadingValDoIf($hash,'ShellyPro_3EM_1','energy_year_ongoing','0')) + (::ReadingValDoIf($hash,'ShellyPro_3EM_1','energy_day_ongoing','0'))))}

         if (::DOIF_time_once($hash,47,$wday) and $md eq "12-31")
    {
      fhem ("setreading $DEVICE energy_year ::ReadingValDoIf($hash,'ShellyPro_3EM_1','energy_year_ongoing')")
     }
 
     3           
                   if (::DOIF_time_once($hash,5,$wday) and ($yday == 0)) {fhem ("setreading Shelly_01 energy_year_ongoing 0")}

         if (::DOIF_time_once($hash,6,$wday)) {fhem ("setreading Shelly_01 energy_year_ongoing ".((::ReadingValDoIf($hash,'Shelly_01','energy_year_ongoing','0')) + (::ReadingValDoIf($hash,'Shelly_01','energy_day_ongoing','0'))))}

         if (::DOIF_time_once($hash,7,$wday) and $md eq "12-31")
    {
      fhem ("setreading $DEVICE energy_year ::ReadingValDoIf($hash,'Shelly_01','energy_year_ongoing')")
     }
 
     4         
   
     5           
         if (::EventDoIf('Shelly_03',$hash,'^energy:.*$',1)) {fhem ("setreading Shelly_03 energy_day_ongoing ".((::ReadingValDoIf($hash,'Shelly_03','energy')) - (::ReadingValDoIf($hash,'Shelly_03','energy_morning','0'))))}

         if (::DOIF_time_once($hash,8,$wday)) {fhem ("setreading Shelly_03 energy_morning ".(::ReadingValDoIf($hash,'Shelly_03','energy'))); fhem("setreading Shelly_03 energy_day_ongoing 0")}

         if (::DOIF_time_once($hash,9,$wday)) {fhem ("setreading Shelly_03 energy_day ".(::ReadingValDoIf($hash,'Shelly_03','energy_day_ongoing','0')))}

       
     6           
         if (::DOIF_time_once($hash,10,$wday) and ($mday == 1)) {fhem ("setreading Shelly_03 energy_month_ongoing 0")}

         if (::DOIF_time_once($hash,11,$wday)) {fhem ("setreading Shelly_03 energy_month_ongoing ".((::ReadingValDoIf($hash,'Shelly_03','energy_month_ongoing','0')) + (::ReadingValDoIf($hash,'Shelly_03','energy_day_ongoing','0'))))}

         if (::DOIF_time_once($hash,12,$wday) and (strftime("%d", localtime(time+86400)) eq "01"))
    {
      fhem ("setreading $DEVICE energy_month ::ReadingValDoIf($hash,'Shelly_03','energy_month_ongoing')")
     }
 
     7           
                   if (::DOIF_time_once($hash,13,$wday) and ($yday == 0)) {fhem ("setreading Shelly_03 energy_year_ongoing 0")}

         if (::DOIF_time_once($hash,14,$wday)) {fhem ("setreading Shelly_03 energy_year_ongoing ".((::ReadingValDoIf($hash,'Shelly_03','energy_year_ongoing','0')) + (::ReadingValDoIf($hash,'Shelly_03','energy_day_ongoing','0'))))}

         if (::DOIF_time_once($hash,15,$wday) and $md eq "12-31")
    {
      fhem ("setreading $DEVICE energy_year ::ReadingValDoIf($hash,'Shelly_03','energy_year_ongoing')")
     }
 
     8         
   
     9           
         if (::EventDoIf('Shelly_04',$hash,'^energy:.*$',1)) {fhem ("setreading Shelly_04 energy_day_ongoing ".((::ReadingValDoIf($hash,'Shelly_04','energy')) - (::ReadingValDoIf($hash,'Shelly_04','energy_morning','0'))))}

         if (::DOIF_time_once($hash,16,$wday)) {fhem ("setreading Shelly_04 energy_morning ".(::ReadingValDoIf($hash,'Shelly_04','energy'))); fhem("setreading Shelly_04 energy_day_ongoing 0")}

         if (::DOIF_time_once($hash,17,$wday)) {fhem ("setreading Shelly_04 energy_day ".(::ReadingValDoIf($hash,'Shelly_04','energy_day_ongoing','0')))}

       
   days:
   defs:
     tpl:
       TPL_UpdateEnergy

        $1_Debug
  {
   }
 
        $1_EnergyDay 
  {
         if ([$1:"^$2:.*$"]) {fhem ("setreading $1 energy_day_ongoing ".(([?$1:$2]) - ([?$1:energy_morning,0])))}

         if ([00:00:01]) {fhem ("setreading $1 energy_morning ".([?$1:$2])); fhem("setreading $1 energy_day_ongoing 0")}

         if ([23:59:40]) {fhem ("setreading $1 energy_day ".([?$1:energy_day_ongoing,0]))}

        }

        $1_EnergyMonth
  {
         if ([00:00:01] and ($mday == 1)) {fhem ("setreading $1 energy_month_ongoing 0")}

         if ([23:59:45]) {fhem ("setreading $1 energy_month_ongoing ".(([?$1:energy_month_ongoing,0]) + ([?$1:energy_day_ongoing,0])))}

         if ([23:59:47] and (strftime("%d", localtime(time+86400)) eq "01"))
    {
      fhem ("setreading $DEVICE energy_month [?$1:energy_month_ongoing]")
     }
  }

        $1_EnergyYear
  {
                   if ([00:00:01] and ($yday == 0)) {fhem ("setreading $1 energy_year_ongoing 0")}

         if ([23:59:50]) {fhem ("setreading $1 energy_year_ongoing ".(([?$1:energy_year_ongoing,0]) + ([?$1:energy_day_ongoing,0])))}

         if ([23:59:52] and $md eq "12-31")
    {
      fhem ("setreading $DEVICE energy_year [?$1:energy_year_ongoing]")
     }
  }


   helper:
     NOTIFYDEV  EZ1_Inverter1,Shelly_04,Shelly_03,ShellyPro_3EM_1,Shelly_01,EZ1_Inverter2,global
     event      Total_Energy_S: -25.73169 kWh
     globalinit 1
     last_timer 48
     sleeptimer -1
     triggerDev ShellyPro_3EM_1
     triggerEvents:
       Returned_Energy_A: 27.79702 kWh
       Purchased_Energy_B: 17.90265 kWh
       Returned_Energy_B: 1.17326 kWh
       Returned_Energy_C: 24.35751 kWh
       Purchased_Energy_S: 27.59610 kWh
       Returned_Energy_S: 53.32779 kWh
       Total_Energy_S: -25.73169 kWh
       Active_Power_calculated: -579.6 W ( -34776 Ws = -9.66 Wh in 60 s )
       energy_day_ongoing: -25.73169
     triggerEventsState:
       Returned_Energy_A: 27.79702 kWh
       Purchased_Energy_B: 17.90265 kWh
       Returned_Energy_B: 1.17326 kWh
       Returned_Energy_C: 24.35751 kWh
       Purchased_Energy_S: 27.59610 kWh
       Returned_Energy_S: 53.32779 kWh
       Total_Energy_S: -25.73169 kWh
       Active_Power_calculated: -579.6 W ( -34776 Ws = -9.66 Wh in 60 s )
       energy_day_ongoing: -25.73169
   internals:
   intervalfunc:
   localtime:
     0          1747605601
     1          1747605580
     10         1747605601
     11         1747605585
     12         1747605587
     13         1747605601
     14         1747605590
     15         1747605592
     16         1747605601
     17         1747605580
     18         1747605601
     19         1747605585
     2          1747605601
     20         1747605587
     21         1747605601
     22         1747605590
     23         1747605592
     24         1747605601
     25         1747605580
     26         1747605601
     27         1747605585
     28         1747605587
     29         1747605601
     3          1747605585
     30         1747605590
     31         1747605592
     32         1747605601
     33         1747605580
     34         1747605601
     35         1747605585
     36         1747605587
     37         1747605601
     38         1747605590
     39         1747605592
     4          1747605587
     40         1747605601
     41         1747605580
     42         1747605601
     43         1747605585
     44         1747605587
     45         1747605601
     46         1747605590
     47         1747605592
     5          1747605601
     6          1747605590
     7          1747605592
     8          1747605601
     9          1747605580
   perlblock:
     0          Shelly_01_Debug
     1          Shelly_01_EnergyDay
     10         Shelly_04_EnergyMonth
     11         Shelly_04_EnergyYear
     12         EZ1_Inverter1_Debug
     13         EZ1_Inverter1_EnergyDay
     14         EZ1_Inverter1_EnergyMonth
     15         EZ1_Inverter1_EnergyYear
     16         EZ1_Inverter2_Debug
     17         EZ1_Inverter2_EnergyDay
     18         EZ1_Inverter2_EnergyMonth
     19         EZ1_Inverter2_EnergyYear
     2          Shelly_01_EnergyMonth
     20         ShellyPro_3EM_1_Debug
     21         ShellyPro_3EM_1_EnergyDay
     22         ShellyPro_3EM_1_EnergyMonth
     23         ShellyPro_3EM_1_EnergyYear
     3          Shelly_01_EnergyYear
     4          Shelly_03_Debug
     5          Shelly_03_EnergyDay
     6          Shelly_03_EnergyMonth
     7          Shelly_03_EnergyYear
     8          Shelly_04_Debug
     9          Shelly_04_EnergyDay
   readings:
   realtime:
     0          00:00:01
     1          23:59:40
     10         00:00:01
     11         23:59:45
     12         23:59:47
     13         00:00:01
     14         23:59:50
     15         23:59:52
     16         00:00:01
     17         23:59:40
     18         00:00:01
     19         23:59:45
     2          00:00:01
     20         23:59:47
     21         00:00:01
     22         23:59:50
     23         23:59:52
     24         00:00:01
     25         23:59:40
     26         00:00:01
     27         23:59:45
     28         23:59:47
     29         00:00:01
     3          23:59:45
     30         23:59:50
     31         23:59:52
     32         00:00:01
     33         23:59:40
     34         00:00:01
     35         23:59:45
     36         23:59:47
     37         00:00:01
     38         23:59:50
     39         23:59:52
     4          23:59:47
     40         00:00:01
     41         23:59:40
     42         00:00:01
     43         23:59:45
     44         23:59:47
     45         00:00:01
     46         23:59:50
     47         23:59:52
     5          00:00:01
     6          23:59:50
     7          23:59:52
     8          00:00:01
     9          23:59:40
   time:
     0          00:00:01
     1          23:59:40
     10         00:00:01
     11         23:59:45
     12         23:59:47
     13         00:00:01
     14         23:59:50
     15         23:59:52
     16         00:00:01
     17         23:59:40
     18         00:00:01
     19         23:59:45
     2          00:00:01
     20         23:59:47
     21         00:00:01
     22         23:59:50
     23         23:59:52
     24         00:00:01
     25         23:59:40
     26         00:00:01
     27         23:59:45
     28         23:59:47
     29         00:00:01
     3          23:59:45
     30         23:59:50
     31         23:59:52
     32         00:00:01
     33         23:59:40
     34         00:00:01
     35         23:59:45
     36         23:59:47
     37         00:00:01
     38         23:59:50
     39         23:59:52
     4          23:59:47
     40         00:00:01
     41         23:59:40
     42         00:00:01
     43         23:59:45
     44         23:59:47
     45         00:00:01
     46         23:59:50
     47         23:59:52
     5          00:00:01
     6          23:59:50
     7          23:59:52
     8          00:00:01
     9          23:59:40
   timeCond:
     0          1
     1          1
     10         6
     11         6
     12         6
     13         7
     14         7
     15         7
     16         9
     17         9
     18         10
     19         10
     2          2
     20         10
     21         11
     22         11
     23         11
     24         13
     25         13
     26         14
     27         14
     28         14
     29         15
     3          2
     30         15
     31         15
     32         17
     33         17
     34         18
     35         18
     36         18
     37         19
     38         19
     39         19
     4          2
     40         21
     41         21
     42         22
     43         22
     44         22
     45         23
     46         23
     47         23
     5          3
     6          3
     7          3
     8          5
     9          5
   timer:
     0          0
     1          0
     10         0
     11         0
     12         0
     13         0
     14         0
     15         0
     16         0
     17         0
     18         0
     19         0
     2          0
     20         0
     21         0
     22         0
     23         0
     24         0
     25         0
     26         0
     27         0
     28         0
     29         0
     3          0
     30         0
     31         0
     32         0
     33         0
     34         0
     35         0
     36         0
     37         0
     38         0
     39         0
     4          0
     40         0
     41         0
     42         0
     43         0
     44         0
     45         0
     46         0
     47         0
     5          0
     6          0
     7          0
     8          0
     9          0
   timers:
     1           0  1
     10          18  19  20
     11          21  22  23
     13          24  25
     14          26  27  28
     15          29  30  31
     17          32  33
     18          34  35  36
     19          37  38  39
     2           2  3  4
     21          40  41
     22          42  43  44
     23          45  46  47
     3           5  6  7
     5           8  9
     6           10  11  12
     7           13  14  15
     9           16  17
   trigger:
     all         Shelly_01 Shelly_03 Shelly_04 EZ1_Inverter1 EZ1_Inverter2 ShellyPro_3EM_1
   triggertime:
     1747605580:
       localtime  1747605580
       hash:
     1747605585:
       localtime  1747605585
       hash:
     1747605587:
       localtime  1747605587
       hash:
     1747605590:
       localtime  1747605590
       hash:
     1747605592:
       localtime  1747605592
       hash:
     1747605601:
       localtime  1747605601
       hash:
   uiState:
   uiTable:
Attributes:
   room       Interfaces,Shelly

Hier z.B. die mehrfachen Einträge

Du darfst diesen Dateianhang nicht ansehen.

Ich habe eigentlich alle Aggregationsangaben mit dem Fragezeichen versehen, die nicht triggern sollen.
Aber warum triggert [23:59:40] zweimal ?

Für einen Tipp dankbar
Gruss
Joe
FHEM auf RaspberryPI B (buster)
2xCUL868 für MAX/Slow_RF, HM-LAN, JeeLink
MAX!/HM-Thermostate, FS20/HM-Rolladenschalter, FS20-EM, LevelJet-Ölstandsmessung, PCA301, IT, KM271, IPCAM, FireTAB10 FTUI