SolarEdge Wechselrichter
SolarEdge Wechselrichter | |
---|---|
Allgemein | |
Protokoll | Modubus TCP |
Typ | Wechselrichter |
Kategorie | Energieverbrauchsmessung |
Technische Details | |
Kommunikation | Ethernet TCP |
Kanäle | 1 (bidiektional) |
Betriebsspannung | 750V DC; 230V 3xAC |
Leistungsaufnahme | Eigenverbrauch 2% (geschätzt) |
Versorgung | 230V~ 3xAC |
Abmessungen | 317x512x214 (mm) |
Sonstiges | |
Modulname | ModbusAttr |
Hersteller | Solaredge |
SE10k von Solaredge in FHEM einbinden
Dieser Artikel beschreibt die Einbindung eines Solaredgewechselrichters SE10k in ein FHEM System über eine Ethernetverbindung mit Hilfe des Moduls ModbusAttr.
Vorbedingungen
FHEM läuft und hat genügend Platz für Modifikationen und Logfiles (ca. 100 MByte / Jahr).
Am Wechselrichter
Im zugehörigen Menu ist bereits der Port 503 eingestellt. Trotzdem muss dieser noch einmal aktiviert werden, da sonst Modbus TCP nicht aktiv wird. Hilfe da zu bietet die Installationsanleitung [1].
ModbusAttr Device in FHEM
in FHEM wird ein ModbusAttr angelegt
define SolarEdge ModbusAttr 1 30 192.168.178.36 TCP
danach alle Attribute aus dem unten stehenden list nach dem Verfahren:
attr SolarEdge dev-h-defPoll 1
Mehr Daten sind im Sunspec Protokoll zu finden
List von Device Solaredge in FHEM
Internals: BUSY 0 DEF 1 30 192.168.178.36 TCP DEST 192.168.178.36:502 DeviceName 192.168.178.36:502 FD 86 INTERVAL 30 IODev KeSolarEdge LASTOPEN 1514309396.43558 MODBUSID 1 ModuleVersion 3.7.0 - 20.8.2017 NAME KeSolarEdge NOTIFYDEV global NR 363 NTFY_ORDER 50-KeSolarEdge PARTIAL PROTOCOL TCP REQUESTHEX 00c60000000601039c8f0001 STATE opened TRIGGERTIME 1514313544.27135 TRIGGERTIME_FMT 2017-12-26 19:39:04 TYPE ModbusAttr devioLoglevel 3 nextOpenDelay 60 Attributes: dev-h-defPoll 1 dev-h-defShowGet 1 enableControlSet 1 maxTimeoutsToReconnect 3 obj-h40079-expr $val / 10 obj-h40079-reading AC-Volt-A obj-h40082-reading AC-Volt-Scale obj-h40082-unpack s> obj-h40083-reading AC-Power obj-h40084-reading AC-Power-Scale obj-h40084-unpack s> obj-h40093-len 2 obj-h40093-reading AC-Energy obj-h40093-unpack l> obj-h40095-reading AC-Energy-Scale obj-h40096-reading DC-Current obj-h40097-reading DC-Current-Scale obj-h40097-unpack s> obj-h40098-reading DC-Voltage obj-h40099-reading DC-Voltage-Scale obj-h40099-unpack s> obj-h40100-reading DC-Power obj-h40101-reading DC-Power-Scale obj-h40101-unpack s> obj-h40103-reading HeatSinkTemp obj-h40103-unpack s> obj-h40107-reading Status
Dummys anlegen
Zur Verwendung der "at"s werden Dummys benötigt
define pv_energyday_log dummy
dum_pv_energyday_log /r dum_pv_energyday_read
dum_pv_energymonth_log
dum_pv_energymonth_read
dum_pv_energytoday
dum_pv_energytomonth
dum_pv_energytoweek
dum_pv_energytoyear
dum_pv_energyweek_log
dum_pv_energyweek_read
dum_pv_energyyear_log
dum_pv_energyyear_read
dum_pvdcpower
dum_pvdcvolt
dum_pvenergy
dum_pvloss
dum_pvpower
at Devices in FHEM
Auslesen der Daten, da das ModbusAttr nicht immer geht:
at_solaredge
+*00:20:00 { if (Value("KeSolarEdge") eq "opened") { my $ACEnergy = fhem ("get KeSolarEdge AC-Energy"); my $ACEnergyScale = fhem ("get KeSolarEdge AC-Energy-Scale"); my $ACE = 0; my $day = Value("dum_pv_energyday_read"); my $week = Value("dum_pv_energyweek_read"); my $month = Value("dum_pv_energymonth_read"); my $year = Value("dum_pv_energyyear_read"); if (($ACEnergy ne "No Data") and ($ACEnergyScale ne "No FD")) { my $ACE = $ACEnergy * (10 ** $ACEnergyScale); if ($ACE > 0) { fhem ("set dum_pvenergy " . $ACE); fhem ("set dum_pv_energytoday " . ($ACE - $day)); fhem ("set dum_pv_energytoweek " . ($ACE - $week)); fhem ("set dum_pv_energytomonth " . ($ACE - $month)); fhem ("set dum_pv_energytoyear " . ($ACE - $year)); } } #Log 1, "at_Solaredge: PV-Energy " . $ACE . "\n"; my $ACPower = fhem ("get KeSolarEdge AC-Power"); my $ACPowerScale = fhem ("get KeSolarEdge AC-Power-Scale"); my $ACP = 0; my $DCP = 0; if (($ACPower ne "No FD") and ($ACPower ne "No Data") and ($ACPowerScale ne "No FD")) { $ACP = $ACPower * (10 ** $ACPowerScale); fhem ("set dum_pvpower " . $ACP); #Log 1, "at_Solaredge: PV-Power " . $ACP . "\n"; my $DCPower = fhem ("get KeSolarEdge DC-Power"); my $DCPowerScale = fhem ("get KeSolarEdge DC-Power-Scale"); if (($DCPower ne "no FD") and ($DCPowerScale ne "no FD")) { $DCP = $DCPower * (10 ** $DCPowerScale); if ($DCP != 0) { fhem ("set dum_pvdcpower " . $DCP); fhem ("set dum_pvloss " . sprintf("%.1f", ($DCP - $ACP))); } } } my $DCVoltage = fhem ("get KeSolarEdge DC-Voltage"); my $DCVoltageScale = fhem ("get KeSolarEdge DC-Voltage-Scale"); my $DCV = 0; if (($DCVoltage ne "no FD") and ($DCVoltage ne "No Data") and ($DCVoltageScale ne "no FD")) { $DCV = $DCVoltage * (10 ** $DCVoltageScale); fhem ("set dum_pvdcvolt " . $DCV); } my $Status = fhem ("get KeSolarEdge Status"); if ($Status ne "no FD") { if ($Status == 2) { fhem ("modify at_solaredge +*00:20:00"); } else { fhem ("modify at_solaredge +*00:01:00"); } } } else { Log 1, Value("KeSolarEdge"); fhem ("modify at_solaredge +*00:01:00"); } }
und eines um die Werte täglich zurück zu setzen
at_midnight
*24:00 { # Abspeichern der täglichen, wöchentlichen und monatlichen Werte use Time::Local; my ($Psec,$Pmin,$Phour,$Pmday,$Pmonth,$Pyear,$Pwday,$Pyday,$Pisdst) = localtime(); if(Value("KeSolarEdge") eq "opened") { my $pvenergy = fhem("get KeSolarEdge AC-Energy"); Log 5, "at_midnight AC-Energy" . " " . $pvenergy; if ($pvenergy ne "No FD") { my $pvet = Value("dum_pv_energyday_read"); #Log 5, "at_midnight dum_pv_energyday_read " . $pvet; fhem ("set dum_pv_energyday_log " . ($pvenergy - $pvet)); #Log 5, "at_midnight dum_pv_energyday" . " " . $pvenergy; fhem ("set dum_pv_energyday_read " . $pvenergy); #Log 5, "at_midnight dum_pv_energyday_read" . " " . $pvenergy; fhem ("modify at_midnight *24:00"); if ($Pwday == 1) { my $pvet = Value("dum_pv_energyweek_read"); fhem ("set dum_pv_energyweek_log " . ($pvenergy - $pvet)); fhem ("set dum_pv_energyweek_read " . $pvenergy); } if ($Pmday == 1) { my $pvet = Value("dum_pv_energymonth_read"); fhem ("set dum_pv_energymonth_log " . ($pvenergy - $pvet)); fhem ("set dum_pv_energymonth_read " . $pvenergy); } if ($Pyday == 1) { my $pvet = Value("dum_pv_energyyear_read"); fhem ("set dum_pv_energyyear_log " . ($pvenergy - $pvet)); fhem ("set dum_pv_energyyear_read " . $pvenergy); } } else { fhem ("modify at_midnight +00:01"); Log 2, "at_midnight Solaredge AC-Energy No FD" } } else { fhem ("modify at_midnight +00:01"); Log 2, "at_midnight Solaredge not opened" } }
Log
Das ModbusDevice legt sich ein eigenes Log an. Um aber übersichtliche Grafiken zu bekommen werden die Daten des Dummy benötigt. Hier hilft ein Logfile
define FileLog_KePv Filelog %L/pv-%Y.log dum_pv*.*
Grafiken
Todo: Beschreibungen zu SVG hinterlegen |
Links
- Solaredge: Installationsanleitung
- Solaredge: Sunspec Protokoll