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)
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.
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.
Vielen lieben Dank,
da sieht man es wieder mal: "Wer lesen kann ist klar im Vorteil" :-)
Ich hatte es nicht registriert.
mvh
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
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.
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 ...
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.
Frage zu den Images, kann man das in FTUI3 auch visualisieren?
Schaut schon toll aus.
Ob jemand uiTable tatsächlich in FTUI3 nutzt, weiß ich nicht, hier gab es schon mal Diskussionen dazu:
https://forum.fhem.de/index.php?topic=129898.msg1241999#msg1241999
https://forum.fhem.de/index.php?topic=140096.msg1327921#msg1327921
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
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.
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
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.
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
2025-05-18_15h54_42.png
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
Das doppelte Triggern kann ich mir nicht erklären. Du musst das Problem einkreisen. Du könntest ein zweites DOIF mit gleicher Template-Definition anlegen und dort nur das eine Reading im Template angeben und schauen ob das Problem wieder auftritt.
Hallo Damian,
Ich habe nun das Device kopiert und alles auskommentiert bis auf zwei Zeilen und nur ein Device eingebunden.
Minütliches Update des Readings um das debuggen zu vereinfachen.
$1_EnergyDay
{
## Taeglichen Energieverbrauch aufsteigend in Reading schreiben
if ([$1:"^$2:.*$"]) {fhem ("setreading $1 JR_energy_day_ongoing ".(([?$1:$2:d]) - ([?$1:JR_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 JR_energy_morning ".([?$1:$2:d])); fhem("setreading $1 JR_energy_day_ongoing 0")}
## Taeglichen Energieverbrauch abends in separates Reading uebernehmen
## if ([23:59:40]) {fhem ("setreading $1 JR_energy_day ".([?$1:JR_energy_day_ongoing,0:d]))}
if ([+00:01]) {fhem ("setreading $1 JR_energy_day ".([?$1:JR_energy_day_ongoing,0:d]))}
## Taeglichen Energieverbrauch dann wieder loeschen. (Verbleibt aber im Logfile)
## if ([23:59:55]) {fhem ("deletereading $1 energy_day")}
}
So bekomme ich immer 2 Einträge im Log jede Minute.
2025-05-19_21:16:01 EZ1_Inverter1 JR_energy_day: 132.8055
2025-05-19_21:16:01 EZ1_Inverter1 JR_energy_day: 132.8055
2025-05-19_21:17:02 EZ1_Inverter1 JR_energy_day: 132.8055
2025-05-19_21:17:02 EZ1_Inverter1 JR_energy_day: 132.8055
2025-05-19_21:18:02 EZ1_Inverter1 JR_energy_day: 132.8055
2025-05-19_21:18:02 EZ1_Inverter1 JR_energy_day: 132.8055
2025-05-19_21:19:02 EZ1_Inverter1 JR_energy_day: 132.8055
2025-05-19_21:19:02 EZ1_Inverter1 JR_energy_day: 132.8055
Wenn ich die erste Zeile auskommentiere habe ich nur einen Eintrag.
Verstehen tue ich das nicht.
Ich muss das irgendwie fixen ...
Hast Du noch eine Idee ?
Danke
Joe
Jeder Perlblock reagiert auf alle Trigger, die sich innerhalb des Block befinden. Durch setreading erzeugst du einen Trigger auf den du im selben Block (erste Zeile) reagierst - der Block wird erneut ausgeführt. Offenbar ist hier noch die Zeitbedingung wahr und führt zur wiederholten Ausführung.
Als Tipp habe ich noch ein paar Verbesserungsvorschläge.
1) Wenn man sich meine Lösung anschaut, dann sieht man, dass ich immer nur einen Timer für beliebig viele Readings habe und nicht für jedes Reading einen eigenen.
2) Pro Perlblock habe ich nur einen Trigger und nicht mehrere, das führt zu keinen Nebeneffekten und belastet wie bei 1) das System weniger.
Hallo Damian,
Danke.
2 Blöcke drauss gemacht und schon hab ich nur noch einen Eintrag im Logfile.
bzgl. nur einem Timer
Es ist hier wichtig, dass Befehle hintereinander bzw. in der richtigen Reihenfolge ablaufen. Deshalb auch die vielen Timer.
Ist es gewährleistet, dass wenn ich z.B. 3 fhem Befehle hintereinander absetze, der nächste erst ausgeführt wird, wenn der vorherige komplett beendet ist ?
Oder könnte es sein, dass mehrere parallel ausgeführt werden und das Ganze durcheinander kommt ?
Gruss
Joe
Zitat von: cotecmania am 20 Mai 2025, 17:08:02Hallo Damian,
Danke.
2 Blöcke drauss gemacht und schon hab ich nur noch einen Eintrag im Logfile.
bzgl. nur einem Timer
Es ist hier wichtig, dass Befehle hintereinander bzw. in der richtigen Reihenfolge ablaufen. Deshalb auch die vielen Timer.
Ist es gewährleistet, dass wenn ich z.B. 3 fhem Befehle hintereinander absetze, der nächste erst ausgeführt wird, wenn der vorherige komplett beendet ist ?
Oder könnte es sein, dass mehrere parallel ausgeführt werden und das Ganze durcheinander kommt ?
Gruss
Joe
Parallel gibt es in FHEM nicht, sondern immer nur sequentiell. Timer werden im FHEM-System gesetzt. Wenn die gleiche Zeit definiert ist, dann weiß ich nicht, ob FHEM die Reihenfolge, in der sie definiert wurden einhält. Es könnte sein, dass es nicht der Fall ist.