Page 2 of 2

Re: Solaredge inverter plug-in Modbus TCP

Posted: Wednesday 02 April 2025 15:32
by Xenon
I have the same issue here. My guess is that solar panel power is not a measured value, but a calculated (by SolardEdge) value, and therefore not available for Domoticz to feed in. Domoticz expects Grid Power / P1 values to be in kWh (which is Watt x Hour) instead of actual power consumption in W (which is in Watts only), like actual Battery Power and Solar Panels Power are. So you can't simply add nor substract values which are not presented in the exact same units (Wh is not equal to W).

For example, if I turn on an electical 1000W heater for an hour, it will consume 1000W x 1h = 1kWh.
However, if I turn on the exact same heater for only half an hour, it will consume 1000W x 0.5h = 0.5kWh.
And if tumed on for only 6 minutes, you'll end up with a consumption of 1000W x 0.1h = 0.1kWh.
Nevertheless, in all situations it will actually consume 1kW to generate heat. This indicates why you can't mix up / add / subtract values in (k)W and (k)Wh.

Domoticz' energy dashboard presents Grid Power in W, but allows input devices for Grid Power in kWh only, which appears to be incorrect imho.

Re: Solaredge inverter plug-in Modbus TCP

Posted: Wednesday 02 April 2025 15:36
by jannl
More or less my lua script does the trick now.
Only the power to the ev charger is unknown, mixing up the computation.

The only solution I see so far is diving into Python to create a plugin that at least reads the data from the charger, a Solaredge charger (Keba P30 under the hood). For the latter one a python script is already present I found. So now I need to do the magic myself ;-)

But this will take some time I am afraid.

Re: Solaredge inverter plug-in Modbus TCP

Posted: Wednesday 02 April 2025 19:21
by JayDotR
I have the plugin running since 2021 on a Raspberry Pi4 with the following global config :
1° Domoticz is beta trunk (since 2020

2° Python is 3.9.2

3° Operating System is
Linux <hostname> 6.6.66-v8+ #1830 SMP PREEMPT Mon Dec 16 14:40:26 GMT 2024 aarch64 GNU/Linux

4° modules installed by pip3
pymodbus 3.0.2
modbus-proxy 0.6.8
solaredge-modbus 0.7.2

5° Manual added plugin via Github (not the master, but the meter branch in release 2.0.4), where in late 2023 I helped him with my installation data to fine-tune and validate the plugin
# Source: https://github.com/addiejanssen/domotic ... tcp-plugin

On my Raspberry, I am using the Modbus Proxy Python plugin in order to bypass the uniqueness to connect to the Inverters on their Modbus socket ...
On Domoticz, the Port of the ModBus Proxy is used to connect to SolarEdge (following)

6° SolarEdge installation
- 38 Aleo Solar 305W Panels with SolarEDGE Performance Optimizers
- connected to a SolarEdge 3phase SE16K with ModBus activated (Follower)
- also part of the installation : a SolarEdge SE6000H Monophase with Modbus activated (Master) to convert AC back to DC Storage on a LG 16kWh Battery
- to guide the electric flows : The SolarEdge Meter
- as my Energy Provider forced me : a second P1 Meter on the Solar Side of my House, but the entire SolarEdge installation is 'behind' the 2nd P1 Meter ;).

To fine-tune the real Energy Flows in my house, an additional dzvents Script calculates the Own Usage per Device Update based on realtime data ...

Re: Solaredge inverter plug-in Modbus TCP

Posted: Thursday 03 April 2025 8:30
by jannl
Not sure what your point is, because my setup differs a lot from yours.

I also use a Lua script to compute the solar energy, but because I do not know what the power delivered to the charger is, I have a gap for now.

I use lua iso dzvents, because I find it much more straight forward as a more or less old-skool programmer.

Re: Solaredge inverter plug-in Modbus TCP

Posted: Thursday 03 April 2025 22:36
by JayDotR
My Setup was a reply to the following open question
jannl wrote: Monday 31 March 2025 13:22 Still wondering how the Solaredge app does this.

Anyone got this working with an inverter, battery, charger and inline-meter?
So from the config part of SolarEdge, we are running almost the same (except I have a monophased SE6000H to connect a High-Voltage (410V) Battery on DC. As the battery was installed 5 years after the Panels + SE16K, the replacement of the initial inverter with a model being able to connect directly a Battery was no option :-/

Issues I encountered before being able to read all Data from (Battery, Battery Inverter, Inline Meter and Roof Inverter) and which could help to get readings
a) The Modbus has to be activated on the SolarEdge Inverter (if you are unsure what you are changing on the Setup of the Inverter, ask a professionnal to confirm) - this is normally accessible via the WIFI Connection in Pairing Mode. However, only 1 concurrential connection to the local Socket of your Inverter is possible ...
b) Depending on your Config, you have to note down the Modbus ID of your Inverter and to verify (if multiple inverters) which one is Master and which one is follower
In order to bypass technical limitations of the Socket on the Inverter, use the Modbus Proxy on your Raspberry. The Proxy opens the connection to the Inverter(s) and keeps them open. Another advantage is you can use multiple clients to connect to the same inverter

Config file for modbus-proxy

Code: Select all

pi@raspberry:/ $ more /srv/modbus-proxy/config.yml 
devices:
- modbus:
    url: <IP of the 1st Inverter>:1502
    timeout: 10
    connection_time: 0.1
  listen:
    bind: 0:2501
- modbus:
    url: <IP of the 2nd Inverter>:1502
    timeout: 10
    connection_time: 0.1
  listen:
    bind: 0:2502
Use the Meter Branch of the Plugin (git clone ... )
In the Hardware Config part :

Code: Select all

for the 1st Inverter (in my case the follower) : 
- try with the Modbus ID you have seen in the Pairing Mode / local setup (in my case : ID =3)
- Hardware Components = Inverter (only)
- use IP / Port of your Raspberry ;)
- Add Missing devices : yes
and then for the master device

Code: Select all

for the 1st Inverter (in my case the follower) : 
- try with the Modbus ID you have seen in the Pairing Mode / local setup (in my case : ID =1)
- Hardware Components = Inverter+Battery+Meter
- use IP / Port of your Raspberry ;)
- Add Missing devices : yes
Once this done, you should see a lot of devices.

In order to get to your question "what the power delivered to the charger" is, I understood you're meaning the charge/discharge rate of your battery ?

This could be the Device like
SolarEdge WR Batt 000300DE 222 SolarEdge WR Batt - Instant (W) Usage Electric -xxx Watt

Hoping this part could help you advancing ?

Re: Solaredge inverter plug-in Modbus TCP

Posted: Friday 04 April 2025 8:13
by jannl
Thanks, but that are the things I already did.

The value I van not find is the number of watts coming from the solar panels, for some reason that needs to be computed I guess.

Re: Solaredge inverter plug-in Modbus TCP

Posted: Friday 04 April 2025 9:18
by telewy
Current inverter Wats is avaiable.
Total energy e.g. Watts per hour must be calculated.

Re: Solaredge inverter plug-in Modbus TCP

Posted: Friday 04 April 2025 10:12
by jannl
Inverter power is wrong value, propably only works when no battery or charger is present

Re: Solaredge inverter plug-in Modbus TCP

Posted: Friday 04 April 2025 10:30
by telewy
OK, sure, I don't have battery

Re: Solaredge inverter plug-in Modbus TCP

Posted: Friday 04 April 2025 21:04
by JayDotR
jannl wrote: Friday 04 April 2025 8:13 Thanks, but that are the things I already did.

The value I van not find is the number of watts coming from the solar panels, for some reason that needs to be computed I guess.
on the ModBus Plugin, in my case I have an Device, but I doubt that the DeviceID's will be the same on each inverter which gives the AC Instant Watts (1.48 Watt is now at 21 o'clock ..)

Code: Select all

sqlite> select * from DeviceStatus where id = 1020;
ID|HardwareID|DeviceID|Unit|Name|Used|Type|SubType|SwitchType|Favorite|SignalLevel|BatteryLevel|nValue|sValue|LastUpdate|Order|AddjValue|AddjMulti|AddjValue2|AddjMulti2|StrParam1|StrParam2|LastLevel|Protected|CustomImage|Description|Options|Color|OrgHardwareID
1020|28|001C000D|13|WR Inverter Roof AC - Instant (W)|1|248|1|0|1|12|255|0|1.4833333333333334|2025-04-04 20:01:33|998|0.0|1.0|0.0|1.0|||0|0|0||||0
If you are looking for the Watts of the Panels, perhaps the dzVents / lua part could help you. You need a Dummy Hardware ID and to create for
- each String a sensor
- each Inverter a Sensor
- each Panel a sensor
- beware : SolarEdge API permits only 300 calls per Day, so a realistic value could be a timer on each 10 minutes or less if you are already using the API for other system calls ... (I use 30' as Modbus is far more accurate)
- you are required to use the Names of the Panels, i.e. "panel 1.1.10"
- based on this, you could add another lua/dzvents to calculate the accumulated power of the panels on your needs

Code: Select all

--------------------------------------------------------------------------------
-- Config
local enableDebugPrint = true
local isDecimalComma = true -- true for 1.000,00 :: false for 1,000.00 
local username = "<your e-mail>"
local password = "<your account password>"
local siteID = "<your site-id from SolarEdge>"

local vScriptName        = 'SolarEdge_API'
local vScriptVersion     = '1.01'

local function LogDebug(domoticz, log)
  if enableDebugPrint then
    print(string.format('dzRequestSolarInfo : %s', log))
  end
end


local function AddReportData(json, component)
  local id = tostring(component.id)
  if json.reportersData[id] then
    component.DayWh = json.reportersData[id].unscaledEnergy
  end
end


local function GetOptimizerData(json, component)
  if component.data and component.data.type == "POWER_BOX" then
    local optimizer = component.data
    AddReportData(json, optimizer)
    return optimizer
  end
end


local function GetStringData(json, info, component)
  if component.data and component.data.type == "STRING" then
    local powerstring = component.data
    AddReportData(json, powerstring)
    powerstring.Optimizers = {}
    for _, child in pairs(component.children) do
      local optimizer = GetOptimizerData(json, child)
      if optimizer then
        table.insert(powerstring.Optimizers, optimizer)
        table.insert(info.Optimizers, optimizer)
      end
    end
    return powerstring
  end
end


local function GetInverterData(json, info, component)
  if component.data and (component.data.type == "INVERTER" or component.data.type == "INVERTER_3PHASE") then
    local inverter = component.data
    AddReportData(json, inverter)
    inverter.Strings = {}
    for _, child in pairs(component.children) do
      local string = GetStringData(json, info, child)
      if string then
        table.insert(inverter.Strings, string)
        table.insert(info.Strings, string)
      end
    end
    return inverter
  end
end


local function RequestLogical(domoticz)
    
    local authorization = string.format("%s:%s", username, password)
    authorization = string.format("Basic %s", domoticz.utils.toBase64(authorization))

    local request = {}
    request.url = string.format("https://monitoring.solaredge.com/solaredge-apigw/api/sites/%s/layout/logical", siteID) 
    request.headers = { ['Authorization'] = authorization }
    request.method = 'GET'
    request.callback = 'ResponseLogical'

    domoticz.openURL(request)
end


local function RequestSystemData(domoticz, itemID)
  if itemID == nil then return end

  local request = {}
  request.url = string.format("https://monitoringpublic.solaredge.com/solaredge-web/p/publicSystemData?reporterId=%d&type=panel&activeTab=0&fieldId=%s&isPublic=true&locale=en_US", itemID, siteID) 
  request.method = 'GET'
  request.callback = 'ResponseSystemData'

  domoticz.openURL(request)
end


local function UpdateDevice(domoticz, deviceType, device)
    LogDebug(domoticz, device)
    LogDebug(domoticz, deviceType)
  device.Name = device.Name or device.name
  device.Name = string.gsub(device.Name, "Module", "Panel")

  if not domoticz.utils.deviceExists(device.Name) then
    LogDebug(domoticz, string.format('to monitor create an dummy device type="Electric (Instant+Counter) name="%s"', device.Name))
    return
  end

  local lastData = domoticz.data.LastData[device.Name]
  if lastData == nil then
    domoticz.data.LastData[device.Name] = {Watt = device.Watt, DayWh=device.DayWh}
    RequestSystemData(domoticz, device.id)
    return
  end

  local lastWatt = lastData.Watt or 0
  local lastDayWh = lastData.DayWh or 0
  device.Watt = device.Watt or lastWatt
  device.DayWh = device.DayWh or lastDayWh

  if device.DayWh == lastDayWh and device.Watt == lastWatt then
    return -- No new data
  end
  
  RequestSystemData(domoticz, device.id)

  if device.DayWh < lastDayWh  then
    lastDayWh = 0 -- Most likely a new day
  end

  local dzDevice = domoticz.devices(device.Name)
  local addWh = device.DayWh - lastDayWh
  local newWh = dzDevice.WhTotal + addWh

  if enableDebugPrint then -- and (device.Name == "Panel 1.0.1" or device.Name == "Panel 1.0.4" or device.Name == "Inverter 1") then
    LogDebug(domoticz, string.format('----- %s "%s" ----------------------------------', deviceType, device.Name))
    LogDebug(domoticz, string.format('device.DayWh=%0.3f  lastDayWh=%0.3f  device.Watt=%0.3f  lastWatt=%0.3f', device.DayWh, lastDayWh, device.Watt, lastWatt))
    LogDebug(domoticz, string.format('device.DayWh - lastDayWh = addWh => %0.3f - %0.3f = %0.3f', device.DayWh, lastDayWh, addWh))
    LogDebug(domoticz, string.format('old.WhTotal + addWh = newWh => %0.3f + %0.3f = %0.3f', dzDevice.WhTotal, addWh, newWh))
    LogDebug(domoticz, string.format('OldTotal=%0.3f   DomoticzToday=%0.3f   lastDayWh=%0.3f   PanelToday=%0.3f   newWh=%0.3f', dzDevice.WhTotal, dzDevice.WhToday, lastDayWh, device.DayWh, newWh))
    LogDebug(domoticz, string.format('%s "%s" Today = %0.2f Wh   Now = %0.2f W', deviceType, device.Name, device.DayWh, device.Watt))
  end
  dzDevice.updateElectricity(device.Watt, newWh)
  domoticz.data.LastData[device.Name] = {Watt = device.Watt, DayWh=device.DayWh}
end


local function OnLogicalResponse(domoticz, item)
    local info = { Inverters = {}, Strings = {}, Optimizers = {} }
    for _, child in pairs(item.json.logicalTree.children) do
      local inverter = GetInverterData(item.json, info, child)
      if inverter then
        table.insert(info.Inverters, inverter)
      end
    end
    
    for _, device in ipairs(info.Inverters) do
      UpdateDevice(domoticz, "Inverter", device)
    end
    
    for _, device in ipairs(info.Strings) do
      UpdateDevice(domoticz, "String", device)
    end
    
    for _, device in ipairs(info.Optimizers) do
      UpdateDevice(domoticz, "Optimizer", device)
    end
end


local function OnSystemDataResponse(domoticz, item)
    
    local reporterId = tonumber(string.match(item.data, "var reporterId = (.-);") or "0")
    local systemData = string.match(item.data, "SE%.systemData = (.-);") or "{}"
    local json = domoticz.utils.fromJSON(systemData)
    LogDebug(domoticz, json)
    local device = {}
    device.Name = json.description

    local powerstring = json.measurements["Power [W]"] or json.measurements["P AC [W]"]
    if powerstring == nil then
        return
    end
    powerstring = string.gsub(powerstring, ',', '')
    device.Watt = tonumber(powerstring)
    UpdateDevice(domoticz, "", device)
    LogDebug(domoticz, string.format("%d %s : %0.3f Watt", reporterId, device.Name, device.Watt))
end


--[[ ======================================================================== ]]
local interface = {}
interface.active = true

interface.on = {}
-- interface.on.timer = {'every hour between 59 minutes before sunrise and 59 minutes after sunset'}
-- interface.on.timer = {'every 15 minutes at civildaytime'}
interface.on.timer = {'every 30 minutes'}
interface.on.httpResponses = {'ResponseLogical', 'ResponseSystemData'}

interface.data = {}
interface.data.LastData = { initial = {} }

function interface.execute(domoticz, item)
    if (item.isTimer) then
      LogDebug(domoticz, os.date("%Y-%m-%d",os.time()) .. "-=[ Start HTTP Request ]======================================")
      RequestLogical(domoticz)
    elseif (item.isHTTPResponse) then
      LogDebug(domoticz, os.date("%Y-%m-%d",os.time()) .. "-=[ Start HTTP Response ]=====================================")
      if (item.ok) then
        if item.callback == "ResponseLogical" then
          OnLogicalResponse(domoticz, item)
        elseif item.callback == "ResponseSystemData" then
          OnSystemDataResponse(domoticz, item)
        end
      else
        LogDebug(domoticz, string.format("Error in HTTP request. Error %d - %s", item.statusCode, item.statusText))
      end
    end

    LogDebug(domoticz, os.date("%Y-%m-%d",os.time()) .. "-=[ End ]=====================================================")
end

return interface


Re: Solaredge inverter plug-in Modbus TCP

Posted: Saturday 05 April 2025 7:36
by gizmocuz
Question, why not use the Domoticz build in support for Solaredge hardware?

Re: Solaredge inverter plug-in Modbus TCP

Posted: Saturday 05 April 2025 16:50
by jannl
For me the update frequency. The api calls are way to slow. Even the app is way slower compared to the modbus updates.

Basically the energy dashboard is useless when using the solaredge api updates.

Or are we talking about difgerent things?

Re: Solaredge inverter plug-in Modbus TCP

Posted: Saturday 05 April 2025 20:53
by JayDotR
jannl wrote: Saturday 05 April 2025 16:50 For me the update frequency. The api calls are way to slow. Even the app is way slower compared to the modbus updates.

Basically the energy dashboard is useless when using the solaredge api updates.

Or are we talking about difgerent things?
I understand your concern : indeed the API is far, far too slow here on Updates for being used on the Energy Dashboard.

As this Dashboard is in my opinion a nice Gadget - I did not put my efforts to get a perfect solution, but my result still looks acceptable for my needs :).
P1/Grid : I am using the P1 SMART meter which is read via USB/RJ11 as Slimme Meter on the Sagecom D210 of the Grid Provider
Solar : I am using the Reading I get via Modbus from the Roof Inverter (connected to the Panels) - used Register is the "Generated kWh of the Inverter"
Battery : I am using the Reading I get via Modbus from the Battery Inverter - used Register is the "Generated kWh of the Inverter"
Battery SOC : the Reading from the Battery via Modbus on the SOC
For the 3 custom widgets, I am using (as idea)
a) Solar Radiation in Watt per square Meter from my Weather Station
b) Via DzVents generated : Sum of kWh the House used, calculated from different Devices (Solar Production, Battery Charge and Discharge, Grid Import/Export)
c) via dzVents as well : Amount of kWh of Solar Production used by myself

Re: Solaredge inverter plug-in Modbus TCP

Posted: Sunday 06 April 2025 15:06
by jannl
The inverter you are using is a Solaredge? I do not see that register I think.

Re: Solaredge inverter plug-in Modbus TCP

Posted: Sunday 06 April 2025 20:58
by JayDotR
jannl wrote: Sunday 06 April 2025 15:06 The inverter you are using is a Solaredge? I do not see that register I think.
Yes, I have two of them : For the Solar Installation, a 3-phase SE16K and on the battery Side a mono-phased SE6000H.

I activated logging (Info [checked], LogLevel [verbose/verbose+]) and hereby the readings I see (NB : attention, volumetry of the readings can get quite fast very large, perhaps change the standard reading interval on less aggressive - otherwise it could be the log is not able to follow the load :lol: )
On the SE16K -> 2025-04-06 20:49:06.209 "energy_total": 68621048, (to divide by 1000 to get the kWh)
On the SE6000H -> 2025-04-06 20:53:42.591 "energy_total": 5880620, (to divide by 1000 to get the kWh)

Code: Select all

2025-04-06 20:49:06.209 SolarEdge WR Roof: device: Inverter values: {
2025-04-06 20:49:06.209 "c_id": "SunS",
2025-04-06 20:49:06.209 "c_did": 1,
2025-04-06 20:49:06.209 "c_length": 65,
2025-04-06 20:49:06.209 "c_manufacturer": "SolarEdge",
2025-04-06 20:49:06.209 "c_model": "SE16K-RW000BNN4",
2025-04-06 20:49:06.209 "c_version": "0004.0019.0521",
2025-04-06 20:49:06.209 "c_deviceaddress": 3,
2025-04-06 20:49:06.209 "c_sunspec_did": 103,
2025-04-06 20:49:06.209 "c_sunspec_length": 50,
2025-04-06 20:49:06.209 "current": 0,
2025-04-06 20:49:06.209 "l1_current": 0,
2025-04-06 20:49:06.209 "l2_current": 0,
2025-04-06 20:49:06.209 "l3_current": 0,
2025-04-06 20:49:06.209 "current_scale": -2,
2025-04-06 20:49:06.209 "l1_voltage": 3980,
2025-04-06 20:49:06.209 "l2_voltage": 3976,
2025-04-06 20:49:06.209 "l3_voltage": 3978,
2025-04-06 20:49:06.209 "l1n_voltage": 2305,
2025-04-06 20:49:06.209 "l2n_voltage": 2298,
2025-04-06 20:49:06.209 "l3n_voltage": 2290,
2025-04-06 20:49:06.209 "voltage_scale": -1,
2025-04-06 20:49:06.209 "power_ac": 0,
2025-04-06 20:49:06.209 "power_ac_scale": 0,
2025-04-06 20:49:06.209 "frequency": 4998,
2025-04-06 20:49:06.209 "frequency_scale": -2,
2025-04-06 20:49:06.209 "power_apparent": 0,
2025-04-06 20:49:06.209 "power_apparent_scale": 0,
2025-04-06 20:49:06.209 "power_reactive": 0,
2025-04-06 20:49:06.209 "power_reactive_scale": 0,
2025-04-06 20:49:06.209 "power_factor": 0,
2025-04-06 20:49:06.209 "power_factor_scale": 0,
2025-04-06 20:49:06.209 "energy_total": 68621048,
2025-04-06 20:49:06.209 "energy_total_scale": 0,
2025-04-06 20:49:06.209 "current_dc": 0,
2025-04-06 20:49:06.209 "current_dc_scale": 0,
2025-04-06 20:49:06.209 "voltage_dc": 21,
2025-04-06 20:49:06.209 "voltage_dc_scale": -1,
2025-04-06 20:49:06.209 "power_dc": 0,
2025-04-06 20:49:06.209 "power_dc_scale": 0,
2025-04-06 20:49:06.209 "temperature": 0,
2025-04-06 20:49:06.209 "temperature_scale": -2,
2025-04-06 20:49:06.209 "status": 2,
2025-04-06 20:49:06.209 "vendor_status": 0,
2025-04-06 20:49:06.209 "rrcr_state": 0,
2025-04-06 20:49:06.209 "active_power_limit": 100,
2025-04-06 20:49:06.209 "cosphi": 0,
2025-04-06 20:49:06.209 "commit_power_control_settings": 0,
2025-04-06 20:49:06.209 "restore_power_control_default_settings": 0,
2025-04-06 20:49:06.209 "reactive_power_config": 0,
2025-04-06 20:49:06.209 "reactive_power_response_time": 200,
2025-04-06 20:49:06.209 "advanced_power_control_enable": 1,
2025-04-06 20:49:06.209 "export_control_mode": 0,
2025-04-06 20:49:06.209 "export_control_limit_mode": 0,
2025-04-06 20:49:06.209 "export_control_site_limit": 0
2025-04-06 20:49:06.209 }

Code: Select all

2025-04-06 20:53:42.591 SolarEdge WR Batt: device: Inverter values: {
2025-04-06 20:53:42.591 "c_id": "SunS",
2025-04-06 20:53:42.591 "c_did": 1,
2025-04-06 20:53:42.591 "c_length": 65,
2025-04-06 20:53:42.591 "c_manufacturer": "SolarEdge",
2025-04-06 20:53:42.591 "c_model": "SE6000H-RWS00BNO4",
2025-04-06 20:53:42.591 "c_version": "0004.0022.0044",
2025-04-06 20:53:42.591 "c_deviceaddress": 1,
2025-04-06 20:53:42.591 "c_sunspec_did": 101,
2025-04-06 20:53:42.591 "c_sunspec_length": 50,
2025-04-06 20:53:42.591 "current": 230,
2025-04-06 20:53:42.591 "l1_current": 230,
2025-04-06 20:53:42.591 "l2_current": 0,
2025-04-06 20:53:42.591 "l3_current": 0,
2025-04-06 20:53:42.591 "current_scale": -2,
2025-04-06 20:53:42.591 "l1_voltage": 2293,
2025-04-06 20:53:42.591 "l2_voltage": 0,
2025-04-06 20:53:42.591 "l3_voltage": 0,
2025-04-06 20:53:42.591 "l1n_voltage": 2293,
2025-04-06 20:53:42.591 "l2n_voltage": 0,
2025-04-06 20:53:42.591 "l3n_voltage": 0,
2025-04-06 20:53:42.591 "voltage_scale": -1,
2025-04-06 20:53:42.591 "power_ac": 5238,
2025-04-06 20:53:42.591 "power_ac_scale": -1,
2025-04-06 20:53:42.591 "frequency": 49996,
2025-04-06 20:53:42.591 "frequency_scale": -3,
2025-04-06 20:53:42.591 "power_apparent": 5292,
2025-04-06 20:53:42.591 "power_apparent_scale": -1,
2025-04-06 20:53:42.591 "power_reactive": 7512,
2025-04-06 20:53:42.591 "power_reactive_scale": -2,
2025-04-06 20:53:42.591 "power_factor": 9898,
2025-04-06 20:53:42.591 "power_factor_scale": -2,
2025-04-06 20:53:42.591 "energy_total": 5880620,
2025-04-06 20:53:42.591 "energy_total_scale": 0,
2025-04-06 20:53:42.591 "current_dc": 12951,
2025-04-06 20:53:42.591 "current_dc_scale": -4,
2025-04-06 20:53:42.591 "voltage_dc": 4106,
2025-04-06 20:53:42.591 "voltage_dc_scale": -1,
2025-04-06 20:53:42.591 "power_dc": 5318,
2025-04-06 20:53:42.591 "power_dc_scale": -1,
2025-04-06 20:53:42.591 "temperature": 3498,
2025-04-06 20:53:42.591 "temperature_scale": -2,
2025-04-06 20:53:42.591 "status": 4,
2025-04-06 20:53:42.591 "vendor_status": 0,
2025-04-06 20:53:42.591 "rrcr_state": 0,
2025-04-06 20:53:42.591 "active_power_limit": 100,
2025-04-06 20:53:42.591 "cosphi": 0,
2025-04-06 20:53:42.591 "commit_power_control_settings": 0,
2025-04-06 20:53:42.591 "restore_power_control_default_settings": 0,
2025-04-06 20:53:42.591 "reactive_power_config": 3,
2025-04-06 20:53:42.591 "reactive_power_response_time": 200,
2025-04-06 20:53:42.591 "advanced_power_control_enable": 1,
2025-04-06 20:53:42.591 "export_control_mode": 0,
2025-04-06 20:53:42.591 "export_control_limit_mode": 0,
2025-04-06 20:53:42.591 "export_control_site_limit": 0
2025-04-06 20:53:42.591 }
2025-04-06 20:53:42.870 SolarEdge WR Batt: Updated 12 values out of 19
2025-04-06 20:53:43.291 SolarEdge WR Batt: Inverter returned information for Meter1
2025-04-06 20:53:43.292 SolarEdge WR Batt: device: Meter1 values: {
2025-04-06 20:53:43.292 "c_manufacturer": "SolarEdge",
2025-04-06 20:53:43.292 "c_model": "SE-MTR-3Y-400V-A",
2025-04-06 20:53:43.292 "c_option": "Export+Import",
2025-04-06 20:53:43.292 "c_version": "79",
2025-04-06 20:53:43.292 "c_deviceaddress": 2,
2025-04-06 20:53:43.292 "c_sunspec_did": 203,
2025-04-06 20:53:43.292 "c_sunspec_length": 105,
2025-04-06 20:53:43.292 "current": 27715,
2025-04-06 20:53:43.292 "l1_current": 14121,
2025-04-06 20:53:43.292 "l2_current": 7069,
2025-04-06 20:53:43.292 "l3_current": 6524,
2025-04-06 20:53:43.292 "current_scale": -4,
2025-04-06 20:53:43.292 "voltage_ln": 22940,
2025-04-06 20:53:43.292 "l1n_voltage": 22940,
2025-04-06 20:53:43.292 "l2n_voltage": 22967,
2025-04-06 20:53:43.292 "l3n_voltage": 23013,
2025-04-06 20:53:43.292 "voltage_ll": 0,
2025-04-06 20:53:43.292 "l12_voltage": 0,
2025-04-06 20:53:43.292 "l23_voltage": 0,
2025-04-06 20:53:43.292 "l31_voltage": 0,
2025-04-06 20:53:43.292 "voltage_scale": -2,
2025-04-06 20:53:43.292 "frequency": 4999,
2025-04-06 20:53:43.292 "frequency_scale": -2,
2025-04-06 20:53:43.292 "power": -10568,
2025-04-06 20:53:43.292 "l1_power": -16441,
2025-04-06 20:53:43.292 "l2_power": 14415,
2025-04-06 20:53:43.292 "l3_power": -8542,
2025-04-06 20:53:43.292 "power_scale": -3,
2025-04-06 20:53:43.292 "power_apparent": 4265,
2025-04-06 20:53:43.292 "l1_power_apparent": 2142,
2025-04-06 20:53:43.292 "l2_power_apparent": 1439,
2025-04-06 20:53:43.292 "l3_power_apparent": 1333,
2025-04-06 20:53:43.292 "power_apparent_scale": -1,
2025-04-06 20:53:43.292 "power_reactive": -4264,
2025-04-06 20:53:43.292 "l1_power_reactive": -1810,
2025-04-06 20:53:43.292 "l2_power_reactive": -1345,
2025-04-06 20:53:43.292 "l3_power_reactive": -1108,
2025-04-06 20:53:43.292 "power_reactive_scale": -1,
2025-04-06 20:53:43.292 "power_factor": 1513,
2025-04-06 20:53:43.292 "l1_power_factor": -3499,
2025-04-06 20:53:43.292 "l2_power_factor": 3129,
2025-04-06 20:53:43.292 "l3_power_factor": 4909,
2025-04-06 20:53:43.292 "power_factor_scale": -2,
2025-04-06 20:53:43.292 "export_energy_active": 1285184100,
2025-04-06 20:53:43.292 "l1_export_energy_active": 655856750,
2025-04-06 20:53:43.292 "l2_export_energy_active": 660105450,
2025-04-06 20:53:43.292 "l3_export_energy_active": 662436350,
2025-04-06 20:53:43.292 "import_energy_active": 1310712500,
2025-04-06 20:53:43.292 "l1_import_energy_active": 867324600,
2025-04-06 20:53:43.292 "l2_import_energy_active": 527277900,
2025-04-06 20:53:43.292 "l3_import_energy_active": 609324400,
2025-04-06 20:53:43.292 "energy_active_scale": -2,
2025-04-06 20:53:43.292 "export_energy_apparent": 0,
2025-04-06 20:53:43.292 "l1_export_energy_apparent": 0,
2025-04-06 20:53:43.292 "l2_export_energy_apparent": 0,
2025-04-06 20:53:43.292 "l3_export_energy_apparent": 0,
2025-04-06 20:53:43.292 "import_energy_apparent": 0,
2025-04-06 20:53:43.292 "l1_import_energy_apparent": 0,
2025-04-06 20:53:43.292 "l2_import_energy_apparent": 0,
2025-04-06 20:53:43.292 "l3_import_energy_apparent": 0,
2025-04-06 20:53:43.292 "energy_apparent_scale": -32768,
2025-04-06 20:53:43.292 "import_energy_reactive_q1": 0,
2025-04-06 20:53:43.292 "l1_import_energy_reactive_q1": 0,
2025-04-06 20:53:43.292 "l2_import_energy_reactive_q1": 0,
2025-04-06 20:53:43.292 "l3_import_energy_reactive_q1": 0,
2025-04-06 20:53:43.292 "import_energy_reactive_q2": 0,
2025-04-06 20:53:43.292 "l1_import_energy_reactive_q2": 0,
2025-04-06 20:53:43.292 "l2_import_energy_reactive_q2": 0,
2025-04-06 20:53:43.292 "l3_import_energy_reactive_q2": 0,
2025-04-06 20:53:43.292 "export_energy_reactive_q3": 0,
2025-04-06 20:53:43.292 "l1_export_energy_reactive_q3": 0,
2025-04-06 20:53:43.292 "l2_export_energy_reactive_q3": 0,
2025-04-06 20:53:43.292 "l3_export_energy_reactive_q3": 0,
2025-04-06 20:53:43.292 "export_energy_reactive_q4": 0,
2025-04-06 20:53:43.292 "l1_export_energy_reactive_q4": 0,
2025-04-06 20:53:43.292 "l2_export_energy_reactive_q4": 0,
2025-04-06 20:53:43.292 "l3_export_energy_reactive_q4": 0,
2025-04-06 20:53:43.292 "energy_reactive_scale": -32768
2025-04-06 20:53:43.292 }
2025-04-06 20:53:43.888 SolarEdge WR Batt: Updated 25 values out of 37
2025-04-06 20:53:44.094 SolarEdge WR Batt: Inverter returned information for Battery1
2025-04-06 20:53:44.094 SolarEdge WR Batt: device: Battery1 values: {
2025-04-06 20:53:44.094 "c_manufacturer": "LG",
2025-04-06 20:53:44.094 "c_model": "EH257064P8S1DMA2206081106",
2025-04-06 20:53:44.094 "c_version": "DCDC 1.2.18 BMS 2.3.0.4",
2025-04-06 20:53:44.094 "c_deviceaddress": 15,
2025-04-06 20:53:44.094 "c_sunspec_did": 0,
2025-04-06 20:53:44.094 "rated_energy": 16038.0,
2025-04-06 20:53:44.094 "maximum_charge_continuous_power": 7000.0,
2025-04-06 20:53:44.094 "maximum_discharge_continuous_power": 7000.0,
2025-04-06 20:53:44.094 "maximum_charge_peak_power": 1644.0,
2025-04-06 20:53:44.094 "maximum_discharge_peak_power": 7000.0,
2025-04-06 20:53:44.094 "average_temperature": 18.399999618530273,
2025-04-06 20:53:44.094 "maximum_temperature": 0.0,
2025-04-06 20:53:44.094 "instantaneous_voltage": 410.6000061035156,
2025-04-06 20:53:44.094 "instantaneous_current": -1.3468095064163208,
2025-04-06 20:53:44.094 "instantaneous_power": -553.0,
2025-04-06 20:53:44.094 "lifetime_export_energy_counter": 4366858,
2025-04-06 20:53:44.094 "lifetime_import_energy_counter": 5532276,
2025-04-06 20:53:44.094 "maximum_energy": 16038.0,
2025-04-06 20:53:44.094 "available_energy": 15439.0,
2025-04-06 20:53:44.094 "soh": 96.19999694824219,
2025-04-06 20:53:44.094 "soe": 91.80000305175781,
2025-04-06 20:53:44.094 "status": 4,
2025-04-06 20:53:44.094 "status_internal": 3,
2025-04-06 20:53:44.094 "event_log": 0,
2025-04-06 20:53:44.094 "event_log_internal": 0
2025-04-06 20:53:44.094 }

Re: Solaredge inverter plug-in Modbus TCP

Posted: Monday 07 April 2025 7:29
by jannl
Nope, that is not the correct value. At the moment you use a battery and charger next to your solarpanels there seems to be an issue.

I whish is was the correct value, my production be 2kW higher at times.

Either the solaredge_modbus python library is not giving al registers or the needed value is not present. I tested with the example.py which is in the repository.

Re: Solaredge inverter plug-in Modbus TCP

Posted: Monday 07 April 2025 20:34
by JayDotR
In that case I have to admin that "I'm sorry, but out of alternatives that help you". The Installation I have certainly another wiring / logic as yours.

Technically seen : my system is a PV Installation with own consumption that returns the non-used production to the Grid, where a Storage System is interconnected in the Wiring on the PV Side.

For my use case I found my values, but I admin : it took a lot of reflexion work and dzvents programming to calculate the missing parts ;)