Solaredge inverter plug-in Modbus TCP
Moderators: leecollings, remb0
Forum rules
Before posting here, make sure you are on the latest Beta or Stable version.
If you have problems related to the web gui, clear your browser cache + appcache first.
Use the following template when posting here:
Version: xxxx
Platform: xxxx
Plugin/Hardware: xxxx
Description:
.....
If you are having problems with scripts/blockly, always post the script (in a spoiler or code tag) or screenshots of your blockly
If you are replying, please do not quote images/code from the first post
Please mark your topic as Solved when the problem is solved.
Before posting here, make sure you are on the latest Beta or Stable version.
If you have problems related to the web gui, clear your browser cache + appcache first.
Use the following template when posting here:
Version: xxxx
Platform: xxxx
Plugin/Hardware: xxxx
Description:
.....
If you are having problems with scripts/blockly, always post the script (in a spoiler or code tag) or screenshots of your blockly
If you are replying, please do not quote images/code from the first post
Please mark your topic as Solved when the problem is solved.
-
- Posts: 5
- Joined: Thursday 09 March 2017 9:05
- Target OS: Raspberry Pi / ODroid
- Domoticz version:
- Contact:
Re: Solaredge inverter plug-in Modbus TCP
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.
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.
-
- Posts: 673
- Joined: Thursday 02 October 2014 6:36
- Target OS: Raspberry Pi / ODroid
- Domoticz version: 2022.2
- Location: Geleen
- Contact:
Re: Solaredge inverter plug-in Modbus TCP
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.
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.
-
- Posts: 9
- Joined: Thursday 02 January 2025 21:15
- Target OS: Raspberry Pi / ODroid
- Domoticz version: beta
- Location: Lux
- Contact:
Re: Solaredge inverter plug-in Modbus TCP
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 ...
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 ...
--
Domoticz Beta on Raspberry 3b (2x), and 4 (2x) on Rasbian Bullseye / Raspbian Bookworm / OSMC
Using: PiHole, SolarEdge Modbus, Sainlogic / Weather Underground, MQTT, Fritzbox, P1 Meter(s), dzvents Scripting
Domoticz Beta on Raspberry 3b (2x), and 4 (2x) on Rasbian Bullseye / Raspbian Bookworm / OSMC
Using: PiHole, SolarEdge Modbus, Sainlogic / Weather Underground, MQTT, Fritzbox, P1 Meter(s), dzvents Scripting
-
- Posts: 673
- Joined: Thursday 02 October 2014 6:36
- Target OS: Raspberry Pi / ODroid
- Domoticz version: 2022.2
- Location: Geleen
- Contact:
Re: Solaredge inverter plug-in Modbus TCP
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.
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.
-
- Posts: 9
- Joined: Thursday 02 January 2025 21:15
- Target OS: Raspberry Pi / ODroid
- Domoticz version: beta
- Location: Lux
- Contact:
Re: Solaredge inverter plug-in Modbus TCP
My Setup was a reply to the following open question
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
Use the Meter Branch of the Plugin (git clone ... )
In the Hardware Config part :
and then for the master device
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 ?
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
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
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
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 ?
--
Domoticz Beta on Raspberry 3b (2x), and 4 (2x) on Rasbian Bullseye / Raspbian Bookworm / OSMC
Using: PiHole, SolarEdge Modbus, Sainlogic / Weather Underground, MQTT, Fritzbox, P1 Meter(s), dzvents Scripting
Domoticz Beta on Raspberry 3b (2x), and 4 (2x) on Rasbian Bullseye / Raspbian Bookworm / OSMC
Using: PiHole, SolarEdge Modbus, Sainlogic / Weather Underground, MQTT, Fritzbox, P1 Meter(s), dzvents Scripting
-
- Posts: 673
- Joined: Thursday 02 October 2014 6:36
- Target OS: Raspberry Pi / ODroid
- Domoticz version: 2022.2
- Location: Geleen
- Contact:
Re: Solaredge inverter plug-in Modbus TCP
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.
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.
-
- Posts: 7
- Joined: Tuesday 10 January 2017 13:52
- Target OS: Linux
- Domoticz version:
- Location: Poland
- Contact:
Re: Solaredge inverter plug-in Modbus TCP
Current inverter Wats is avaiable.
Total energy e.g. Watts per hour must be calculated.
Total energy e.g. Watts per hour must be calculated.
-
- Posts: 673
- Joined: Thursday 02 October 2014 6:36
- Target OS: Raspberry Pi / ODroid
- Domoticz version: 2022.2
- Location: Geleen
- Contact:
Re: Solaredge inverter plug-in Modbus TCP
Inverter power is wrong value, propably only works when no battery or charger is present
-
- Posts: 7
- Joined: Tuesday 10 January 2017 13:52
- Target OS: Linux
- Domoticz version:
- Location: Poland
- Contact:
Re: Solaredge inverter plug-in Modbus TCP
OK, sure, I don't have battery
-
- Posts: 9
- Joined: Thursday 02 January 2025 21:15
- Target OS: Raspberry Pi / ODroid
- Domoticz version: beta
- Location: Lux
- Contact:
Re: Solaredge inverter plug-in Modbus TCP
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
- 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
--
Domoticz Beta on Raspberry 3b (2x), and 4 (2x) on Rasbian Bullseye / Raspbian Bookworm / OSMC
Using: PiHole, SolarEdge Modbus, Sainlogic / Weather Underground, MQTT, Fritzbox, P1 Meter(s), dzvents Scripting
Domoticz Beta on Raspberry 3b (2x), and 4 (2x) on Rasbian Bullseye / Raspbian Bookworm / OSMC
Using: PiHole, SolarEdge Modbus, Sainlogic / Weather Underground, MQTT, Fritzbox, P1 Meter(s), dzvents Scripting
- gizmocuz
- Posts: 2536
- Joined: Thursday 11 July 2013 18:59
- Target OS: Raspberry Pi / ODroid
- Domoticz version: beta
- Location: Top of the world
- Contact:
Re: Solaredge inverter plug-in Modbus TCP
Question, why not use the Domoticz build in support for Solaredge hardware?
Quality outlives Quantity!
-
- Posts: 673
- Joined: Thursday 02 October 2014 6:36
- Target OS: Raspberry Pi / ODroid
- Domoticz version: 2022.2
- Location: Geleen
- Contact:
Re: Solaredge inverter plug-in Modbus TCP
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?
Basically the energy dashboard is useless when using the solaredge api updates.
Or are we talking about difgerent things?
-
- Posts: 9
- Joined: Thursday 02 January 2025 21:15
- Target OS: Raspberry Pi / ODroid
- Domoticz version: beta
- Location: Lux
- Contact:
Re: Solaredge inverter plug-in Modbus TCP
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
--
Domoticz Beta on Raspberry 3b (2x), and 4 (2x) on Rasbian Bullseye / Raspbian Bookworm / OSMC
Using: PiHole, SolarEdge Modbus, Sainlogic / Weather Underground, MQTT, Fritzbox, P1 Meter(s), dzvents Scripting
Domoticz Beta on Raspberry 3b (2x), and 4 (2x) on Rasbian Bullseye / Raspbian Bookworm / OSMC
Using: PiHole, SolarEdge Modbus, Sainlogic / Weather Underground, MQTT, Fritzbox, P1 Meter(s), dzvents Scripting
-
- Posts: 673
- Joined: Thursday 02 October 2014 6:36
- Target OS: Raspberry Pi / ODroid
- Domoticz version: 2022.2
- Location: Geleen
- Contact:
Re: Solaredge inverter plug-in Modbus TCP
The inverter you are using is a Solaredge? I do not see that register I think.
-
- Posts: 9
- Joined: Thursday 02 January 2025 21:15
- Target OS: Raspberry Pi / ODroid
- Domoticz version: beta
- Location: Lux
- Contact:
Re: Solaredge inverter plug-in Modbus TCP
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

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 }
--
Domoticz Beta on Raspberry 3b (2x), and 4 (2x) on Rasbian Bullseye / Raspbian Bookworm / OSMC
Using: PiHole, SolarEdge Modbus, Sainlogic / Weather Underground, MQTT, Fritzbox, P1 Meter(s), dzvents Scripting
Domoticz Beta on Raspberry 3b (2x), and 4 (2x) on Rasbian Bullseye / Raspbian Bookworm / OSMC
Using: PiHole, SolarEdge Modbus, Sainlogic / Weather Underground, MQTT, Fritzbox, P1 Meter(s), dzvents Scripting
-
- Posts: 673
- Joined: Thursday 02 October 2014 6:36
- Target OS: Raspberry Pi / ODroid
- Domoticz version: 2022.2
- Location: Geleen
- Contact:
Re: Solaredge inverter plug-in Modbus TCP
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.
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.
-
- Posts: 9
- Joined: Thursday 02 January 2025 21:15
- Target OS: Raspberry Pi / ODroid
- Domoticz version: beta
- Location: Lux
- Contact:
Re: Solaredge inverter plug-in Modbus TCP
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
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

--
Domoticz Beta on Raspberry 3b (2x), and 4 (2x) on Rasbian Bullseye / Raspbian Bookworm / OSMC
Using: PiHole, SolarEdge Modbus, Sainlogic / Weather Underground, MQTT, Fritzbox, P1 Meter(s), dzvents Scripting
Domoticz Beta on Raspberry 3b (2x), and 4 (2x) on Rasbian Bullseye / Raspbian Bookworm / OSMC
Using: PiHole, SolarEdge Modbus, Sainlogic / Weather Underground, MQTT, Fritzbox, P1 Meter(s), dzvents Scripting
Who is online
Users browsing this forum: No registered users and 1 guest