Reading Data from Solaredge inverters via Modbus TCP

I would love to see it documented for the community in rhis section :sunglasses:

The items could probably use some tidying up - I did this a while ago in OpenHAB 1.x which I stopped using then recently converted it to OH2. Unlike in the above example- I was able to use mutiple poll requests, so used a separate poll for each block of contiguous data. This may not be the most efficient, but it works.

modbus.cfg

#Separate connection blocks required for different register type polls
poll=2000

tcp.FroniusBlk1.connection=192.168.21.202:502
tcp.FroniusBlk1.id=1
tcp.FroniusBlk1.start=213
tcp.FroniusBlk1.length=1
tcp.FroniusBlk1.type=holding
tcp.FroniusBlk1.valuetype=uint16

tcp.FroniusBlk2.connection=192.168.21.202:502
tcp.FroniusBlk2.id=1
tcp.FroniusBlk2.start=499
tcp.FroniusBlk2.length=14
tcp.FroniusBlk2.type=holding
tcp.FroniusBlk2.valuetype=uint32

tcp.FroniusBlk3.connection=192.168.21.202:502
tcp.FroniusBlk3.id=1
tcp.FroniusBlk3.start=40071
tcp.FroniusBlk3.length=22
tcp.FroniusBlk3.type=holding
tcp.FroniusBlk3.valuetype=float32

tcp.FroniusBlk4.connection=192.168.21.202:502
tcp.FroniusBlk4.id=1
tcp.FroniusBlk4.start=40091
tcp.FroniusBlk4.length=20
tcp.FroniusBlk4.type=holding
tcp.FroniusBlk4.valuetype=float32

tcp.FroniusBlk5.connection=192.168.21.202:502
tcp.FroniusBlk5.id=1
tcp.FroniusBlk5.start=40117
tcp.FroniusBlk5.length=1
tcp.FroniusBlk5.type=holding
tcp.FroniusBlk5.valuetype=uint16

tcp.FroniusBlk6.connection=192.168.21.202:502
tcp.FroniusBlk6.id=1
tcp.FroniusBlk6.start=40123
tcp.FroniusBlk6.length=8
tcp.FroniusBlk6.type=holding
tcp.FroniusBlk6.valuetype=uint32

tcp.FroniusBlk7.connection=192.168.21.202:502
tcp.FroniusBlk7.id=1
tcp.FroniusBlk7.start=40281
tcp.FroniusBlk7.length=31
tcp.FroniusBlk7.type=holding
tcp.FroniusBlk7.valuetype=uint16

items

Group 	gMyOpenHab
Group 	gSolar
Group	gSolarMain	(gSolar)
Group 	gSolarPower	(gSolar)
Group 	gSolarAC		(gSolar)		
Group 	gSolarDC		(gSolar)
Group	gSolarInfo	(gSolar)
/* Solar 
Number  Solar_Active_StateCode   "Current State [%d]"                  (gSolarMain) {modbus="FroniusBlk1:0"}

Number  Solar_Site_Power         	"Actual Power [%d W]"                  (gSolarMain, gSolarPower) {modbus="FroniusBlk2:0"}
//Number  Solar_Site_Energy_Day_HW 	"Generated Today HW [%d Wh]"         (gSolarMain, gSolarPower) {modbus="FroniusBlk2:1"}
Number  Solar_Site_Energy_Day 		"Generated Today [%d Wh]"            (gSolarMain, gSolarPower) {modbus="FroniusBlk2:2"}
//Number  Solar_F_Site_Energy_Year_HW "Generated Year HW [%d Wh]"      (gSolarPower) {modbus="FroniusBlk2:3"}
Number  Solar_F_Site_Energy_Year_LW "Generated Year  [%d Wh]"          (gSolarPower) {modbus="FroniusBlk2:4"}
//Number  Solar_F_Site_Energy_Tot_HW"Generated Lifetime HW [%d Wh]"        (gSolarPower) {modbus="FroniusBlk2:5"}
Number  Solar_F_Site_Energy_Tot_LW	"Generated Lifetime [%d Wh]"        (gSolarPower) {modbus="FroniusBlk2:6"}

Number  Solar_AC_Current         "AC total current [%.2f A]"               (gSolarAC) {modbus="FroniusBlk3:0"}
Number  Solar_AphA               "AC phase A current [%.2f A]"            (gSolarAC) {modbus="FroniusBlk3:1"}
Number  Solar_AphB               "AC phase B current [%.2f  A]"            (gSolarAC) {modbus="FroniusBlk3:2"}
Number  Solar_AphC               "AC phase C current [%.2f  A]"            (gSolarAC) {modbus="FroniusBlk3:3"}
Number  Solar_PPVphBC            "AC voltage phase BC [%.2f V]"           (gSolarAC) {modbus="FroniusBlk3:5"}
Number  Solar_PPVphCA            "AC voltage phase CA [%.2f V]"           (gSolarAC) {modbus="FroniusBlk3:6"}
Number  Solar_PPVphAB            "AC voltage phase AB [%.2f V]"           (gSolarAC) {modbus="FroniusBlk3:4"}
Number  Solar_PhVphA             "AC voltage phase AN [%.2f V]"           (gSolarAC) {modbus="FroniusBlk3:7"}
Number  Solar_PhVphB             "AC voltage phase BN [%.2f V]"           (gSolarAC) {modbus="FroniusBlk3:8"}
Number  Solar_PhVphC             "AC voltage phase CN [%.2f V]"           (gSolarAC) {modbus="FroniusBlk3:9"}

Number  Solar_AC_Power           "AC power [%.2f W]"                      (gSolarAC) {modbus="FroniusBlk4:0"}
Number  Solar_AC_Freq            "AC frequency [%.2f  Hz]"                 (gSolarAC) {modbus="FroniusBlk4:1"}
Number  Solar_WH                 "AC lifetime energy production [%.0f Wh]"(gSolarAC) {modbus="FroniusBlk4:5"}
//BCK 16/07/17 for some reason Solar_DCA & Solar_DCV below cause errors - need to look at it
//Number  Solar_DCA                "DC current [%.2f  A]"                    (gSolarDC) {modbus="FroniusBlk4:6"}
//Number  Solar_DCV                "DC voltage [%.2f  V]"                    (gSolarDC) {modbus="FroniusBlk4:7"}
Number  Solar_DCW                "DC power [%.2f  W]"                      (gSolarDC) {modbus="FroniusBlk4:8"}

Number  Solar_State              "Operating state (enum)[%d]"            (gSolarInfo) {modbus="FroniusBlk5:0"}

Number  Solar_EvtVnd1            "Event Flag 1 [%d]Bit field"          (gSolarInfo) {modbus="FroniusBlk6:0"}
Number  Solar_EvtVnd2            "Event Flag 2 [%d]Bit field"          (gSolarInfo) {modbus="FroniusBlk6:1"}
Number  Solar_EvtVnd3            "Event Flag 3 [%d]Bit field"          (gSolarInfo) {modbus="FroniusBlk6:2"}
Number  Solar_EvtVnd4            "Event Flag 4 [%d]Bit field"          (gSolarInfo) {modbus="FroniusBlk6:3"}

Number  Solar_1_DCA              "String 1 DC current [%d A]"           (gSolarDC) {modbus="FroniusBlk7:0"}
Number  Solar_1_DCV              "String 1 DC voltage [%d V]"           (gSolarDC) {modbus="FroniusBlk7:1"}
Number  Solar_1_DCW              "String 1 DC power [%d W]"             (gSolarDC) {modbus="FroniusBlk7:2"}
Number  Solar_1_Tmp              "String 1 Temperature [%d C]"          (gSolarDC) {modbus="FroniusBlk7:7"}
Number  Solar_1_DCSt             "String 1 Operating state [%d]"       (gSolarDC) {modbus="FroniusBlk7:8"}
Number  Solar_2_DCA              "String 2 DC current [%d A]"           (gSolarDC) {modbus="FroniusBlk7:20"}
Number  Solar_2_DCV              "String 2 DC voltage [%d V]"           (gSolarDC) {modbus="FroniusBlk7:21"}
Number  Solar_2_DCW              "String 2 DC power [%d W]"             (gSolarDC) {modbus="FroniusBlk7:22"}
Number  Solar_2_Tmp              "String 2 Temperature [%d C]"          (gSolarDC) {modbus="FroniusBlk7:27"}
Number  Solar_2_DCSt             "String 2 Operating state [%d]"       (gSolarDC) {modbus="FroniusBlk7:28"}

Hopefully somebody finds this useful.

Brent

1 Like

Hello Thomas,

I don’t use openhab but iobroker - but maybe you can help anyway :sunglasses:
You seem to be able to interpret the values that the inverter and the Modbus meter output.
Can you tell me how I can use the values to determine the current consumption of the house?
The value must be determined by the inverter as it is displayed in the SolarEdge web interface.

Here are the values I read from the Modbus counter:

 address   name   description   unit   type   len   factor   offset   role   room   poll   wp
40071   I_AC_Current   AC Total Current value   Amp   uint16be   1   1   0   level      true   false   
40075   I_AC_Current_SF   AC Current scale factor      int16be   1   1   0   level      true   false   
40083   I_AC_Power   AC Power value   W   int16be   1   1   0   level      true   false   
40084   I_AC_Power_SF   AC Power scale factor      int16be   1   1   0   level      true   false   
40085   I_AC_Frequency   AC Frequency value   Hz   uint16be   1   0.01   0   level      true   false   
40093   I_AC_Energy_WH   AC Lifetime Energy production   kWh   int32be   2   0.001   0   level      true   false   
40098   I_DC_Voltage   DC Voltage value   V   uint16be   1   0.1   0   level      true   false   
40100   I_DC_Power   DC Power Value   W   int16be   1   0.1   0   level      true   false   
40103   I_Temp_Sink   Temperatur   °C   int16be   1   1   0   level      true   false   
40107   I_Status   Operation State      uint16be   1   1   0   level      true   false   
40154   C_Option   Export + Import, Production, consumption,   NA   string   8   1   0   level      true   false   
40189   M_AC_Current   AC Current (sum of active phases)   A   int16be   1   1   0   level      true   false   
40193   M_AC_Current_S F   AC Current Scale Factor   SF   int16be   1   1   0   level      true   false   
40194   M_AC_Voltage_L N   Line to Neutral AC Voltage (average of active phases)   V   int16be   1   1   0   level      true   false   
40198   M_AC_Voltage_L L   Line to Line AC Voltage (average of active phases)   V   int16be   1   1   0   level      true   false   
40202   M_AC_Voltage_S F   AC Voltage Scale Factor   V   int16be   1   1   0   level      true   false   
40203   M_AC_Freq   AC Frequency   Hz   int16be   1   1   0   level      true   false   
40204   M_AC_Freq_SF   AC Frequency Scale Factor   SF   int16be   1   1   0   level      true   false   
40205   M_AC_Power   Total Real Power (sum of active phases)   W   uint16be   1   1   0   level      true   false   
40209   M_AC_Power_SF   AC Real Power Scale Factor   SW   int16be   1   1   0   level      true   false   
40210   M_AC_VA   Total AC Apparent Power (sum of active phases)   VA   int16be   1   1   0   level      true   false   
40214   M_AC_VA_SF   AC Apparent Power Scale Factor   SF   int16be   1   1   0   level      true   false   
40215   M_AC_VAR   Total AC Reactive Power (sum of active phases)   VAR   int16be   1   1   0   level      true   false   
40219   M_AC_VAR_SF   AC Reactive Power Scale Factor   %   int16be   1   1   0   level      true   false   
40220   M_AC_PF   Average Power Factor (average of active phases)   %   int16be   1   1   0   level      true   false   
40224   M_AC_PF_SF   AC Power Factor Scale Factor   SF   int16be   1   1   0   level      true   false   
40225   M_Exported   Total Exported Real Energy   Wh   uint32le   2   1   0   level      true   false   
40233   M_Imported   Total Imported Real Energy   Wh   uint32le   2   1   0   level      true   false   
40233   M_Imported   Total Imported Real Energy   Wh   uint32le   2   1   0   level      true   false   
40241   M_Energy_W_SF   Real Energy Scale Factor   Wh   int16be   1   1   0   level      true   false   
40242   M_Exported_VA   Total Exported Apparent Energy   VAh   uint32le   2   1   0   level      true   false   
40106   I_Temp_SF   Scale factor      int16be   1   1   0   level      true   false

Kind regards,
Olli

The current consumption of your house would be:

House = inverter power (I_AC_Power) + modbus meter power (M_AC_Power)

Assuming, that the modbus meter counts exported energy as negative values and imported as positive values.
As highlighted above, you need to use the scaling factor (M_AC_Power_SF) to scale your power values:

Modbus meter power = M_AC_Power * exp (10, M_AC_Power_SF)
Interver meter power = I_AC_Power * exp (10, I_AC_Power_SF)

BR,

Thomas

thx Thomas,

FYI, there is a new 2.x binding for Solaredge inverters which is using the web monitoring portal API for data, which is very easy to install and setup.
It’s the only solution for older inverters which lacks modbus communication port. You don’t even need a website API key.
Only the Solaredge web monitoring credentials are needed.

Keep in mind that the Solaredge API lags minutes behind the actual solar production. Therefore, if you want to steer the power consumption in your house to capitalise on the actual solar power being available (i.e. for matching the power you feed to your e-car, or dumping the excess energy into a heat storage solution, that is not controlled directly by your inverter), you need real-time data, which is what the direct access to the Modbus data provides.

Best,

Thomas

Has anyone found out, which modbus address represents the battery level? I’m using a SE 5000H with LG RESU10H. The sunspec documents is pretty silent about batteries and using several tools to monitor the modbus made me NOT find anything about the battery.

Hi Thomas.
I newly own a se9k too, and am looking for ways to work with it.
I have an electronics background, but am currently absorbed with remodeling my house. It will take some months before I can dive deeper, but want to start with something basic now.
I have not yet started to use openhab or volkszähler, but am looking at both.
It seems like you have a setup quite close to what I might need.
Any chance to get in direct contact?
(Did not see a pm function here)
Ps: I am in Graubünden, Switzerland.
I think you are in Germany?

Being completely new to openHAB, i try to copy the code of @tkuehne (for inverter only).
As there are no file names given, i guess around a bit, and i do the following:

paste to
/etc/openhab2/services/modbus.cfg
change the IP

paste twice to
/etc/openhab2/items/solaredge9k.items

paste to
/etc/openhab2/sitemaps/solaredge9k.sitemap

paste to
/etc/openhab2/rules/solaredge9k.rules
Now i was not able to access the sitemap,
had to add 1st line sitemap solaredge9k label=“solaredge9k” { and last line }

Sounds like correct?
Is there anything more, or should this run?
next i’ll need to enable modbus TCP in the inverter…

As a reference for others who look for ways to get data from their solaredge inverters:


It does read directly from the inverter, by mimicking the solaredge portal server or by sniffing the traffic to the SE server.
This allows you to even get module-data if you have optimizers on your PV modules.

1 Like

So, Modbus TCP is enabled, i can get data through an excel spreadsheet/VBA thing.

But i can’t read via OH following thomas’ instructions.


Am i using the right filenames?

/etc/openhab2/services/modbus.cfg

    poll=10000

    tcp.se9k.connection=192.168.188.21:502:60:0:0:3:500
    tcp.se9k.id=1
    tcp.se9k.type=holding
    tcp.se9k.start=69
    tcp.se9k.length=50
    tcp.se9k.valuetype=uint16

/etc/openhab2/items/solaredge9k.items



    Group se9kint "Wechselrichter PV-Anlage (int-Werte)"
    Group se9k "Wechselrichter PV-Anlage"
    Number se9k_DID_int “WR Typ (int) [%d]” (se9kint) {modbus=“se9k:0”}

    // Amps acrosss all phases
    Number se9k_Amps_int “WR Stromerzeugung gesamt (int) [%d A]” (se9kint) { modbus=“se9k:2” }

    // Amps Phase A,B,C and scaling factor
    Number se9k_AmpA_int “WR Stromerzeugung Ph.A (int) [%d A]” (se9kint) { modbus=“se9k:3” }
    Number se9k_AmpB_int “WR Stromerzeugung Ph.B (int) [%d A]” (se9kint) { modbus=“se9k:4” }
    Number se9k_AmpC_int “WR Stromerzeugung Ph.C (int) [%d A]” (se9kint) { modbus=“se9k:5” }
    Number se9k_AmpSF_int “WR Skalierungsfaktor Strom (int) [%d]” (se9kint) { modbus=“se9k:6” }

    // Voltage for Phases A,B,C and scaling factor
    Number se9k_VoltA_int “WR Spannung Phase A (int) [%d V]” (se9kint) { modbus=“se9k:10” }
    Number se9k_VoltB_int “WR Spannung Phase B (int) [%d V]” (se9kint) { modbus=“se9k:11” }
    Number se9k_VoltC_int “WR Spannung Phase C (int) [%d V]” (se9kint) { modbus=“se9k:12” }
    Number se9k_VoltSF_int “WR Skalierungsfaktor Spannung (int) [%d]” (se9kint) { modbus=“se9k:13” }

    // Power and SF
    Number se9k_Watt_int “WR Leistung Erzeugung (int) [%d W]” (se9kint) { modbus=“se9k:14” }
    Number se9k_WattSF_int “WR Skalierungsfaktor Leistung (int) [%d]” (se9kint) { modbus=“se9k:15” }

    // Frequency and SF
    Number se9k_Hz_int “WR Netzfrequenz (int) [%d Hz]” (se9kint) { modbus=“se9k:16” }
    Number se9k_HzSF_int “WR Skalierungsfaktor Netzfrequ. (int) [%d]” (se9kint) { modbus=“se9k:17” }

    // Apparent Power and SF
    Number se9k_VA_int “WR Scheinleistung gesamt (int) [%d VA]” (se9kint) { modbus=“se9k:18” }
    Number se9k_VASF_int “WR Skalierungsfaktor Scheinleistung (int) [%d]” (se9kint) { modbus=“se9k:19” }

    // Reactive Power and SF
    Number se9k_VAR_int “WR Reaktive Leistung gesamt (int) [%d VA]” (se9kint) { modbus=“se9k:20” }
    Number se9k_VARSF_int “WR Skalierungsfaktor reaktive Leistung (int) [%d]” (se9kint) { modbus=“se9k:21” }

    // Power factor
    Number se9k_PF_int “WR Leistungsfaktor (int) [%d cos phi]” (se9kint) { modbus=“se9k:22” }
    Number se9k_PFSF_int “WR Skalierungsfaktor Leistungsfaktor (int) [%d]” (se9kint) { modbus=“se9k:23” }

    // Lifetime generated energy
    Number se9k_Wh1_int “WR Erzeugungszaehler Byte1 (int) [%d Wh]” (se9kint) { modbus=“se9k:24” }
    Number se9k_Wh2_int “WR Erzeugungszaehler Byte2 (int) [%d Wh]” (se9kint) { modbus=“se9k:25” }
    Number se9k_WhSF_int “WR Skalierungsfaktor Zaehler (int) [%d]” (se9kint) { modbus=“se9k:26” }

    // DC side current
    Number se9k_DCA_int “WR Strom DC Seite (int) [%d A]” (se9kint) { modbus=“se9k:27” }
    Number se9k_DCASF_int “WR Skalierungsfaktor DC Strom (int) [%d]” (se9kint) { modbus=“se9k:28” }

    // DC side voltage
    Number se9k_DCV_int “WR Spannung DC Seite (int) [%d V]” (se9kint) { modbus=“se9k:29” }
    Number se9k_DCVSF_int “WR Skalierungsfaktor DC Spannung (int) [%d]” (se9kint) { modbus=“se9k:30” }

    // DC side power
    Number se9k_DCW_int “WR Leistung DC Seite (int) [%d W]” (se9kint) { modbus=“se9k:31” }
    Number se9k_DCWSF_int “WR Skalierungsfaktor DC Leistung (int) [%d]” (se9kint) { modbus=“se9k:32” }

    // Temp Heat sink
    Number se9k_THS_int “WR Temperatur Kuehlkorper (int) [%d C]” (se9kint) { modbus=“se9k:34” }
    Number se9k_THSSF_int “WR Skalierungsfaktor Kuehlkoerper (int) [%d]” (se9kint) { modbus=“se9k:37” }

    // Operating state
    Number se9k_Status_int “WR Status (int) [%d]” (se9kint) { modbus=“se9k:38” }
    Number se9k_Status_Vendor_int “WR Status Vendor (int) [%d]” (se9kint) { modbus=“se9k:39” }

// Se9K inverter Float values
String se9k_DID “WR Typ [%s]” (se9k)
// Amps acrosss all phases
Number se9k_Amps “WR Stromerzeugung gesamt [%.2f A]” (se9k)
// Amps Phase A,B,C
Number se9k_AmpA “WR Stromerzeugung Ph.A [%.2f A]” (se9k)
Number se9k_AmpB “WR Stromerzeugung Ph.B [%.2f A]” (se9k)
Number se9k_AmpC “WR Stromerzeugung Ph.C [%.2f A]” (se9k)
// Voltage for Phases A,B,C
Number se9k_VoltA “WR Spannung Phase A [%.1f V]” (se9k)
Number se9k_VoltB “WR Spannung Phase B [%.1f V]” (se9k)
Number se9k_VoltC “WR Spannung Phase C [%.1f V]” (se9k)
// Power
Number se9k_Watt “Erzeugungsleistung Photovolaik [%.2f W]” (se9k)
// Frequency
Number se9k_Hz “WR Netzfrequenz [%.2f Hz]” (se9k)
// Apparent Power
Number se9k_VA “WR Scheinleistung gesamt [%.2f VA]” (se9k)
// Reacive Power
Number se9k_VAR “WR reaktive Leistung gesamt [%.2f VA]” (se9k)
// Power factor
Number se9k_PF “WR Leistungsfaktor [%.1f cos phi]” (se9k)
// Lifetime generated energy
Number se9k_kWh “WR Erzeugungszaehler [%.3f kWh]” (se9k)
// the follwing two items allow you to display some derived values, i.e. the energy produced in the current year.
Number se9k_kWh_Jahr “WR Erzeugung seit Jahresanfang [%.3f kWh]” (se9k)
Number se9k_kWh_Jahr_Offset “WR Offset Erzeugungaehler zum 1.1. [%.3f kWh]” (se9k)
// DC side current
Number se9k_DCA “WR Strom DC Seite [%.2f A]” (se9k)
// DC side voltage
Number se9k_DCV “WR Spannung DC Seite [%.2f V]” (se9k)
// DC side power
Number se9k_DCW “WR Leistung DC Seite [%.2f W]” (se9k)
// Temp Heat sink
Number se9k_THS “WR Temperatur Kuehlkorper [%.2f C]” (se9k)
// Status
String se9k_Status “Status [%s]” (se9k)
String se9k_Status_Vendor “Status Vendor [%s]” (se9k)

/etc/openhab2/rules/solaredge9k.rules

    Group se9kint "Wechselrichter PV-Anlage (int-Werte)"
    Group se9k "Wechselrichter PV-Anlage"
    Number se9k_DID_int “WR Typ (int) [%d]” (se9kint) {modbus=“se9k:0”}

    // Amps acrosss all phases
    Number se9k_Amps_int “WR Stromerzeugung gesamt (int) [%d A]” (se9kint) { modbus=“se9k:2” }

    // Amps Phase A,B,C and scaling factor
    Number se9k_AmpA_int “WR Stromerzeugung Ph.A (int) [%d A]” (se9kint) { modbus=“se9k:3” }
    Number se9k_AmpB_int “WR Stromerzeugung Ph.B (int) [%d A]” (se9kint) { modbus=“se9k:4” }
    Number se9k_AmpC_int “WR Stromerzeugung Ph.C (int) [%d A]” (se9kint) { modbus=“se9k:5” }
    Number se9k_AmpSF_int “WR Skalierungsfaktor Strom (int) [%d]” (se9kint) { modbus=“se9k:6” }

    // Voltage for Phases A,B,C and scaling factor
    Number se9k_VoltA_int “WR Spannung Phase A (int) [%d V]” (se9kint) { modbus=“se9k:10” }
    Number se9k_VoltB_int “WR Spannung Phase B (int) [%d V]” (se9kint) { modbus=“se9k:11” }
    Number se9k_VoltC_int “WR Spannung Phase C (int) [%d V]” (se9kint) { modbus=“se9k:12” }
    Number se9k_VoltSF_int “WR Skalierungsfaktor Spannung (int) [%d]” (se9kint) { modbus=“se9k:13” }

    // Power and SF
    Number se9k_Watt_int “WR Leistung Erzeugung (int) [%d W]” (se9kint) { modbus=“se9k:14” }
    Number se9k_WattSF_int “WR Skalierungsfaktor Leistung (int) [%d]” (se9kint) { modbus=“se9k:15” }

    // Frequency and SF
    Number se9k_Hz_int “WR Netzfrequenz (int) [%d Hz]” (se9kint) { modbus=“se9k:16” }
    Number se9k_HzSF_int “WR Skalierungsfaktor Netzfrequ. (int) [%d]” (se9kint) { modbus=“se9k:17” }

    // Apparent Power and SF
    Number se9k_VA_int “WR Scheinleistung gesamt (int) [%d VA]” (se9kint) { modbus=“se9k:18” }
    Number se9k_VASF_int “WR Skalierungsfaktor Scheinleistung (int) [%d]” (se9kint) { modbus=“se9k:19” }

    // Reactive Power and SF
    Number se9k_VAR_int “WR Reaktive Leistung gesamt (int) [%d VA]” (se9kint) { modbus=“se9k:20” }
    Number se9k_VARSF_int “WR Skalierungsfaktor reaktive Leistung (int) [%d]” (se9kint) { modbus=“se9k:21” }

    // Power factor
    Number se9k_PF_int “WR Leistungsfaktor (int) [%d cos phi]” (se9kint) { modbus=“se9k:22” }
    Number se9k_PFSF_int “WR Skalierungsfaktor Leistungsfaktor (int) [%d]” (se9kint) { modbus=“se9k:23” }

    // Lifetime generated energy
    Number se9k_Wh1_int “WR Erzeugungszaehler Byte1 (int) [%d Wh]” (se9kint) { modbus=“se9k:24” }
    Number se9k_Wh2_int “WR Erzeugungszaehler Byte2 (int) [%d Wh]” (se9kint) { modbus=“se9k:25” }
    Number se9k_WhSF_int “WR Skalierungsfaktor Zaehler (int) [%d]” (se9kint) { modbus=“se9k:26” }

    // DC side current
    Number se9k_DCA_int “WR Strom DC Seite (int) [%d A]” (se9kint) { modbus=“se9k:27” }
    Number se9k_DCASF_int “WR Skalierungsfaktor DC Strom (int) [%d]” (se9kint) { modbus=“se9k:28” }

    // DC side voltage
    Number se9k_DCV_int “WR Spannung DC Seite (int) [%d V]” (se9kint) { modbus=“se9k:29” }
    Number se9k_DCVSF_int “WR Skalierungsfaktor DC Spannung (int) [%d]” (se9kint) { modbus=“se9k:30” }

    // DC side power
    Number se9k_DCW_int “WR Leistung DC Seite (int) [%d W]” (se9kint) { modbus=“se9k:31” }
    Number se9k_DCWSF_int “WR Skalierungsfaktor DC Leistung (int) [%d]” (se9kint) { modbus=“se9k:32” }

    // Temp Heat sink
    Number se9k_THS_int “WR Temperatur Kuehlkorper (int) [%d C]” (se9kint) { modbus=“se9k:34” }
    Number se9k_THSSF_int “WR Skalierungsfaktor Kuehlkoerper (int) [%d]” (se9kint) { modbus=“se9k:37” }

    // Operating state
    Number se9k_Status_int “WR Status (int) [%d]” (se9kint) { modbus=“se9k:38” }
    Number se9k_Status_Vendor_int “WR Status Vendor (int) [%d]” (se9kint) { modbus=“se9k:39” }

// Se9K inverter Float values
String se9k_DID “WR Typ [%s]” (se9k)
// Amps acrosss all phases
Number se9k_Amps “WR Stromerzeugung gesamt [%.2f A]” (se9k)
// Amps Phase A,B,C
Number se9k_AmpA “WR Stromerzeugung Ph.A [%.2f A]” (se9k)
Number se9k_AmpB “WR Stromerzeugung Ph.B [%.2f A]” (se9k)
Number se9k_AmpC “WR Stromerzeugung Ph.C [%.2f A]” (se9k)
// Voltage for Phases A,B,C
Number se9k_VoltA “WR Spannung Phase A [%.1f V]” (se9k)
Number se9k_VoltB “WR Spannung Phase B [%.1f V]” (se9k)
Number se9k_VoltC “WR Spannung Phase C [%.1f V]” (se9k)
// Power
Number se9k_Watt “Erzeugungsleistung Photovolaik [%.2f W]” (se9k)
// Frequency
Number se9k_Hz “WR Netzfrequenz [%.2f Hz]” (se9k)
// Apparent Power
Number se9k_VA “WR Scheinleistung gesamt [%.2f VA]” (se9k)
// Reacive Power
Number se9k_VAR “WR reaktive Leistung gesamt [%.2f VA]” (se9k)
// Power factor
Number se9k_PF “WR Leistungsfaktor [%.1f cos phi]” (se9k)
// Lifetime generated energy
Number se9k_kWh “WR Erzeugungszaehler [%.3f kWh]” (se9k)
// the follwing two items allow you to display some derived values, i.e. the energy produced in the current year.
Number se9k_kWh_Jahr “WR Erzeugung seit Jahresanfang [%.3f kWh]” (se9k)
Number se9k_kWh_Jahr_Offset “WR Offset Erzeugungaehler zum 1.1. [%.3f kWh]” (se9k)
// DC side current
Number se9k_DCA “WR Strom DC Seite [%.2f A]” (se9k)
// DC side voltage
Number se9k_DCV “WR Spannung DC Seite [%.2f V]” (se9k)
// DC side power
Number se9k_DCW “WR Leistung DC Seite [%.2f W]” (se9k)
// Temp Heat sink
Number se9k_THS “WR Temperatur Kuehlkorper [%.2f C]” (se9k)
// Status
String se9k_Status “Status [%s]” (se9k)
String se9k_Status_Vendor “Status Vendor [%s]” (se9k)

/etc/openhab2/sitemaps/solaredge9k.sitemap

sitemap solaredge9k label="solaredge9k" {

    Text item=se9k_Watt {

      	Frame label="Wechselrichter SE9k" {
                Text item=se9k_Watt
                Text item=se9k_kWh
                Text item=se9k_kWh_Jahr
      		Setpoint item=se9k_kWh_Jahr_Offset  minValue=-100000 maxValue=100000 step=0.1
                Text item=se9k_Hz
      		Text item=se9k_VA
                Text item=se9k_VAR
                Text item=se9k_PF
      		Text item=se9k_Amps
      		Text item=se9k_AmpA
                Text item=se9k_AmpB
                Text item=se9k_AmpC
                Text item=se9k_VoltA
                Text item=se9k_VoltB
                Text item=se9k_VoltC
                Text item=se9k_DCA
                Text item=se9k_DCV
                Text item=se9k_DCW
                Text item=se9k_THS
                Text item=se9k_Status
                Text item=se9k_Status_Vendor
      	}
      	Group item=se9kint label="Werte SE9K Wechselrichter (int)"
      }
}

The file names look correct. The rules file seems to be the same as the items file, contentwise. If that is not a copy&paste error of the post, this would be wrong. Also, post/look at the /var/log/openhab2/openhab2.log if it still does not work after the correction, to geht a hint about what‘s going on.

Hi everyone!

@tkuehne 's great description about the modbus set up made me wonder if we could make this more userfriendly, so I’ve came up with a dedicated sunspec binding.

It uses the openhab2 compatible modbus binding from @ssalonen which is currently awaiting integration into the main openhab branch.

The sunspec addon supports reading data from inverters (single/split/three phase) at the moment but if someone can help me with testing I’ll add support for meters as well. (I do not have access to a smart meter)

Code can be found here, but if any of you would like to try out I can send the prebuild packages.

I would be very glad to get feedback testreports from you!

2 Likes

Hi

Thanks for creating this code to be used with modbus…
I have last we got a SolarEdge system and i have already got it to work. I really love that it picks up the data locally, that makes it both fast and more important i don’t have to trust external servers to get my information.

Most things worked with just copy paste but there was some problems with " and ”, yes they look almost the same but not the same in the editor. I guess this is some copy paste problem between systems.
I have also translated most things to Swedish now but i am lacking the correct term for Apparent Power and Reactive Power so if there are anyone that knows the electrical terms in Swedish please feel free to reply here…

But i have still one problem with the site map. The “Setpoint item=se9k_kWh_Jahr_Offset”, i cant get this to work. When i try to press it in the android app the app crashes and to be honest i don’t know what is should be used for. Anyone that can explain to me?
I would guess the crash is general and has nothing to do with this feature.

So a big than you Thomas Kuehne for making this really detailed and simple to use post, I would not have been able to do this feature myself but now i have a mush better understanding of how modbus is working.

Hi Thomas, I just got a SolarEdge inverter and same ModBus meter as you have but find that (excepting for the Common + Identification values) all of the meter 1 values (addresses 40190 onwards) are being reported as either 0 or 32768. The inverters own values are being reported correctly. Did you have any issues with the meter or did it just work? Many thanks. Ian.

Hi Ian,

It just worked. Does your inverter show you correct values for the meter in it‘s display? If not, maybe there is a modbus ID or other configuration error.

Best,

Thomas

Thanks for the reply, the meter readings (instantaneous grid import / export power) look fine when I check them on the inverters LCD screen. It’s a single phase meter (C_SunSpec_DID=201) and reports it’s C_Model as WND-3Y-400-MB when queried via Modbus over TCP from the inverter.
The meter shows up in the inverters RS-485 status menu as RS485-1 Dev=MLT Prot=01 ##=01. The solar edge meter installation guide example seems to suggest that this should be Dev=MTR Prot=WN but I don’t really know what impact that has.

Ian.

WN stands for WattNode, and your meter is a Wattnode Device. I guess I would switch it to Dev=MTR Prot=WN and try if this changes things.

Hallo tkuehne,
ich denke ich habe die selbe Konfiguration (Solaredge WR,…) und möchte Daten via Excel File auslesen.
Habe am WR Modbus TCP mit Port 502 aktiviert. bekomme aber keine Werte.
Eventuell irgendwelche Tipps für mich woran es liegen kann ?
Pingen kann ich den WR, bin aber kein VB Programmierer oder ähnliches und kann dem Code weiter oben nur bedingt folgen.

danke