Zendure SolarFlow 2400 AC+
Moderators: leecollings, remb0
-
Henry
- Posts: 44
- Joined: Tuesday 06 March 2018 18:56
- Target OS: Raspberry Pi / ODroid
- Domoticz version: 2024.7
- Location: Netherlands
- Contact:
Zendure SolarFlow 2400 AC+
Good morning,
I recently got a Zendure SolarFlow 2400 AC+ and want to see some stats on the dashboard. I can't find an integration for this so what is the best approach for this? I'm running Domoticz 2026.2 and mosquitto.
I recently got a Zendure SolarFlow 2400 AC+ and want to see some stats on the dashboard. I can't find an integration for this so what is the best approach for this? I'm running Domoticz 2026.2 and mosquitto.
-
Henry
- Posts: 44
- Joined: Tuesday 06 March 2018 18:56
- Target OS: Raspberry Pi / ODroid
- Domoticz version: 2024.7
- Location: Netherlands
- Contact:
Re: Zendure SolarFlow 2400 AC+
I found out that the stats can be collected from http://[ZENDURE_IP]/properties/report. I've created a DZVents script that collects the data every minute and store it in some dummy devices. Now I have the battery in the Energy Dashboard and on my dynamic home dashboard.
- waltervl
- Posts: 7019
- Joined: Monday 28 January 2019 18:48
- Target OS: Linux
- Domoticz version: 2026.3
- Location: NL
- Contact:
Re: Zendure SolarFlow 2400 AC+
There is also this topic where the MQTT option was discussed: viewtopic.php?t=42929
Domoticz running on Udoo X86 (on Ubuntu)
Devices/plugins: ZigbeeforDomoticz (with Xiaomi, Ikea, Tuya devices), Nefit Easy, Midea Airco, Omnik Solar, Goodwe Solar
Devices/plugins: ZigbeeforDomoticz (with Xiaomi, Ikea, Tuya devices), Nefit Easy, Midea Airco, Omnik Solar, Goodwe Solar
-
Henry
- Posts: 44
- Joined: Tuesday 06 March 2018 18:56
- Target OS: Raspberry Pi / ODroid
- Domoticz version: 2024.7
- Location: Netherlands
- Contact:
Re: Zendure SolarFlow 2400 AC+
Thank you. The topic is a bit older but I guess it's worth trying mqtt. For now the direct api works ok.
-
pgit
- Posts: 17
- Joined: Monday 04 August 2014 17:54
- Target OS: Raspberry Pi / ODroid
- Domoticz version:
- Contact:
Re: Zendure SolarFlow 2400 AC+
Great, I'm trying to do the same thing, but programming in LUA is not really my thing;Henry wrote: Thursday 06 August 2026 12:51 I found out that the stats can be collected from http://[ZENDURE_IP]/properties/report. I've created a DZVents script that collects the data every minute and store it in some dummy devices. Now I have the battery in the Energy Dashboard and on my dynamic home dashboard.
I'm struggling to togle virtual switches from the values (0 or 1) from the report page...
Would you mind sharing your script?
And which property did you use in the energy dashboard?
I see there is one for battery charge power and a seperate one for battery discharge power, but I can only add one of them in the dashboard...
How did you combine them into one?
Thanks in advance!
-
Henry
- Posts: 44
- Joined: Tuesday 06 March 2018 18:56
- Target OS: Raspberry Pi / ODroid
- Domoticz version: 2024.7
- Location: Netherlands
- Contact:
Re: Zendure SolarFlow 2400 AC+
This is the lua script i'm using:
I'm only reading the vaules, not writing anything. I hope the description in the code says enough.
Code: Select all
--[[
Zendure SolarFlow 2400 AC+ -> Domoticz (via lokale zenSDK-API)
Plaats dit bestand in: <domoticz>/scripts/dzVents/scripts/zendure_local.lua
(of plak de inhoud in Setup -> More Options -> Events -> dzVents nieuw script)
Werkt naast de Zendure-cloud: de HEMS/lokale API is een extra uitgang,
je app blijft gewoon live data tonen.
Bevestigd endpoint: http://[ZENDURE_IP]/properties/report
Data zit onder .properties ; accu's onder .packData[]
Aanmaken in Domoticz (Dummy hardware -> Virtual Sensors):
- Percentage : SoC totaal, en evt. per pack
- Custom Sensor W : laden, ontladen, zon, naar huis, grid
- Temperature : apparaattemperatuur
- Custom Sensor dBm (optioneel): WiFi-signaal
Noteer van elk het idx en vul hieronder in. idx = 0 -> overslaan.
]]
-- >>> AANPASSEN <<<
local ZENDURE_IP = '[ZENDURE_IP]'
local IDX = {
-- kern
soc = 0, -- Percentage (electricLevel, %)
charge = 0, -- Custom Sensor W (outputPackPower = laden)
discharge = 0, -- Custom Sensor W (packInputPower = ontladen)
solar = 0, -- Custom Sensor W (solarInputPower)
toHome = 0, -- Custom Sensor W (outputHomePower)
grid = 0, -- Custom Sensor W (gridInputPower)
netPower = 0, -- Custom Sensor W (netto accuvermogen: + = laden, - = ontladen)
netGrid = 0, -- Custom Sensor W (netto verbruik: gridInputPower - laadvermogen)
remainOut = 0, -- Custom Sensor min (remainOutTime, resterende ontlaadtijd)
-- extra (optioneel)
temp = 0, -- Temperature (hyperTmp / 100)
wifi = 0, -- Custom Sensor dBm (rssi)
pack1soc = 0, -- Percentage (packData[1].socLevel)
pack2soc = 0, -- Percentage (packData[2].socLevel)
pack1temp = 0, -- Temperature (packData[1].maxTemp / 100)
pack2temp = 0, -- Temperature (packData[2].maxTemp / 100)
updated = 0, -- Text (rapporttijd, uit timestamp)
-- Voor het ingebouwde Energiedashboard:
batPower = 0, -- Usage (Electric) netto accuvermogen (Watt-veld "Batterij")
batVolt = 0, -- Voltage (BatVolt / 100)
energyIn = 0, -- Electric (Instant+Counter) laadenergie (In)
energyOut = 0, -- Electric (Instant+Counter) ontlaadenergie (Uit)
netUsed = 0, -- kWh netto verbruik (netGrid > 0)
netBack = 0, -- kWh netto teruglevering (netGrid < 0)
p1 = 1, -- BESTAAND P1-device (Slimme Meter) - niet aanmaken, alleen uitlezen
}
-- >>> EINDE AANPASSEN <<<
return {
on = {
timer = { 'every minute' },
httpResponses = { 'zendureReport' },
},
data = {
lastTs = { initial = 0 }, -- laatste meetmoment (voor kWh-integratie)
whIn = { initial = 0 }, -- cumulatieve laadenergie (Wh)
whOut = { initial = 0 }, -- cumulatieve ontlaadenergie (Wh)
whUsed = { initial = 0 }, -- cumulatief netto verbruik (Wh)
whBack = { initial = 0 }, -- cumulatieve netto teruglevering (Wh)
},
logging = {
level = domoticz.LOG_ERROR, -- zet op LOG_INFO om mee te kijken
marker = 'Zendure',
},
execute = function(domoticz, item)
-- 1) Elke minuut de lokale API opvragen
if item.isTimer then
domoticz.openURL({
url = 'http://' .. ZENDURE_IP .. '/properties/report',
method = 'GET',
callback = 'zendureReport',
})
return
end
-- 2) Antwoord verwerken
if not (item.ok and item.isJSON) then
domoticz.log('Geen geldige JSON van de Zendure', domoticz.LOG_ERROR)
return
end
local p = item.json.properties or {}
local packs = item.json.packData or {}
local function setPct(idx, val)
if idx and idx > 0 and val ~= nil then
domoticz.devices(idx).updatePercentage(val)
end
end
local function setW(idx, val)
if idx and idx > 0 and val ~= nil then
domoticz.devices(idx).updateCustomSensor(val)
end
end
local function setTemp(idx, val)
if idx and idx > 0 and val ~= nil then
domoticz.devices(idx).updateTemperature(val)
end
end
local function setText(idx, val)
if idx and idx > 0 and val ~= nil then
domoticz.devices(idx).updateText(val)
end
end
-- kern
setPct(IDX.soc, p.electricLevel)
setW(IDX.charge, p.outputPackPower)
setW(IDX.discharge, p.packInputPower)
setW(IDX.solar, p.solarInputPower)
setW(IDX.toHome, p.outputHomePower)
setW(IDX.grid, p.gridInputPower)
-- netto accuvermogen: laden positief, ontladen negatief
local charge = p.outputPackPower or 0
local discharge = p.packInputPower or 0
setW(IDX.netPower, charge - discharge)
-- netto verbruik: WERKELIJKE netafname (P1) minus wat er naar de accu gaat.
-- gridInputPower van de Zendure is alleen zijn eigen laadstroom (~= outputPackPower),
-- dus dat geeft altijd 0. De P1-meter is de echte huis-netafname.
local p1net = 0
if IDX.p1 > 0 then
local p1 = domoticz.devices(IDX.p1)
if p1 then p1net = (p1.usage or 0) - (p1.usageDelivered or 0) end
end
local net = p1net - charge
setW(IDX.netGrid, net)
-- === Ingebouwd Energiedashboard ===
-- Netto accuvermogen als Usage-device (Watt-veld "Batterij")
if IDX.batPower > 0 then
local pdev = domoticz.devices(IDX.batPower)
if pdev then pdev.updateEnergy(charge - discharge) end
end
-- Accuspanning
if IDX.batVolt > 0 and p.BatVolt ~= nil then
local vdev = domoticz.devices(IDX.batVolt)
if vdev then vdev.updateVoltage(p.BatVolt / 100.0) end
end
-- kWh-tellers: vermogen zelf integreren op basis van verstreken tijd
local now = os.time()
local dt = 0
if domoticz.data.lastTs > 0 then dt = now - domoticz.data.lastTs end
domoticz.data.lastTs = now
if dt < 0 or dt > 300 then dt = 0 end -- gaten na uitval niet meetellen
domoticz.data.whIn = domoticz.data.whIn + charge * dt / 3600.0
domoticz.data.whOut = domoticz.data.whOut + discharge * dt / 3600.0
if IDX.energyIn > 0 then
local d = domoticz.devices(IDX.energyIn)
if d then d.updateElectricity(charge, domoticz.data.whIn) end
end
if IDX.energyOut > 0 then
local d = domoticz.devices(IDX.energyOut)
if d then d.updateElectricity(discharge, domoticz.data.whOut) end
end
-- netto verbruik/teruglevering als kWh-tellers (net = P1 - laadvermogen, zie boven)
if net >= 0 then
domoticz.data.whUsed = domoticz.data.whUsed + net * dt / 3600.0
else
domoticz.data.whBack = domoticz.data.whBack + (-net) * dt / 3600.0
end
if IDX.netUsed > 0 then
local d = domoticz.devices(IDX.netUsed)
if d then d.updateElectricity(net > 0 and net or 0, domoticz.data.whUsed) end
end
if IDX.netBack > 0 then
local d = domoticz.devices(IDX.netBack)
if d then d.updateElectricity(net < 0 and -net or 0, domoticz.data.whBack) end
end
-- resterende ontlaadtijd: alleen zinvol tijdens ontladen.
-- Laadt/idle -> apparaat geeft een placeholder (42000/59940 min); dan 0 tonen.
if p.remainOutTime ~= nil then
local rot = 0
if discharge > 0 then rot = p.remainOutTime end
setW(IDX.remainOut, rot)
end
-- extra
if p.hyperTmp ~= nil then setTemp(IDX.temp, p.hyperTmp / 100.0) end
setW(IDX.wifi, p.rssi)
if item.json.timestamp ~= nil then
setText(IDX.updated, os.date('%Y-%m-%d %H:%M:%S', item.json.timestamp))
end
if packs[1] then
setPct(IDX.pack1soc, packs[1].socLevel)
if packs[1].maxTemp ~= nil then setTemp(IDX.pack1temp, packs[1].maxTemp / 100.0) end
end
if packs[2] then
setPct(IDX.pack2soc, packs[2].socLevel)
if packs[2].maxTemp ~= nil then setTemp(IDX.pack2temp, packs[2].maxTemp / 100.0) end
end
domoticz.log('Zendure bijgewerkt: SoC=' .. tostring(p.electricLevel)
.. '% laden=' .. tostring(p.outputPackPower)
.. 'W ontladen=' .. tostring(p.packInputPower) .. 'W', domoticz.LOG_INFO)
end
}
-
pgit
- Posts: 17
- Joined: Monday 04 August 2014 17:54
- Target OS: Raspberry Pi / ODroid
- Domoticz version:
- Contact:
Re: Zendure SolarFlow 2400 AC+
Fantastic, thank you!
I will add the missing virtual sensors and try your script a.s.a.p.
I assume packData[2] is for one extra battery.
I have added two AB300L's so I wil also try to adapt your script to include packData[3] values.
I will add the missing virtual sensors and try your script a.s.a.p.
I assume packData[2] is for one extra battery.
I have added two AB300L's so I wil also try to adapt your script to include packData[3] values.
-
Henry
- Posts: 44
- Joined: Tuesday 06 March 2018 18:56
- Target OS: Raspberry Pi / ODroid
- Domoticz version: 2024.7
- Location: Netherlands
- Contact:
Re: Zendure SolarFlow 2400 AC+
I indeed have 1 extra pack. You can enter the link in a browser to check the json.
Good luck
Good luck
-
pgit
- Posts: 17
- Joined: Monday 04 August 2014 17:54
- Target OS: Raspberry Pi / ODroid
- Domoticz version:
- Contact:
Re: Zendure SolarFlow 2400 AC+
Dear Henry,
Sorry to bother again but... what type of virtual sensors did you use for:
netUsed = 0, -- kWh netto verbruik (netGrid > 0)
netBack = 0, -- kWh netto teruglevering (netGrid < 0)
???
I don't seem to understand how / where they are being used...
Whether I use a Custom Sensor, Usage (Electric), Text, or Counter, I keep getting the following errors in the log:
2026-08-21 01:18:00.631 Error: dzVents: Zendure: Method updateElectricity is not available for device "kWh netto verbruik (netGrid > 0)" (deviceType=General, deviceSubType=Custom Sensor). If you believe this is not correct, please report.
2026-08-21 01:18:00.632 Error: dzVents: Zendure: Method updateElectricity is not available for device "kWh netto teruglevering (netGrid < 0)" (deviceType=General, deviceSubType=Custom Sensor). If you believe this is not correct, please report.
...
2026-08-21 01:53:00.937 Error: dzVents: Zendure: Method updateElectricity is not available for device "kWh ELECTRIC netto verbruik (netGrid > 0)" (deviceType=Usage, deviceSubType=Electric). If you believe this is not correct, please report.
2026-08-21 01:53:00.938 Error: dzVents: Zendure: Method updateElectricity is not available for device "kWh ELECTRIC netto teruglevering (netGrid < 0)" (deviceType=Usage, deviceSubType=Electric). If you believe this is not correct, please report.
2026-08-21 01:54:01.213 Error: dzVents: Zendure: Method updateElectricity is not available for device "kWh TEXT netto verbruik (netGrid > 0)" (deviceType=General, deviceSubType=Text). If you believe this is not correct, please report.
2026-08-21 01:54:01.214 Error: dzVents: Zendure: Method updateElectricity is not available for device "kWh TEXT netto teruglevering (netGrid < 0)" (deviceType=General, deviceSubType=Text). If you believe this is not correct, please report.
...
2026-08-21 02:13:00.950 Error: dzVents: Zendure: Method updateElectricity is not available for device "kWh COUNTER netto verbruik (netGrid > 0)" (deviceType=RFXMeter, deviceSubType=RFXMeter counter). If you believe this is not correct, please report.
2026-08-21 02:13:00.951 Error: dzVents: Zendure: Method updateElectricity is not available for device "kWh COUNTER netto teruglevering (netGrid < 0)" (deviceType=RFXMeter, deviceSubType=RFXMeter counter). If you believe this is not correct, please report.
Yes, I'm having a (very) late night struggle
Thanks (again) for any help!
Sorry to bother again but... what type of virtual sensors did you use for:
netUsed = 0, -- kWh netto verbruik (netGrid > 0)
netBack = 0, -- kWh netto teruglevering (netGrid < 0)
???
I don't seem to understand how / where they are being used...
Whether I use a Custom Sensor, Usage (Electric), Text, or Counter, I keep getting the following errors in the log:
2026-08-21 01:18:00.631 Error: dzVents: Zendure: Method updateElectricity is not available for device "kWh netto verbruik (netGrid > 0)" (deviceType=General, deviceSubType=Custom Sensor). If you believe this is not correct, please report.
2026-08-21 01:18:00.632 Error: dzVents: Zendure: Method updateElectricity is not available for device "kWh netto teruglevering (netGrid < 0)" (deviceType=General, deviceSubType=Custom Sensor). If you believe this is not correct, please report.
...
2026-08-21 01:53:00.937 Error: dzVents: Zendure: Method updateElectricity is not available for device "kWh ELECTRIC netto verbruik (netGrid > 0)" (deviceType=Usage, deviceSubType=Electric). If you believe this is not correct, please report.
2026-08-21 01:53:00.938 Error: dzVents: Zendure: Method updateElectricity is not available for device "kWh ELECTRIC netto teruglevering (netGrid < 0)" (deviceType=Usage, deviceSubType=Electric). If you believe this is not correct, please report.
2026-08-21 01:54:01.213 Error: dzVents: Zendure: Method updateElectricity is not available for device "kWh TEXT netto verbruik (netGrid > 0)" (deviceType=General, deviceSubType=Text). If you believe this is not correct, please report.
2026-08-21 01:54:01.214 Error: dzVents: Zendure: Method updateElectricity is not available for device "kWh TEXT netto teruglevering (netGrid < 0)" (deviceType=General, deviceSubType=Text). If you believe this is not correct, please report.
...
2026-08-21 02:13:00.950 Error: dzVents: Zendure: Method updateElectricity is not available for device "kWh COUNTER netto verbruik (netGrid > 0)" (deviceType=RFXMeter, deviceSubType=RFXMeter counter). If you believe this is not correct, please report.
2026-08-21 02:13:00.951 Error: dzVents: Zendure: Method updateElectricity is not available for device "kWh COUNTER netto teruglevering (netGrid < 0)" (deviceType=RFXMeter, deviceSubType=RFXMeter counter). If you believe this is not correct, please report.
Yes, I'm having a (very) late night struggle
Thanks (again) for any help!
Last edited by pgit on Friday 21 August 2026 2:39, edited 1 time in total.
-
pgit
- Posts: 17
- Joined: Monday 04 August 2014 17:54
- Target OS: Raspberry Pi / ODroid
- Domoticz version:
- Contact:
Re: Zendure SolarFlow 2400 AC+
I just figured out they work when I choose them to be Electric (Instant + Counter), right?
But I am yet to grasp their use...
How are the different from the measurements of the P1 meter?
How did you configure them in the settings of the energy dashboard?
(It's still night time, I haven't seen their behaviour when there is solar input from my panels yet)
But I am yet to grasp their use...
How are the different from the measurements of the P1 meter?
How did you configure them in the settings of the energy dashboard?
(It's still night time, I haven't seen their behaviour when there is solar input from my panels yet)
-
Henry
- Posts: 44
- Joined: Tuesday 06 March 2018 18:56
- Target OS: Raspberry Pi / ODroid
- Domoticz version: 2024.7
- Location: Netherlands
- Contact:
Re: Zendure SolarFlow 2400 AC+
The type is type Electric (Instant+Counter) indeed. I’m not at home right now so it’s a bit hard for me to check but some devices are there just for testing. I’ve attached a screenshot of my energy daahboard settings.
- Attachments
-
- IMG_6402.jpeg (344.32 KiB) Viewed 589 times
-
pgit
- Posts: 17
- Joined: Monday 04 August 2014 17:54
- Target OS: Raspberry Pi / ODroid
- Domoticz version:
- Contact:
Re: Zendure SolarFlow 2400 AC+
Thanks a lot, Henry!
Looks like I have my energyboard working now.
(Maybe it's not a very good moment to show you, though, while the batteries are fully charged and the panels are supplying more then demanded, but I couldn't wait )
Next (and the real) challenge will be to be able to use Domoticz as a HEMS for the Zendure...
Looks like I have my energyboard working now.
(Maybe it's not a very good moment to show you, though, while the batteries are fully charged and the panels are supplying more then demanded, but I couldn't wait )
Next (and the real) challenge will be to be able to use Domoticz as a HEMS for the Zendure...
-
Henry
- Posts: 44
- Joined: Tuesday 06 March 2018 18:56
- Target OS: Raspberry Pi / ODroid
- Domoticz version: 2024.7
- Location: Netherlands
- Contact:
Re: Zendure SolarFlow 2400 AC+
Looking good. Let me know if you succeed in controling the battery with domiticz
-
BartSr
- Posts: 541
- Joined: Sunday 03 July 2016 16:16
- Target OS: Raspberry Pi / ODroid
- Domoticz version: V2024.7
- Location: Netherlands
- Contact:
Re: Zendure SolarFlow 2400 AC+
Any news on this topic?
I tend to buy same type.
-Bart
I tend to buy same type.
-Bart
Raspberry pi 3b
Arduino
KAKU
RfxCom
Zwave2MQTT
OTGW
Chinese sensors temp (Dallas),movement
Tasmota
Esp8266 / 32 espeasy
Zigbee2MQTT
Arduino
KAKU
RfxCom
Zwave2MQTT
OTGW
Chinese sensors temp (Dallas),movement
Tasmota
Esp8266 / 32 espeasy
Zigbee2MQTT