Solaranlage Komplettbeispiel Fronius BYD: Unterschied zwischen den Versionen
KKeine Bearbeitungszusammenfassung |
(Änderungen der Struktur) |
||
| (70 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
==Einbindung eines Fronius-Wechselrichters, BYD-Speicher, SolarForecast, evcc-Autoladen und FTUI 2 Darstellung in FHEM== | ==Einbindung eines Fronius-Wechselrichters, BYD-Speicher, SolarForecast, evcc-Autoladen und FTUI 2 Darstellung in FHEM== | ||
[[Datei:Screenshot 2024-11-14 164746.jpg|mini|Übersicht]] | [[Datei:Screenshot 2024-11-14 164746.jpg|mini|Übersicht]] | ||
Dies Wiki beschreibt die beispielhafte Einbindung einer Solaranlage in FHEM. | Dies Wiki beschreibt die beispielhafte Einbindung einer Solaranlage in FHEM. (Stand 02.01.2026) | ||
Alle Module zur Steuerung der Komponenten sind bereits in | Alle Module zur Steuerung der Komponenten sind bereits in FHEM vorhanden bzw. werden gerade weiterentwickelt. | ||
Ein Wechselrichter der Fa Fronius aus Österreich sowie der | Ein Wechselrichter der Fa Fronius aus Österreich sowie der China-Speicher von BYD sind oft die Grundeinheiten einer Einfamilienhauslösung. | ||
Alle notwendigen Readings werden über die vorhandenen Module speziell für dies Paket über Userreadings erzeugt, so | Alle notwendigen Readings werden über die vorhandenen Module speziell für dies Paket über Userreadings erzeugt, so dass auch andere Erzeuger oder Speicher in das Grundkonstrukt übernommen werden können. Es gibt auch einen weiteren Grund für die Userreadings: Der Wechselrichter der Frima Fronius erzeugt einige Daten in relativ langen Zeitabständen (>10 Min) so dass diese z.B. nicht für Intergrale zur Leistungsanzeige benutzt werden können. | ||
Diese Beispielanlage besteht aus 4 Strings. Zwei sind an den Fronius WR und zwei weitere an zwei Growatt 2KW WR angschlossen. Weiterhin gibt es einen zusätzlichen Fronius Prower Meter (1 Phasig) für die beiden Growatt WR. | |||
[[Datei:Screenshot 2024-09-25 191422.jpg|mini|ftui2 Übersicht]] | [[Datei:Screenshot 2024-09-25 191422.jpg|mini|ftui2 Übersicht]] | ||
=== Vorbedingungen === | === Vorbedingungen === | ||
FHEM läuft und hat genügend Platz für Logdaten (> | FHEM läuft und hat genügend Platz für Logdaten (dBLog >5GB/Jahr wenn wirklich alles geloggt wird) | ||
Der Wechselrichter sowie der Speicher sind über Lan oder eine sehr stabile(!) Wlan Verbindung erreichbar. | Der Wechselrichter sowie der Speicher sind über Lan oder eine sehr stabile(!) Wlan Verbindung erreichbar. | ||
Von Wlan ist | Von Wlan ist abzuraten, weil diese Verbindungen oftmals zu lange Zeitverzögerungen oder auch kurzzeitige Unterbrechungen haben. Es läuft mit Wlan-- aber oft nicht stabil genug. Der Aufbau eines Lan zu weiter entfernten Einheiten ist u.U. aufwändig, lohnt aber immer. | ||
Alle Daten werden über DbLog gespeichert und die Graphen daraus gewonnen. | Alle Daten werden über [[DbLog]] gespeichert und die Graphen daraus gewonnen. | ||
Um die Kommunikation z.B. über Modbus zu ermöglichen, reicht es, wenn der Installateur die Modbus-Verbindung freischaltet . Man benötigt keineswegs das Technician-Passwort des WR. | |||
Wenn Fahrzeugladen über eine Wallbox mit eingebunden werden soll | Wenn Fahrzeugladen über eine Wallbox mit eingebunden werden soll, können geeignete Wallboxen das natürlich selbst steuern. Hier ist ein Beispiel für die Integration der Software EVCC die das Laden eines Fahrzeugs komfortabel steuert vorgestellt. Für diese SW (sie kann paralel z.B. mit FHEM auf einem PI laufen) ist für die meisten Wallboxen ein sog. Token erforderlich, der über Github pro Monat für 1$ gekauft werden muss. | ||
=== Grundstruktur === | === Grundstruktur === | ||
Der Wechselrichter wird über das [ | * Der Wechselrichter wird über das Modul [[fronius]] ausgelesen, dabei werden diverse [[userReadings]] erzeugt. | ||
* Zusätzlich werden über [[HTTPMOD]] weitere Daten ausgelesen, diese sind aber nicht für die Berechnungen notwendig. | |||
Zusätzlich werden über [ | * Der Speicher ist über den Wechselrichter per [[ModbusAttr]] erreichbar sowie auch direkt über das Modul [[BYDBox]]. | ||
* Daraus ergeben sich zusätzliche Darstellungen des Batteriezustands. | |||
Der Speicher ist über den Wechselrichter per ModbusAttr erreichbar sowie auch direkt über das [ | * Bezug, Einspeisung, Erzeugung und Hausverbrauch werden über vier [[ElectricityCalculator|ElectricityCalculator]] Devices erzeugt, | ||
* diese Module erzeugen auch die gesammten Statistikdaten. (Heute, Gestern, Monat, Vormonat, Jahr) | |||
Daraus ergeben sich | * Zwei weitere Dummys plus Berechnungsroutinen erhalten die Daten Eigenverbrauchsquote und Autarkiegrad. | ||
* Das sehr umfangreiche [[SolarForecast - Solare Prognose (PV Erzeugung) und Verbrauchersteuerung|Modul SolarForecast]] wird integriert und es können viele Graphen dargestellt werden. | |||
Bezug, Einspeisung, Erzeugung und Hausverbrauch werden über vier [[ElectricityCalculator|ElectricityCalculator | * Eine größere [[readingsGroup]] stellt die Gesamtstatistik der Anlage dar. | ||
* Das optinonale Programm EVCC kann integriert und auch gesteuert werden. | |||
diese Module erzeugen auch die gesammten Statistikdaten. (Heute, Gestern, Monat, Vormonat, Jahr) | * Einige FTUI2 Beispiele runden die Darstellung auf einem Tablet ab. | ||
Zwei weitere Dummys plus Berechnungsroutinen erhalten die Daten Eigenverbrauchsquote und Autarkiegrad. | |||
Das sehr umfangreiche [[SolarForecast - Solare Prognose (PV Erzeugung) und Verbrauchersteuerung|Modul SolarForecast]] wird integriert und viele Graphen dargestellt. | |||
Eine größere readingsGroup stellt die Gesamtstatistik der Anlage dar. | |||
Das optinonale Programm EVCC | |||
Einige FTUI2 Beispiele runden die Darstellung auf einem Tablet ab. | |||
==Fronius_Symo in FHEM== | ==Fronius_Symo in FHEM== | ||
In FHEM wird das Modul fronius angelegt und darin diverse userReadings erzeugt, ebenso werden damit auch die Daten der zusätzlichen WR ausgelesen und addiert. '''Wichtig''': Es ist ein Autolade_Calculator in den userReadings vorhanden. Wenn der Abschnitt mit Autoladen nicht verwendet wird, bitte die Einträge entfernen. Die dienen nur der korrekten Berechnung und Anzeige des Hausverbrauchs (ohne Autoladen!). | |||
<div class="mw-collapsible mw-collapsed"> | |||
<syntaxhighlight lang="perl"> | Code:<div class="mw-collapsible-content"> | ||
<syntaxhighlight lang="perl"> | |||
defmod Fronius_Symo fronius 192.168.xxx.xxx | |||
attr Fronius_Symo DbLogExclude .* | attr Fronius_Symo DbLogExclude .* | ||
attr Fronius_Symo DbLogInclude | attr Fronius_Symo DbLogInclude User_Consumed_E,Einspeisung,Bezug,Akku_Laden,Akku_Entladen,PowerFlow_Site_P_Grid,PowerFlow_Site_P_Load,Meter_1_PowerReal_P_Sum | ||
attr Fronius_Symo IntervalRealtimeData 60 | |||
attr Fronius_Symo comment Auf dem Dach sind 15.6kWp installiert\ | |||
Str1: 7640W Süd+Carport\ | |||
Str2: 3480W Ost\ | |||
Grow1: 2200W West\ | |||
Grow2: 2320W GH\ | |||
userReadings User_Produced_FPV nur für SolarForecast | |||
attr Fronius_Symo group Fronius | attr Fronius_Symo group Fronius | ||
attr Fronius_Symo icon | attr Fronius_Symo icon inverter | ||
attr Fronius_Symo room Energie-Strom | attr Fronius_Symo room Energie-Strom | ||
attr Fronius_Symo stateFormat {return "Status: ".ReadingsVal($name,"state","")."<br>\ | attr Fronius_Symo stateFormat {return "Status: ".ReadingsVal($name,"state","")."<br>\\ | ||
PV-aktuell: ".sprintf("%.0f",ReadingsVal($name,"PowerFlow_Site_P_PV",0))." W<br>\ | PV-aktuell: ".sprintf("%.0f",ReadingsVal($name,"PowerFlow_Site_P_PV",0))." W<br>\\ | ||
PV Einspeisung: ".sprintf("%.0f",ReadingsVal($name,"Einspeisung",0))." W<br>\ | PV Einspeisung: ".sprintf("%.0f",ReadingsVal($name,"Einspeisung",0))." W<br>\\ | ||
Netzbezug: ".sprintf("%.0f",ReadingsVal($name,"Bezug",0))." W<br>\ | Netzbezug: ".sprintf("%.0f",ReadingsVal($name,"Bezug",0))." W<br>\\ | ||
Ladestand Akku: ".sprintf("%.0f",ReadingsVal($name,"Storage_0_Controller_StateOfCharge_Relative",0))." %<br>\\ | |||
PV gesamt: ".sprintf("%.2f",ReadingsVal($name,"PowerFlow_Site_E_Total",0)/1000)." kWh";;;;;;;;} | |||
Ladestand Akku: ".sprintf("%.0f",ReadingsVal($name,"Storage_0_Controller_StateOfCharge_Relative",0))." %<br>\ | |||
PV gesamt: ".sprintf("%.2f",ReadingsVal($name,"PowerFlow_Site_E_Total",0)/1000)." kWh";;;;} | |||
attr Fronius_Symo userReadings Einspeisung:PowerFlow_Site_P_Grid.* {ReadingsVal($name,"PowerFlow_Site_P_Grid","")<0?ReadingsVal($name,"PowerFlow_Site_P_Grid","")*-1:0},\ | attr Fronius_Symo userReadings Einspeisung:PowerFlow_Site_P_Grid.* {ReadingsVal($name,"PowerFlow_Site_P_Grid","")<0?ReadingsVal($name,"PowerFlow_Site_P_Grid","")*-1:0},\ | ||
Neg_Einspeisung:PowerFlow_Site_P_Grid.* {ReadingsVal($name,"PowerFlow_Site_P_Grid","")<0?ReadingsVal($name,"PowerFlow_Site_P_Grid",""):0},\ | Neg_Einspeisung:PowerFlow_Site_P_Grid.* {ReadingsVal($name,"PowerFlow_Site_P_Grid","")<0?ReadingsVal($name,"PowerFlow_Site_P_Grid",""):0},\ | ||
| Zeile 71: | Zeile 67: | ||
Akku_Laden:PowerFlow_Site_P_Akku.* {ReadingsVal($name,"PowerFlow_Site_P_Akku","")<0?ReadingsVal($name,"PowerFlow_Site_P_Akku","")*-1:0},\ | Akku_Laden:PowerFlow_Site_P_Akku.* {ReadingsVal($name,"PowerFlow_Site_P_Akku","")<0?ReadingsVal($name,"PowerFlow_Site_P_Akku","")*-1:0},\ | ||
Akku_Entladen:PowerFlow_Site_P_Akku.* {ReadingsVal($name,"PowerFlow_Site_P_Akku","")>0?ReadingsVal($name,"PowerFlow_Site_P_Akku",""):0},\ | Akku_Entladen:PowerFlow_Site_P_Akku.* {ReadingsVal($name,"PowerFlow_Site_P_Akku","")>0?ReadingsVal($name,"PowerFlow_Site_P_Akku",""):0},\ | ||
User_Produced_PV:PowerFlow_Site_P_PV.* integral {ReadingsVal("$name","PowerFlow_Site_P_PV","0")/3600000},\ | User_Produced_PV:PowerFlow_Site_P_PV.* integral {((ReadingsVal("$name","PowerFlow_Site_P_PV","0"))+(ReadingsVal($name,"Meter_1_PowerReal_P_Sum","0")))/3600000},\ | ||
User_Consumed_EN:PowerFlow_Site_P_PV.* {ReadingsVal($name,"PowerFlow_Site_P_PV","")+ReadingsVal($name,"PowerFlow_Site_P_Grid","")+ReadingsVal($name,"PowerFlow_Site_P_Akku","")},\ | User_Produced_FPV:PowerFlow_Site_P_PV.* integral {(ReadingsVal("$name","PowerFlow_Site_P_PV","0"))/3600000},\ | ||
User_Consumed_EN:PowerFlow_Site_P_PV.* {ReadingsVal($name,"PowerFlow_Site_P_PV","")+ReadingsVal($name,"Meter_1_PowerReal_P_Sum","")-(ReadingsVal("MQTT2_evcc1","Ladeleistung","")*1000)+ReadingsVal($name,"PowerFlow_Site_P_Grid","")+ReadingsVal($name,"PowerFlow_Site_P_Akku","")},\ | |||
User_Consumed_E:PowerFlow_Site_P_PV.* {ReadingsVal($name,"User_Consumed_EN","")>0?ReadingsVal($name,"User_Consumed_EN",""):0},\ | User_Consumed_E:PowerFlow_Site_P_PV.* {ReadingsVal($name,"User_Consumed_EN","")>0?ReadingsVal($name,"User_Consumed_EN",""):0},\ | ||
User_Consumed_Energie_C:User_Consumed_E.* integral {ReadingsVal("$name","User_Consumed_E","0")/3600000} | User_Consumed_Energie_C:User_Consumed_E.* integral {ReadingsVal("$name","User_Consumed_E","0")/3600000}, | ||
</syntaxhighlight> | </syntaxhighlight> | ||
</div> | |||
</div> | |||
== | ==FroniusPowerFlow== | ||
Über HTTPMOD können zusätzlich aus dem Fronius '''Device String Werte''' ausgelesen (für FTUI Anzeigen z.B.) | |||
< | <div class="mw-collapsible mw-collapsed"> | ||
attr | Code:<div class="mw-collapsible-content"> | ||
attr | <pre> | ||
attr | defmod FroniusPowerFlow HTTPMOD http://192.168.xxx.xxx/solar_api/v1/GetPowerFlowRealtimeData.fcgi 10 | ||
attr | attr FroniusPowerFlow userattr reading1Name reading1JSON | ||
attr | attr FroniusPowerFlow DbLogExclude .* | ||
attr | attr FroniusPowerFlow extractAllJSON 1 | ||
attr FroniusPowerFlow group Fronius | |||
attr FroniusPowerFlow icon inverter | |||
attr FroniusPowerFlow room Energie-Strom | |||
attr FroniusPowerFlow stateFormat Leistung: PV_Produktion W | |||
attr FroniusPowerFlow userReadings Neg_Einspeisung:Body_Data_Site_P_Grid.* {ReadingsVal($name,"Body_Data_Site_P_Grid","")<0?ReadingsVal($name,"Body_Data_Site_P_Grid",""):0},\ | |||
Bezug:Body_Data_Site_P_Grid.* {ReadingsVal($name,"Body_Data_Site_P_Grid","")>0?ReadingsVal($name,"Body_Data_Site_P_Grid",""):0},\ | |||
Akku_Laden:Body_Data_Site_P_Akku.* {ReadingsVal($name,"Body_Data_Site_P_Akku","")<0?ReadingsVal($name,"Body_Data_Site_P_Akku","")*-1:0},\ | |||
Akku_Entladen:Body_Data_Site_P_Akku.* {ReadingsVal($name,"Body_Data_Site_P_Akku","")>0?ReadingsVal($name,"Body_Data_Site_P_Akku",""):0},\ | |||
PV_Produktion:Body_Data_Site_P_Grid.* {((ReadingsVal("$name","Body_Data_Site_P_PV","0"))+(ReadingsVal("Fronius_Symo","Meter_1_PowerReal_P_Sum","0")))} | |||
</pre> | |||
</div> | |||
</div> | |||
</ | |||
== PV_Batterie == | == PV_Batterie == | ||
Per [[ModbusAttr]] werden Daten der Batterie aus dem Fronius gelesen und es können auch Einstellungen daran vorgenommen werden | |||
< | |||
min SOC Winter/Sommer oder auch das Verhindern einer Sofortentladung bei Anschluss eines Fahrzeugs zur Aufladung.... | |||
<div class="mw-collapsible mw-collapsed"> | |||
Code:<div class="mw-collapsible-content"> | |||
<pre> | |||
defmod PV_Batterie ModbusAttr 1 10 192.168.xxx.xxx:502 TCP | |||
attr PV_Batterie DbLogExclude .* | attr PV_Batterie DbLogExclude .* | ||
attr PV_Batterie DbLogInclude DCPowerMPPT1,DCPowerMPPT2 | |||
attr PV_Batterie dev-h-combine 125 | attr PV_Batterie dev-h-combine 125 | ||
attr PV_Batterie dev-h-defFormat %.1f | attr PV_Batterie dev-h-defFormat %.1f | ||
| Zeile 230: | Zeile 222: | ||
attr PV_Batterie stateFormat Status: BatteryState <br/>\ | attr PV_Batterie stateFormat Status: BatteryState <br/>\ | ||
Ladung: BatteryChargePercent % | Reserve: BatConfigReserve %<br/>\ | Ladung: BatteryChargePercent % | Reserve: BatConfigReserve %<br/>\ | ||
Summe Entladung: Summe_Entladung kWh | Summe Ladung: Summe_Ladung kWh<br/> | Summe Entladung: Summe_Entladung kWh | Summe Ladung: Summe_Ladung kWh<br/> | ||
</ | |||
</pre> | |||
</div> | |||
</div> | |||
==myBYDBox== | ==myBYDBox== | ||
Das Modul BYDBox ermöglicht es, direkt aus der Batterie einzelne Zelldaten auszulesen. Das geht natürlich nur, wenn der Speicher direkt über LAN am Netzwerk angebunden ist. | |||
Achtung: IP der BYD-Box nehmen, nicht die vom Fronius ! | Achtung: IP der BYD-Box nehmen, nicht die vom Fronius! | ||
<syntaxhighlight lang="perl">define myBYDBox BYDBox 192.168.xxx.xxx 60 | <syntaxhighlight lang="perl">define myBYDBox BYDBox 192.168.xxx.xxx 60 | ||
attr myBYDBox DbLogExclude .* | attr myBYDBox DbLogExclude .* | ||
| Zeile 244: | Zeile 238: | ||
attr myBYDBox room Energie-Strom | attr myBYDBox room Energie-Strom | ||
attr myBYDBox verbose 0</syntaxhighlight> | attr myBYDBox verbose 0</syntaxhighlight> | ||
Runde Darstellung der BYD Speicherwerte | |||
Darstellung der Batterie über ein DOIF aus myBYDBox die ui_Table dazu genutzt | |||
== BYD.Box_view == | == BYD.Box_view == | ||
[[Datei:Screenshot 2024-11-14 164959.jpg|mini|BYD.Box_view]] | [[Datei:Screenshot 2024-11-14 164959.jpg|mini|BYD.Box_view]]Darstellung der BYD-Box über ein DOIF<div class="mw-collapsible mw-collapsed"> | ||
Code:<div class="mw-collapsible-content"> | |||
<pre> | |||
define BYD.Box_viev DOIF ## | define BYD.Box_viev DOIF ## | ||
attr BYD.Box_viev alias BYD.Box_viev | attr BYD.Box_viev alias BYD.Box_viev | ||
| Zeile 257: | Zeile 254: | ||
ring2([myBYDBox:Battery_1_MaxmVolt],2800,3500,120,0,"mV",200,undef,"1,font-weight:normal",[myBYDBox:Battery_1_MinmVolt],2800,3500,0,120,"mV",undef,"1,font-weight:normal") |\ | ring2([myBYDBox:Battery_1_MaxmVolt],2800,3500,120,0,"mV",200,undef,"1,font-weight:normal",[myBYDBox:Battery_1_MinmVolt],2800,3500,0,120,"mV",undef,"1,font-weight:normal") |\ | ||
ring2([myBYDBox:BatteryMaxTemp],10,30,120,0,"°C",200,undef,"1,font-weight:normal",[myBYDBox:BatteryMinTemp],10,30,0,120,"°C",undef,"1,font-weight:normal") | ring2([myBYDBox:BatteryMaxTemp],10,30,120,0,"°C",200,undef,"1,font-weight:normal",[myBYDBox:BatteryMinTemp],10,30,0,120,"°C",undef,"1,font-weight:normal") | ||
</pre> | |||
</ | </div> | ||
</div> | |||
== BYD_Cells == | == BYD_Cells == | ||
| Zeile 264: | Zeile 262: | ||
Ladezustand der einzelnen Zellen einer BYD-Box über ein DOIF aus myBYDBox | Ladezustand der einzelnen Zellen einer BYD-Box über ein DOIF aus myBYDBox | ||
Es sind vier Zellengruppen definiert, ggf anpassen (Beispiel 10.2 kWh BYD) | |||
<div class="mw-collapsible mw-collapsed"> | |||
Code:<div class="mw-collapsible-content"> | |||
<pre> | |||
define BYD_Cells DOIF ## | define BYD_Cells DOIF ## | ||
attr BYD_Cells alias BYD_Cells | attr BYD_Cells alias BYD_Cells | ||
| Zeile 379: | Zeile 380: | ||
[myBYDBox:Battery_1_VoltsperCell_063],colorBYD([myBYDBox:Battery_1_VoltsperCell_063]),"15") |\ | [myBYDBox:Battery_1_VoltsperCell_063],colorBYD([myBYDBox:Battery_1_VoltsperCell_063]),"15") |\ | ||
</ | </pre> | ||
</div> | |||
</div> | |||
== Anlegen der ElectricityCalculator für Bezug, Einspeisung, Erzeugung und Hausverbrauch == | |||
vier Module ElectricityCalculator (v.Sailor) werden angelegt um die gesammten Statistikdaten | |||
(Heute, Gestern, Monat, Vormonat, Jahr, Vorjahr) zu erzeugen. Das geht auch mit dem Modul Statistics.<div class="mw-collapsible mw-collapsed"> | |||
Code:<div class="mw-collapsible-content"> | |||
<pre> | |||
define Hausverbrauch ElectricityCalculator Fronius_Symo:User_Consumed_Energie_C.* | |||
attr Hausverbrauch BasicPricePerAnnum 0 | |||
attr Hausverbrauch Currency €; | |||
attr Hausverbrauch DbLogExclude .* | |||
attr Hausverbrauch DbLogInclude Fronius_Symo_User_Consumed_Energie_C_EnergyDay | |||
attr Hausverbrauch DecimalPlace 3 | |||
attr Hausverbrauch ElectricityCounterOffset 0 | |||
attr Hausverbrauch ElectricityKwhPerCounts 1 | |||
attr Hausverbrauch ElectricityPricePerKWh 0.2567 | |||
attr Hausverbrauch MonthOfAnnualReading 1 | |||
attr Hausverbrauch MonthlyPayment 0 | |||
attr Hausverbrauch ReadingDestination CalculatorDevice | |||
attr Hausverbrauch SiPrefixPower W | |||
attr Hausverbrauch room Energie-Strom | |||
attr Hausverbrauch stateFormat Fronius_Symo_User_Consumed_Energie_C_EnergyDay kWh | |||
attr Hausverbrauch verbose 0 | |||
define Fronius_Erzeugung ElectricityCalculator Fronius_Symo:User_Produced_PV.* | |||
attr Fronius_Erzeugung BasicPricePerAnnum 0 | |||
attr Fronius_Erzeugung Currency €; | |||
attr Fronius_Erzeugung DbLogExclude .* | |||
attr Fronius_Erzeugung DbLogInclude Fronius_Symo_User_Produced_PV_EnergyDay | |||
attr Fronius_Erzeugung DecimalPlace 3 | |||
attr Fronius_Erzeugung ElectricityCounterOffset -0.148 | |||
attr Fronius_Erzeugung ElectricityKwhPerCounts 1 | |||
attr Fronius_Erzeugung ElectricityPricePerKWh 0.3305 | |||
attr Fronius_Erzeugung MonthOfAnnualReading 1 | |||
attr Fronius_Erzeugung MonthlyPayment 0 | |||
attr Fronius_Erzeugung ReadingDestination CalculatorDevice | |||
attr Fronius_Erzeugung SiPrefixPower W | |||
attr Fronius_Erzeugung alias Erzeugung | |||
attr Fronius_Erzeugung room Energie-Strom | |||
attr Fronius_Erzeugung stateFormat Fronius_Symo_User_Produced_PV_EnergyDay kWh | |||
attr Fronius_Erzeugung verbose 0 | |||
define Fronius_Einspeisung ElectricityCalculator Fronius_Symo:Meter_0_EnergyReal_WAC_Minus_Absolute.* | |||
attr Fronius_Einspeisung BasicPricePerAnnum 0 | |||
attr Fronius_Einspeisung Currency €; | |||
attr Fronius_Einspeisung DbLogExclude .* | |||
attr Fronius_Einspeisung DbLogInclude Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_PowerCurrent,Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_EnergyDay | |||
attr Fronius_Einspeisung DecimalPlace 3 | |||
attr Fronius_Einspeisung ElectricityCounterOffset 0 | |||
attr Fronius_Einspeisung ElectricityKwhPerCounts 0.001 | |||
attr Fronius_Einspeisung ElectricityPricePerKWh 0.083 | |||
attr Fronius_Einspeisung MonthOfAnnualReading 1 | |||
attr Fronius_Einspeisung MonthlyPayment 0 | |||
attr Fronius_Einspeisung ReadingDestination CalculatorDevice | |||
attr Fronius_Einspeisung SiPrefixPower W | |||
attr Fronius_Einspeisung alias Einspeisung | |||
attr Fronius_Einspeisung room Energie-Strom | |||
attr Fronius_Einspeisung stateFormat Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_EnergyDay kWh | |||
attr Fronius_Einspeisung verbose 0 | |||
define Fronius_Bezug ElectricityCalculator Fronius_Symo:Meter_0_EnergyReal_WAC_Plus_Absolute.* | |||
attr Fronius_Bezug BasicPricePerAnnum 0 | |||
attr Fronius_Bezug Currency €; | |||
attr Fronius_Bezug DbLogExclude .* | |||
attr Fronius_Bezug DbLogInclude Fronius_Symo_Meter_0_EnergyReal_WAC_Plus_Absolute_EnergyDay,Fronius_Symo_Meter_0_EnergyReal_WAC_Plus_Absolute_PowerCurrent | |||
attr Fronius_Bezug DecimalPlace 3 | |||
attr Fronius_Bezug ElectricityCounterOffset -36.075 | |||
attr Fronius_Bezug ElectricityKwhPerCounts 0.001 | |||
attr Fronius_Bezug ElectricityPricePerKWh 0.3305 | |||
attr Fronius_Bezug MonthOfAnnualReading 1 | |||
attr Fronius_Bezug MonthlyPayment 0 | |||
attr Fronius_Bezug ReadingDestination CalculatorDevice | |||
attr Fronius_Bezug SiPrefixPower W | |||
attr Fronius_Bezug alias Bezug | |||
attr Fronius_Bezug room Energie-Strom | |||
attr Fronius_Bezug stateFormat Fronius_Symo_Meter_0_EnergyReal_WAC_Plus_Absolute_EnergyDay kWh | |||
attr Fronius_Bezug verbose 0 | |||
</pre> | |||
</div> | |||
</div> | |||
== Autarkie, Eigenverbrauch == | == Autarkie, Eigenverbrauch == | ||
Zwei Dummys mit dazugehörigen Füllroutinen werden angelegt | |||
<div class="mw-collapsible mw-collapsed"> | |||
Code:<div class="mw-collapsible-content"> | |||
<pre> | |||
define AutarkieQuote dummy | define AutarkieQuote dummy | ||
attr AutarkieQuote DbLogExclude .* | attr AutarkieQuote DbLogExclude .* | ||
| Zeile 423: | Zeile 509: | ||
} | } | ||
</syntaxhighlight>Zusätzliche Routinen in 99_myUtils.pm um zu kleine oder auch zu große Werte auszusondern. Das "verschönert" die Graphen; kann auch weggelassen werden. Hintergrund: Integralberechnungen übersteuern beim Start.<syntaxhighlight lang="perl"> | </syntaxhighlight>Zusätzliche Routinen in 99_myUtils.pm um zu kleine oder auch zu große Werte auszusondern. Das "verschönert" die Graphen; kann auch weggelassen werden. Hintergrund: Diffential/Integralberechnungen unter/übersteuern beim Start.<syntaxhighlight lang="perl"> | ||
sub reduce_max_value | sub reduce_max_value | ||
{ | { | ||
| Zeile 449: | Zeile 535: | ||
attr Eigenverbr_Timer DbLogExclude .* | attr Eigenverbr_Timer DbLogExclude .* | ||
attr Eigenverbr_Timer room Energie-Strom | attr Eigenverbr_Timer room Energie-Strom | ||
</pre> | |||
</ | </div> | ||
</div> | |||
== mySolarStat == | == mySolarStat == | ||
[[Datei:Screenshot 2024-11-14 164746.jpg|mini|ReadingsGroup]] | [[Datei:Screenshot 2024-11-14 164746.jpg|mini|ReadingsGroup]] | ||
größere | Eine größere readingsGroup als Übersichtstabelle, passt auch gut in ftui2 aufs Tablet | ||
<div class="mw-collapsible mw-collapsed"> | |||
Code:<div class="mw-collapsible-content"> | |||
<pre> | |||
define mySolarStat readingsGroup < >,<Heute>,<Gestern>,<Monat>,<Vormonat>,<Jahr> \ | define mySolarStat readingsGroup < >,<Heute>,<Gestern>,<Monat>,<Vormonat>,<Jahr> \ | ||
Fronius_Erzeugung:Fronius_Symo_User_Produced_PV_EnergyDay,Fronius_Symo_User_Produced_PV_EnergyDayLast,Fronius_Symo_User_Produced_PV_EnergyMonth,Fronius_Symo_User_Produced_PV_EnergyMonthLast,Fronius_Symo_User_Produced_PV_EnergyYear \ | Fronius_Erzeugung:Fronius_Symo_User_Produced_PV_EnergyDay,Fronius_Symo_User_Produced_PV_EnergyDayLast,Fronius_Symo_User_Produced_PV_EnergyMonth,Fronius_Symo_User_Produced_PV_EnergyMonthLast,Fronius_Symo_User_Produced_PV_EnergyYear \ | ||
| Zeile 466: | Zeile 556: | ||
attr mySolarStat room Energie-Auto,Energie-Strom,Statistik | attr mySolarStat room Energie-Auto,Energie-Strom,Statistik | ||
attr mySolarStat valueFormat %.1f | attr mySolarStat valueFormat %.1f | ||
</ | </pre> | ||
</div> | |||
</div> | |||
== Grafiken == | == Grafiken == | ||
[[Datei:Screenshot 2024-11-14 164925.jpg|mini|Erzeugung]] | [[Datei:Screenshot 2024-11-14 164925.jpg|mini|Erzeugung]] | ||
Strombezug, Stromeinspeisung, Stromerzeugung, Stromverbrauch, Solare Vorhersage | Strombezug, Stromeinspeisung, Stromerzeugung, Stromverbrauch, Solare Vorhersage | ||
hier "nur" ein Beispiel Stromerzeugung, die anderen Graphen dementsprechend anlegen | |||
<div class="mw-collapsible mw-collapsed"> | |||
Code:<div class="mw-collapsible-content"> | |||
<pre> | |||
defmod SVG_myDbLog_1 SVG myDbLog:SVG_myDbLog_1:HISTORY | defmod SVG_myDbLog_1 SVG myDbLog:SVG_myDbLog_1:HISTORY | ||
attr SVG_myDbLog_1 alias Stromerzeugung | attr SVG_myDbLog_1 alias Stromerzeugung | ||
| Zeile 501: | Zeile 597: | ||
"<IN>" using 1:2 axes x1y2 title 'Tageserzeugung <L2> [kWh]' ls l2fill lw 1 with lines | "<IN>" using 1:2 axes x1y2 title 'Tageserzeugung <L2> [kWh]' ls l2fill lw 1 with lines | ||
</ | </pre> | ||
</div> | |||
</div> | |||
== SolarForecast == | == SolarForecast == | ||
[[Datei:Screenshot 2024-11-15 173408.jpg|mini|SolarForecast Darstellung]] | |||
Es müssen vorher unter global die attr longitude und latitude für den Standort der Anlage eingegeben werden, damit die einzelnen Wettermodelle funktionieren. Forecast hat ein prima selbsterklärendes Startmenü und man sieht auch gleich die evt. vorhandenen Einstellungsfehler. | |||
Weiteres dazu im umfangreichen [[SolarForecast - Solare Prognose (PV Erzeugung) und Verbrauchersteuerung|Wiki | Weiteres dazu im umfangreichen [[SolarForecast - Solare Prognose (PV Erzeugung) und Verbrauchersteuerung|Wiki Solarforecast]]. | ||
Die dort beschriebene Grafik Solare Vorhersage zeigt die Differenzen zwischen der berechneten Vorhersage und der tatsächlichen PV-Erzeugung eines Tages.< | Die dort beschriebene Grafik "Solare Vorhersage" zeigt die Differenzen zwischen der berechneten Vorhersage und der tatsächlichen PV-Erzeugung eines Tages. Die Werte, die in der Anlagenübersicht angezeigt werden, sollten identisch zu denen in dem u.A. ftui2 Widget sein (Gegenkontrolle). | ||
In diesem Beispiel ist ein Interner consumer01 (Autoladen) eingestellt, dessen Werte nicht mit in den Forecast einbezogen werden. | |||
<div class="mw-collapsible mw-collapsed"> | |||
Code:<div class="mw-collapsible-content"> | |||
<pre> | |||
defmod Forecast SolarForecast | |||
attr Forecast DbLogExclude .* | attr Forecast DbLogExclude .* | ||
attr Forecast DbLogInclude LastHourPVforecast,LastHourPVreal,AllPVforecastsToEvent | attr Forecast DbLogInclude LastHourPVforecast,LastHourPVreal,AllPVforecastsToEvent | ||
attr Forecast consumer01 MQTT2_evcc1 type=charger power=0 exconfc=1 icon=electric_car_icon pcurr=loadpoints_1_chargePower :W | |||
attr Forecast consumer01 | |||
attr Forecast ctrlLanguage DE | attr Forecast ctrlLanguage DE | ||
attr Forecast | attr Forecast ctrlNextHoursSoCForecastReadings 07,08,09,10,11,12,13,14,15,16,17,18,19,20,21 | ||
attr Forecast | attr Forecast ctrlSpecialReadings BatPowerIn_Sum,BatPowerOut_Sum,conForecastTillNextSunrise,dayAfterTomorrowPVforecast,todayConsumption,todayConsumptionForecast,todayConsumptionForecastDay,todayGridConsumption,todayGridFeedIn,tomorrowConsumptionForecast | ||
attr Forecast event-on-change-reading .* | attr Forecast event-on-change-reading .* | ||
attr Forecast | attr Forecast graphicControl energyUnit=kWh headerDetail=all,pv | ||
attr Forecast | attr Forecast graphicHistoryHour 8 | ||
attr Forecast | attr Forecast graphicSelect forecast | ||
attr Forecast | attr Forecast graphicShowNight 01 | ||
attr Forecast | attr Forecast plantControl showLink=1 | ||
attr Forecast room Energie-Strom | attr Forecast room Energie-Strom | ||
attr Forecast | attr Forecast setupBatteryDev01 PV_Batterie pin=BatteryChargeWatt:W pout=BatteryDischargeWatt:W intotal=Summe_Ladung:kWh outtotal=Summe_Entladung:kWh show=1 cap=12800 charge=BatteryChargePercent | ||
attr Forecast setupInverterDev01 Fronius_Symo | attr Forecast setupInverterDev01 Fronius_Symo pvOut=PowerFlow_Site_P_PV:W etotal=User_Produced_FPV:kWh capacity=11000 strings:Ostseite,Suedseite | ||
attr Forecast setupInverterStrings Suedseite,Westseite | attr Forecast setupInverterDev02 Fronius_Symo pvOut=Meter_1_PowerReal_P_Sum:W etotal=Meter_1_EnergyReal_WAC_Sum_Produced:Wh capacity=4000 strings:Westseite,GH_Ost,GH_West | ||
attr Forecast setupInverterStrings Suedseite,Westseite,Ostseite,GH_West,GH_Ost | |||
attr Forecast setupMeterDev Fronius_Symo gcon=Bezug:W contotal=Meter_0_EnergyReal_WAC_Plus_Absolute:Wh gfeedin=Einspeisung feedtotal=Meter_0_EnergyReal_WAC_Plus_Absolute:Wh conprice=powerCost:€ feedprice=0.083:€ | attr Forecast setupMeterDev Fronius_Symo gcon=Bezug:W contotal=Meter_0_EnergyReal_WAC_Plus_Absolute:Wh gfeedin=Einspeisung feedtotal=Meter_0_EnergyReal_WAC_Plus_Absolute:Wh conprice=powerCost:€ feedprice=0.083:€ | ||
attr Forecast setupRadiationAPI | attr Forecast setupRadiationAPI OpenMeteoDWD_D2-API | ||
attr Forecast setupStringPeak Suedseite=7.66 Westseite=2.2 | attr Forecast setupStringAzimuth Suedseite=0 Westseite=90 Ostseite=-90 GH_Ost=-90 GH_West=90 | ||
attr Forecast setupWeatherDev1 | attr Forecast setupStringDeclination Suedseite=35 Westseite=60 Ostseite=45 GH_West=18 GH_Ost=18 | ||
attr Forecast setupStringPeak Suedseite=7.66 Westseite=2.2 Ostseite=3.48 GH_Ost=1.74 GH_West=0.58 | |||
attr Forecast setupWeatherDev1 OpenMeteoDWD_D2-API | |||
attr Forecast verbose 0 | attr Forecast verbose 0 | ||
</pre> | |||
</div> | |||
</div> | |||
[[Datei:Screenshot 2024-11-14 165143.jpg|mini|SolarForecast Diff. Grafik]] | |||
Die | Die Unterschiede vom Forecast zur reellen Erzeugung können in einer Grafik dargestellt werden. | ||
== Autoladen über evcc == | |||
Integration und Steuerung der Wallbox, Wechselrichter, Batterie sowie zu ladendes Fahrzeug kann über das Programm evcc gemacht werden. | |||
Die Software evcc läuft problemlos parallel auf dem FHEM Systemrechner und kann über MQTT2 eingebunden werden. | |||
Weitere Infos dazu in https://evcc.io/ | |||
den man für 1$ pro Monat erwerben kann. Aber solange ein solches Modul mit ähnlich umfangreichen Möglichkeiten bei | Der Nachteil dieser (externen) Software ist der Preis. Es wird mit Open-Source-Software geworben, jedoch die meisten Module z.B. zum Steuern eines Fahrzeugs oder einer Wallbox gehen nur über einen sogenannten Sponsortoken, den man für 1$ pro Monat erwerben kann. Aber solange ein solches Modul mit ähnlich umfangreichen Möglichkeiten bei FHEM nicht zur Verfügung steht, hier die Möglichkeit der Integration in FHEM. | ||
Der Clou ist hiebei ist die Hausbatterie entsprechend der evcc Möglichkeiten zu schalten und auch das Programm zu steuern | |||
auf welche Art das Fz geladen werden soll: Sofort, nur PV Überschuss, Minimal + PV oder Aus | |||
Zusätzlich ein weiterer ElectricityCalculator für die Autoladestatistik der Wallbox. | |||
Dieser übergibt seine Autoladungswerte über mqttPublish zurück an fhem. | |||
<div class="mw-collapsible mw-collapsed"> | |||
Code:<div class="mw-collapsible-content"> | |||
<pre> | |||
defmod MQTT2_evcc1 MQTT2_DEVICE evcc1 | |||
attr MQTT2_evcc1 DbLogExclude .* | attr MQTT2_evcc1 DbLogExclude .* | ||
attr MQTT2_evcc1 DbLogInclude loadpoints_1_chargePower | |||
attr MQTT2_evcc1 alias Wally | attr MQTT2_evcc1 alias Wally | ||
attr MQTT2_evcc1 autocreate 1 | attr MQTT2_evcc1 autocreate 1 | ||
attr MQTT2_evcc1 comment Achtung: EVCC greift per Modbus auf Fronius zu Port 502 Adr. 200 | |||
attr MQTT2_evcc1 event-on-change-reading .* | attr MQTT2_evcc1 event-on-change-reading .* | ||
attr MQTT2_evcc1 event-on-update-reading .* | |||
attr MQTT2_evcc1 icon wallbox | attr MQTT2_evcc1 icon wallbox | ||
attr MQTT2_evcc1 room Energie-Auto | attr MQTT2_evcc1 room Energie-Auto | ||
attr MQTT2_evcc1 setList ChargeMode:Now,Min+PV,PV,Stop { my %h=(Now=>'now','Min+PV'=>'minpv',PV=>'pv',Stop=>'off');; qq(evcc/loadpoints/1/mode/set $h{$EVTPART1});; } \ | attr MQTT2_evcc1 setList ChargeMode:Now,Min+PV,PV,Stop { my %h=(Now=>'now','Min+PV'=>'minpv',PV=>'pv',Stop=>'off');; qq(evcc/loadpoints/1/mode/set $h{$EVTPART1});; } \ | ||
PvPriority:Home,Car,FillCar { my %h=(Home=>'95','Car'=>'35','FillCar'=>'15');; qq(evcc/site/prioritySoc/set $h{$EVTPART1});; }\ | PvPriority:Home,Car,FillCar { my %h=(Home=>'95','Car'=>'35','FillCar'=>'15');; qq(evcc/site/prioritySoc/set $h{$EVTPART1});; }\ | ||
MaxCurrent:11,14,16,20,24,32 { qq(evcc/loadpoints/1/maxCurrent/set $EVTPART1);; } | MaxCurrent:11,14,16,20,24,32 { qq(evcc/loadpoints/1/maxCurrent/set $EVTPART1);; } | ||
attr MQTT2_evcc1 stateFormat Auto_Status | loadpoints_1_mode | attr MQTT2_evcc1 stateFormat Auto_Status | loadpoints_1_mode | loadpoints_1_chargePower W | ||
attr MQTT2_evcc1 userReadings Auto_Status { (ReadingsVal($name,'loadpoints_1_connected','') eq 'true' ? 2 : 0) },\ | attr MQTT2_evcc1 userReadings Auto_Status { (ReadingsVal($name,'loadpoints_1_connected','') eq 'true' ? 2 : 0) },\ | ||
Reichweite { (ReadingsVal($name,'loadpoints_1_vehicleSoc','')*0. | Reichweite { ((ReadingsVal($name,'loadpoints_1_vehicleSoc','')-10)*0.67) },\ | ||
Ladeleistung { (ReadingsVal($name,'loadpoints_1_chargePower','')/1000) } | |||
Und nun noch ein ElectricityCalculator, zur Berechnung der Strommenge: | |||
Die Stromwerte kommen aus einem 1-Wire Counter der einen extra Zähler über den SO Port zählt. | |||
Wenn die Wallbox einen Stromzähler hat, geht das natürlich einfacher; nur die Statistikwerte dieses Zählers werden benötigt. | |||
defmod Autolade_Calculator ElectricityCalculator MQTT2_evcc1:loadpoints_1_chargeTotalImport.* | |||
attr Autolade_Calculator BasicPricePerAnnum 132.84 | |||
attr Autolade_Calculator BasicPricePerAnnum 132 | |||
attr Autolade_Calculator Currency € | attr Autolade_Calculator Currency € | ||
attr Autolade_Calculator DbLogExclude .* | attr Autolade_Calculator DbLogExclude .* | ||
attr Autolade_Calculator DbLogInclude | attr Autolade_Calculator DbLogInclude MQTT2_evcc1_loadpoints_1_chargeTotalImport_EnergyDay | ||
attr Autolade_Calculator DecimalPlace 3 | attr Autolade_Calculator DecimalPlace 3 | ||
attr Autolade_Calculator ElectricityCounterOffset 0 | attr Autolade_Calculator ElectricityCounterOffset 0 | ||
attr Autolade_Calculator ElectricityKwhPerCounts | attr Autolade_Calculator ElectricityKwhPerCounts 1 | ||
attr Autolade_Calculator ElectricityPricePerKWh 0.3305 | attr Autolade_Calculator ElectricityPricePerKWh 0.3305 | ||
attr Autolade_Calculator MonthOfAnnualReading | attr Autolade_Calculator MonthOfAnnualReading 1 | ||
attr Autolade_Calculator MonthlyPayment 121 | attr Autolade_Calculator MonthlyPayment 121 | ||
attr Autolade_Calculator ReadingDestination CalculatorDevice | attr Autolade_Calculator ReadingDestination CalculatorDevice | ||
| Zeile 769: | Zeile 712: | ||
attr Autolade_Calculator alias Autoladen | attr Autolade_Calculator alias Autoladen | ||
attr Autolade_Calculator room Energie-Auto,Steuerung | attr Autolade_Calculator room Energie-Auto,Steuerung | ||
attr Autolade_Calculator stateFormat | attr Autolade_Calculator stateFormat Heute: MQTT2_evcc1_loadpoints_1_chargeTotalImport_EnergyDay kWh | ||
</pre> | |||
</div> | |||
</ | </div> | ||
[[Datei:Solaranlage-ftui.jpg|mini|Solaranlagenübersicht]] | |||
==ftui2 Widgets zur Darstellung auf einem Tablet== | ==ftui2 Widgets zur Darstellung auf einem Tablet== | ||
Widget pvvis und angepasste Daten zur Darstellung | Widget pvvis und angepasste Daten zur Darstellung | ||
Einige Werte werden intern berechnet, das | Einige Werte werden intern berechnet, das {{Link2Forum|Topic=119440|Message=1320903|LinkText=Widget}} selbst kann im Forum geladen werden. | ||
Widget | |||
<div class="mw-collapsible mw-collapsed"> | |||
Code:<div class="mw-collapsible-content"><pre> | |||
<header>Solaranlage und Batterie</header> | <header>Solaranlage und Batterie</header> | ||
| Zeile 804: | Zeile 753: | ||
</div> | </div> | ||
</ | |||
</pre> | |||
</div> | |||
</div> | |||
== Und [[SolarForecast FTUI Widget|Widget SolarForecast]] für die Vorschau auf ftui2, darunter die Differenz Vorhersage/reale Erzeugung: == | |||
<div class="mw-collapsible mw-collapsed"> | |||
Code:<div class="mw-collapsible-content"> | |||
<pre> | |||
<div class="page" id="content_forecast"> | <div class="page" id="content_forecast"> | ||
<div class="gridster"> | <div class="gridster"> | ||
| Zeile 842: | Zeile 799: | ||
</div> | </div> | ||
</div> | </div> | ||
</ | </pre>(Nur der der Vollständigkeit wegen) | ||
</div> | |||
</div><!-- Fortsetzung folgt --> | |||
[[Kategorie:Wechselrichter]] | |||
[[Kategorie:Energieerzeugungsmessung]] | |||
Aktuelle Version vom 2. Januar 2026, 18:03 Uhr
Einbindung eines Fronius-Wechselrichters, BYD-Speicher, SolarForecast, evcc-Autoladen und FTUI 2 Darstellung in FHEM
Dies Wiki beschreibt die beispielhafte Einbindung einer Solaranlage in FHEM. (Stand 02.01.2026)
Alle Module zur Steuerung der Komponenten sind bereits in FHEM vorhanden bzw. werden gerade weiterentwickelt.
Ein Wechselrichter der Fa Fronius aus Österreich sowie der China-Speicher von BYD sind oft die Grundeinheiten einer Einfamilienhauslösung.
Alle notwendigen Readings werden über die vorhandenen Module speziell für dies Paket über Userreadings erzeugt, so dass auch andere Erzeuger oder Speicher in das Grundkonstrukt übernommen werden können. Es gibt auch einen weiteren Grund für die Userreadings: Der Wechselrichter der Frima Fronius erzeugt einige Daten in relativ langen Zeitabständen (>10 Min) so dass diese z.B. nicht für Intergrale zur Leistungsanzeige benutzt werden können.
Diese Beispielanlage besteht aus 4 Strings. Zwei sind an den Fronius WR und zwei weitere an zwei Growatt 2KW WR angschlossen. Weiterhin gibt es einen zusätzlichen Fronius Prower Meter (1 Phasig) für die beiden Growatt WR.
Vorbedingungen
FHEM läuft und hat genügend Platz für Logdaten (dBLog >5GB/Jahr wenn wirklich alles geloggt wird)
Der Wechselrichter sowie der Speicher sind über Lan oder eine sehr stabile(!) Wlan Verbindung erreichbar.
Von Wlan ist abzuraten, weil diese Verbindungen oftmals zu lange Zeitverzögerungen oder auch kurzzeitige Unterbrechungen haben. Es läuft mit Wlan-- aber oft nicht stabil genug. Der Aufbau eines Lan zu weiter entfernten Einheiten ist u.U. aufwändig, lohnt aber immer.
Alle Daten werden über DbLog gespeichert und die Graphen daraus gewonnen.
Um die Kommunikation z.B. über Modbus zu ermöglichen, reicht es, wenn der Installateur die Modbus-Verbindung freischaltet . Man benötigt keineswegs das Technician-Passwort des WR.
Wenn Fahrzeugladen über eine Wallbox mit eingebunden werden soll, können geeignete Wallboxen das natürlich selbst steuern. Hier ist ein Beispiel für die Integration der Software EVCC die das Laden eines Fahrzeugs komfortabel steuert vorgestellt. Für diese SW (sie kann paralel z.B. mit FHEM auf einem PI laufen) ist für die meisten Wallboxen ein sog. Token erforderlich, der über Github pro Monat für 1$ gekauft werden muss.
Grundstruktur
- Der Wechselrichter wird über das Modul fronius ausgelesen, dabei werden diverse userReadings erzeugt.
- Zusätzlich werden über HTTPMOD weitere Daten ausgelesen, diese sind aber nicht für die Berechnungen notwendig.
- Der Speicher ist über den Wechselrichter per ModbusAttr erreichbar sowie auch direkt über das Modul BYDBox.
- Daraus ergeben sich zusätzliche Darstellungen des Batteriezustands.
- Bezug, Einspeisung, Erzeugung und Hausverbrauch werden über vier ElectricityCalculator Devices erzeugt,
- diese Module erzeugen auch die gesammten Statistikdaten. (Heute, Gestern, Monat, Vormonat, Jahr)
- Zwei weitere Dummys plus Berechnungsroutinen erhalten die Daten Eigenverbrauchsquote und Autarkiegrad.
- Das sehr umfangreiche Modul SolarForecast wird integriert und es können viele Graphen dargestellt werden.
- Eine größere readingsGroup stellt die Gesamtstatistik der Anlage dar.
- Das optinonale Programm EVCC kann integriert und auch gesteuert werden.
- Einige FTUI2 Beispiele runden die Darstellung auf einem Tablet ab.
Fronius_Symo in FHEM
In FHEM wird das Modul fronius angelegt und darin diverse userReadings erzeugt, ebenso werden damit auch die Daten der zusätzlichen WR ausgelesen und addiert. Wichtig: Es ist ein Autolade_Calculator in den userReadings vorhanden. Wenn der Abschnitt mit Autoladen nicht verwendet wird, bitte die Einträge entfernen. Die dienen nur der korrekten Berechnung und Anzeige des Hausverbrauchs (ohne Autoladen!).
defmod Fronius_Symo fronius 192.168.xxx.xxx
attr Fronius_Symo DbLogExclude .*
attr Fronius_Symo DbLogInclude User_Consumed_E,Einspeisung,Bezug,Akku_Laden,Akku_Entladen,PowerFlow_Site_P_Grid,PowerFlow_Site_P_Load,Meter_1_PowerReal_P_Sum
attr Fronius_Symo IntervalRealtimeData 60
attr Fronius_Symo comment Auf dem Dach sind 15.6kWp installiert\
Str1: 7640W Süd+Carport\
Str2: 3480W Ost\
Grow1: 2200W West\
Grow2: 2320W GH\
userReadings User_Produced_FPV nur für SolarForecast
attr Fronius_Symo group Fronius
attr Fronius_Symo icon inverter
attr Fronius_Symo room Energie-Strom
attr Fronius_Symo stateFormat {return "Status: ".ReadingsVal($name,"state","")."<br>\\
PV-aktuell: ".sprintf("%.0f",ReadingsVal($name,"PowerFlow_Site_P_PV",0))." W<br>\\
PV Einspeisung: ".sprintf("%.0f",ReadingsVal($name,"Einspeisung",0))." W<br>\\
Netzbezug: ".sprintf("%.0f",ReadingsVal($name,"Bezug",0))." W<br>\\
Ladestand Akku: ".sprintf("%.0f",ReadingsVal($name,"Storage_0_Controller_StateOfCharge_Relative",0))." %<br>\\
PV gesamt: ".sprintf("%.2f",ReadingsVal($name,"PowerFlow_Site_E_Total",0)/1000)." kWh";;;;;;;;}
attr Fronius_Symo userReadings Einspeisung:PowerFlow_Site_P_Grid.* {ReadingsVal($name,"PowerFlow_Site_P_Grid","")<0?ReadingsVal($name,"PowerFlow_Site_P_Grid","")*-1:0},\
Neg_Einspeisung:PowerFlow_Site_P_Grid.* {ReadingsVal($name,"PowerFlow_Site_P_Grid","")<0?ReadingsVal($name,"PowerFlow_Site_P_Grid",""):0},\
Bezug:PowerFlow_Site_P_Grid.* {ReadingsVal($name,"PowerFlow_Site_P_Grid","")>0?ReadingsVal($name,"PowerFlow_Site_P_Grid",""):0},\
Akku_Laden:PowerFlow_Site_P_Akku.* {ReadingsVal($name,"PowerFlow_Site_P_Akku","")<0?ReadingsVal($name,"PowerFlow_Site_P_Akku","")*-1:0},\
Akku_Entladen:PowerFlow_Site_P_Akku.* {ReadingsVal($name,"PowerFlow_Site_P_Akku","")>0?ReadingsVal($name,"PowerFlow_Site_P_Akku",""):0},\
User_Produced_PV:PowerFlow_Site_P_PV.* integral {((ReadingsVal("$name","PowerFlow_Site_P_PV","0"))+(ReadingsVal($name,"Meter_1_PowerReal_P_Sum","0")))/3600000},\
User_Produced_FPV:PowerFlow_Site_P_PV.* integral {(ReadingsVal("$name","PowerFlow_Site_P_PV","0"))/3600000},\
User_Consumed_EN:PowerFlow_Site_P_PV.* {ReadingsVal($name,"PowerFlow_Site_P_PV","")+ReadingsVal($name,"Meter_1_PowerReal_P_Sum","")-(ReadingsVal("MQTT2_evcc1","Ladeleistung","")*1000)+ReadingsVal($name,"PowerFlow_Site_P_Grid","")+ReadingsVal($name,"PowerFlow_Site_P_Akku","")},\
User_Consumed_E:PowerFlow_Site_P_PV.* {ReadingsVal($name,"User_Consumed_EN","")>0?ReadingsVal($name,"User_Consumed_EN",""):0},\
User_Consumed_Energie_C:User_Consumed_E.* integral {ReadingsVal("$name","User_Consumed_E","0")/3600000},
FroniusPowerFlow
Über HTTPMOD können zusätzlich aus dem Fronius Device String Werte ausgelesen (für FTUI Anzeigen z.B.)
defmod FroniusPowerFlow HTTPMOD http://192.168.xxx.xxx/solar_api/v1/GetPowerFlowRealtimeData.fcgi 10
attr FroniusPowerFlow userattr reading1Name reading1JSON
attr FroniusPowerFlow DbLogExclude .*
attr FroniusPowerFlow extractAllJSON 1
attr FroniusPowerFlow group Fronius
attr FroniusPowerFlow icon inverter
attr FroniusPowerFlow room Energie-Strom
attr FroniusPowerFlow stateFormat Leistung: PV_Produktion W
attr FroniusPowerFlow userReadings Neg_Einspeisung:Body_Data_Site_P_Grid.* {ReadingsVal($name,"Body_Data_Site_P_Grid","")<0?ReadingsVal($name,"Body_Data_Site_P_Grid",""):0},\
Bezug:Body_Data_Site_P_Grid.* {ReadingsVal($name,"Body_Data_Site_P_Grid","")>0?ReadingsVal($name,"Body_Data_Site_P_Grid",""):0},\
Akku_Laden:Body_Data_Site_P_Akku.* {ReadingsVal($name,"Body_Data_Site_P_Akku","")<0?ReadingsVal($name,"Body_Data_Site_P_Akku","")*-1:0},\
Akku_Entladen:Body_Data_Site_P_Akku.* {ReadingsVal($name,"Body_Data_Site_P_Akku","")>0?ReadingsVal($name,"Body_Data_Site_P_Akku",""):0},\
PV_Produktion:Body_Data_Site_P_Grid.* {((ReadingsVal("$name","Body_Data_Site_P_PV","0"))+(ReadingsVal("Fronius_Symo","Meter_1_PowerReal_P_Sum","0")))}
PV_Batterie
Per ModbusAttr werden Daten der Batterie aus dem Fronius gelesen und es können auch Einstellungen daran vorgenommen werden
min SOC Winter/Sommer oder auch das Verhindern einer Sofortentladung bei Anschluss eines Fahrzeugs zur Aufladung....
defmod PV_Batterie ModbusAttr 1 10 192.168.xxx.xxx:502 TCP attr PV_Batterie DbLogExclude .* attr PV_Batterie DbLogInclude DCPowerMPPT1,DCPowerMPPT2 attr PV_Batterie dev-h-combine 125 attr PV_Batterie dev-h-defFormat %.1f attr PV_Batterie dev-h-defLen 2 attr PV_Batterie dev-h-defPoll 1 attr PV_Batterie dev-h-defUnpack f> attr PV_Batterie devStateStyle style="text-align:right" attr PV_Batterie disable 0 attr PV_Batterie event-min-interval ACActEnergy:7200,ACPower:7200,Battery.*:7200 attr PV_Batterie event-on-change-reading .*Energy:0.1,ACPower:1,DCPowerMPPT.*:1,status,Battery.*charge.*:1,BatteryState attr PV_Batterie group Fronius attr PV_Batterie icon measure_battery_100 attr PV_Batterie obj-h40073-reading ACCurrentPhaseA attr PV_Batterie obj-h40075-reading ACCurrentPhaseB attr PV_Batterie obj-h40077-reading ACCurrentPhaseC attr PV_Batterie obj-h40085-reading ACVoltagePhaseA attr PV_Batterie obj-h40087-reading ACVoltagePhaseB attr PV_Batterie obj-h40089-reading ACVoltagePhaseC attr PV_Batterie obj-h40091-format %.0f attr PV_Batterie obj-h40091-reading ACPower attr PV_Batterie obj-h40093-reading ACFrequency attr PV_Batterie obj-h40109-reading CabinetTemperature attr PV_Batterie obj-h40117-format %s attr PV_Batterie obj-h40117-len 1 attr PV_Batterie obj-h40117-map 1:off,2:sleeping,3:starting,4:active,5:throttled,6:shutdown,7:fault,8:standby attr PV_Batterie obj-h40117-reading status attr PV_Batterie obj-h40117-unpack n attr PV_Batterie obj-h40196-expr $val / 1000 attr PV_Batterie obj-h40196-format %.2f attr PV_Batterie obj-h40196-len 4 attr PV_Batterie obj-h40196-reading ACActEnergy attr PV_Batterie obj-h40196-unpack Q> attr PV_Batterie obj-h40267-format %d attr PV_Batterie obj-h40267-group 1-1 attr PV_Batterie obj-h40267-len 1 attr PV_Batterie obj-h40267-reading DCPowerScale attr PV_Batterie obj-h40267-unpack s> attr PV_Batterie obj-h40284-expr $val * 10 ** ReadingsVal($name, 'DCPowerScale', 1) attr PV_Batterie obj-h40284-group 1-2 attr PV_Batterie obj-h40284-len 1 attr PV_Batterie obj-h40284-reading DCPowerMPPT1 attr PV_Batterie obj-h40284-unpack n attr PV_Batterie obj-h40304-expr $val * 10 ** ReadingsVal($name, 'DCPowerScale', 1) attr PV_Batterie obj-h40304-group 1-3 attr PV_Batterie obj-h40304-len 1 attr PV_Batterie obj-h40304-reading DCPowerMPPT2 attr PV_Batterie obj-h40304-unpack n attr PV_Batterie obj-h40324-expr $val * 10 ** ReadingsVal($name, 'DCPowerScale', 1) attr PV_Batterie obj-h40324-group 1-4 attr PV_Batterie obj-h40324-len 1 attr PV_Batterie obj-h40324-reading BatteryChargeWatt attr PV_Batterie obj-h40324-unpack n attr PV_Batterie obj-h40325-expr $val/1000000 attr PV_Batterie obj-h40325-ignoreExpr $val < 100 attr PV_Batterie obj-h40325-len 2 attr PV_Batterie obj-h40325-poll 300 attr PV_Batterie obj-h40325-reading Summe_Ladung attr PV_Batterie obj-h40325-unpack N attr PV_Batterie obj-h40344-expr $val * 10 ** ReadingsVal($name, 'DCPowerScale', 1) attr PV_Batterie obj-h40344-group 1-5 attr PV_Batterie obj-h40344-len 1 attr PV_Batterie obj-h40344-reading BatteryDischargeWatt attr PV_Batterie obj-h40344-unpack n attr PV_Batterie obj-h40345-expr $val/1000000 attr PV_Batterie obj-h40345-ignoreExpr $val < 100 attr PV_Batterie obj-h40345-len 2 attr PV_Batterie obj-h40345-poll 300 attr PV_Batterie obj-h40345-reading Summe_Entladung attr PV_Batterie obj-h40345-unpack N attr PV_Batterie obj-h40355-len 1 attr PV_Batterie obj-h40355-reading BatConfigMaxReferenceWatt attr PV_Batterie obj-h40355-unpack n attr PV_Batterie obj-h40358-format %s attr PV_Batterie obj-h40358-len 1 attr PV_Batterie obj-h40358-map 0:none,1:chargeMax,2:dischrMax,3:bothMax attr PV_Batterie obj-h40358-reading BatConfigMaxEnabled attr PV_Batterie obj-h40358-set 1 attr PV_Batterie obj-h40358-unpack n attr PV_Batterie obj-h40360-expr $val / 100 attr PV_Batterie obj-h40360-format %.0f attr PV_Batterie obj-h40360-len 1 attr PV_Batterie obj-h40360-poll 60 attr PV_Batterie obj-h40360-reading BatConfigReserve attr PV_Batterie obj-h40360-set 1 attr PV_Batterie obj-h40360-setexpr $val * 100 attr PV_Batterie obj-h40360-unpack n attr PV_Batterie obj-h40361-expr $val / 100 attr PV_Batterie obj-h40361-len 1 attr PV_Batterie obj-h40361-reading BatteryChargePercent attr PV_Batterie obj-h40361-unpack n attr PV_Batterie obj-h40364-format %s attr PV_Batterie obj-h40364-len 1 attr PV_Batterie obj-h40364-map 1:off,2:empty,3:discharging,4:charging,5:full,6:holding,7:testing attr PV_Batterie obj-h40364-reading BatteryState attr PV_Batterie obj-h40364-unpack n attr PV_Batterie obj-h40365-expr $val / 10000 * ReadingsVal($name, 'BatConfigMaxReferenceWatt', 1) attr PV_Batterie obj-h40365-len 1 attr PV_Batterie obj-h40365-max ReadingsVal($name, 'BatConfigMaxReferenceWatt', 1) attr PV_Batterie obj-h40365-min -ReadingsVal($name, 'BatConfigMaxReferenceWatt', 1) attr PV_Batterie obj-h40365-reading BatConfigMaxDischargeWatt attr PV_Batterie obj-h40365-set 1 attr PV_Batterie obj-h40365-setexpr $val / ReadingsVal($name, 'BatConfigMaxReferenceWatt', 1) * 10000 attr PV_Batterie obj-h40365-unpack s> attr PV_Batterie obj-h40366-expr $val / 10000 * ReadingsVal($name, 'BatConfigMaxReferenceWatt', 1) attr PV_Batterie obj-h40366-len 1 attr PV_Batterie obj-h40366-max ReadingsVal($name, 'BatConfigMaxReferenceWatt', 1) attr PV_Batterie obj-h40366-min -ReadingsVal($name, 'BatConfigMaxReferenceWatt', 1) attr PV_Batterie obj-h40366-reading BatConfigMaxChargeWatt attr PV_Batterie obj-h40366-set 1 attr PV_Batterie obj-h40366-setexpr $val / ReadingsVal($name, 'BatConfigMaxReferenceWatt', 1) * 10000 attr PV_Batterie obj-h40366-unpack s> attr PV_Batterie room Energie-Strom attr PV_Batterie stateFormat Status: BatteryState <br/>\ Ladung: BatteryChargePercent % | Reserve: BatConfigReserve %<br/>\ Summe Entladung: Summe_Entladung kWh | Summe Ladung: Summe_Ladung kWh<br/>
myBYDBox
Das Modul BYDBox ermöglicht es, direkt aus der Batterie einzelne Zelldaten auszulesen. Das geht natürlich nur, wenn der Speicher direkt über LAN am Netzwerk angebunden ist.
Achtung: IP der BYD-Box nehmen, nicht die vom Fronius!
define myBYDBox BYDBox 192.168.xxx.xxx 60
attr myBYDBox DbLogExclude .*
attr myBYDBox detail-level 1
attr myBYDBox disable 0
attr myBYDBox room Energie-Strom
attr myBYDBox verbose 0
Runde Darstellung der BYD Speicherwerte Darstellung der Batterie über ein DOIF aus myBYDBox die ui_Table dazu genutzt
BYD.Box_view
Darstellung der BYD-Box über ein DOIF
define BYD.Box_viev DOIF ##
attr BYD.Box_viev alias BYD.Box_viev
attr BYD.Box_viev room Energie-Strom
attr BYD.Box_viev uiTable {package ui_Table;;}\
"BYDB-Box"| ring2([myBYDBox:BatteryPower],-6000,6000,120,0,"W",200,[(0,120,500,90,6000,60)],"1,font-weight:normal",[myBYDBox:Battery_1_SOC],0,100,0,120,"%",undef,"1,font-weight:normal",undef,undef,"0,,1,0,1") |\
ring2([myBYDBox:BatteryCurrent],-20,20,120,0,"A",200,undef,"1,font-weight:normal",[myBYDBox:BatteryOutVoltage],300,400,0,120,"V",undef,"1,font-weight:normal",undef,undef,"0,,,0,1") |\
ring2([myBYDBox:Battery_1_MaxmVolt],2800,3500,120,0,"mV",200,undef,"1,font-weight:normal",[myBYDBox:Battery_1_MinmVolt],2800,3500,0,120,"mV",undef,"1,font-weight:normal") |\
ring2([myBYDBox:BatteryMaxTemp],10,30,120,0,"°C",200,undef,"1,font-weight:normal",[myBYDBox:BatteryMinTemp],10,30,0,120,"°C",undef,"1,font-weight:normal")
BYD_Cells
Ladezustand der einzelnen Zellen einer BYD-Box über ein DOIF aus myBYDBox
Es sind vier Zellengruppen definiert, ggf anpassen (Beispiel 10.2 kWh BYD)
define BYD_Cells DOIF ##
attr BYD_Cells alias BYD_Cells
attr BYD_Cells room Energie-Strom
attr BYD_Cells uiTable {package ui_Table;;\
\
sub floor_round {\
my ($zahl)=@_;;\
return(POSIX::floor($zahl / 10) * 10) - 10;;\
}\
\
sub ceil_round {\
my ($zahl)=@_;;\
return(POSIX::ceil($zahl / 10) * 10) + 10;;\
}\
\
sub colorBYD {\
my ($zahl)=@_;;\
my $min = 2800;;\
my $max = 3550;;\
my $mid = 3000;;\
my $mid2 = 3400;;\
my $color_green = 120;;\
\
my $num = 0;;\
\
if($zahl >= $mid2 && $zahl < $max)\
{\
$num = $color_green - (($zahl-$mid2)/($max-$mid2) * $color_green);;\
}\
elsif($zahl < $mid)\
{\
$num = (($zahl-$min)/($mid-$min) * $color_green);;\
}\
elsif($zahl >= $mid)\
{\
$num = $color_green;;\
}\
\
return(POSIX::ceil($num));;\
}\
}\
\
cylinder_bars("BYD Modul 1",floor_round([myBYDBox:Battery_1_MinmVolt]),ceil_round([myBYDBox:Battery_1_MaxmVolt]),"mV",250,undef,undef,0,\
[myBYDBox:Battery_1_VoltsperCell_000],colorBYD([myBYDBox:Battery_1_VoltsperCell_000]),"0",\
[myBYDBox:Battery_1_VoltsperCell_001],colorBYD([myBYDBox:Battery_1_VoltsperCell_001]),"1",\
[myBYDBox:Battery_1_VoltsperCell_002],colorBYD([myBYDBox:Battery_1_VoltsperCell_002]),"2",\
[myBYDBox:Battery_1_VoltsperCell_003],colorBYD([myBYDBox:Battery_1_VoltsperCell_003]),"3",\
[myBYDBox:Battery_1_VoltsperCell_004],colorBYD([myBYDBox:Battery_1_VoltsperCell_004]),"4",\
[myBYDBox:Battery_1_VoltsperCell_005],colorBYD([myBYDBox:Battery_1_VoltsperCell_005]),"5",\
[myBYDBox:Battery_1_VoltsperCell_006],colorBYD([myBYDBox:Battery_1_VoltsperCell_006]),"6",\
[myBYDBox:Battery_1_VoltsperCell_007],colorBYD([myBYDBox:Battery_1_VoltsperCell_007]),"7",\
[myBYDBox:Battery_1_VoltsperCell_008],colorBYD([myBYDBox:Battery_1_VoltsperCell_008]),"8",\
[myBYDBox:Battery_1_VoltsperCell_009],colorBYD([myBYDBox:Battery_1_VoltsperCell_009]),"9",\
[myBYDBox:Battery_1_VoltsperCell_010],colorBYD([myBYDBox:Battery_1_VoltsperCell_010]),"10",\
[myBYDBox:Battery_1_VoltsperCell_011],colorBYD([myBYDBox:Battery_1_VoltsperCell_011]),"11",\
[myBYDBox:Battery_1_VoltsperCell_012],colorBYD([myBYDBox:Battery_1_VoltsperCell_012]),"12",\
[myBYDBox:Battery_1_VoltsperCell_013],colorBYD([myBYDBox:Battery_1_VoltsperCell_013]),"13",\
[myBYDBox:Battery_1_VoltsperCell_014],colorBYD([myBYDBox:Battery_1_VoltsperCell_014]),"14",\
[myBYDBox:Battery_1_VoltsperCell_015],colorBYD([myBYDBox:Battery_1_VoltsperCell_015]),"15") |\
\
cylinder_bars("BYD Modul 2",floor_round([myBYDBox:Battery_1_MinmVolt]),ceil_round([myBYDBox:Battery_1_MaxmVolt]),"mV",250,undef,undef,0,\
[myBYDBox:Battery_1_VoltsperCell_016],colorBYD([myBYDBox:Battery_1_VoltsperCell_016]),"0",\
[myBYDBox:Battery_1_VoltsperCell_017],colorBYD([myBYDBox:Battery_1_VoltsperCell_017]),"1",\
[myBYDBox:Battery_1_VoltsperCell_018],colorBYD([myBYDBox:Battery_1_VoltsperCell_018]),"2",\
[myBYDBox:Battery_1_VoltsperCell_019],colorBYD([myBYDBox:Battery_1_VoltsperCell_019]),"3",\
[myBYDBox:Battery_1_VoltsperCell_020],colorBYD([myBYDBox:Battery_1_VoltsperCell_020]),"4",\
[myBYDBox:Battery_1_VoltsperCell_021],colorBYD([myBYDBox:Battery_1_VoltsperCell_021]),"5",\
[myBYDBox:Battery_1_VoltsperCell_022],colorBYD([myBYDBox:Battery_1_VoltsperCell_022]),"6",\
[myBYDBox:Battery_1_VoltsperCell_023],colorBYD([myBYDBox:Battery_1_VoltsperCell_023]),"7",\
[myBYDBox:Battery_1_VoltsperCell_024],colorBYD([myBYDBox:Battery_1_VoltsperCell_024]),"8",\
[myBYDBox:Battery_1_VoltsperCell_025],colorBYD([myBYDBox:Battery_1_VoltsperCell_025]),"9",\
[myBYDBox:Battery_1_VoltsperCell_026],colorBYD([myBYDBox:Battery_1_VoltsperCell_026]),"10",\
[myBYDBox:Battery_1_VoltsperCell_027],colorBYD([myBYDBox:Battery_1_VoltsperCell_027]),"11",\
[myBYDBox:Battery_1_VoltsperCell_028],colorBYD([myBYDBox:Battery_1_VoltsperCell_028]),"12",\
[myBYDBox:Battery_1_VoltsperCell_029],colorBYD([myBYDBox:Battery_1_VoltsperCell_029]),"13",\
[myBYDBox:Battery_1_VoltsperCell_030],colorBYD([myBYDBox:Battery_1_VoltsperCell_030]),"14",\
[myBYDBox:Battery_1_VoltsperCell_031],colorBYD([myBYDBox:Battery_1_VoltsperCell_031]),"15") |\
\
cylinder_bars("BYD Modul 3",floor_round([myBYDBox:Battery_1_MinmVolt]),ceil_round([myBYDBox:Battery_1_MaxmVolt]),"mV",250,undef,undef,0,\
[myBYDBox:Battery_1_VoltsperCell_032],colorBYD([myBYDBox:Battery_1_VoltsperCell_032]),"0",\
[myBYDBox:Battery_1_VoltsperCell_033],colorBYD([myBYDBox:Battery_1_VoltsperCell_033]),"1",\
[myBYDBox:Battery_1_VoltsperCell_034],colorBYD([myBYDBox:Battery_1_VoltsperCell_034]),"2",\
[myBYDBox:Battery_1_VoltsperCell_035],colorBYD([myBYDBox:Battery_1_VoltsperCell_035]),"3",\
[myBYDBox:Battery_1_VoltsperCell_036],colorBYD([myBYDBox:Battery_1_VoltsperCell_036]),"4",\
[myBYDBox:Battery_1_VoltsperCell_037],colorBYD([myBYDBox:Battery_1_VoltsperCell_037]),"5",\
[myBYDBox:Battery_1_VoltsperCell_038],colorBYD([myBYDBox:Battery_1_VoltsperCell_038]),"6",\
[myBYDBox:Battery_1_VoltsperCell_039],colorBYD([myBYDBox:Battery_1_VoltsperCell_039]),"7",\
[myBYDBox:Battery_1_VoltsperCell_040],colorBYD([myBYDBox:Battery_1_VoltsperCell_040]),"8",\
[myBYDBox:Battery_1_VoltsperCell_041],colorBYD([myBYDBox:Battery_1_VoltsperCell_041]),"9",\
[myBYDBox:Battery_1_VoltsperCell_042],colorBYD([myBYDBox:Battery_1_VoltsperCell_042]),"10",\
[myBYDBox:Battery_1_VoltsperCell_043],colorBYD([myBYDBox:Battery_1_VoltsperCell_043]),"11",\
[myBYDBox:Battery_1_VoltsperCell_044],colorBYD([myBYDBox:Battery_1_VoltsperCell_044]),"12",\
[myBYDBox:Battery_1_VoltsperCell_045],colorBYD([myBYDBox:Battery_1_VoltsperCell_045]),"13",\
[myBYDBox:Battery_1_VoltsperCell_046],colorBYD([myBYDBox:Battery_1_VoltsperCell_046]),"14",\
[myBYDBox:Battery_1_VoltsperCell_047],colorBYD([myBYDBox:Battery_1_VoltsperCell_047]),"15") |\
\
cylinder_bars("BYD Modul 4",floor_round([myBYDBox:Battery_1_MinmVolt]),ceil_round([myBYDBox:Battery_1_MaxmVolt]),"mV",250,undef,undef,0,\
[myBYDBox:Battery_1_VoltsperCell_048],colorBYD([myBYDBox:Battery_1_VoltsperCell_048]),"0",\
[myBYDBox:Battery_1_VoltsperCell_049],colorBYD([myBYDBox:Battery_1_VoltsperCell_049]),"1",\
[myBYDBox:Battery_1_VoltsperCell_050],colorBYD([myBYDBox:Battery_1_VoltsperCell_050]),"2",\
[myBYDBox:Battery_1_VoltsperCell_051],colorBYD([myBYDBox:Battery_1_VoltsperCell_051]),"3",\
[myBYDBox:Battery_1_VoltsperCell_052],colorBYD([myBYDBox:Battery_1_VoltsperCell_052]),"4",\
[myBYDBox:Battery_1_VoltsperCell_053],colorBYD([myBYDBox:Battery_1_VoltsperCell_053]),"5",\
[myBYDBox:Battery_1_VoltsperCell_054],colorBYD([myBYDBox:Battery_1_VoltsperCell_054]),"6",\
[myBYDBox:Battery_1_VoltsperCell_055],colorBYD([myBYDBox:Battery_1_VoltsperCell_055]),"7",\
[myBYDBox:Battery_1_VoltsperCell_056],colorBYD([myBYDBox:Battery_1_VoltsperCell_056]),"8",\
[myBYDBox:Battery_1_VoltsperCell_057],colorBYD([myBYDBox:Battery_1_VoltsperCell_057]),"9",\
[myBYDBox:Battery_1_VoltsperCell_058],colorBYD([myBYDBox:Battery_1_VoltsperCell_058]),"10",\
[myBYDBox:Battery_1_VoltsperCell_059],colorBYD([myBYDBox:Battery_1_VoltsperCell_059]),"11",\
[myBYDBox:Battery_1_VoltsperCell_060],colorBYD([myBYDBox:Battery_1_VoltsperCell_060]),"12",\
[myBYDBox:Battery_1_VoltsperCell_061],colorBYD([myBYDBox:Battery_1_VoltsperCell_061]),"13",\
[myBYDBox:Battery_1_VoltsperCell_062],colorBYD([myBYDBox:Battery_1_VoltsperCell_062]),"14",\
[myBYDBox:Battery_1_VoltsperCell_063],colorBYD([myBYDBox:Battery_1_VoltsperCell_063]),"15") |\
Anlegen der ElectricityCalculator für Bezug, Einspeisung, Erzeugung und Hausverbrauch
vier Module ElectricityCalculator (v.Sailor) werden angelegt um die gesammten Statistikdaten
(Heute, Gestern, Monat, Vormonat, Jahr, Vorjahr) zu erzeugen. Das geht auch mit dem Modul Statistics.
define Hausverbrauch ElectricityCalculator Fronius_Symo:User_Consumed_Energie_C.* attr Hausverbrauch BasicPricePerAnnum 0 attr Hausverbrauch Currency €; attr Hausverbrauch DbLogExclude .* attr Hausverbrauch DbLogInclude Fronius_Symo_User_Consumed_Energie_C_EnergyDay attr Hausverbrauch DecimalPlace 3 attr Hausverbrauch ElectricityCounterOffset 0 attr Hausverbrauch ElectricityKwhPerCounts 1 attr Hausverbrauch ElectricityPricePerKWh 0.2567 attr Hausverbrauch MonthOfAnnualReading 1 attr Hausverbrauch MonthlyPayment 0 attr Hausverbrauch ReadingDestination CalculatorDevice attr Hausverbrauch SiPrefixPower W attr Hausverbrauch room Energie-Strom attr Hausverbrauch stateFormat Fronius_Symo_User_Consumed_Energie_C_EnergyDay kWh attr Hausverbrauch verbose 0 define Fronius_Erzeugung ElectricityCalculator Fronius_Symo:User_Produced_PV.* attr Fronius_Erzeugung BasicPricePerAnnum 0 attr Fronius_Erzeugung Currency €; attr Fronius_Erzeugung DbLogExclude .* attr Fronius_Erzeugung DbLogInclude Fronius_Symo_User_Produced_PV_EnergyDay attr Fronius_Erzeugung DecimalPlace 3 attr Fronius_Erzeugung ElectricityCounterOffset -0.148 attr Fronius_Erzeugung ElectricityKwhPerCounts 1 attr Fronius_Erzeugung ElectricityPricePerKWh 0.3305 attr Fronius_Erzeugung MonthOfAnnualReading 1 attr Fronius_Erzeugung MonthlyPayment 0 attr Fronius_Erzeugung ReadingDestination CalculatorDevice attr Fronius_Erzeugung SiPrefixPower W attr Fronius_Erzeugung alias Erzeugung attr Fronius_Erzeugung room Energie-Strom attr Fronius_Erzeugung stateFormat Fronius_Symo_User_Produced_PV_EnergyDay kWh attr Fronius_Erzeugung verbose 0 define Fronius_Einspeisung ElectricityCalculator Fronius_Symo:Meter_0_EnergyReal_WAC_Minus_Absolute.* attr Fronius_Einspeisung BasicPricePerAnnum 0 attr Fronius_Einspeisung Currency €; attr Fronius_Einspeisung DbLogExclude .* attr Fronius_Einspeisung DbLogInclude Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_PowerCurrent,Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_EnergyDay attr Fronius_Einspeisung DecimalPlace 3 attr Fronius_Einspeisung ElectricityCounterOffset 0 attr Fronius_Einspeisung ElectricityKwhPerCounts 0.001 attr Fronius_Einspeisung ElectricityPricePerKWh 0.083 attr Fronius_Einspeisung MonthOfAnnualReading 1 attr Fronius_Einspeisung MonthlyPayment 0 attr Fronius_Einspeisung ReadingDestination CalculatorDevice attr Fronius_Einspeisung SiPrefixPower W attr Fronius_Einspeisung alias Einspeisung attr Fronius_Einspeisung room Energie-Strom attr Fronius_Einspeisung stateFormat Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_EnergyDay kWh attr Fronius_Einspeisung verbose 0 define Fronius_Bezug ElectricityCalculator Fronius_Symo:Meter_0_EnergyReal_WAC_Plus_Absolute.* attr Fronius_Bezug BasicPricePerAnnum 0 attr Fronius_Bezug Currency €; attr Fronius_Bezug DbLogExclude .* attr Fronius_Bezug DbLogInclude Fronius_Symo_Meter_0_EnergyReal_WAC_Plus_Absolute_EnergyDay,Fronius_Symo_Meter_0_EnergyReal_WAC_Plus_Absolute_PowerCurrent attr Fronius_Bezug DecimalPlace 3 attr Fronius_Bezug ElectricityCounterOffset -36.075 attr Fronius_Bezug ElectricityKwhPerCounts 0.001 attr Fronius_Bezug ElectricityPricePerKWh 0.3305 attr Fronius_Bezug MonthOfAnnualReading 1 attr Fronius_Bezug MonthlyPayment 0 attr Fronius_Bezug ReadingDestination CalculatorDevice attr Fronius_Bezug SiPrefixPower W attr Fronius_Bezug alias Bezug attr Fronius_Bezug room Energie-Strom attr Fronius_Bezug stateFormat Fronius_Symo_Meter_0_EnergyReal_WAC_Plus_Absolute_EnergyDay kWh attr Fronius_Bezug verbose 0
Autarkie, Eigenverbrauch
Zwei Dummys mit dazugehörigen Füllroutinen werden angelegt
define AutarkieQuote dummy
attr AutarkieQuote DbLogExclude .*
attr AutarkieQuote alias Autarkie
attr AutarkieQuote group Fronius
attr AutarkieQuote room Energie-Strom
attr AutarkieQuote stateFormat Heute
attr AutarkieQuote userReadings Heute {get_autarkie ( ReadingsVal("Fronius_Erzeugung","Fronius_Symo_User_Produced_PV_EnergyDay",0) , ReadingsVal("Fronius_Einspeisung","Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_EnergyDay",0) , ReadingsVal("Fronius_Bezug","Fronius_Symo_Meter_0_EnergyReal_WAC_Plus_Absolute_EnergyDay",0) )},\
Gestern {get_autarkie ( ReadingsVal("Fronius_Erzeugung","Fronius_Symo_User_Produced_PV_EnergyDayLast",0) , ReadingsVal("Fronius_Einspeisung","Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_EnergyDayLast",0) , ReadingsVal("Fronius_Bezug","Fronius_Symo_Meter_0_EnergyReal_WAC_Plus_Absolute_EnergyDayLast",0) )},\
Monat {get_autarkie ( ReadingsVal("Fronius_Erzeugung","Fronius_Symo_User_Produced_PV_EnergyMonth",0) , ReadingsVal("Fronius_Einspeisung","Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_EnergyMonth",0) , ReadingsVal("Fronius_Bezug","Fronius_Symo_Meter_0_EnergyReal_WAC_Plus_Absolute_EnergyMonth",0) )},\
Vormonat {get_autarkie ( ReadingsVal("Fronius_Erzeugung","Fronius_Symo_User_Produced_PV_EnergyMonthLast",0) , ReadingsVal("Fronius_Einspeisung","Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_EnergyMonthLast",0) , ReadingsVal("Fronius_Bezug","Fronius_Symo_Meter_0_EnergyReal_WAC_Plus_Absolute_EnergyMonthLast",0) )},\
Jahr {get_autarkie ( ReadingsVal("Fronius_Erzeugung","Fronius_Symo_User_Produced_PV_EnergyYear",0) , ReadingsVal("Fronius_Einspeisung","Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_EnergyYear",0) , ReadingsVal("Fronius_Bezug","Fronius_Symo_Meter_0_EnergyReal_WAC_Plus_Absolute_EnergyYear",0) )}
define EigenverbrQuote dummy
attr EigenverbrQuote DbLogExclude .*
attr EigenverbrQuote alias Eigenverbr.
attr EigenverbrQuote group Fronius
attr EigenverbrQuote room Energie-Strom
attr EigenverbrQuote stateFormat Heute
attr EigenverbrQuote userReadings Heute {get_eigenverbrauch ( ReadingsVal("Fronius_Erzeugung","Fronius_Symo_User_Produced_PV_EnergyDay",0) , ReadingsVal("Fronius_Einspeisung","Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_EnergyDay",0) )},\
Gestern {get_eigenverbrauch ( ReadingsVal("Fronius_Erzeugung","Fronius_Symo_User_Produced_PV_EnergyDayLast",0) , ReadingsVal("Fronius_Einspeisung","Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_EnergyDayLast",0) )},\
Monat {get_eigenverbrauch ( ReadingsVal("Fronius_Erzeugung","Fronius_Symo_User_Produced_PV_EnergyMonth",0) , ReadingsVal("Fronius_Einspeisung","Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_EnergyMonth",0) )},\
Vormonat {get_eigenverbrauch ( ReadingsVal("Fronius_Erzeugung","Fronius_Symo_User_Produced_PV_EnergyMonthLast",0) , ReadingsVal("Fronius_Einspeisung","Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_EnergyMonthLast",0) )},\
Jahr {get_eigenverbrauch ( ReadingsVal("Fronius_Erzeugung","Fronius_Symo_User_Produced_PV_EnergyYear",0) , ReadingsVal("Fronius_Einspeisung","Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_EnergyYear",0) )}
</syntaxhighlight>In die Datei 99_myUtils.pm die Berechnungsroutinen eintragen:<syntaxhighlight lang="perl">
sub get_eigenverbrauch
{
my($erzeugung,$einspeisung) = @_;
return(100) if ($erzeugung)<=0;
my($eigenverbrauch)=(($erzeugung)-($einspeisung))/($erzeugung)*100;
return($eigenverbrauch);
}
sub get_autarkie
{
my($erzeugung,$einspeisung,$bezug) = @_;
my($autarkie)=(($erzeugung)-($einspeisung))/(($erzeugung)-($einspeisung)+($bezug))*100;
return($autarkie);
}
</syntaxhighlight>Zusätzliche Routinen in 99_myUtils.pm um zu kleine oder auch zu große Werte auszusondern. Das "verschönert" die Graphen; kann auch weggelassen werden. Hintergrund: Diffential/Integralberechnungen unter/übersteuern beim Start.<syntaxhighlight lang="perl">
sub reduce_max_value
{
my($device, $reading, $max_value)=@_;
# Begrenzung der Ausgabewerte für Graphen
my($Grenzwert) = ReadingsVal($device,$reading, 0);
return($max_value) if (ReadingsVal($device, $reading,0) > $max_value );
return($Grenzwert);
}
sub reduce_min_value
{
my($device, $reading, $min_value)=@_;
# Begrenzung der Ausgabewerte für Graphen
my($Grenzwert) = ReadingsVal($device,$reading, 0);
return(0) if (ReadingsVal($device, $reading,0) <= $min_value );
return($Grenzwert);
}
</syntaxhighlight>Alle 15 Min erneute Berechnung der Werte (oder eine längere Zeit setzen...)<syntaxhighlight lang="perl">
define Autarkie_Timer at +*00:15:00 {fhem "setreading AutarkieQuote Heute 1"}
attr Autarkie_Timer DbLogExclude .*
attr Autarkie_Timer room Energie-Strom
define Eigenverbr_Timer at +*00:15:00 {fhem "setreading EigenverbrQuote Heute 1"}
attr Eigenverbr_Timer DbLogExclude .*
attr Eigenverbr_Timer room Energie-Strom
mySolarStat
Eine größere readingsGroup als Übersichtstabelle, passt auch gut in ftui2 aufs Tablet
define mySolarStat readingsGroup < >,<Heute>,<Gestern>,<Monat>,<Vormonat>,<Jahr> \ Fronius_Erzeugung:Fronius_Symo_User_Produced_PV_EnergyDay,Fronius_Symo_User_Produced_PV_EnergyDayLast,Fronius_Symo_User_Produced_PV_EnergyMonth,Fronius_Symo_User_Produced_PV_EnergyMonthLast,Fronius_Symo_User_Produced_PV_EnergyYear \ Fronius_Einspeisung:Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_EnergyDay,Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_EnergyDayLast,Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_EnergyMonth,Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_EnergyMonthLast,Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_EnergyYear \ Fronius_Bezug:Fronius_Symo_Meter_0_EnergyReal_WAC_Plus_Absolute_EnergyDay,Fronius_Symo_Meter_0_EnergyReal_WAC_Plus_Absolute_EnergyDayLast,Fronius_Symo_Meter_0_EnergyReal_WAC_Plus_Absolute_EnergyMonth,Fronius_Symo_Meter_0_EnergyReal_WAC_Plus_Absolute_EnergyMonthLast,Fronius_Symo_Meter_0_EnergyReal_WAC_Plus_Absolute_EnergyYear \ Hausverbrauch:Fronius_Symo_User_Consumed_Energie_C_EnergyDay,Fronius_Symo_User_Consumed_Energie_C_EnergyDayLast,Fronius_Symo_User_Consumed_Energie_C_EnergyMonth,Fronius_Symo_User_Consumed_Energie_C_EnergyMonth,Fronius_Symo_User_Consumed_Energie_C_EnergyYear\ Autolade_Calculator:C_STROM_GAS_counters.A_EnergyDay,C_STROM_GAS_counters.A_EnergyDayLast,C_STROM_GAS_counters.A_EnergyMonth,C_STROM_GAS_counters.A_EnergyMonthLast,C_STROM_GAS_counters.A_EnergyYear \ AutarkieQuote:Heute,Gestern,Monat,Vormonat,Jahr \ EigenverbrQuote:Heute,Gestern,Monat,Vormonat,Jahr attr mySolarStat alias Solarstromstatistik kWh / % attr mySolarStat room Energie-Auto,Energie-Strom,Statistik attr mySolarStat valueFormat %.1f
Grafiken
Strombezug, Stromeinspeisung, Stromerzeugung, Stromverbrauch, Solare Vorhersage hier "nur" ein Beispiel Stromerzeugung, die anderen Graphen dementsprechend anlegen
defmod SVG_myDbLog_1 SVG myDbLog:SVG_myDbLog_1:HISTORY
attr SVG_myDbLog_1 alias Stromerzeugung
attr SVG_myDbLog_1 fp_Energieerzeugung 415,204,1,SVG_myDbLog_1,
attr SVG_myDbLog_1 fp_Energieverbrauch 204,164,1,SVG_myDbLog_1,
attr SVG_myDbLog_1 label $data{currval1}::$data{currval2}::$data{currval3}::$data{currval4}::$data{currval5}::
attr SVG_myDbLog_1 plotReplace L1={sprintf("%.1f", $data{currval1})} L2={sprintf("%.1f", $data{currval2})}
attr SVG_myDbLog_1 room Energie-Strom
attr SVG_myDbLog_1 title "Stromerzeugung"
</syntaxhighlight>und dazu die .gplot Datei:<syntaxhighlight lang="perl">
# Created by FHEM/98_SVG.pm, 2024-10-31 18:49:58
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<TL> <L1> W <L2>kWh'
set ytics
set y2tics
set grid y2tics
set ylabel "Momentanleistung [W]"
set y2label "Tageserzeugung [kWh]"
#myDbLog Fronius_Symo:PowerFlow_Site_P_PV:::
#myDbLog Fronius_Erzeugung:Fronius_Symo_User_Produced_PV_EnergyDay:::
plot "<IN>" using 1:2 axes x1y1 title 'Momentanleistung <L1> [W]' ls l3 lw 2 with lines,\
"<IN>" using 1:2 axes x1y2 title 'Tageserzeugung <L2> [kWh]' ls l2fill lw 1 with lines
SolarForecast
Es müssen vorher unter global die attr longitude und latitude für den Standort der Anlage eingegeben werden, damit die einzelnen Wettermodelle funktionieren. Forecast hat ein prima selbsterklärendes Startmenü und man sieht auch gleich die evt. vorhandenen Einstellungsfehler.
Weiteres dazu im umfangreichen Wiki Solarforecast.
Die dort beschriebene Grafik "Solare Vorhersage" zeigt die Differenzen zwischen der berechneten Vorhersage und der tatsächlichen PV-Erzeugung eines Tages. Die Werte, die in der Anlagenübersicht angezeigt werden, sollten identisch zu denen in dem u.A. ftui2 Widget sein (Gegenkontrolle).
In diesem Beispiel ist ein Interner consumer01 (Autoladen) eingestellt, dessen Werte nicht mit in den Forecast einbezogen werden.
defmod Forecast SolarForecast attr Forecast DbLogExclude .* attr Forecast DbLogInclude LastHourPVforecast,LastHourPVreal,AllPVforecastsToEvent attr Forecast consumer01 MQTT2_evcc1 type=charger power=0 exconfc=1 icon=electric_car_icon pcurr=loadpoints_1_chargePower :W attr Forecast ctrlLanguage DE attr Forecast ctrlNextHoursSoCForecastReadings 07,08,09,10,11,12,13,14,15,16,17,18,19,20,21 attr Forecast ctrlSpecialReadings BatPowerIn_Sum,BatPowerOut_Sum,conForecastTillNextSunrise,dayAfterTomorrowPVforecast,todayConsumption,todayConsumptionForecast,todayConsumptionForecastDay,todayGridConsumption,todayGridFeedIn,tomorrowConsumptionForecast attr Forecast event-on-change-reading .* attr Forecast graphicControl energyUnit=kWh headerDetail=all,pv attr Forecast graphicHistoryHour 8 attr Forecast graphicSelect forecast attr Forecast graphicShowNight 01 attr Forecast plantControl showLink=1 attr Forecast room Energie-Strom attr Forecast setupBatteryDev01 PV_Batterie pin=BatteryChargeWatt:W pout=BatteryDischargeWatt:W intotal=Summe_Ladung:kWh outtotal=Summe_Entladung:kWh show=1 cap=12800 charge=BatteryChargePercent attr Forecast setupInverterDev01 Fronius_Symo pvOut=PowerFlow_Site_P_PV:W etotal=User_Produced_FPV:kWh capacity=11000 strings:Ostseite,Suedseite attr Forecast setupInverterDev02 Fronius_Symo pvOut=Meter_1_PowerReal_P_Sum:W etotal=Meter_1_EnergyReal_WAC_Sum_Produced:Wh capacity=4000 strings:Westseite,GH_Ost,GH_West attr Forecast setupInverterStrings Suedseite,Westseite,Ostseite,GH_West,GH_Ost attr Forecast setupMeterDev Fronius_Symo gcon=Bezug:W contotal=Meter_0_EnergyReal_WAC_Plus_Absolute:Wh gfeedin=Einspeisung feedtotal=Meter_0_EnergyReal_WAC_Plus_Absolute:Wh conprice=powerCost:€ feedprice=0.083:€ attr Forecast setupRadiationAPI OpenMeteoDWD_D2-API attr Forecast setupStringAzimuth Suedseite=0 Westseite=90 Ostseite=-90 GH_Ost=-90 GH_West=90 attr Forecast setupStringDeclination Suedseite=35 Westseite=60 Ostseite=45 GH_West=18 GH_Ost=18 attr Forecast setupStringPeak Suedseite=7.66 Westseite=2.2 Ostseite=3.48 GH_Ost=1.74 GH_West=0.58 attr Forecast setupWeatherDev1 OpenMeteoDWD_D2-API attr Forecast verbose 0
Die Unterschiede vom Forecast zur reellen Erzeugung können in einer Grafik dargestellt werden.
Autoladen über evcc
Integration und Steuerung der Wallbox, Wechselrichter, Batterie sowie zu ladendes Fahrzeug kann über das Programm evcc gemacht werden.
Die Software evcc läuft problemlos parallel auf dem FHEM Systemrechner und kann über MQTT2 eingebunden werden.
Weitere Infos dazu in https://evcc.io/
Der Nachteil dieser (externen) Software ist der Preis. Es wird mit Open-Source-Software geworben, jedoch die meisten Module z.B. zum Steuern eines Fahrzeugs oder einer Wallbox gehen nur über einen sogenannten Sponsortoken, den man für 1$ pro Monat erwerben kann. Aber solange ein solches Modul mit ähnlich umfangreichen Möglichkeiten bei FHEM nicht zur Verfügung steht, hier die Möglichkeit der Integration in FHEM.
Der Clou ist hiebei ist die Hausbatterie entsprechend der evcc Möglichkeiten zu schalten und auch das Programm zu steuern
auf welche Art das Fz geladen werden soll: Sofort, nur PV Überschuss, Minimal + PV oder Aus
Zusätzlich ein weiterer ElectricityCalculator für die Autoladestatistik der Wallbox.
Dieser übergibt seine Autoladungswerte über mqttPublish zurück an fhem.
defmod MQTT2_evcc1 MQTT2_DEVICE evcc1
attr MQTT2_evcc1 DbLogExclude .*
attr MQTT2_evcc1 DbLogInclude loadpoints_1_chargePower
attr MQTT2_evcc1 alias Wally
attr MQTT2_evcc1 autocreate 1
attr MQTT2_evcc1 comment Achtung: EVCC greift per Modbus auf Fronius zu Port 502 Adr. 200
attr MQTT2_evcc1 event-on-change-reading .*
attr MQTT2_evcc1 event-on-update-reading .*
attr MQTT2_evcc1 icon wallbox
attr MQTT2_evcc1 room Energie-Auto
attr MQTT2_evcc1 setList ChargeMode:Now,Min+PV,PV,Stop { my %h=(Now=>'now','Min+PV'=>'minpv',PV=>'pv',Stop=>'off');; qq(evcc/loadpoints/1/mode/set $h{$EVTPART1});; } \
PvPriority:Home,Car,FillCar { my %h=(Home=>'95','Car'=>'35','FillCar'=>'15');; qq(evcc/site/prioritySoc/set $h{$EVTPART1});; }\
MaxCurrent:11,14,16,20,24,32 { qq(evcc/loadpoints/1/maxCurrent/set $EVTPART1);; }
attr MQTT2_evcc1 stateFormat Auto_Status | loadpoints_1_mode | loadpoints_1_chargePower W
attr MQTT2_evcc1 userReadings Auto_Status { (ReadingsVal($name,'loadpoints_1_connected','') eq 'true' ? 2 : 0) },\
Reichweite { ((ReadingsVal($name,'loadpoints_1_vehicleSoc','')-10)*0.67) },\
Ladeleistung { (ReadingsVal($name,'loadpoints_1_chargePower','')/1000) }
Und nun noch ein ElectricityCalculator, zur Berechnung der Strommenge:
Die Stromwerte kommen aus einem 1-Wire Counter der einen extra Zähler über den SO Port zählt.
Wenn die Wallbox einen Stromzähler hat, geht das natürlich einfacher; nur die Statistikwerte dieses Zählers werden benötigt.
defmod Autolade_Calculator ElectricityCalculator MQTT2_evcc1:loadpoints_1_chargeTotalImport.*
attr Autolade_Calculator BasicPricePerAnnum 132.84
attr Autolade_Calculator Currency €
attr Autolade_Calculator DbLogExclude .*
attr Autolade_Calculator DbLogInclude MQTT2_evcc1_loadpoints_1_chargeTotalImport_EnergyDay
attr Autolade_Calculator DecimalPlace 3
attr Autolade_Calculator ElectricityCounterOffset 0
attr Autolade_Calculator ElectricityKwhPerCounts 1
attr Autolade_Calculator ElectricityPricePerKWh 0.3305
attr Autolade_Calculator MonthOfAnnualReading 1
attr Autolade_Calculator MonthlyPayment 121
attr Autolade_Calculator ReadingDestination CalculatorDevice
attr Autolade_Calculator SiPrefixPower kW
attr Autolade_Calculator alias Autoladen
attr Autolade_Calculator room Energie-Auto,Steuerung
attr Autolade_Calculator stateFormat Heute: MQTT2_evcc1_loadpoints_1_chargeTotalImport_EnergyDay kWh
ftui2 Widgets zur Darstellung auf einem Tablet
Widget pvvis und angepasste Daten zur Darstellung
Einige Werte werden intern berechnet, das Widget selbst kann im Forum geladen werden.
Widget
<header>Solaranlage und Batterie</header> <div data-type="pvvis" data-device="Fronius_Symo" data-get="Fronius_Symo:Bezug" data-feed="Fronius_Symo:Neg_Einspeisung" data-lp1="MQTT2_evcc1:Auto_Status" data-lp1pow="Autolade_Calculator:Auto_reduce" data-carsoc="MQTT2_evcc1:loadpoints_1_vehicleSoc" data-carvol="Autolade_Calculator:C_STROM_GAS_counters.A_EnergyDay" data-carrange="MQTT2_evcc1:Reichweite" data-charge="Fronius_Symo:Akku_Laden" data-discharge="Fronius_Symo:Akku_Entladen" data-produce="Fronius_Symo:PowerFlow_Site_P_PV" data-sumproduceday="Fronius_Erzeugung:Fronius_Symo_User_Produced_PV_EnergyDay" data-sumgridday="Fronius_Bezug:Fronius_Symo_Meter_0_EnergyReal_WAC_Plus_Absolute_EnergyDay" data-sumfeedday="Fronius_Einspeisung:Fronius_Symo_Meter_0_EnergyReal_WAC_Minus_Absolute_EnergyDay" data-soc="Fronius_Symo:PowerFlow_Inverters_1_SOC" data-chargedischarge="Fronius_Symo:PowerFlow_Site_P_Akku" data-pv-max="10000" data-batt-max="10240" data-autarky="AutarkieQuote:Heute" data-pvhome="Fronius_Symo:PowerFlow_Site_P_Load" data-width="450" data-height="450" class="centered"> </div>
Und Widget SolarForecast für die Vorschau auf ftui2, darunter die Differenz Vorhersage/reale Erzeugung:
<div class="page" id="content_forecast"> <div class="gridster"> <ul> <li data-row="1" data-col="1" data-sizex="9" data-sizey="9"> <header>Solar Vorhersage</header> <div class="cell"> <div data-type="smaportalspg" data-device="Forecast" data-get="state"></div> </div> </li> <li data-row="9" data-col="1" data-sizex="9" data-sizey="4"> <header>Vorhersage</header> <div data-type="chart" data-device="Hausverbrauch" data-logdevice='["myDbLog"]' data-logfile='["HISTORY"]' data-columnspec='["Forecast:LastHourPVreal","Forecast:LastHourPVforecast"]' data-style='["ftui l6fill","ftui l1fill"]' data-uaxis='["primary","secondary"]' data-legend='["Akt.Erzeugung","Akt.Vorhersage"]' data-yunit="°kWh" data-ytext="Menge" data-width="100%" data-height="100%" data-yticks="auto" data-minvalue="auto" data-maxvalue="auto" data-nofulldays="true" data-daysago_start="-6H" data-daysago_end="-22H" data-xticks="auto" </div> </li> </ul> </div> </div>(Nur der der Vollständigkeit wegen)