Moin zusammen,
EDIT:
2020.08.27 - Es wurde nun eine Wiki Seite begonnen Kostal Plenticore 10 Plus (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#Projekte_der_FHEM-Community)
2020.08.27 - kleinere Bereinigungen in der Beschreibung aufgrund von Foren Rückmeldungen
2020.08.27 - Der JSON String für die Statistiken von der API scheint varianten zu haben. Das userreading für statistics_clean wurde angepasst
2020.08.25 - Ersetzen des WR Namens im userreading durch ".*" , um mehr Flexibilität zu erhalten, wenn der Plenticore mal umbenannt wird
2020.08.21 - Alle Devices wurden aktualisiert und die Statistik mit Python hinzugefügt
2020.07.06 - Die momentane SelfConsumptionQuote wurde falsch berechnet
2020.07.01 - In der Bilanz hat mich etwas gestört, aber jetzt passt es besser
2020.06.15 - DOIF Ausschnitte für die Bilanz, die Plenticore Statistik und die EVU Datenübertragung ergänzt
2020.06.15 - Bilanz aktualisiert
2020.06.15 - RAW definition aktualisiert von PV_Anlage_1
ich habe mal versucht die Bilanzierung, von den SMA Mitstreitern aus der Wiki, auf einen Kostal Plenticore zu adaptieren.
Der Plenticore liefert über seine eigenen Statistiken bereits die meisten Werte von hause aus, sodass man diese nicht mehr selber errechnen muss. Somit werden im Vergleich zum SMA Original
keinerlei Funktionen zyklisch aufgerufen. Um die Werte zu aktualisieren rufe ich dieses Dummy im gewünschten Zeitraum mit "set Dum.Energy update" auf. Hierbei ist "update" ein frei gewählter
String, der keinerlei Bedeutung hat. Der "set" Aufruf führt nur die userreadings aus.
Hierbei sind die Devices wie folgt zugeordnet:
- StromZaehler ist der Zähler vom Versorger, ein Wert kleiner 0 bedeutet einspeisen, Da der Zweirichtungszähler leider noch auf sich warten lässt :-(
- Die aktuellen Werte des KSEM werden jetzt über den Plenticore ausgelesen. Ein Lesekopf auf dem EVU Zaehler ist nicht mehr notwendig
- PV_Anlage_1 ist der Plenticore WR
- PV_Anlage_1:Statistic_* sind die ausgelesenen Statistikwerte
Viele Grüsse
Christian
defmod Dum.Energy dummy
attr Dum.Energy DbLogExclude .*
attr Dum.Energy DbLogInclude Autarky.*,GridFeed.*,PV.*,.*Consumption.*
attr Dum.Energy alias Energiebilanz
attr Dum.Energy comment TotalConsumption,AutarkyQuoteDay,SelfConsumptionQuoteDay,AutarkyQuoteMonth,SelfConsumptionQuoteMonth
attr Dum.Energy event-on-change-reading PV,GridConsumption,GridFeedIn,SelfConsumptionQuote,Autarky.*,GridFeed.*,PV.*,.*Consumption.*
attr Dum.Energy event-on-update-reading TotalConsumption,AutarkyQuoteDay,SelfConsumptionQuoteDay,AutarkyQuoteMonth,SelfConsumptionQuoteMonth
attr Dum.Energy group Energiebilanz
attr Dum.Energy icon measure_power_meter
attr Dum.Energy room Strom->Energie
attr Dum.Energy stateFormat {\
my $pvt = ReadingsVal("$name","PVTotal", "")." W";;\
my $pvtd = ReadingsVal("$name","PVTotalDay", "")." kWh";;\
my $pvtm = ReadingsVal("$name","PVTotalMonth", "")." kWh";;\
my $pvty = ReadingsVal("$name","PVTotalYear", "")." kWh";;\
\
my $pv = ReadingsVal("$name","PV", "")." W";;\
my $pvd = ReadingsVal("$name","PVDay", "")." kWh";;\
my $pvm = ReadingsVal("$name","PVMonth", "")." kWh";;\
my $pvy = ReadingsVal("$name","PVYear", "")." kWh";;\
\
my $gfi = ReadingsVal("$name","GridFeedIn", "")." W";;\
my $gfid = ReadingsVal("$name","GridFeedInDay", "")." kWh";;\
my $gfim = ReadingsVal("$name","GridFeedInMonth", "")." kWh";;\
my $gfiy = ReadingsVal("$name","GridFeedInYear", "")." kWh";;\
my $eb = ReadingsVal("$name","GridConsumption", "")." W";;\
my $ebd = ReadingsVal("$name","GridConsumptionDay", "")." kWh";;\
my $ebm = ReadingsVal("$name","GridConsumptionMonth", "")." kWh";;\
my $eby = ReadingsVal("$name","GridConsumptionYear", "")." kWh";;\
my $et = ReadingsVal("$name","TotalConsumption", "")." W";;\
my $etd = ReadingsVal("$name","TotalConsumptionDay", "")." kWh";;\
my $etm = ReadingsVal("$name","TotalConsumptionMonth", "")." kWh";;\
my $ety = ReadingsVal("$name","TotalConsumptionYear", "")." kWh";;\
my $aq = ReadingsVal("$name","AutarkyQuote", "")." %";;\
my $aqd = ReadingsVal("$name","AutarkyQuoteDay", "")." %";;\
my $aqm = ReadingsVal("$name","AutarkyQuoteMonth", "")." %";;\
my $aqy = ReadingsVal("$name","AutarkyQuoteYear", "")." %";;\
my $sq = ReadingsVal("$name","SelfConsumptionQuote", "")." %";;\
my $sqd = ReadingsVal("$name","SelfConsumptionQuoteDay", "")." %";;\
my $sqm = ReadingsVal("$name","SelfConsumptionQuoteMonth", "")." %";;\
my $sqy = ReadingsVal("$name","SelfConsumptionQuoteYear", "")." %";;\
my $md = ReadingsTimestamp("$name", "AutarkyQuote", "");;\
my $cd = ReadingsTimestamp("PV_Anlage_1", "Statistic_Autarky_Day", "");;\
my $cm = ReadingsTimestamp("PV_Anlage_1", "Statistic_Autarky_Month", "");;\
my $cy = ReadingsTimestamp("PV_Anlage_1", "Statistic_Autarky_Year", "");;\
"<html><table border=2 bordercolor='darkgreen' cellspacing=0>\
<tr><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'> </td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>aktueller Wert</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>Heute</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>dieser Monat</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>dieses Jahr</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>PV-Erzeugung-Total</td><td style='padding-right:5px;;padding-left:5px'>".$pvt."</td><td style='padding-right:5px;;padding-left:5px'>".$pvtd."</td><td style='padding-right:5px;;padding-left:5px'>".$pvtm."</td><td style='padding-right:5px;;padding-left:5px'>".$pvty."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>PV-Einspeisung</td><td style='padding-right:5px;;padding-left:5px'>".$gfi."</td><td style='padding-right:5px;;padding-left:5px'>".$gfid."</td><td style='padding-right:5px;;padding-left:5px'>".$gfim."</td><td style='padding-right:5px;;padding-left:5px'>".$gfiy."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Netz-Bezug</td><td style='padding-right:5px;;padding-left:5px'>".$eb."</td><td style='padding-right:5px;;padding-left:5px'>".$ebd."</td><td style='padding-right:5px;;padding-left:5px'>".$ebm."</td><td style='padding-right:5px;;padding-left:5px'>".$eby."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>PV-Bezug</td><td style='padding-right:5px;;padding-left:5px'>".$pv."</td><td style='padding-right:5px;;padding-left:5px'>".$pvd."</td><td style='padding-right:5px;;padding-left:5px'>".$pvm."</td><td style='padding-right:5px;;padding-left:5px'>".$pvy."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Energieverbrauch</td><td style='padding-right:5px;;padding-left:5px'>".$et."</td><td style='padding-right:5px;;padding-left:5px'>".$etd."</td><td style='padding-right:5px;;padding-left:5px'>".$etm."</td><td style='padding-right:5px;;padding-left:5px'>".$ety."</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'>".$aq."</td><td style='padding-right:5px;;padding-left:5px'>".$aqd."</td><td style='padding-right:5px;;padding-left:5px'>".$aqm."</td><td style='padding-right:5px;;padding-left:5px'>".$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'>".$sq."</td><td style='padding-right:5px;;padding-left:5px'>".$sqd."</td><td style='padding-right:5px;;padding-left:5px'>".$sqm."</td><td style='padding-right:5px;;padding-left:5px'>".$sqy."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Berechnung am</td><td style='padding-right:5px;;padding-left:5px'>".$md."</td><td style='padding-right:5px;;padding-left:5px'>".$cd."</td><td style='padding-right:5px;;padding-left:5px'>".$cm."</td><td style='padding-right:5px;;padding-left:5px'>".$cy."</td></tr>\
</table></html>"\
}
attr Dum.Energy userReadings PVTotal {round(ReadingsVal("PV_Anlage_1","Total_AC_active_power",""),0)},\
PVTotalDay {round( ReadingsVal("PV_Anlage_1","Statistic_Yield_Day", "")/1000 ,2)},\
PVTotalMonth {round( ReadingsVal("PV_Anlage_1","Statistic_Yield_Month", "")/1000 ,2)},\
PVTotalYear {round( ReadingsVal("PV_Anlage_1","Statistic_Yield_Year", "")/1000 ,2)},\
\
PV {round( ReadingsVal("PV_Anlage_1","Home_own_consumption_from_battery", "")+ReadingsVal("PV_Anlage_1","Home_own_consumption_from_PV", "") ,0)},\
PVDay {round( (ReadingsVal("PV_Anlage_1","Statistic_EnergyHomeBat_Day", "")+ReadingsVal("PV_Anlage_1","Statistic_EnergyHomePv_Day", ""))/1000 ,2)},\
PVMonth {round( (ReadingsVal("PV_Anlage_1","Statistic_EnergyHomeBat_Month", "")+ReadingsVal("PV_Anlage_1","Statistic_EnergyHomePv_Month", ""))/1000 ,2)},\
PVYear {round( (ReadingsVal("PV_Anlage_1","Statistic_EnergyHomeBat_Year", "")+ReadingsVal("PV_Anlage_1","Statistic_EnergyHomePv_Year", ""))/1000 ,2)},\
\
GridFeedIn { ReadingsVal("PV_Anlage_1","Total_active_power_(powermeter)",0)<=0 ? abs(round(ReadingsVal("PV_Anlage_1","Total_active_power_(powermeter)",0),0)) : 0 },\
GridFeedInDay {round((ReadingsVal("PV_Anlage_1","Statistic_Yield_Day", "")-ReadingsVal("PV_Anlage_1","Statistic_EnergyHomeBat_Day", "")-ReadingsVal("PV_Anlage_1","Statistic_EnergyHomePv_Day", ""))/1000,2)},\
GridFeedInMonth {round((ReadingsVal("PV_Anlage_1","Statistic_Yield_Month", "")-ReadingsVal("PV_Anlage_1","Statistic_EnergyHomeBat_Month", "")-ReadingsVal("PV_Anlage_1","Statistic_EnergyHomePv_Month", ""))/1000,2)},\
GridFeedInYear {round((ReadingsVal("PV_Anlage_1","Statistic_Yield_Year", "")-ReadingsVal("PV_Anlage_1","Statistic_EnergyHomeBat_Year", "")-ReadingsVal("PV_Anlage_1","Statistic_EnergyHomePv_Year", ""))/1000,2)},\
\
GridConsumption { ReadingsVal("PV_Anlage_1","Total_active_power_(powermeter)",0)>=0 ? round(ReadingsVal("PV_Anlage_1","Total_active_power_(powermeter)",0),0) : 0 },\
GridConsumptionDay {round(abs(ReadingsVal("PV_Anlage_1","Statistic_EnergyHomeGrid_Day",""))/1000 ,2)},\
GridConsumptionMonth {round(ReadingsVal("PV_Anlage_1","Statistic_EnergyHomeGrid_Month","")/1000 ,2)},\
GridConsumptionYear {round(ReadingsVal("PV_Anlage_1","Statistic_EnergyHomeGrid_Year","")/1000 ,2)},\
\
TotalConsumption {round((ReadingsVal("PV_Anlage_1","Home_own_consumption_from_PV","")+ReadingsVal("PV_Anlage_1","Home_own_consumption_from_battery","")+ReadingsVal("PV_Anlage_1","Home_own_consumption_from_grid","")),0)},\
\
TotalConsumptionDay {round( (ReadingsVal("PV_Anlage_1","Statistic_EnergyHomePv_Day","")+ReadingsVal("PV_Anlage_1","Statistic_EnergyHomeBat_Day","")+ReadingsVal("PV_Anlage_1","Statistic_EnergyHomeGrid_Day","") )/1000 ,2)},\
TotalConsumptionMonth {round( (ReadingsVal("PV_Anlage_1","Statistic_EnergyHomePv_Month","")+ReadingsVal("PV_Anlage_1","Statistic_EnergyHomeBat_Month","")+ReadingsVal("PV_Anlage_1","Statistic_EnergyHomeGrid_Month","") )/1000 ,2)},\
TotalConsumptionYear {round( (ReadingsVal("PV_Anlage_1","Statistic_EnergyHomePv_Year","")+ReadingsVal("PV_Anlage_1","Statistic_EnergyHomeBat_Year","")+ReadingsVal("PV_Anlage_1","Statistic_EnergyHomeGrid_Year","") )/1000,2)},\
\
AutarkyQuote {my $valA = (ReadingsVal("PV_Anlage_1", "Total_AC_active_power","")*1000)-ReadingsVal("PV_Anlage_1", "Home_own_consumption_from_grid","");;;;\
my $calcVal = round($valA / ($valA + ReadingsVal("PV_Anlage_1", "Home_own_consumption_from_grid",""))*100 ,0)},\
\
AutarkyQuoteDay {round(ReadingsVal("PV_Anlage_1","Statistic_Autarky_Day", ""),0)},\
AutarkyQuoteMonth {round(ReadingsVal("PV_Anlage_1","Statistic_Autarky_Month", ""),0)},\
AutarkyQuoteYear {round(ReadingsVal("PV_Anlage_1","Statistic_Autarky_Year", ""),0)},\
\
SelfConsumptionQuote {my $x = round((ReadingsVal("PV_Anlage_1","Home_own_consumption_from_PV", "") + ReadingsVal("PV_Anlage_1","Home_own_consumption_from_battery","")) / ReadingsVal("PV_Anlage_1","Total_AC_active_power", "") * 100 ,0) ;;;; $x > 100 ? $x = 100:$x = $x ;;;; $x },\
SelfConsumptionQuoteDay {round(ReadingsVal("PV_Anlage_1","Statistic_OwnConsumptionRate_Day", ""),0)},\
SelfConsumptionQuoteMonth {round(ReadingsVal("PV_Anlage_1","Statistic_OwnConsumptionRate_Month", ""),0)},\
SelfConsumptionQuoteYear {round(ReadingsVal("PV_Anlage_1","Statistic_OwnConsumptionRate_Year", ""),0)}
setstate Dum.Energy <html><table border=2 bordercolor='darkgreen' cellspacing=0>\
<tr><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'> </td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>aktueller Wert</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>Heute</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>dieser Monat</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>dieses Jahr</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>PV-Erzeugung-Total</td><td style='padding-right:5px;;padding-left:5px'>619 W</td><td style='padding-right:5px;;padding-left:5px'>23.22 kWh</td><td style='padding-right:5px;;padding-left:5px'>841.89 kWh</td><td style='padding-right:5px;;padding-left:5px'>7921.09 kWh</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>PV-Einspeisung</td><td style='padding-right:5px;;padding-left:5px'>28 W</td><td style='padding-right:5px;;padding-left:5px'>16.19 kWh</td><td style='padding-right:5px;;padding-left:5px'>535.02 kWh</td><td style='padding-right:5px;;padding-left:5px'>4476.75 kWh</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Netz-Bezug</td><td style='padding-right:5px;;padding-left:5px'>0 W</td><td style='padding-right:5px;;padding-left:5px'>0.02 kWh</td><td style='padding-right:5px;;padding-left:5px'>0.79 kWh</td><td style='padding-right:5px;;padding-left:5px'>1025.50 kWh</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>PV-Bezug</td><td style='padding-right:5px;;padding-left:5px'>536 W</td><td style='padding-right:5px;;padding-left:5px'>7.03 kWh</td><td style='padding-right:5px;;padding-left:5px'>306.87 kWh</td><td style='padding-right:5px;;padding-left:5px'>3444.34 kWh</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Energieverbrauch</td><td style='padding-right:5px;;padding-left:5px'>536 W</td><td style='padding-right:5px;;padding-left:5px'>7.05 kWh</td><td style='padding-right:5px;;padding-left:5px'>307.65 kWh</td><td style='padding-right:5px;;padding-left:5px'>4469.84 kWh</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'>100 %</td><td style='padding-right:5px;;padding-left:5px'>100 %</td><td style='padding-right:5px;;padding-left:5px'>100 %</td><td style='padding-right:5px;;padding-left:5px'>77 %</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'>87 %</td><td style='padding-right:5px;;padding-left:5px'>30 %</td><td style='padding-right:5px;;padding-left:5px'>36 %</td><td style='padding-right:5px;;padding-left:5px'>43 %</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Berechnung am</td><td style='padding-right:5px;;padding-left:5px'>2020-08-21 14:30:00</td><td style='padding-right:5px;;padding-left:5px'>2020-08-21 13:57:01</td><td style='padding-right:5px;;padding-left:5px'>2020-08-21 13:57:01</td><td style='padding-right:5px;;padding-left:5px'>2020-08-21 13:57:01</td></tr>\
</table></html>
Hier noch das Listing von PV_Anlage_1, etwas bereinigt
defmod PV_Anlage_1 ModbusAttr 71 60 192.168.178.18:1502 TCP
attr PV_Anlage_1 alias PV_Einspeisung
attr PV_Anlage_1 comment Kostal Plenticore 10 Plus mit BYD Speicher
attr PV_Anlage_1 dev-h-defFormat %.2f
attr PV_Anlage_1 dev-h-defLen 2
attr PV_Anlage_1 dev-h-defPoll 1
attr PV_Anlage_1 dev-h-defRevRegs 1
attr PV_Anlage_1 dev-h-defUnpack f>
attr PV_Anlage_1 dev-type-STR-format %s
attr PV_Anlage_1 dev-type-STR-len 8
attr PV_Anlage_1 dev-type-STR-revRegs 0
attr PV_Anlage_1 dev-type-STR-unpack a*
attr PV_Anlage_1 event-on-change-reading statistics_.*,Statistic_.*,Act_state_of_charge,Actual_battery_charge_.*,Battery_temperature,Home_own_consumption_from_.*,Inverter_state,Power_DC1,Power_DC2,Power_DC_Sum,Total_DC_Power,Total_DC_Power_Max,Total_PV_Power_reserve,Voltage_DC1,Voltage_DC2,.*_yield,Solar_.*
attr PV_Anlage_1 group PV Eigenverbrauch
attr PV_Anlage_1 icon sani_solar
attr PV_Anlage_1 obj-h100-reading Total_DC_Power
attr PV_Anlage_1 obj-h104-format %s
attr PV_Anlage_1 obj-h104-reading State_of_energy_manager
attr PV_Anlage_1 obj-h104-revRegs 0
attr PV_Anlage_1 obj-h104-unpack N
attr PV_Anlage_1 obj-h106-reading Home_own_consumption_from_battery
attr PV_Anlage_1 obj-h108-reading Home_own_consumption_from_grid
attr PV_Anlage_1 obj-h110-reading Total_home_consumption_Battery
attr PV_Anlage_1 obj-h112-reading Total_home_consumption_Grid
attr PV_Anlage_1 obj-h114-reading Total_home_consumption_PV
attr PV_Anlage_1 obj-h116-reading Home_own_consumption_from_PV
attr PV_Anlage_1 obj-h118-reading Total_home_consumption
attr PV_Anlage_1 obj-h120-reading Isolation_resistance
attr PV_Anlage_1 obj-h122-reading Power_limit_from_EVU
attr PV_Anlage_1 obj-h124-reading Total_home_consumption_rate
attr PV_Anlage_1 obj-h14-reading Inverter_serial_number
attr PV_Anlage_1 obj-h14-type STR
attr PV_Anlage_1 obj-h144-reading Worktime
attr PV_Anlage_1 obj-h150-reading Actual_cos_phi
attr PV_Anlage_1 obj-h152-reading Grid_frequency
attr PV_Anlage_1 obj-h154-reading Current_Phase_1
attr PV_Anlage_1 obj-h156-reading Active_power_Phase_1
attr PV_Anlage_1 obj-h158-reading Voltage_Phase_1
attr PV_Anlage_1 obj-h160-reading Current_Phase_2
attr PV_Anlage_1 obj-h162-reading Active_power_Phase_2
attr PV_Anlage_1 obj-h164-reading Voltage_Phase_2
attr PV_Anlage_1 obj-h166-reading Current_Phase_3
attr PV_Anlage_1 obj-h168-reading Active_power_Phase_3
attr PV_Anlage_1 obj-h170-reading Voltage_Phase_3
attr PV_Anlage_1 obj-h172-reading Total_AC_active_power
attr PV_Anlage_1 obj-h174-reading Total_AC_reactive_power
attr PV_Anlage_1 obj-h178-reading Total_AC_apparent_power
attr PV_Anlage_1 obj-h190-reading Battery_charge_current
attr PV_Anlage_1 obj-h194-format %.0f
attr PV_Anlage_1 obj-h194-reading Number_of_battery_cycles
attr PV_Anlage_1 obj-h200-reading Actual_battery_charge_-minus_or_discharge_-plus_current
attr PV_Anlage_1 obj-h202-reading PSSB_fuse_state
attr PV_Anlage_1 obj-h208-format %.0f
attr PV_Anlage_1 obj-h208-reading Battery_ready_flag
attr PV_Anlage_1 obj-h210-reading Act_state_of_charge
attr PV_Anlage_1 obj-h212-reading Battery_state
attr PV_Anlage_1 obj-h214-reading Battery_temperature
attr PV_Anlage_1 obj-h216-reading Battery_voltage
attr PV_Anlage_1 obj-h218-reading Cos_phi_(powermeter)
attr PV_Anlage_1 obj-h220-reading Frequency_(powermeter)
attr PV_Anlage_1 obj-h222-reading Current_phase_1_(powermeter)
attr PV_Anlage_1 obj-h224-reading Active_power_phase_1_(powermeter)
attr PV_Anlage_1 obj-h226-reading Reactive_power_phase_1_(powermeter)
attr PV_Anlage_1 obj-h228-reading Apparent_power_phase_1_(powermeter)
attr PV_Anlage_1 obj-h230-reading Voltage_phase_1_(powermeter)
attr PV_Anlage_1 obj-h232-reading Current_phase_2_(powermeter)
attr PV_Anlage_1 obj-h234-reading Active_power_phase_2_(powermeter)
attr PV_Anlage_1 obj-h236-reading Reactive_power_phase_2_(powermeter)
attr PV_Anlage_1 obj-h238-reading Apparent_power_phase_2_(powermeter)
attr PV_Anlage_1 obj-h240-reading Voltage_phase_2_(powermeter)
attr PV_Anlage_1 obj-h242-reading Current_phase_3_(powermeter)
attr PV_Anlage_1 obj-h244-reading Active_power_phase_3_(powermeter)
attr PV_Anlage_1 obj-h246-reading Reactive_power_phase_3_(powermeter)
attr PV_Anlage_1 obj-h248-reading Apparent_power_phase_3_(powermeter)
attr PV_Anlage_1 obj-h250-reading Voltage_phase_3_(powermeter)
attr PV_Anlage_1 obj-h252-reading Total_active_power_(powermeter)
attr PV_Anlage_1 obj-h254-reading Total_reactive_power_(powermeter)
attr PV_Anlage_1 obj-h256-reading Total_apparent_power_(powermeter)
attr PV_Anlage_1 obj-h258-reading Current_DC1
attr PV_Anlage_1 obj-h260-reading Power_DC1
attr PV_Anlage_1 obj-h266-reading Voltage_DC1
attr PV_Anlage_1 obj-h268-reading Current_DC2
attr PV_Anlage_1 obj-h270-reading Power_DC2
attr PV_Anlage_1 obj-h276-reading Voltage_DC2
attr PV_Anlage_1 obj-h278-reading Current_DC3
attr PV_Anlage_1 obj-h280-reading Power_DC3
attr PV_Anlage_1 obj-h286-reading Voltage_DC3
attr PV_Anlage_1 obj-h320-reading Total_yield
attr PV_Anlage_1 obj-h322-reading Daily_yield
attr PV_Anlage_1 obj-h324-reading Yearly_yield
attr PV_Anlage_1 obj-h326-reading Monthly_yield
attr PV_Anlage_1 obj-h38-reading Software-Version_Maincontroller_(MC)
attr PV_Anlage_1 obj-h38-type STR
attr PV_Anlage_1 obj-h384-len 16
attr PV_Anlage_1 obj-h384-reading Inverter_network_name
attr PV_Anlage_1 obj-h384-type STR
attr PV_Anlage_1 obj-h420-reading IP-address
attr PV_Anlage_1 obj-h420-type STR
attr PV_Anlage_1 obj-h428-reading IP-subnetmask
attr PV_Anlage_1 obj-h428-type STR
attr PV_Anlage_1 obj-h436-reading IP-gateway
attr PV_Anlage_1 obj-h436-type STR
attr PV_Anlage_1 obj-h446-reading IP-DNS1
attr PV_Anlage_1 obj-h446-type STR
attr PV_Anlage_1 obj-h454-reading IP-DNS2
attr PV_Anlage_1 obj-h454-type STR
attr PV_Anlage_1 obj-h46-reading Software-Version_IO-Controller_(IOC)
attr PV_Anlage_1 obj-h46-type STR
attr PV_Anlage_1 obj-h514-len 1
attr PV_Anlage_1 obj-h514-reading Battery_actual_SOC
attr PV_Anlage_1 obj-h517-reading Battery_Manufacturer
attr PV_Anlage_1 obj-h517-type STR
attr PV_Anlage_1 obj-h525-format %c
attr PV_Anlage_1 obj-h525-reading Battery_Model_ID
attr PV_Anlage_1 obj-h525-unpack N
attr PV_Anlage_1 obj-h527-format %c
attr PV_Anlage_1 obj-h527-reading Battery_Serial_Number
attr PV_Anlage_1 obj-h529-len 4
attr PV_Anlage_1 obj-h529-reading Work_Capacity
attr PV_Anlage_1 obj-h529-unpack N
attr PV_Anlage_1 obj-h531-format %.0f
attr PV_Anlage_1 obj-h531-reading Inverter_Max_Power
attr PV_Anlage_1 obj-h531-unpack N
attr PV_Anlage_1 obj-h535-revRegs 0
attr PV_Anlage_1 obj-h535-unpack n
attr PV_Anlage_1 obj-h551-revRegs 0
attr PV_Anlage_1 obj-h559-revRegs 0
attr PV_Anlage_1 obj-h56-format %.0f
attr PV_Anlage_1 obj-h56-reading Inverter_state
attr PV_Anlage_1 obj-h56-unpack N
attr PV_Anlage_1 obj-h575-len 1
attr PV_Anlage_1 obj-h575-reading Inverter_Generation_Power_(actual)
attr PV_Anlage_1 obj-h577-len 2
attr PV_Anlage_1 obj-h577-reading Generation_Energy
attr PV_Anlage_1 obj-h577-unpack N
attr PV_Anlage_1 obj-h578-reading Total_energy
attr PV_Anlage_1 obj-h582-reading Actual_battery_charge-discharge_power
attr PV_Anlage_1 obj-h586-format %s
attr PV_Anlage_1 obj-h586-reading Battery_Firmware
attr PV_Anlage_1 obj-h586-unpack N
attr PV_Anlage_1 obj-h588-format %s
attr PV_Anlage_1 obj-h588-len 1
attr PV_Anlage_1 obj-h588-reading Battery_Type
attr PV_Anlage_1 obj-h588-unpack N
attr PV_Anlage_1 obj-h6-reading Inverter_article_number
attr PV_Anlage_1 obj-h6-type STR
attr PV_Anlage_1 obj-h768-len 32
attr PV_Anlage_1 obj-h768-reading Productname
attr PV_Anlage_1 obj-h768-type STR
attr PV_Anlage_1 obj-h800-len 32
attr PV_Anlage_1 obj-h800-reading Power_class
attr PV_Anlage_1 obj-h800-type STR
attr PV_Anlage_1 room Strom->Photovoltaik
attr PV_Anlage_1 sortby 01
attr PV_Anlage_1 stateFormat {sprintf("\
<TABLE>\
\
<TR>\
<TH ALIGN=\"MIDDLE\" WIDTH=\"20\">Batterie %s</TH>\
<TH ALIGN=\"MIDDLE\" WIDTH=\"20\">aktuell</TH>\
<TH ALIGN=\"RIGHT\" WIDTH=\"20\">Hausverbrauch</TH>\
<TH ALIGN=\"MIDDLE\" WIDTH=\"20\">Erträge</TH>\
</TR>\
\
<TR>\
<TD ALIGN=\"MIDDLE\" WIDTH=\"20\">\
Leistung: %04d W<br>\
Temp.: %02.1f °C<br>\
Ladung total: %2d %%<br>\
Ladung Res.: %04d Wh\
</TD>\
\
<TD ALIGN=\"RIGHT\" WIDTH=\"20\">\
DC total: %05d W<br>\
<br>\
<br>\
PV reserve: %05d W\
</TD>\
\
<TD ALIGN=\"RIGHT\" WIDTH=\"20\">\
von PV: %05d W <br>\
von Batterie: %05d W<br>\
vom Netz: %05d W<br>\
ins Haus: %05d W<br>\
Netz: %05d W\
</TD>\
\
<TD ALIGN=\"RIGHT\" WIDTH=\"20\">\
Tag: %05d KWh <br>\
Monat: %05d KWh<br>\
Jahr: %05d KWh<br>\
Total: %05d KWh\
</TD>\
</TR>\
\
</TABLE>\
" , \
(ReadingsVal($name,"Actual_battery_charge_-minus_or_discharge_-plus_Power",0) lt 0) ? "<span style='color:#00FF00'>Laden</span>":"<span style='color:#FF0000'>Entladen</span>" ,\
\
ReadingsVal($name,"Actual_battery_charge_-minus_or_discharge_-plus_Power",0),\
ReadingsVal($name,"Battery_temperature",0) ,\
ReadingsVal($name,"Act_state_of_charge",0) ,\
ReadingsVal($name,"Actual_battery_charge_usable_Power",0) ,\
\
ReadingsVal($name,"Power_DC_Sum","0"),\
ReadingsVal($name,"Total_PV_Power_reserve","0"),\
\
ReadingsVal($name,"Home_own_consumption_from_PV",0) ,\
ReadingsVal($name,"Home_own_consumption_from_battery",0) ,\
ReadingsVal($name,"Home_own_consumption_from_grid",0),\
ReadingsVal($name,"Home_own_consumption_from_PV",0) +ReadingsVal($name,"Home_own_consumption_from_battery",0)+ReadingsVal($name,"Home_own_consumption_from_grid",0),\
ReadingsVal($name,"Total_active_power_(powermeter)",0),\
\
round(ReadingsVal($name,"Daily_yield",0)/1000 ,0),\
round(ReadingsVal($name,"Monthly_yield",0)/1000 ,0) ,\
round(ReadingsVal($name,"Yearly_yield",0)/1000 ,0) ,\
round(ReadingsVal($name,"Total_yield",0)/1000 ,0)\
)}
attr PV_Anlage_1 userReadings Power_DC_Sum:Total_DC_Power.* { ReadingsVal($NAME,"Power_DC1","0")+ReadingsVal($NAME,"Power_DC2","0") },\
\
Total_PV_Power_reserve:Total_DC_Power.* {my $reserve = ReadingsVal($NAME,"Power_DC_Sum","0") * 0.90 - ReadingsVal($NAME,"Home_own_consumption_from_PV","0");;;; ($reserve lt 0)?0:round($reserve,3) },\
\
Total_DC_Power_Max:Total_DC_Power.* { my $Bat_out = (ReadingsVal($NAME,"Actual_battery_charge_-minus_or_discharge_-plus_current","0")*ReadingsVal($NAME,"Battery_voltage","0"));;;; ($Bat_out gt 0)?ReadingsVal($NAME,"Power_DC_Sum","0") + $Bat_out :ReadingsVal($NAME,"Power_DC_Sum","0") },\
\
Actual_battery_charge_-minus_or_discharge_-plus_Power:Actual_battery_charge_-minus_or_discharge_-plus_current.* {round((ReadingsVal($NAME,"Actual_battery_charge_-minus_or_discharge_-plus_current","0")*ReadingsVal($NAME,"Battery_voltage","0")),0)},\
\
Actual_battery_charge_usable_Power:Act_state_of_charge.* {my $x = (8960*(ReadingsVal($NAME,"Act_state_of_charge","0")-10)/100);;;; ($x lt 0)?0:round($x,0) },\
\
Solar_SolarRadiation:Total_DC_Power.* { my $x1 = POSIX::strftime("%Y-%m-%d_%H_00_Rad1wh",localtime(time-60*60)) ;;;; my $x2 = POSIX::strftime("%Y-%m-%d_%H_00_Rad1wh",localtime()) ;;;; my $x_avg = round((ReadingsVal("DWD_Prognose",$x1,0)+ReadingsVal("DWD_Prognose",$x2,0))/2 , 0) ;;;; my $time = POSIX::strftime("%M",localtime()) ;;;; ($time < 30)?ReadingsVal("DWD_Prognose",$x1,0):$x_avg },\
\
statistics_clean:statistics_output.* { my $x = ReadingsVal($NAME,"statistics_output",0);; $x =~ s/"moduleid": "scb:statistic:EnergyFlow", |, "moduleid": "scb:statistic:EnergyFlow"|"processdata": \[//g;; $x =~ s/id": "|, "unit": "", "value"|^\[|\]\}\]$//g;; $x =~ s/moduleid/statistics_00_moduleid/g;; $x =~ s/processdata/statistics/g;; $x =~ s/\}\, \{/\, /g;; $x =~ s/\{\{/\{/g;; return $x }
attr PV_Anlage_1 verbose 0
Für die Plenticore Statistiken wird noch ein expandJSON benötigt.
defmod Plenticore_Statistics expandJSON PV_Anlage_1:statistics_clean:.\{.*}
attr Plenticore_Statistics DbLogExclude .*
attr Plenticore_Statistics alias Plenticore_Statistics
attr Plenticore_Statistics comment Das Device wird über ein Python Skript im reading output befüllt.\
deletereading Plenticore_Status [A|C|EXT|RANGE|WS].*\
attr Plenticore_Statistics room Strom->Photovoltaik
Der Ablauf für die Statistiken ist dann wie folgt:
1) Einmalig müssen einige Parameter als readings im Device PV_Anlage_1 gesetzt werden
setreading PV_Anlage_1 IP-Address_Plenticore
setreading PV_Anlage_1 IP-Address_FHEM
2) Das Skript /opt/fhem/python/bin/plenticore_statistic.py wird einmal pro Stunde aus dem DOIF mit allen Parametern aufgerufen
3) Dann wird von dem Skript in PV_Anlage_1 das reading statistics_output befüllt. Dieses JSON kann so leider nicht direkt verwendet werden.
4) Ein userreading in PV_Anlage_1 wandelt das JSON aus Schritt 3) um und schreibt es in statistics_clean
5) Das Device Plenticore_Statistics wandelt nun das JSON in einzelne readings in PV_Anlage_1 um. Nun sollten alle statistic_* readings vorhanden sein.
6) Die Statistiken werden von meinem Bilanz Device gelesen, was ebenfalls in diesem DOIF mit "set Dum.Energy update" stündlich aktualisiert wird.
7) Der Forecast über den DWD und Proplanta läuft auch bereits, aber würde diesen rahmen sprengen.
Aktualisierung der Bilanz durch einen zyklischen Aufruf aus einem DOIF
hier wird alle 5 Minuten zwischen 8:00 und 20:00 Uhr das Dummy aktiviert um die Bilanz aufzustellen. Das geht natürlich auch mit einem AT, jedoch ist dies nur ein erster Ausschnitt vom DOIF.
Im Orginial gibt es noch einige weitere Einträge, die die PV_Anlage_ 1 betreffen. Das findet sich dann später im Wiki.
defmod PV_Schedule DOIF ################################################################################################################\
## 2 Plenticore Status aktualisieren\
##\
([:57])\
(\
{system("/usr/bin/python3 /opt/fhem/python/bin/plenticore_statistic.py ".ReadingsVal("PV_Anlage_1","IP-Address_Plenticore","?")." ".ReadingsVal("PV_Anlage_1","IP-Address_FHEM","?")." &")}\
set Dum.Energy update\
\
)\
attr PV_Schedule DbLogExclude .*
attr PV_Schedule alias PV_Schedule
attr PV_Schedule cmdState BYD Status|Plenticore Status
attr PV_Schedule do always
attr PV_Schedule room Strom->System
attr PV_Schedule sortby 11
attr PV_Schedule wait 0:0:0:10:0:0
Die folgenden Python Skripte sind inhaltlich nicht vollständig von mir. Verwendung auf eigene Gefahr.
Momentan bin ich dabei die ersten Versuche zu machen, die Kommunikation auf Fhem HTTPMOD umzustellen, was bereits teilweise funktioniert.
Für mich ist die Python Lösung nur ein zwischen Schritt, der nicht auf dauer so bleiben soll. Trotzdem läuft es mit dieser Konfiguration bereits ca. 6 Monate fehlerfrei.
Eventuell müssen noch Python Module nachinstalliert werden:
## pip3 install pycryptodome
## pip3 install -U fhem
Die Pfadnamen können geändert werden, dann aber auch bitte überall ;-)
/opt/fhem/python/bin/plenticore_statistic.py
#####
##
## https://stackoverflow.com/questions/59053539/api-call-portation-from-java-to-python-kostal-plenticore-inverter?answertab=active#tab-top
##
import random
import string
import base64
import json
import requests
import hashlib
import os
import hmac
from Crypto.Cipher import AES
import binascii
import fhem
import asyncio
import sys
plenticore = sys.argv[1]
web = sys.argv[2]
request = '/processdata/scb:statistic:EnergyFlow'
try:
with open('/opt/fhem/python/pwd_plenticore.json', 'r') as f:
credentials=json.load(f)
except Exception as e:
print('Something went wrong: {}'.format(e))
USER_TYPE = credentials["username"]
PASSWD = credentials["password"]
BASE_URL = "http://" + plenticore + "/api/v1"
AUTH_START = "/auth/start"
AUTH_FINISH = "/auth/finish"
AUTH_CREATE_SESSION = "/auth/create_session"
ME = "/auth/me"
def randomString(stringLength):
letters = string.ascii_letters
return ''.join(random.choice(letters) for i in range(stringLength))
u = randomString(12)
u = base64.b64encode(u.encode('utf-8')).decode('utf-8')
step1 = {
"username": USER_TYPE,
"nonce": u
}
step1 = json.dumps(step1)
url = BASE_URL + AUTH_START
headers = {'Content-type': 'application/json', 'Accept': 'application/json'}
response = requests.post(url, data=step1, headers=headers)
response = json.loads(response.text)
i = response['nonce']
e = response['transactionId']
o = response['rounds']
a = response['salt']
bitSalt = base64.b64decode(a)
def getPBKDF2Hash(password, bytedSalt, rounds):
return hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), bytedSalt, rounds)
r = getPBKDF2Hash(PASSWD,bitSalt,o)
s = hmac.new(r, "Client Key".encode('utf-8'), hashlib.sha256).digest()
c = hmac.new(r, "Server Key".encode('utf-8'), hashlib.sha256).digest()
_ = hashlib.sha256(s).digest()
d = "n=user,r="+u+",r="+i+",s="+a+",i="+str(o)+",c=biws,r="+i
g = hmac.new(_, d.encode('utf-8'), hashlib.sha256).digest()
p = hmac.new(c, d.encode('utf-8'), hashlib.sha256).digest()
f = bytes(a ^ b for (a, b) in zip(s, g))
proof = base64.b64encode(f).decode('utf-8')
step2 = {
"transactionId": e,
"proof": proof
}
step2 = json.dumps(step2)
url = BASE_URL + AUTH_FINISH
headers = {'Content-type': 'application/json', 'Accept': 'application/json'}
response = requests.post(url, data=step2, headers=headers)
response = json.loads(response.text)
token = response['token']
signature = response['signature']
y = hmac.new(_, "Session Key".encode('utf-8'), hashlib.sha256)
y.update(d.encode('utf-8'))
y.update(s)
P = y.digest()
protocol_key = P
t = os.urandom(16)
e2 = AES.new(protocol_key,AES.MODE_GCM,t)
e2, authtag = e2.encrypt_and_digest(token.encode('utf-8'))
step3 = {
"transactionId": e,
"iv": base64.b64encode(t).decode('utf-8'),
"tag": base64.b64encode(authtag).decode("utf-8"),
"payload": base64.b64encode(e2).decode('utf-8')
}
step3 = json.dumps(step3)
headers = { 'Content-type': 'application/json', 'Accept': 'application/json' }
url = BASE_URL + AUTH_CREATE_SESSION
response = requests.post(url, data=step3, headers=headers)
response = json.loads(response.text)
sessionId = response['sessionId']
#create a new header with the new Session-ID for all further requests
headers = { 'Content-type': 'application/json', 'Accept': 'application/json', 'authorization': "Session " + sessionId }
url = BASE_URL + ME
response = requests.get(url = url, headers = headers)
response = json.loads(response.text)
authOK = response['authenticated']
if not authOK:
print("authorization NOT OK")
sys.exit()
url = BASE_URL + "/info/version"
response = requests.get(url = url, headers = headers)
response = json.loads(response.text)
swversion = response['sw_version']
apiversion = response['api_version']
hostname = response['hostname']
name = response['name']
print("Connected to the inverter " + name + "/" + hostname + " with SW-Version " + swversion + " and API-Version " + apiversion)
# Auth OK, now send your desired requests
url = BASE_URL + request
response = requests.get(url = url, headers = headers)
response = json.loads(response.text)
message = json.dumps(response)
#print(json.dumps(response, indent=4, sort_keys=True))
#print(message)
async def run():
try:
with open('/opt/fhem/python/pwd_fhem.json', 'r') as f:
credentials=json.load(f)
except Exception as e:
print('Something went wrong: {}'.format(e))
fh = fhem.Fhem(web, protocol="http", port=8083, username=credentials["username"], password=credentials["password"])
fh.send_cmd("setreading PV_Anlage_1 statistics_output " + message)
asyncio.get_event_loop().run_until_complete(run())
Für das obige Skript sind die Passworte im Filesystem hinterlegt.
/opt/fhem/python/
-rw-r----- 1 fhem fhem 53 Aug 19 10:52 pwd_fhem.json
{
"username": "<Dein user Name>",
"password": "<Dein Passwort>"
}
-rw-r----- 1 fhem fhem 59 Mär 26 11:57 pwd_plenticore.json
Hier ist der username fest vom Plenticore vorgegeben, das Passwort findet sich auf einem Gehäuseaufkleber am WR.
{
"username": "user",
"password": "<Dein Passwort>"
}
wenn ich nur auf die Zahlen gucke ist
ZitatPV-Erzeugung incl. Speicher
der Eigenverbrauch(egal ob Speicher od. direkt). :-\
Okay,
PV-Erzeugung {round((ReadingsVal("PV_Anlage_1","Total_AC_active_power", ""),0)}
Der Eigenverbrauch laeuft hier unter
TotalConsumption
{round((ReadingsVal("PV_Anlage_1","Home_own_consumption_from_PV", "") +
ReadingsVal("PV_Anlage_1","Home_own_consumption_from_battery",0) +
ReadingsVal("PV_Anlage_1","Home_own_consumption_from_grid",0)) <<<< zaehlte der Netzverbrauch auch dazu?
,0)}
Gruss
Christian
Moin,
im ersten Post gab es einen Update...
und den ersten Monats Plot hier Bilanz Plot aus DBLog (https://forum.fhem.de/index.php/topic,53584.msg1069165.html#msg1069165)
Der Fehlerteufel hat sich eingeschlichen.
das userreading fuer SelfConsumptionQuote war nicht korrekt. Die Definition ist im ersten Post aktualisiert.
Hallo zusammen,
ich habe da mal eine schoene externe Seite gefunden, um Autarkie und Eigenverbrauch abzuschaetzen.
Unabhängigkeitsrechner (https://pvspeicher.htw-berlin.de/unabhaengigkeitsrechner)
Wie immer, keine Haftung fuer externe Seiten und alles andere was man noch so ausschliessen muss :-)
Der erste Post wurde mit Stand heute wieder aktualisiert...
Hallo Christian
Ich habe heute Abend versucht die Bilanz zu implementieren. Leider habe ich das Problem, dass in PV_Anlage_1 die Statistik Einträge nicht erstellt werden:
\
statistics_clean:statistics_output.* { my $x = ReadingsVal($NAME,"statistics_output",0);;;; $x =~ s/\{"moduleid": "scb:statistic:EnergyFlow", "processdata": \[|id": "|, "unit": "", "value"|^\[|\]\}\]$//g;;;; $x =~ s/moduleid/statistics_00_moduleid/g;;;; $x =~ s/processdata/statistics/g;;;; $x =~ s/\}\, \{/\, /g;;;; return $x }
ich vermute fast das ich hier noch ein paar Sachen anpassen muss.
Nur was? und mit welchen Werten?
danke für deine Hilfe
Zitat von: Mumpitz am 23 August 2020, 20:11:01
Hallo Christian
Ich habe heute Abend versucht die Bilanz zu implementieren. Leider habe ich das Problem, dass in PV_Anlage_1 die Statistik Einträge nicht erstellt werden:
\
statistics_clean:statistics_output.* { my $x = ReadingsVal($NAME,"statistics_output",0);;;; $x =~ s/\{"moduleid": "scb:statistic:EnergyFlow", "processdata": \[|id": "|, "unit": "", "value"|^\[|\]\}\]$//g;;;; $x =~ s/moduleid/statistics_00_moduleid/g;;;; $x =~ s/processdata/statistics/g;;;; $x =~ s/\}\, \{/\, /g;;;; return $x }
ich vermute fast das ich hier noch ein paar Sachen anpassen muss.
Nur was? und mit welchen Werten?
danke für deine Hilfe
Dafür musst Du das Python Skript implementieren, das diese Werte aus dem Plenticore ausliest.
Gruß Christian
Zitat von: Mumpitz am 23 August 2020, 20:11:01
Hallo Christian
Ich habe heute Abend versucht die Bilanz zu implementieren. Leider habe ich das Problem, dass in PV_Anlage_1 die Statistik Einträge nicht erstellt werden:
\
statistics_clean:statistics_output.* { my $x = ReadingsVal($NAME,"statistics_output",0);;;; $x =~ s/\{"moduleid": "scb:statistic:EnergyFlow", "processdata": \[|id": "|, "unit": "", "value"|^\[|\]\}\]$//g;;;; $x =~ s/moduleid/statistics_00_moduleid/g;;;; $x =~ s/processdata/statistics/g;;;; $x =~ s/\}\, \{/\, /g;;;; return $x }
ich vermute fast das ich hier noch ein paar Sachen anpassen muss.
Nur was? und mit welchen Werten?
danke für deine Hilfe
Dafür musst Du das Python Skript implementieren, das diese Werte aus dem Plenticore ausliest.
Gruß Christian
Zitat von: ch.eick am 24 August 2020, 08:57:16
Dafür musst Du das Python Skript implementieren, das diese Werte aus dem Plenticore ausliest.
Gruß Christian
Das habe ich natürlich gemacht! Es erscheint der folgende Fehler im Logfile von fhem:
KeyError: 'nonce'
i = response['nonce']
File "/opt/fhem/python/bin/plenticore_statistic.py", line 56, in <module>
Traceback (most recent call last):
Hast du eine Idee?
Zitat von: Mumpitz am 24 August 2020, 10:04:38
KeyError: 'nonce'
i = response['nonce']
File "/opt/fhem/python/bin/plenticore_statistic.py", line 56, in <module>
Traceback (most recent call last):
Da stimmt schon etwas mit dem ersten HTTP Aufruf nicht.
Verwendest Du das Python Version 3?
Werden alle importe gemacht?
Hast Du das Passwort File angelegt?
Ich baue mir dann immer folgendes ein, damit man nicht so blind suchen muss
print("Login : ", USER_TYPE)
print("PWD : ", PASSWD)
print("Meldung : ",response )
print ("header : ",response.request.headers)
print ("body : ",response.request.body)
Du kannst es ja auch direkt auf der Kommandozeile aufrufen
/usr/bin/python3 /opt/fhem/python/bin/plenticore_statistic.py >IP-Adresse des Plenticore> <IP-Adresse des Fhem Telnet>
Gruß
Christian
Zitat von: ch.eick am 24 August 2020, 10:44:15
Da stimmt schon etwas mit dem ersten HTTP Aufruf nicht.
Verwendest Du das Python Version 3?
Werden alle importe gemacht?
Hast Du das Passwort File angelegt?
Ich baue mir dann immer folgendes ein, damit man nicht so blind suchen muss
print("Login : ", USER_TYPE)
print("PWD : ", PASSWD)
print("Meldung : ",response )
print ("header : ",response.request.headers)
print ("body : ",response.request.body)
Du kannst es ja auch direkt auf der Kommandozeile aufrufen
/usr/bin/python3 /opt/fhem/python/bin/plenticore_statistic.py >IP-Adresse des Plenticore> <IP-Adresse des Fhem Telnet>
Gruß
Christian
Das Passwort File ist angelegt. Die Frage stellt sich allerdings auch noch, was für ein Passwort da rein kommt?
Also über die IP Adresse komme ich auf den lokalen Webserver. Dort gibt es jedoch keinen Benutzer, sondern Anlagenbetreiber zur Auswahl. Passwort ist klar.
Wenn ich auf per http auf das api zugreife kommt keine Passwortabfrage sondern eine komische Seite mit POST befehlen.
root@FHEM:/opt/fhem/python/bin# /opt/fhem/python/bin/plenticore_statistic.py 192.168.17.30 192.168.17.5
import-im6.q16: unable to open X server `' @ error/import.c/ImportImageCommand/360.
import-im6.q16: unable to open X server `' @ error/import.c/ImportImageCommand/360.
import-im6.q16: unable to open X server `' @ error/import.c/ImportImageCommand/360.
import-im6.q16: unable to open X server `' @ error/import.c/ImportImageCommand/360.
import-im6.q16: unable to open X server `' @ error/import.c/ImportImageCommand/360.
import-im6.q16: unable to open X server `' @ error/import.c/ImportImageCommand/360.
import-im6.q16: unable to open X server `' @ error/import.c/ImportImageCommand/360.
import-im6.q16: unable to open X server `' @ error/import.c/ImportImageCommand/360.
from: can't read /var/mail/Crypto.Cipher
import-im6.q16: unable to open X server `' @ error/import.c/ImportImageCommand/360.
import-im6.q16: unable to open X server `' @ error/import.c/ImportImageCommand/360.
import-im6.q16: unable to open X server `' @ error/import.c/ImportImageCommand/360.
import-im6.q16: unable to open X server `' @ error/import.c/ImportImageCommand/360.
/opt/fhem/python/bin/plenticore_statistic.py: line 21: plenticore: command not found
/opt/fhem/python/bin/plenticore_statistic.py: line 22: web: command not found
/opt/fhem/python/bin/plenticore_statistic.py: line 23: request: command not found
/opt/fhem/python/bin/plenticore_statistic.py: line 25: try:: command not found
/opt/fhem/python/bin/plenticore_statistic.py: line 26: syntax error near unexpected token `('
/opt/fhem/python/bin/plenticore_statistic.py: line 26: ` with open('/opt/fhem/python/pwd_plenticore.json', 'r') as f:'
Hmm,?
Zitat von: Mumpitz am 24 August 2020, 17:44:37
Das Passwort File ist angelegt. Die Frage stellt sich allerdings auch noch, was für ein Passwort da rein kommt?
Also über die IP Adresse komme ich auf den lokalen Webserver. Dort gibt es jedoch keinen Benutzer, sondern Anlagenbetreiber zur Auswahl. Passwort ist klar.
Wenn ich auf per http auf das api zugreife kommt keine Passwortabfrage sondern eine komische Seite mit POST befehlen.
Im Passwort file steht
{
"username": "user",
"password": "Das Passwort steht auf dem Gehäuse"
}
"user" ist hierbei vorgegeben und entspricht dem Betreiber.
Das ist die nicht dokumentierte API Oberfläche, da sieht man aber was so alles gehen soll
http://<IP-Adresse>/api/vi
Dieser Aufruf ist schon mal falsch!
root@FHEM:/opt/fhem/python/bin# /opt/fhem/python/bin/plenticore_statistic.py 192.168.17.30 192.168.17.5
er sollte so lauten, den /usr/bin/python3 ist der Interpreter, der das Programm abarbeitet.
fhem@raspberrypi:~/python/bin$ /usr/bin/python3 plenticore_statistic.py 192.168.178.18 192.168.178.40
###### Hier noch etwas über Deine Python installation
fhem@raspberrypi:~/python/bin$ which python3
/usr/bin/python3
fhem@raspberrypi:~/python/bin$ python3 --version
Python 3.7.3
Zitat von: ch.eick am 24 August 2020, 20:21:46
Im Passwort file steht
{
"username": "user",
"password": "Das Passwort steht auf dem Gehäuse"
}
OK, nun bin ich einen Schritt weiter!
Nun erhalten ich auf der Konsole wie auch in fhem bereits eine Antwort:
Connected to the inverter PUCK RESTful API/Hermet with SW-Version 01.15.04581 and API-Version 0.2.0
CSRF token not available!
CSRF token requested for server that doesn't know CSRF
CSRF token requested for server that doesn't know CSRF
2020.08.25 07:33:24 3: eval: {round( (ReadingsVal("WR_Plenticore","Statistic_EnergyHomePv_Year","")+ReadingsVal("WR_Plenticore","Statistic_EnergyHomeBat_Year","")+ReadingsVal("WR_Plenticore","Statistic_EnergyHomeGrid_Year","") )/1000,2)}
2020.08.25 07:33:24 1: PERL WARNING: Argument "" isn't numeric in addition (+) at (eval 2101105) line 1.
2020.08.25 07:33:24 3: eval: {round( (ReadingsVal("WR_Plenticore","Statistic_EnergyHomePv_Month","")+ReadingsVal("WR_Plenticore","Statistic_EnergyHomeBat_Month","")+ReadingsVal("WR_Plenticore","Statistic_EnergyHomeGrid_Month","") )/1000 ,2)}
2020.08.25 07:33:24 1: PERL WARNING: Argument "" isn't numeric in addition (+) at (eval 2101104) line 1.
2020.08.25 07:33:24 3: eval: {round( (ReadingsVal("WR_Plenticore","Statistic_EnergyHomePv_Day","")+ReadingsVal("WR_Plenticore","Statistic_EnergyHomeBat_Day","")+ReadingsVal("WR_Plenticore","Statistic_EnergyHomeGrid_Day","") )/1000 ,2)}
2020.08.25 07:33:24 1: PERL WARNING: Argument "" isn't numeric in addition (+) at (eval 2101103) line 1.
2020.08.25 07:33:24 3: eval: {round(ReadingsVal("WR_Plenticore","Statistic_EnergyHomeGrid_Year","")/1000 ,2)}
2020.08.25 07:33:24 1: PERL WARNING: Argument "" isn't numeric in division (/) at (eval 2101101) line 1.
2020.08.25 07:33:24 3: eval: {round(ReadingsVal("WR_Plenticore","Statistic_EnergyHomeGrid_Month","")/1000 ,2)}
2020.08.25 07:33:24 1: PERL WARNING: Argument "" isn't numeric in division (/) at (eval 2101100) line 1.
2020.08.25 07:33:24 3: eval: {round(abs(ReadingsVal("WR_Plenticore","Statistic_EnergyHomeGrid_Day",""))/1000 ,2)}
2020.08.25 07:33:24 1: PERL WARNING: Argument "" isn't numeric in abs at (eval 2101099) line 1.
2020.08.25 07:33:24 3: eval: {round((ReadingsVal("WR_Plenticore","Statistic_Yield_Year", "")-ReadingsVal("WR_Plenticore","Statistic_EnergyHomeBat_Year", "")-ReadingsVal("WR_Plenticore","Statistic_EnergyHomePv_Year", ""))/1000,2)}
2020.08.25 07:33:24 1: PERL WARNING: Argument "" isn't numeric in subtraction (-) at (eval 2101097) line 1.
2020.08.25 07:33:24 3: eval: {round((ReadingsVal("WR_Plenticore","Statistic_Yield_Month", "")-ReadingsVal("WR_Plenticore","Statistic_EnergyHomeBat_Month", "")-ReadingsVal("WR_Plenticore","Statistic_EnergyHomePv_Month", ""))/1000,2)}
2020.08.25 07:33:24 1: PERL WARNING: Argument "" isn't numeric in subtraction (-) at (eval 2101096) line 1.
2020.08.25 07:33:24 3: eval: {round((ReadingsVal("WR_Plenticore","Statistic_Yield_Day", "")-ReadingsVal("WR_Plenticore","Statistic_EnergyHomeBat_Day", "")-ReadingsVal("WR_Plenticore","Statistic_EnergyHomePv_Day", ""))/1000,2)}
2020.08.25 07:33:24 1: PERL WARNING: Argument "" isn't numeric in subtraction (-) at (eval 2101095) line 1.
2020.08.25 07:33:24 3: eval: {round( (ReadingsVal("WR_Plenticore","Statistic_EnergyHomeBat_Year", "")+ReadingsVal("WR_Plenticore","Statistic_EnergyHomePv_Year", ""))/1000 ,2)}
2020.08.25 07:33:24 1: PERL WARNING: Argument "" isn't numeric in addition (+) at (eval 2101093) line 1.
2020.08.25 07:33:24 3: eval: {round( (ReadingsVal("WR_Plenticore","Statistic_EnergyHomeBat_Month", "")+ReadingsVal("WR_Plenticore","Statistic_EnergyHomePv_Month", ""))/1000 ,2)}
2020.08.25 07:33:24 1: PERL WARNING: Argument "" isn't numeric in addition (+) at (eval 2101092) line 1.
2020.08.25 07:33:24 3: eval: {round( (ReadingsVal("WR_Plenticore","Statistic_EnergyHomeBat_Day", "")+ReadingsVal("WR_Plenticore","Statistic_EnergyHomePv_Day", ""))/1000 ,2)}
2020.08.25 07:33:24 1: PERL WARNING: Argument "" isn't numeric in addition (+) at (eval 2101091) line 1.
2020.08.25 07:33:24 3: eval: {round( ReadingsVal("WR_Plenticore","Statistic_Yield_Year", "")/1000 ,2)}
2020.08.25 07:33:24 1: PERL WARNING: Argument "" isn't numeric in division (/) at (eval 2101089) line 1.
2020.08.25 07:33:24 3: eval: {round( ReadingsVal("WR_Plenticore","Statistic_Yield_Month", "")/1000 ,2)}
2020.08.25 07:33:24 1: PERL WARNING: Argument "" isn't numeric in division (/) at (eval 2101088) line 1.
2020.08.25 07:33:24 3: eval: {round( ReadingsVal("WR_Plenticore","Statistic_Yield_Day", "")/1000 ,2)}
2020.08.25 07:33:24 1: PERL WARNING: Argument "" isn't numeric in division (/) at (eval 2101087) line 1.
2020.08.25 07:33:24 2: PV_Schedule: {system("/usr/bin/python3 /opt/fhem/python/bin/plenticore_statistic.py ".ReadingsVal("WR_Plenticore","IP-Address_Plenticore","?")." ".ReadingsVal("WR_Plenticore","IP-Address_FHEM","?")." &")}: -1
Im Device des Wechselrichter, bei mir WR_Plenticore, habe ich auch 2 neue Readings erhalten. Allerdings mit komischen Inhalt:
statistics_clean {"statistics": [], "modulehermet:statistic:EnergyFlow"}]
statistics_output [{"processdata": [], "moduleid": "hermet:statistic:EnergyFlow"}]
Diese Meldung ist normal und wird auch bleiben.
Somit arbeitet das DOIF bereits und startet jede Stunde die Statistik Abfrage :-)
Die readings mit den IP-Adresse hast Du ach bereits richtig angelegt und die Adressen stimmen auch.
2020.08.25 07:33:24 2: PV_Schedule: {system("/usr/bin/python3 /opt/fhem/python/bin/plenticore_statistic.py ".ReadingsVal("WR_Plenticore","IP-Address_Plenticore","?")." ".ReadingsVal("WR_Plenticore","IP-Address_FHEM","?")." &")}: -1
Diese Meldungen kommen vom plenticore_statistic.py Skript.
### Die Anmeldung ist gelaufen und es wird "/api/vi/info/version" abgefragt. Du hast den default Namen von SCB auf Hermet im Plenticore geändert, ansonsten sind unsere Versionen identisch.
Connected to the inverter PUCK RESTful API/Hermet with SW-Version 01.15.04581 and API-Version 0.2.0
### Ab hier scheint die Kommunikation zum Fhem noch nicht sauber zu sein, oder es kommt von einem anderen Device ???
### Weiter unten bekommst Du ja schon eine Rückmeldung vom Plenticore (s.u.)
CSRF token not available!
CSRF token requested for server that doesn't know CSRF
CSRF token requested for server that doesn't know CSRF
Das hier liegt daran, weil Du keine Werte für Statistic_* bekommen hast. Also einfach überlesen und später sollten sie dann weg sein
(ReadingsVal("WR_Plenticore","Statistic_EnergyHomePv_Year","")+ReadingsVal("WR_Plenticore","Statistic_EnergyHomeBat_Year","")+ReadingsVal("WR_Plenticore","Statistic_EnergyHomeGrid_Year","") )/1000,2)}
2020.08.25 07:33:24 1: PERL WARNING: Argument "" isn't numeric in addition (+) at (eval 2101105) line 1.
2020.08.25 07:33:24 1: PERL WARNING: Argument "" isn't numeric in division (/) at (eval 2101088) line 1.
2020.08.25 07:33:24 3: eval: {round( ReadingsVal("WR_Plenticore","Statistic_Yield_Day", "")/1000 ,2)}
2020.08.25 07:33:24 1: PERL WARNING: Argument "" isn't numeric in division (/) at (eval 2101087) line 1.
Diese Readings sind die Rückmeldung vom Plenticore, somit hat die Kopplung vom Python Skript bereits geklappt. Die CSRF Meldungen kommen dann nicht von diesen Devices.
statistics_clean {"statistics": [], "modulehermet:statistic:EnergyFlow"}]
statistics_output [{"processdata": [], "moduleid": "hermet:statistic:EnergyFlow"}]
"statistics_output" ist der JSON String der vom Plenticore gekommen ist, ich vermute durch Deine Namensänderung hat sich auch die Moduleid verändert.
Bitte prüfe und ändere folgende Zeile im Skript, denn da ist der Name mit drin :-(
alt: request = '/processdata/scb:statistic:EnergyFlow'
neu: request = '/processdata/hermet:statistic:EnergyFlow'
"statistics_clean" wird durch das userreading aus dem PV_Anlage_1 Device erzeugt und es arbeitet ebenfalls schon :-) Jedock garbage in gibt garbage out :-)
Des weiteren kommt hier auch wieder Deine Namensänderung zum tragen, bitte ändere das userreading und ersetze "scb" durch ".*" . Im ersten post ändere ich das dann auch noch.
statistics_clean:statistics_output.* { my $x = ReadingsVal($NAME,"statistics_output",0);; $x =~ s/\{"moduleid": ".*:statistic:EnergyFlow", "processdata": \[|id": "|, "unit": "", "value"|^\[|\]\}\]$//g;; $x =~ s/moduleid/statistics_00_moduleid/g;; $x =~ s/processdata/statistics/g;; $x =~ s/\}\, \{/\, /g;; return $x }
Ich denke, das hilft jetzt wieder weiter. Im statistics_output sollte später so etwas wie dies hier stehen.
Wenn Du das in das reading schreibst, sollte das userreading es in statistics_clean umwandel.
Als nächstes erledigt dann "Plenticore_Statistics" seine Arbeitet und wandelt das JSON in einzelne Readings um.
[{"moduleid": "scb:statistic:EnergyFlow", "processdata": [{"id": "Statistic:Autarky:Day", "unit": "", "value": 99.6919677162}, {"id": "Statistic:Autarky:Month", "unit": "", "value": 99.7246557431}, {"id": "Statistic:Autarky:Total", "unit": "", "value": 65.6140392962}, {"id": "Statistic:Autarky:Year", "unit": "", "value": 77.3596096492}, {"id": "Statistic:CO2Saving:Day", "unit": "", "value": 10704.3006626863}, {"id": "Statistic:CO2Saving:Month", "unit": "", "value": 686394.2485287965}, {"id": "Statistic:CO2Saving:Total", "unit": "", "value": 5955983.828972261}, {"id": "Statistic:CO2Saving:Year", "unit": "", "value": 5641830.747554813}, {"id": "Statistic:EnergyHome:Day", "unit": "", "value": 7752.3548381243}, {"id": "Statistic:EnergyHome:Month", "unit": "", "value": 361046.7609239225}, {"id": "Statistic:EnergyHome:Total", "unit": "", "value": 5974726.2243373245}, {"id": "Statistic:EnergyHome:Year", "unit": "", "value": 4521121.1624692}, {"id": "Statistic:EnergyHomeBat:Day", "unit": "", "value": 2630.1575911424}, {"id": "Statistic:EnergyHomeBat:Month", "unit": "", "value": 117455.2500878764}, {"id": "Statistic:EnergyHomeBat:Total", "unit": "", "value": 1173864.8793304889}, {"id": "Statistic:EnergyHomeBat:Year", "unit": "", "value": 1027927.0100875347}, {"id": "Statistic:EnergyHomeGrid:Day", "unit": "", "value": 23.4391181523}, {"id": "Statistic:EnergyHomeGrid:Month", "unit": "", "value": 989.6937225771}, {"id": "Statistic:EnergyHomeGrid:Total", "unit": "", "value": 2069061.0860175206}, {"id": "Statistic:EnergyHomeGrid:Year", "unit": "", "value": 1025701.7678753391}, {"id": "Statistic:EnergyHomePv:Day", "unit": "", "value": 5098.385426528}, {"id": "Statistic:EnergyHomePv:Month", "unit": "", "value": 242595.4949888238}, {"id": "Statistic:EnergyHomePv:Total", "unit": "", "value": 2746389.3044861364}, {"id": "Statistic:EnergyHomePv:Year", "unit": "", "value": 2469595.567303522}, {"id": "Statistic:OwnConsumptionRate:Day", "unit": "", "value": 50.5398038434}, {"id": "Statistic:OwnConsumptionRate:Month", "unit": "", "value": 36.7189626257}, {"id": "Statistic:OwnConsumptionRate:Total", "unit": "", "value": 46.0743603017}, {"id": "Statistic:OwnConsumptionRate:Year", "unit": "", "value": 43.3948710567}, {"id": "Statistic:Yield:Day", "unit": "", "value": 15291.8580895519}, {"id": "Statistic:Yield:Month", "unit": "", "value": 980563.212183995}, {"id": "Statistic:Yield:Total", "unit": "", "value": 8508548.327103231}, {"id": "Statistic:Yield:Year", "unit": "", "value": 8059758.21079259}]}]
Viele Grüße
Christian
Zitat von: ch.eick am 25 August 2020, 13:50:48
Diese Meldung ist normal und wird auch bleiben.
Somit arbeitet das DOIF bereits und startet jede Stunde die Statistik Abfrage :-)
Die readings mit den IP-Adresse hast Du ach bereits richtig angelegt und die Adressen stimmen auch.
2020.08.25 07:33:24 2: PV_Schedule: {system("/usr/bin/python3 /opt/fhem/python/bin/plenticore_statistic.py ".ReadingsVal("WR_Plenticore","IP-Address_Plenticore","?")." ".ReadingsVal("WR_Plenticore","IP-Address_FHEM","?")." &")}: -1
Besten Dank für deine Hilfe. Leider klappt es immernoch nicht. Ich denke ich habe noch 2 Probleme:
1:
Ich glaube hier stimmt noch was nicht ganz. Das sind meine beiden Readings im WR_Plenticore:
statistics_clean {"statistics": [], "moduleHermet:statistic:EnergyFlow"}]
statistics_output [{"processdata": [], "moduleid": "Hermet:statistic:EnergyFlow"}]
Diese entstehen durch den Aufruf wie du mir geschrieben hast:
statistics_clean:statistics_output.* { my $x = ReadingsVal($NAME,"statistics_output",0);; $x =~ s/\{"moduleid": ".*:statistic:EnergyFlow", "processdata": \[|id": "|, "unit": "", "value"|^\[|\]\}\]$//g;; $x =~ s/moduleid/statistics_00_moduleid/g;; $x =~ s/processdata/statistics/g;; $x =~ s/\}\, \{/\, /g;; return $x }
2:
Das zweite Problem ist der Aufruf aus Fhem das noch nicht ganz alles sauber ist. Was soll ich noch versuchen? Wenn ich den Aufruf direkt aus der Konsole mache erscheint der CSRF Fehler ebenfalls. Meiner Meinung nach müsste er hier bereits die Werte anzeigen, odern nicht?
root@FHEM:~# /usr/bin/python3 /opt/fhem/python/bin/plenticore_statistic.py 192.168.17.30 192.168.17.5
Connected to the inverter PUCK RESTful API/Hermet with SW-Version 01.15.04581 and API-Version 0.2.0
CSRF token requested for server that doesn't know CSRF
CSRF token requested for server that doesn't know CSRF
CSRF token not available!
Besten Dank nochmals für deine Hilfe. Ich glaube wir sind nicht mehr weit vom Problem entfernt (hoff)
Update 1657 Uhr: Testweise habe ich jetzt auf 8083 das Attribut CSRF Token = none entfernt. Nun läuft der Befehl in der Konsole durch ohne Fehler.
Allerdings zeigt er mir weiter nichts in FHEM an, aber möglicherweise weil bei Punkt 1 noch was im argen liegt?
Zitat von: Mumpitz am 25 August 2020, 16:14:19
Besten Dank für deine Hilfe. Leider klappt es immernoch nicht. Ich denke ich habe noch 2 Probleme:
1:
Ich glaube hier stimmt noch was nicht ganz. Das sind meine beiden Readings im WR_Plenticore:
statistics_clean {"statistics": [], "moduleHermet:statistic:EnergyFlow"}]
statistics_output [{"processdata": [], "moduleid": "Hermet:statistic:EnergyFlow"}]
Diese entstehen durch den Aufruf wie du mir geschrieben hast:
statistics_clean:statistics_output.* { my $x = ReadingsVal($NAME,"statistics_output",0);; $x =~ s/\{"moduleid": ".*:statistic:EnergyFlow", "processdata": \[|id": "|, "unit": "", "value"|^\[|\]\}\]$//g;; $x =~ s/moduleid/statistics_00_moduleid/g;; $x =~ s/processdata/statistics/g;; $x =~ s/\}\, \{/\, /g;; return $x }
2:
Das zweite Problem ist der Aufruf aus Fhem das noch nicht ganz alles sauber ist. Was soll ich noch versuchen? Wenn ich den Aufruf direkt aus der Konsole mache erscheint der CSRF Fehler ebenfalls. Meiner Meinung nach müsste er hier bereits die Werte anzeigen, odern nicht?
root@FHEM:~# /usr/bin/python3 /opt/fhem/python/bin/plenticore_statistic.py 192.168.17.30 192.168.17.5
Connected to the inverter PUCK RESTful API/Hermet with SW-Version 01.15.04581 and API-Version 0.2.0
CSRF token requested for server that doesn't know CSRF
CSRF token requested for server that doesn't know CSRF
CSRF token not available!
Besten Dank nochmals für deine Hilfe. Ich glaube wir sind nicht mehr weit vom Problem entfernt (hoff)
Update 1657 Uhr: Testweise habe ich jetzt auf 8083 das Attribut CSRF Token = none entfernt. Nun läuft der Befehl in der Konsole durch ohne Fehler.
Allerdings zeigt er mir weiter nichts in FHEM an, aber möglicherweise weil bei Punkt 1 noch was im argen liegt?
Zu 2:
Das hätte ich jetzt auch vermutet, bei ist nur http ohne Key konfiguriert, da kannst Du ja noch mal anderweitig weiter testen.
Zu 1:
Die Daten werden ja bereits übertragen, nur kommt vom Plenticore noch nichts an Werten.
An dem userreading habe ich das Problem bereits erkannt, das werde ich aber erst zu Ende der Woche bearbeiten können.
Wenn Du meine test Daten in das statistics_output schreibst, sollte das jedoch schon laufen. Das kommando wird einfach komplett in die Kommandozeile von Fhem geschrieben.
setreading PV_Anlage_1 statistics_output [{"moduleid": "scb:statistic:EnergyFlow", "processdata": [{"id": "Statistic:Autarky:Day", "unit": "", "value": 99.6919677162}, {"id": "Statistic:Autarky:Month", "unit": "", "value": 99.7246557431}, {"id": "Statistic:Autarky:Total", "unit": "", "value": 65.6140392962}, {"id": "Statistic:Autarky:Year", "unit": "", "value": 77.3596096492}, {"id": "Statistic:CO2Saving:Day", "unit": "", "value": 10704.3006626863}, {"id": "Statistic:CO2Saving:Month", "unit": "", "value": 686394.2485287965}, {"id": "Statistic:CO2Saving:Total", "unit": "", "value": 5955983.828972261}, {"id": "Statistic:CO2Saving:Year", "unit": "", "value": 5641830.747554813}, {"id": "Statistic:EnergyHome:Day", "unit": "", "value": 7752.3548381243}, {"id": "Statistic:EnergyHome:Month", "unit": "", "value": 361046.7609239225}, {"id": "Statistic:EnergyHome:Total", "unit": "", "value": 5974726.2243373245}, {"id": "Statistic:EnergyHome:Year", "unit": "", "value": 4521121.1624692}, {"id": "Statistic:EnergyHomeBat:Day", "unit": "", "value": 2630.1575911424}, {"id": "Statistic:EnergyHomeBat:Month", "unit": "", "value": 117455.2500878764}, {"id": "Statistic:EnergyHomeBat:Total", "unit": "", "value": 1173864.8793304889}, {"id": "Statistic:EnergyHomeBat:Year", "unit": "", "value": 1027927.0100875347}, {"id": "Statistic:EnergyHomeGrid:Day", "unit": "", "value": 23.4391181523}, {"id": "Statistic:EnergyHomeGrid:Month", "unit": "", "value": 989.6937225771}, {"id": "Statistic:EnergyHomeGrid:Total", "unit": "", "value": 2069061.0860175206}, {"id": "Statistic:EnergyHomeGrid:Year", "unit": "", "value": 1025701.7678753391}, {"id": "Statistic:EnergyHomePv:Day", "unit": "", "value": 5098.385426528}, {"id": "Statistic:EnergyHomePv:Month", "unit": "", "value": 242595.4949888238}, {"id": "Statistic:EnergyHomePv:Total", "unit": "", "value": 2746389.3044861364}, {"id": "Statistic:EnergyHomePv:Year", "unit": "", "value": 2469595.567303522}, {"id": "Statistic:OwnConsumptionRate:Day", "unit": "", "value": 50.5398038434}, {"id": "Statistic:OwnConsumptionRate:Month", "unit": "", "value": 36.7189626257}, {"id": "Statistic:OwnConsumptionRate:Total", "unit": "", "value": 46.0743603017}, {"id": "Statistic:OwnConsumptionRate:Year", "unit": "", "value": 43.3948710567}, {"id": "Statistic:Yield:Day", "unit": "", "value": 15291.8580895519}, {"id": "Statistic:Yield:Month", "unit": "", "value": 980563.212183995}, {"id": "Statistic:Yield:Total", "unit": "", "value": 8508548.327103231}, {"id": "Statistic:Yield:Year", "unit": "", "value": 8059758.21079259}]}]
Nun zu dem eigentlichen Problem. Hast Du im Skript bereits die Zeile mit "scb:statistic:EnergyFlow" in "Hermet:statistic:EnergyFlow" umgeändert?
Wenn das schon erledigt ist, dann schau Dir im Python mal einen print() Befehl an und füge die dann im Skript ein, um Dir Zwischenergebnisse anzuzeigen.
Ich bin jetzt erst mal bis übermorgen unterwegs :-)
Zitat von: ch.eick am 25 August 2020, 19:56:18
Wenn Du meine test Daten in das statistics_output schreibst, sollte das jedoch schon laufen. Das kommando wird einfach komplett in die Kommandozeile von Fhem geschrieben.
Hat perfekt funktioniert. Alle Werte werden berechnet und angezeigt!
Nun zu dem eigentlichen Problem. Hast Du im Skript bereits die Zeile mit "scb:statistic:EnergyFlow" in "Hermet:statistic:EnergyFlow" umgeändert?
Ja. Hatte ich gemacht. Nachdem ich die Print Befehle am Schluss aktiviert habe musste ich feststellen, dass keinerlei Werte kamen, nur der Name des API. Aus Plausch habe ich nochmals scb eingetragen, und sieht da, die Werte kommen!!! Kann mir das nicht erklären, warum er da den alten Namen eingetragen lässt.
Das heisst nun, ich habe die Werte in fhem in den beiden Readings. Leider gehen sie von da aber nicht weiter in die Statistik_ Readings. Dort verbleiben aber deine Werte. Ich kann den Energy Dummy updaten wie ich will, es passiert einfach nix.
Hier die beiden Readings, welche nach Dem ausführen des Scripts aktualisiert werden:
statistics_clean
{"statistics": [{"Statistic:Autarky:Day": 99.5931898904, "Statistic:Autarky:Month": 99.6635714096, "Statistic:Autarky:Total": 99.6635714096, "Statistic:Autarky:Year": 99.6635714096, "Statistic:CO2Saving:Day": 26528.5249077122, "Statistic:CO2Saving:Month": 149143.9487200841, "Statistic:CO2Saving:Total": 149143.9487200841, "Statistic:CO2Saving:Year": 149143.9487200841, "Statistic:EnergyHome:Day": 10226.7764666189, "Statistic:EnergyHome:Month": 104543.4346882987, "Statistic:EnergyHome:Total": 104543.4346882987, "Statistic:EnergyHome:Year": 104543.4346882987, "Statistic:EnergyHomeBat:Day": 3291.2464926297, "Statistic:EnergyHomeBat:Month": 24571.3268830336, "Statistic:EnergyHomeBat:Total": 24571.3268830336, "Statistic:EnergyHomeBat:Year": 24571.3268830336, "Statistic:EnergyHomeGrid:Day": 41.614506264, "Statistic:EnergyHomeGrid:Month": 351.9681873088, "Statistic:EnergyHomeGrid:Total": 351.9681873088, "Statistic:EnergyHomeGrid:Year": 351.9681873088, "Statistic:EnergyHomePv:Day": 6893.3934287837, "Statistic:EnergyHomePv:Month": 79618.1765724283, "Statistic:EnergyHomePv:Total": 79618.1765724283, "Statistic:EnergyHomePv:Year": 79618.1765724283, "Statistic:OwnConsumptionRate:Day": 26.8753014314, "Statistic:OwnConsumptionRate:Month": 48.9018864695, "Statistic:OwnConsumptionRate:Total": 48.9018864695, "Statistic:OwnConsumptionRate:Year": 48.9018864695, "Statistic:Yield:Day": 37897.8927253031, "Statistic:Yield:Month": 213062.7838858345, "Statistic:Yield:Total": 213062.7838858345, "Statistic:Yield:Year": 213062.7838858345}], "modulescb:statistic:EnergyFlow"}]
2020-08-25 20:49:00
statistics_output
[{"processdata": [{"id": "Statistic:Autarky:Day", "unit": "", "value": 99.5931898904}, {"id": "Statistic:Autarky:Month", "unit": "", "value": 99.6635714096}, {"id": "Statistic:Autarky:Total", "unit": "", "value": 99.6635714096}, {"id": "Statistic:Autarky:Year", "unit": "", "value": 99.6635714096}, {"id": "Statistic:CO2Saving:Day", "unit": "", "value": 26528.5249077122}, {"id": "Statistic:CO2Saving:Month", "unit": "", "value": 149143.9487200841}, {"id": "Statistic:CO2Saving:Total", "unit": "", "value": 149143.9487200841}, {"id": "Statistic:CO2Saving:Year", "unit": "", "value": 149143.9487200841}, {"id": "Statistic:EnergyHome:Day", "unit": "", "value": 10226.7764666189}, {"id": "Statistic:EnergyHome:Month", "unit": "", "value": 104543.4346882987}, {"id": "Statistic:EnergyHome:Total", "unit": "", "value": 104543.4346882987}, {"id": "Statistic:EnergyHome:Year", "unit": "", "value": 104543.4346882987}, {"id": "Statistic:EnergyHomeBat:Day", "unit": "", "value": 3291.2464926297}, {"id": "Statistic:EnergyHomeBat:Month", "unit": "", "value": 24571.3268830336}, {"id": "Statistic:EnergyHomeBat:Total", "unit": "", "value": 24571.3268830336}, {"id": "Statistic:EnergyHomeBat:Year", "unit": "", "value": 24571.3268830336}, {"id": "Statistic:EnergyHomeGrid:Day", "unit": "", "value": 41.614506264}, {"id": "Statistic:EnergyHomeGrid:Month", "unit": "", "value": 351.9681873088}, {"id": "Statistic:EnergyHomeGrid:Total", "unit": "", "value": 351.9681873088}, {"id": "Statistic:EnergyHomeGrid:Year", "unit": "", "value": 351.9681873088}, {"id": "Statistic:EnergyHomePv:Day", "unit": "", "value": 6893.3934287837}, {"id": "Statistic:EnergyHomePv:Month", "unit": "", "value": 79618.1765724283}, {"id": "Statistic:EnergyHomePv:Total", "unit": "", "value": 79618.1765724283}, {"id": "Statistic:EnergyHomePv:Year", "unit": "", "value": 79618.1765724283}, {"id": "Statistic:OwnConsumptionRate:Day", "unit": "", "value": 26.8753014314}, {"id": "Statistic:OwnConsumptionRate:Month", "unit": "", "value": 48.9018864695}, {"id": "Statistic:OwnConsumptionRate:Total", "unit": "", "value": 48.9018864695}, {"id": "Statistic:OwnConsumptionRate:Year", "unit": "", "value": 48.9018864695}, {"id": "Statistic:Yield:Day", "unit": "", "value": 37897.8927253031}, {"id": "Statistic:Yield:Month", "unit": "", "value": 213062.7838858345}, {"id": "Statistic:Yield:Total", "unit": "", "value": 213062.7838858345}, {"id": "Statistic:Yield:Year", "unit": "", "value": 213062.7838858345}], "moduleid": "scb:statistic:EnergyFlow"}]
Wie kriegen wir das noch hin??
So, da bin ich wieder :-)
Zitat von: Mumpitz am 25 August 2020, 21:23:07
Ja. Hatte ich gemacht. Nachdem ich die Print Befehle am Schluss aktiviert habe musste ich feststellen, dass keinerlei Werte kamen, nur der Name des API. Aus Plausch habe ich nochmals scb eingetragen, und sieht da, die Werte kommen!!! Kann mir das nicht erklären, warum er da den alten Namen eingetragen lässt.
Die API ist nach meiner Meinung sehr intolerant gegen die geringsten Änderungen :-( , das heißt ich habe keine Ahnung :-) . So sei es, aber jetzt hast Du ja Daten.
Komischer Weise ist der JSON String bei Dir geringfügig anders als bei mir, obwohl wir die selbe FW Version haben. Ich habe dann mal mein userreading verändert und nun sollte es aber klappen.
Bitte tausche diesen Teil aus:
statistics_clean:statistics_output.* { my $x = ReadingsVal($NAME,"statistics_output",0);; $x =~ s/"moduleid": "scb:statistic:EnergyFlow", |, "moduleid": "scb:statistic:EnergyFlow"|"processdata": \[//g;; $x =~ s/id": "|, "unit": "", "value"|^\[|\]\}\]$//g;; $x =~ s/moduleid/statistics_00_moduleid/g;; $x =~ s/processdata/statistics/g;; $x =~ s/\}\, \{/\, /g;; $x =~ s/\{\{/\{/g;; return $x }
Zur Erklärung, ich habe im Fhem noch nicht das passende gefunden, um diesen JSON String korrekt in readings einzulesen und auch noch passende readingsnamen zu vergeben. Das ist der Grund, warum ich hier mit Perl und suchen/ersetzen den JSON String für das FHEM expandJSON Modul lesbar gemacht habe.
Im einzelnen werden folgende Strings verändert, also gelöscht, ersetzt und einzelne Zeichen modifiziert, damit es wieder JSON ist:
1. Schritt $x =~ s/"moduleid": "scb:statistic:EnergyFlow", |, "moduleid": "scb:statistic:EnergyFlow"|"processdata": \[//g
# Die "" sind hier teil des Strings und werden auch gelöscht!
"moduleid": "scb:statistic:EnergyFlow",
, "moduleid": "scb:statistic:EnergyFlow"
"processdata": \[
2. Schritt $x =~ s/id": "|, "unit": "", "value"|^\[|\]\}\]$//g
# Bei einer Regex maskiert ein \ das nächste Zeichen, damit es nicht als Steuerzeichen erkannt wird
# Es wird einiges gelöscht...
id": "
, "unit": "", "value"
^\[ # Die [ am Anfang des Strings
\]\}\]$ # Die restlichen Klammern am Ende des Strings
3. Schritt $x =~ s/moduleid/statistics_00_moduleid/g
Aus moduleid wird statistics_00_moduleid
4. Schritt $x =~ s/processdata/statistics/g
Aus processdata wird statistics
5. Schritt $x =~ s/\}\, \{/\, /g
Einige Zeichen so umsetzen, dass wieder ein JSON Syntax entsteht
6. Schritt $x =~ s/\{\{/\{/g
Aus {{ am Anfang wieder { machen
Das ist natürlich hart kodierte Stringmanipulation, die für jeden Einzelfall überprüft werden muss!!
Sollte jemand sich mit den Möglichkeiten zu JSON im FHEM auskennen, ist er gerne eingeladen sich hier zu verwirklichen :-)
Für das Testen kann man das Device Plenticore_Statistics disablen, damit nicht fehlerhafte Statistic_* readings in die LogDb geschrieben werden. Sollte man das Vergessen, steht ein Aufräumen in der Datenbank an :-)
attr Plenticore_Statistics disable 1
Viele Grüße
Christian
Zitat von: ch.eick am 27 August 2020, 09:28:31
So, da bin ich wieder :-)
Die API ist nach meiner Meinung sehr intolerant gegen die geringsten Änderungen :-( , das heißt ich habe keine Ahnung :-) . So sei es, aber jetzt hast Du ja Daten.
Komischer Weise ist der JSON String bei Dir geringfügig anders als bei mir, obwohl wir die selbe FW Version haben. Ich habe dann mal mein userreading verändert und nun sollte es aber klappen.
Bitte tausche diesen Teil aus:
statistics_clean:statistics_output.* { my $x = ReadingsVal($NAME,"statistics_output",0);; $x =~ s/"moduleid": "scb:statistic:EnergyFlow", |, "moduleid": "scb:statistic:EnergyFlow"|"processdata": \[//g;; $x =~ s/id": "|, "unit": "", "value"|^\[|\]\}\]$//g;; $x =~ s/moduleid/statistics_00_moduleid/g;; $x =~ s/processdata/statistics/g;; $x =~ s/\}\, \{/\, /g;; $x =~ s/\{\{/\{/g;; return $x }
Du bist mein persönlicher Held des Tages!!! (Weiss, nützt dir nix ;D)
Es funktioniert alles!!! Die Readings werden geschrieben und die Bilanz aktualisiert. Echt cool!
Jetzt geht's an meine persönliche Dokumentation sowie an die Umsetzung der Visualisierung ins FTUI (Thema waf 8))
Also, nochmals ein herzliches Dankeschön aus der Schweiz
Zitat von: Mumpitz am 27 August 2020, 09:57:15
Du bist mein persönlicher Held des Tages!!! (Weiss, nützt dir nix ;D)
Es funktioniert alles!!! Die Readings werden geschrieben und die Bilanz aktualisiert. Echt cool!
Jetzt geht's an meine persönliche Dokumentation sowie an die Umsetzung der Visualisierung ins FTUI (Thema waf 8))
Also, nochmals ein herzliches Dankeschön aus der Schweiz
Na dann herzlichen Glückwunsch :-)
Der waf ist besonders hoch, wenn es die Frau gar nicht merkt. Die Diagramme interessieren die Damen nicht, weshalb Du auch keine FTUI Integration brauchst.
Sinnvoll wäre ein optisches Signal in Form einer Ampel, wann noch Überschuss ist, damit die Spülmaschine noch laufen kann, aber das gehört nicht in diesen Thread.
Im Anhang nochmal ein Bild der Bilanz. Die Autarkie für dieses Jahr ist schon auf 77% geklettert. Jetzt geht es leider nur noch sehr langsam weiter nach oben. Mein Ziel wäre 80%, was ich mal aus dem Bauch heraus so daher gesagt habe :-)
Ich versuche mich noch in den Jahres Balkendiagrammen, aber da ist mir noch nicht ganz klar, was wirklich von Interesse ist.
Der PV-Bezug pro Woche wäre das dunkel Blaue, aber da sind nicht so viele Schwankungen drin.
Die Autarkie ist auch sinn frei, weil man keinen Rückschluss machen kann.
PV_Total_Woche ist noch ganz nett, da kann man sehen, wie so die Woche gewesen ist.
Bei PV_Total_Monat sind dann die Wochenbalken alle aufeinandergestapelt.
Was hättest Du da noch für Ideen? Oder natürlich auch jeder andere, der hier mit liest ;-)
Die Werte in der LogDb für das Diagramm sind noch zusätzlich durch DbRep direkt in der Datenbank erzeugt worden und kommen nicht vom Plenticore. In den Plenticore Statistiken werden keine Wochen Werte geliefert, aber das kann ja alles die SQL Datenbank.
Gruß
Christian
Zitat von: Mumpitz am 27 August 2020, 09:57:15
Jetzt geht's an meine persönliche Dokumentation sowie an die Umsetzung der Visualisierung ins FTUI (Thema waf 8))
Würdest Du mir bitte dann Deine Dokumentation mit den besonderen Erlebnissen als PN zusenden?
Ich wollte daraus auch noch ein WIKI machen und jemand der es schon mal nachgebaut hat hat ja einen anderen Blickwinkel.
Dann könnte ich direkt erkennen, wo die Schwachstellen bei meiner Erklärung sind.
Zitat von: ch.eick am 27 August 2020, 11:32:29
Würdest Du mir bitte dann Deine Dokumentation mit den besonderen Erlebnissen als PN zusenden?
Ich wollte daraus auch noch ein WIKI machen und jemand der es schon mal nachgebaut hat hat ja einen anderen Blickwinkel.
Dann könnte ich direkt erkennen, wo die Schwachstellen bei meiner Erklärung sind.
Mache ich, mal schauen wer schneller ist :-)
Zitat von: Mumpitz am 27 August 2020, 14:24:13
Mache ich, mal schauen wer schneller ist :-)
Erster :-)
2020.08.27 - Es wurde nun eine Wiki Seite begonnen Kostal Plenticore 10 Plus (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#Projekte_der_FHEM-Community)
Aber natürlich noch nicht bis zum Ende alles drin....
Sooo, ab jetzt ist das Wiki die erste Quelle der Wahl!
Heute ist es leider soweit, das erste mal seit Inbetriebnahme meiner PV Anlage vor 2 Wochen ist mein BYD leer und wir müssen Strom aus dem Netz beziehen. Das bringt natürlich mit sich, dass die Autark und Eigenverbrauchsquote auf 0 abgesackt ist. Das mag offenbar die Berechnung gar nicht. Im Dum.Energy dummy wie auch im Log diese Fehlermeldung:
Gibt es einen Spezialisten der das beheben kann?
2020.08.30 08:50:00 1: Error evaluating Dum.Energy userReading SelfConsumptionQuote: Illegal division by zero at (eval 338122) line 1
Zitat von: Mumpitz am 30 August 2020, 09:25:23
Heute ist es leider soweit, das erste mal seit Inbetriebnahme meiner PV Anlage vor 2 Wochen ist mein BYD leer und wir müssen Strom aus dem Netz beziehen. Das bringt natürlich mit sich, dass die Autark und Eigenverbrauchsquote auf 0 abgesackt ist. Das mag offenbar die Berechnung gar nicht. Im Dum.Energy dummy wie auch im Log diese Fehlermeldung:
Gibt es einen Spezialisten der das beheben kann?
2020.08.30 08:50:00 1: Error evaluating Dum.Energy userReading SelfConsumptionQuote: Illegal division by zero at (eval 338122) line 1
Ich schau es mir mal an.
EDIT: Bitte tausche im userreading die Zeile für SelfConsumptionQuote aus
SelfConsumptionQuote { my $y = ReadingsVal("PV_Anlage_1","Total_AC_active_power", 0) ;; $y <= 0 ? $y = 1 : $y = $y ;; my $x = round((ReadingsVal("PV_Anlage_1","Home_own_consumption_from_PV", "0") + ReadingsVal("PV_Anlage_1","Home_own_consumption_from_battery","0")) / $y * 100 ,0) ;; $x > 100 ? $x = 100:$x = $x ;; $x }
Du könntest schon mal die Doku im Wiki lesen, da sich jetzt auch Bilder drin :-)
Hallo
Worüber ich mir immernoch den Kopf zerbreche ist der Betrag der erzeugten Leistung. Wenn ich die FHEM Werte und die Werte aus dem KOSTAL Portal vergleiche fehlen das ziemlich genau 10kWh.
Erzeugte Leistung gemäss FHEM heute: 19.12kWh
Erzeugte Leistung gemäss Kostal Portal: 29.5 kWh.
Da die Batterie heute morgen völlig leer war, also bis auf den SOC 10% (ca. 1kWh). Da es sich beim Speicher um einen BYD 10.3 handelt, wäre das ziemlich genau der Betrag welcher mir fehlt...
Nur, wie kann ich diesen in FHEM berechnen? Ich kriegs nicht raus :-(
Zitat von: ch.eick am 30 August 2020, 12:59:05
Ich schau es mir mal an.
EDIT: Bitte tausche im userreading die Zeile für SelfConsumptionQuote aus
SelfConsumptionQuote { my $y = ReadingsVal("PV_Anlage_1","Total_AC_active_power", 0) ;; $y <= 0 ? $y = 1 : $y = $y ;; my $x = round((ReadingsVal("PV_Anlage_1","Home_own_consumption_from_PV", "0") + ReadingsVal("PV_Anlage_1","Home_own_consumption_from_battery","0")) / $y * 100 ,0) ;; $x > 100 ? $x = 100:$x = $x ;; $x }
Es hat funktioniert. Der selbe Fehler kommt übrigens auch bei der Autark Quote
Error evaluating Dum.Energy userReading AutarkyQuote: Illegal division by zero at (eval 578554) line 2.
Zitat von: Mumpitz am 31 August 2020, 20:07:38
Hallo
Worüber ich mir immernoch den Kopf zerbreche ist der Betrag der erzeugten Leistung. Wenn ich die FHEM Werte und die Werte aus dem KOSTAL Portal vergleiche fehlen das ziemlich genau 10kWh.
Erzeugte Leistung gemäss FHEM heute: 19.12kWh
Erzeugte Leistung gemäss Kostal Portal: 29.5 kWh.
Da die Batterie heute morgen völlig leer war, also bis auf den SOC 10% (ca. 1kWh). Da es sich beim Speicher um einen BYD 10.3 handelt, wäre das ziemlich genau der Betrag welcher mir fehlt...
Nur, wie kann ich diesen in FHEM berechnen? Ich kriegs nicht raus :-(
In Fhem habe ich auch lange überlegt was da angezeigt werden soll.
Ich meine, da zeige ich die Leistung an, die der WR abgegeben hat, was die 10KW erklären würde, denn die sind ja noch im Speicher und der Speicher ist auf der DC Seite.
Da müssten wir zwei nochmal intensiv drüber Philosophieren. Berechnen und Ausgeben kann man so ziemlich alles.
Als ich das gemacht habe war niemand da, der sagen konnte ob das so stimmt oder auch nicht.
Versuche es mal zu erklären und ich kann es dann umsetzen.
Ich bin halt auch Anfänger :-)
Gruß
Christian
Zitat von: Mumpitz am 31 August 2020, 20:10:07
Es hat funktioniert. Der selbe Fehler kommt übrigens auch bei der Autark Quote
Error evaluating Dum.Energy userReading AutarkyQuote: Illegal division by zero at (eval 578554) line 2.
Ah, ich denke ich verstehe es.
Wenn Total_AC_active_power = 0 ist die AutarkyQuote natürlich auch immer 0.
Ich schau es mir morgen an.
EDIT: Nach einem leichten Syntax Knoten in meinem Kopf sollte das nun so richtig funktionieren.
Bitte tausche beide userreadings aus.
AutarkyQuote {my $valA = ReadingsVal("PV_Anlage_1", "Total_AC_active_power","")-ReadingsVal("PV_Anlage_1", "Home_own_consumption_from_grid","");; my $calcVal = ($valA > 0)?round($valA /($valA + ReadingsVal("PV_Anlage_1", "Home_own_consumption_from_grid",""))*100 ,0) : 0 ;; ($calcVal > 100)?100:$calcVal },
SelfConsumptionQuote {my $valS = ReadingsVal("PV_Anlage_1","Total_AC_active_power", 0) ;; my $calcVal = ($valS > 0)? round((ReadingsVal("PV_Anlage_1","Home_own_consumption_from_PV", "0") + ReadingsVal("PV_Anlage_1","Home_own_consumption_from_battery","0")) / $valS * 100 ,0) : 0 ;; ($calcVal > 100)?100:$calcVal},
Zur Erklärung: vereinfacht wird mit ($val > 0)? wird zuerst geprüft, ob der WR liefert und zum Schluss erfolgt noch die Begrenzung auf 100%
Gestern war ich nämlich bei 102% Autarkie :-) Der Speicher hat alles gedeckt und es wurden 2 Watt ins Netz eingespeist, bis der WR wieder auf 0 Watt eingeregelt hatte.
Gruß
Christian