Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)

Begonnen von ch.eick, 07 Oktober 2020, 16:09:12

Vorheriges Thema - Nächstes Thema

misux

Doch doch, ich behaupte mal das alles i.o. ist... Siehe Bild

Die Modbus version ist die gleiche.
Kann es nur nicht so laufen lasse weil sonst das Logfile bald den raspberry sprengt...

misux

Und das mit dem megabreiten fenster werd ich mal im Anfängerforum posten, vielleicht erbarmt sich ja mal jemand... Das f11 style funktioniert perfekt.

ch.eick

Zitat von: misux am 28 Dezember 2021, 10:10:44
Und das mit dem megabreiten fenster werd ich mal im Anfängerforum posten, vielleicht erbarmt sich ja mal jemand... Das f11 style funktioniert perfekt.
Okay, aber auch das f11 ist über breit.
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

misux

Nö, bei mir stellt er f11 und f18 super dar. so wie es sein soll...

ch.eick

Zitat von: misux am 28 Dezember 2021, 10:42:03
Nö, bei mir stellt er f11 und f18 super dar. so wie es sein soll...
Dann wird das auch noch mit dem Bildschirm zusammen hängen.
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

misux

okay, aber wie du sagst ist das erstmal nebensächtlich..

Aber mein Problem mit den Logeinträgen... hast du da noch eine Idee? Weil ich weiß da definitiv nicht weiter...

EDIT:
Auch das ist gelöst. Das attribut verbose 0 wurde nicht mit dem RAW editor übernommen. Habe es manuell eingetragen.

misux

So, bin dabei die API einzurichten... Leider bekomme ich wieder n Error bei den Einträgen in der 99_myUtils:

Can't locate Crypt/URandom.pm in @INC (you may need to install the Crypt::URandom module) (@INC contains: ./FHEM/lib ./lib ./FHEM . /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.28.1 /usr/local/share/perl/5.28.1 /usr/lib/arm-linux-gnueabihf/perl5/5.28 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.28 /usr/share/perl/5.28 /usr/local/lib/site_perl /usr/lib/arm-linux-gnueabihf/perl-base) at ./FHEM/99_myUtils.pm line 14. BEGIN failed--compilation aborted at ./FHEM/99_myUtils.pm line 14.

die beiden Module hatte ich schon aktuell:
    sudo apt-get install libcryptx-perl
    sudo apt-get install libpbkdf2-tiny-perl

Und nu...? :-X Sorry das es hier so doof läuft, habs mir auch anders vorgestellt... :-[

DS_Starter

Ich verwende zum Nachinstalieren von Perl Modulen gern den FHEM Installer.
Das ein FHEM Modul. Du definierst ein Device mit:


define fhemInstaller Installer


Und dann in deinem Fall  "set fhemInstaller installPerl Crypt::URandom".

Sollte dann passen.
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

misux

OK!

Habs installiert. und alle recommended und suggesten außer DBD::Pg installiert.

Bei dem DBD::Pg bekomme ich einen Error:
error 'installPerl DBD::Pg'

Crypt::URandom ist installiert. Weiter gehts! Vielen Dank!

DS_Starter

DBD::Pg brauchst du nur wenn du PostgreSQL mit DbLog einsetzt. Also o.k. soweit.
Viel Erfolg ...
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

misux

WOW!

Ich habs geschafft! OKAY! 8) Soweit so gut... Nur wenn ich mir das so ansehe weis ich nicht so recht was oder von wem die API die Daten geholt hat, jedenfalls nicht von mir.. ;D

Die Daten können nicht passen... Meine Anlage läuft seit August und ich habe auch diesen Monat so einiges vom Netz bezogen... Siehe Bilder

Wo liegt jetzt der Fehler?

P.S. ich habe, war mir nicht sicher ob es so gemacht werden sollte, alle %IP-WR% in der RAW in meine Kostal IP geändert...
sieht jetzt also über all so aus: http://192.168.1.37/api/v1/.....

Und den Monatswert auf dem Kostal seite verstehe ich bis heute nicht...
Monat 171,7
Hausverbrauch 301,8
aus PV 55,1
aus Netz 183,5
aus Batterie 67,7

ich kann hin und her rechnen aber auf diese 171,1 komme ich nicht.... was ist das?

Und der Jahreswert ist noch schlimmer nur viel größer... Kapiere ich nicht

ch.eick

Zitat von: misux am 28 Dezember 2021, 23:31:18
Nur wenn ich mir das so ansehe weis ich nicht so recht was oder von wem die API die Daten geholt hat, jedenfalls nicht von mir.. ;D

Die Daten können nicht passen... Meine Anlage läuft seit August und ich habe auch diesen Monat so einiges vom Netz bezogen... Siehe Bilder

Wo liegt jetzt der Fehler?
such, such, such,.... :-)
Zitat
Und den Monatswert auf dem Kostal Seite verstehe ich bis heute nicht...
Monat 171,7
Hausverbrauch 301,8
aus PV 55,1
aus Netz 183,5
aus Batterie 67,7

ich kann hin und her rechnen aber auf diese 171,1 komme ich nicht.... was ist das?

Und der Jahreswert ist noch schlimmer nur viel größer... Kapiere ich nicht
183,5 + 55,1 - 67,7 = 171
Das mit dem Speicher ist immer etwas verwirrend, da der im Hochvolt Bereich ist wird der Ertrag erst nach der Speicherentnahme als Ertrag gerechnet.
Ich hoffe das stimmt jetzt so, wenn nicht kannst Du das im photovoltaikforum.de mal nachfragen. Das hatte ich vor 2 jahren mal versucht zu verstehen.

Wahrscheinlich hast Du das PV_Schedule Device noch nicht in Verwendung. Daraus brauchst Du das cmd_1 , cmd_4 und cmd_5.
Bei cmd_1 kannst Du erstmal das Schattenmanagement entfernen.

Im cmd_5 werden täglich, monatich und jährlich die Zählerstände als "*_init_*" readings im Device gespeichert und für die Statistik Korrektur im Schwarm verwendet.
Bei nur einem WR könnte man das wieder zurück bauen, oder Du verwendest es weiter, damit über alle Anwender die Devices gleich sind.

Für den aller ersten Start des Konstruktes müsstest Du die readings einmal für Day, Month und Year mit Deinen Werten vom KSEM setzen. Das kann man auch etwas schätzen,
bis die Statistiken richtig passen und mit dem nächsten 1. des Monats werden dann alle richtig gesetzt. Du hast auch die Ehre einen Jahres Wechsel zu haben :-)

Zitat
P.S. ich habe, war mir nicht sicher ob es so gemacht werden sollte, alle %IP-WR% in der RAW in meine Kostal IP geändert...
sieht jetzt also über all so aus: http://192.168.1.37/api/v1/.....
Die IP-Adresse wird aus dem WR_1_config geholt und dann im WR_1_API Device mit replacement eingesetzt. Das dient der Portabilität, damit nicht jeder im Device jedesmal wieder alles ändern muss.

Die Statistik Werte für das Vorjahr kommen aus einem DbRep Device, was Du später mal einrichten kannst. Das macht eh erst Sinn, wenn es ein volles Jahr in der Datenbank gibt.
Mit DbRep kann man auch später extrem viele Reports oder Vergleiche anfertigen, da mir MySQL fast alles möglich ist, bis hin zu komplexen Berechnungen direkt in der Datenbank.
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

misux

Zitat von: ch.eick am 29 Dezember 2021, 10:24:13

Für den aller ersten Start des Konstruktes müsstest Du die readings einmal für Day, Month und Year mit Deinen Werten vom KSEM setzen. Das kann man auch etwas schätzen,
bis die Statistiken richtig passen und mit dem nächsten 1. des Monats werden dann alle richtig gesetzt. Du hast auch die Ehre einen Jahres Wechsel zu haben :-)


;D  :o der war gut.. klingt logisch, wenn man weis wovon man spricht... Wo müssen denn diese readingwerte gesetzt werden?
ZitatDay, Month und Year mit Deinen Werten vom KSEM
Das soll das Installationsdatum sein oder welches?

Genauso viel verstehe ich da:
ZitatWahrscheinlich hast Du das PV_Schedule Device noch nicht in Verwendung. Daraus brauchst Du das cmd_1 , cmd_4 und cmd_5.
Bei cmd_1 kannst Du erstmal das Schattenmanagement entfernen.
Wo soll ich das Schattenmamagement entfernen? Mienst du bevor ich set cmd1 durchführe soll ich im WR das Schattenmanagement ausschalten? Kapiere nix.

und zwischendurch noch eine Frage zum LogDB...

Ist es okay wenn ich in der def nur "./db.conf WR_1" drin habe? Oder muss unbedingt "./db.conf .*:.*" drin stehen? Also ich brauche nix loggen, habe es nur für den Plenticore erstellt...


ch.eick

Zitat von: misux am 29 Dezember 2021, 21:22:36
;D  :o der war gut.. klingt logisch, wenn man weis wovon man spricht... Wo müssen denn diese readingwerte gesetzt werden? Das soll das Installationsdatum sein oder welches?

Genauso viel verstehe ich da: Wo soll ich das Schattenmamagement entfernen? Mienst du bevor ich set cmd1 durchführe soll ich im WR das Schattenmanagement ausschalten? Kapiere nix.
Hier findest Du ein DOIF mit dem Namen PV_Schedule .
Damit werden die Statistiken und noch einige andere Funktionalitäten regelmäßig ausgeführt.

Hier habe ich Dir mal eine abgespeckte Version für einen WR gemacht.
Das cmd_5 wird jeden Tag um 00:01 ausgeführt und sichert die Zählerstände vom KSEM im WR_1_API Device.

defmod PV_Schedule DOIF ################################################################################################################\
## 1 Plenticore Status aktualisieren. Dies geschieht über das PV_Anlage_1_API Device\
##\
([:57])\
\
   (get WR_1_API 20_Statistic_EnergyFlow)\
\
################################################################################################################\
## 2 PV Prognose vom aktuellen Tag aktualisieren\
##     zwischen 5 und 21 Uhr zur vollen Stunde\
DOELSEIF\
([05:00-21:00] and [:00])\
\
   ({Solar_forecast("LogDB","LogDBRep_PV_Forecast_SQL","WR_1","Solar_Calculation_fc","DWD_Forecast",0)})\
\
################################################################################################################\
## 3 PV Prognose für den nächsten Tag aktualisieren\
## \
DOELSEIF\
([06:55] or [19:11])\
\
   ({Solar_forecast("LogDB","LogDBRep_PV_Forecast_SQL","WR_1","Solar_Calculation_fc","DWD_Forecast",1)})\
\
################################################################################################################\
## 4 regelmäßig die Bilanz aktualisieren, alle 5 Minuten außer um :00\
##\
DOELSEIF\
([+:05] and ![:00])\
\
  (get WR_1_API 04_auth_me)\
\
################################################################################################################\
## 5 Jeden Morgen die Zählerstände aktualisieren, damit im Schwarm die Statistiken berechnet werden können\
##\
##    ## **** sind z.B. meine ersten Zählerwerte, die ich beim aller ersten mal gesetzt hatte\
DOELSEIF\
([00:01])\
\
  (setreading WR_1_API SW_Meter_init_FeedInGrid_Day [WR_0_KSEM:Active_energy-])   ## 6172\
  (setreading WR_1_API SW_Meter_init_Grid_Day [WR_0_KSEM:Active_energy+])         ## 4727\
\
({if ($mday eq 1)\
     {\
      fhem("setreading WR_1_API SW_Meter_init_FeedInGrid_Month [WR_0_KSEM:Active_energy-]");;   ## 5707\
      fhem("setreading WR_1_API SW_Meter_init_Grid_Month [WR_0_KSEM:Active_energy+]");;         ## 4717\
\
      if ($yday eq 1)\
        {\
         fhem("setreading WR_1_API SW_Meter_init_FeedInGrid_Year [WR_0_KSEM:Active_energy-]");;   ## 5241\
         fhem("setreading WR_1_API SW_Meter_init_Grid_Year [WR_0_KSEM:Active_energy+]");;         ## 3517\
        }\
     }\
  }\
)\
\

attr PV_Schedule DbLogExclude .*
attr PV_Schedule alias PV_Schedule
attr PV_Schedule cmdState WR Status|Forecast 0|Forecast 1|Bilanz refresh
attr PV_Schedule comment Version 2021.04.19 12:00
attr PV_Schedule do always
attr PV_Schedule room Strom->Photovoltaik
attr PV_Schedule sortby 11
attr PV_Schedule verbose 0
attr PV_Schedule wait 0,3:0:0:0
attr PV_Schedule webCmd cmd_1:cmd_2:cmd_3:cmd_4
attr PV_Schedule webCmdLabel Statistic :Forecast_0 :Forecast_1 :Bilanz :

mit einem Kommando in der FHEM Kommando Zeile kannst Du die initial Werte vom Dezember noch rückwirkend setzen und so die Statistiken für Dezember korrigieren.
Am 01.01.2022 werden dann alle Werte automatisch gesetzt und dann täglich und monatlich weiter geführt.

setreading WR_1_API SW_Meter_init_FeedInGrid_Month [nnnn]

*_Day muss den Zähterwert von morgens haben
*_Month muss den Zähterwert von morgens am 01. des Monats haben
*_Year muss den Zählerwert von morgens am 01.01. des Jahres haben

Das WR_0_KSEM Device sollte dafür natürlich auch aktiv sein.

Zitat
und zwischendurch noch eine Frage zum LogDB...

Ist es okay wenn ich in der def nur "./db.conf WR_1" drin habe? Oder muss unbedingt "./db.conf .*:.*" drin stehen? Also ich brauche nix loggen, habe es nur für den Plenticore erstellt...
Damit kenne ich mich nicht so genau aus, aber nur das WR_1 wird nicht ausreichen.
Normalerweise aktiviert man das Logging für alles und kann bei neuen Devices ein "DbLogExclude .*" in jedem Device erzeugen lassen.
Schau da bitte nochmal beim DbLog nach oder schreib die Frage in den DbLog Thread.
Ansonsten könnte im Moment besser passen, jedoch habe ich noch viele andere Devices, falls Du Dich da auch bedienen möchtest.

"./db.conf WR_1.*:.*"

RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

misux

Zitat von: ch.eick am 29 Dezember 2021, 23:48:47

Das WR_0_KSEM Device sollte dafür natürlich auch aktiv sein.


OKay, DOIF habe ich angelegt. in deinem Code ist n kleiner Fehler... Hat ein bisschen gedauert, aber ich habs gefunden... ;D
im
## 5 Jeden Morgen die Zählerstände aktualisieren, damit im Schwarm die Statistiken berechnet werden können\
##\
##\    ## **** sind z.B. meine ersten Zählerwerte, die ich beim aller ersten mal gesetzt hatte
DOELSEIF\
([00:01])\

fehlte hinter " gesetzt hatte..." \
##\
und dann das DOELSEIF

Hab n Error bekommen das DOELSEIF nicht kennt oder so...

Das KSEM habe ich angelegt und im Log bekomme ich:
2021.12.30 00:42:32 3: WR_0_KSEM: defined master with id 1, protocol TCP and interval 60, connection to 192.168.1.41:502
2021.12.30 00:42:32 3: Opening WR_0_KSEM device 192.168.1.41:502
2021.12.30 00:42:32 1: WR_0_KSEM: Can't connect to 192.168.1.41:502: 192.168.1.41: Verbindungsaufbau abgelehnt (111)
2021.12.30 00:42:33 3: WR_0_KSEM: attr disable removed


Da muss doch bestimmt noch irgendwo die Zugangsdaten hinterlegt werden... Finde aber in der Wiki nirgens eine info drüber...

UNd püktlich um 00:57 hab ich einen Logfile eintrag bekommen:
2021.12.30 00:57:00 1: PERL WARNING: Argument "Error evaluating WR_1_API userReading SW_Statistic_Autar..." isn't numeric in sprintf at (eval 349668) line 40.
2021.12.30 00:57:00 3: eval:
my $calcVal=0;
my $WR="WR_1";
my $YearBefore='LogDBRep_Statistic_previous_Year';

my $pvt   = sprintf("%04d W",ReadingsVal($WR,"SW_Total_AC_Active_P",0) );
my $pvtd  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_Yield_Day",0)/1000 );
my $pvtm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_Yield_Month",0)/1000 );
my $pvty  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_Yield_Year",0)/1000, ReadingsVal("$YearBefore","Statistic_Yield_Year",0) );

my $pv  = sprintf("%04d W",ReadingsVal($WR,"SW_Home_own_consumption_from_Battery",0)+ReadingsVal($WR,"SW_Home_own_consumption_from_PV",0) );
my $pvd  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Day",0)/1000 );
my $pvm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Month",0)/1000 );
my $pvy  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_EnergyHomePv_Year",0)/1000, ReadingsVal("$YearBefore","Statistic_EnergyHomePv_Year",0) );

my $gfi  =  sprintf("%04d W",(ReadingsVal($WR,"Total_Active_P_EM",0)<=0 ? abs(round(ReadingsVal($WR,"Total_Active_P_EM",0),0)):  0) );
my $gfid = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Day",0)/1000 );
my $gfim = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Month",0)/1000 );
my $gfiy = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_EnergyHomeFeedInGrid_Year",0)/1000, ReadingsVal("$YearBefore","Statistic_EnergyFeedInGrid_Year",0) );

my $eb   = sprintf("%04d W",(ReadingsVal($WR,"Total_Active_P_EM",0)>=0 ? round(ReadingsVal($WR,"Total_Active_P_EM",0),0) : 0) );
my $ebd  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Day",0)/1000 );
my $ebm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Month",0)/1000 );
my $eby  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_EnergyHomeGrid_Year",0)/1000, ReadingsVal("$YearBefore","Statistic_EnergyHomeGrid_Year",0) );

my $pvb   = sprintf("%04d W",ReadingsVal($WR,"SW_Home_own_consumption_from_Battery",0));
my $pvbd  = sprintf("%04d kWh",ReadingsVal("$name","Statistic_EnergyHomeBat_Day",0)/1000 );
my $pvbm  = sprintf("%04d kWh",ReadingsVal("$name","Statistic_EnergyHomeBat_Month",0)/1000 );
my $pvby  = sprintf("%05d / %05d",ReadingsVal("$name","Statistic_EnergyHomeBat_Year",0)/1000, ReadingsVal("$YearBefore","Statistic_EnergyHomeBat_Year",0) );

my $et   = sprintf("%04d W",(ReadingsVal($WR,"SW_Home_own_consumption_from_PV",0)+ReadingsVal($WR,"SW_Home_own_consumption_from_Battery",0)+ReadingsVal($WR,"SW_Home_own_consumption_from_grid",0)) );
my $etd  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_TotalConsumption_Day",0)/1000 );
my $etm  = sprintf("%04d kWh",ReadingsVal("$name","SW_Statistic_TotalConsumption_Month",0)/1000 );
my $ety  = sprintf("%05d / %05d",ReadingsVal("$name","SW_Statistic_TotalConsumption_Year",0)/1000, ReadingsVal("$YearBefore","Statistic_TotalConsumption_Year",0));

my $valA = ReadingsVal($WR, "SW_Total_AC_Active_P",0)-ReadingsVal($WR, "SW_Home_own_consumption_from_grid",0);
    $calcVal = ($valA > 0) ? round($valA /($valA + ReadingsVal($WR, "SW_Home_own_consumption_from_grid",""))*100 ,0) : 0;
my $aq = sprintf("%4d %%",(($calcVal > 100) ? 100 : $calcVal) );

my $aqd  = sprintf("%4d %%",ReadingsVal("$name","SW_Statistic_Autarky_Day",0) );
my $aqm  = sprintf("%4d %%",ReadingsVal("$name","SW_Statistic_Autarky_Month",0) );
my $aqy  = sprintf("%4d %%",ReadingsVal("$name","SW_Statistic_Autarky_Year",0) );

my $valS = ReadingsVal($WR,"SW_Total_AC_Active_P",0);
    $calcVal = ($valS > 0) ? round((ReadingsVal($WR,"SW_Home_own_consumption_from_PV",0) + ReadingsVal($WR,"SW_Home_own_consumption_from_Battery",0)) / $valS * 100 ,0) : 0;
my $sq   =  sprintf("%4d %%",(($calcVal > 100) ? 100 : $calcVal) );

my $sqd  = sprintf("%4d %%",ReadingsVal("$name","SW_Statistic_OwnConsumptionRate_Day",0) );
my $sqm  = sprintf("%4d %%",ReadingsVal("$name","SW_Statistic_OwnConsumptionRate_Month",0) );
my $sqy  = sprintf("%4d %%",ReadingsVal("$name","SW_Statistic_OwnConsumptionRate_Year",0) );

my $date = POSIX::strftime("%Y-%m-%d",localtime(time_str2num(ReadingsTimestamp($name, "auth_me_authenticated",0))));
my $md = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "auth_me_authenticated",0))));
my $cd   = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "SW_Statistic_Autarky_Day",0))));
my $cm   = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "SW_Statistic_Autarky_Month",0))));
my $cy   = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "SW_Statistic_Autarky_Year",0))));

"<html><table border=2 bordercolor='darkgreen' cellspacing=0 style='width: 100%'>
<colgroup>
   <col span='1' style='width: 52%;'>
   <col span='1' style='width: 12%;'>
   <col span='1' style='width: 12%;'>
   <col span='1' style='width: 12%;'>
   <col span='1' style='width: 12%;'>
</colgroup>
<tr><td style='padding-right:5px;padding-left:5px;font-weight:bold'>Statistik vom $date</td><td style='padding-right:5px;padding-left:5px;font-weight:bold;text-align:center'>aktuell</td><td style='padding-right:5px;padding-left:5px;font-weight:bold;text-align:center'>Heute</td><td style='padding-right:5px;padding-left:5px;font-weight:bold;text-align:center'>Monat</td><td style='padding-right:5px;padding-left:5px;font-weight:bold;text-align:center'>Jahr / Vorjahr</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Erzeugung PV-Total</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvt."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvtd."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvtm."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvty."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Bezug von PV</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pv."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvd."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvm."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvy."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Bezug von Batterie</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvb."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvbd."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvbm."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$pvby."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Bezug ins Haus (Energieverbrauch)</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$et."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$etd."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$etm."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$ety."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Bezug vom Netz</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$eb."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$ebd."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$ebm."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$eby."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Einspeisung ins Netz</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$gfi."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$gfid."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$gfim."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$gfiy."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Autarkiequote</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$aq."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$aqd."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$aqm."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$aqy."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Eigenverbrauchsquote</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$sq."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$sqd."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$sqm."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$sqy."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Berechnet um</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$md."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$cd."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$cm."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$cy."</td></tr>
</table></html>"


:o :-[ :-X