ESS: Victron Multiplus / Quattro

Hi,

As we are planning the installation of a victron ESS composed of 3 Quattro 15kVA inverters and a set of pytes batteries (approximately 45kWh).
Has anyone started implementing Victron components?

Regards,
klinki

Hi Klinky, there are already some victron PRs for OpenEMS - #1819 and #1815. It is for a Victron Multiplus. The PRs are outdated already.
Internally we have an updated bundle. I will prepare a new PR with the updated bundle in the coming days.
The system runs very stable. So it should be a good base for your project.

1 Like

Great!
Thank you very much, Christian!

Without having seen it yet, I’m sure it will save me a lot of time!

Hey Klinki,

I extracted the Victron bundle from the opernikus private repo and moved it as a PR into the opernikus common repo.

This bundle had multiple contributors, and has multiple TODOs and is therefor not fitted for an official PR into OpenEMS.

This bundle can be used for private usages however.
It can be used as a base for future projects/implementations :slight_smile:

1 Like

Thank you very much! Everything is better than starting from zero.

But the code does not look that bad… :smiley:

Good morning,

The hardware is set up in my garage. Configuring the MultiPlus 2 as an ESS was quite easy, as was controlling the device via an external Modbus master. Even connecting your battery inverter code worked.

Do you already have an implementation for a Victron ESS?

Thanks again & regards,
Klinki

Hi,

I have the first implementation of a Victron Multiplus 2 ESS running:
My Repo

Thanks to you again for the inverter classes. That helped very much.

There were a lot of Enums to integrate…

Good morning,

Meanwhile I configured 3 Multiplus as a 3phase system. It was easy going and seems to work fine for 2 days now.

Victron´s ESS component is working out of the box and there´s actually not much programming necessary. However, there is a substantial amount of information regarding the inverters, batteries, and other components.
So there are different values of allowed charge/discharge power. The BMS has it´s values which can be different from the inverter.
My current approach is to read all of these limits and provide OpenEMS with the lowest value, which, in my case, comes from the BMS
So it would be more transparent to EMS what the ESS is doing and why.

regards,
klinki

Hi,

I am currently trying to get my 1-phase Victron Multiplus 2 10 kWh ESS connected to openEMS.

I have copied the components

  • io.openems.edge.batteryinverter.victron
  • io.openems.edge.controller.ess.chargedischargelimiter
  • io.openems.edge.controller.symmetric.thresholdpeakshaver

from openemsForkKlinki/io.openems.edge.batteryinverter.victron at develop · DerWahreKlinki/openemsForkKlinki · GitHub into the current development branch and got it to compile and start.

Setup
modbus0 - bridge to Fronius PV Inverter - works
pvinverter0 - Fronius Symo Inverter - Modbus TCP with ID 1 - works
meter0 - Fronius Smart Meter via Datamanager - Modbus TCP with ID 240 - works
modbus1 - bridge to Victron Venus - works for batteryInverter0
batteryInverter0 - configured to access Multiplus with ModbusID 100 - works
ess0 - Victron Multiplus 2 ESS via modbus1 with Modbus ID 227 - no entries visible in log
battery0 - Victron Battery via modbus1 and referencing Victron ESS-ID ess0 - works

Situation
I am currently receiving the following error:

  • [battery0] No ESS reference available

It would be great, if somebody can give me a hint what is the root cause and what components have to be setup.

Thanks

Dirk

2024-11-28T13:04:18,988 [modbus1 ] INFO  [e.modbus.api.task.AbstractTask]   Execute FC3ReadHoldingRegisters [batteryInverter0;unitid=100;priority=LOW;ref=850/0x352;length=2;response=0000 0000]
2024-11-28T13:04:18,991 [modbus1 ] INFO  [e.modbus.api.task.AbstractTask]   Execute FC3ReadHoldingRegisters [battery0;unitid=1;priority=HIGH;ref=259/0x103;length=68;response=14f9 0000 00ec 00e1 0000 0000 0000 021c 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00ad 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0051 0000 0220 01e0 0230 02bc 0438 0000 0000 0000 0000 0000 0000 0000 0000 00dc 00e6 0000 0000 0000 0000 0000 0000 0000]
2024-11-28T13:04:19,003 [modbus1 ] INFO  [e.modbus.api.task.AbstractTask]   Execute FC3ReadHoldingRegisters [battery0;unitid=1;priority=HIGH;ref=1282/0x502;length=20;response=0000 0000 0000 0000 0000 0000 0000 0010 014f 0150 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000]
2024-11-28T13:04:19,009 [modbus1 ] INFO  [e.modbus.api.task.AbstractTask]   Execute FC3ReadHoldingRegisters [batteryInverter0;unitid=100;priority=HIGH;ref=800/0x320;length=27;response=6238 3237 6562 3530 6665 6466 0000 0000 0000 0000 0000 025b 0273 0265 0000 0000 0000 0561 0048 029f 085b fdd5 003a 0000 0000 0000 0001]
2024-11-28T13:04:19,013 [modbus1 ] INFO  [e.modbus.api.task.AbstractTask]   Execute FC3ReadHoldingRegisters [batteryInverter0;unitid=100;priority=HIGH;ref=840/0x348;length=7;response=021a 0147 06df 0036 0001 0000 0051]
2024-11-28T13:04:19,016 [modbus1 ] INFO  [e.modbus.api.task.AbstractTask]   Execute FC3ReadHoldingRegisters [batteryInverter0;unitid=100;priority=HIGH;ref=865/0x361;length=2;response=00ee 060f]
2024-11-28T13:04:19,019 [modbus1 ] INFO  [e.modbus.api.task.AbstractTask]   Execute FC3ReadHoldingRegisters [batteryInverter0;unitid=100;priority=HIGH;ref=2700/0xa8c;length=11;response=000a 0064 0064 0000 0000 ffff 0000 0000 0000 0000 0000]
2024-11-28T13:04:19,039 [_cycle  ] ERROR [.ro.VictronBatteryInverterImpl] [battery0] No ESS reference available.
2024-11-28T13:04:19,042 [_cycle  ] INFO  [ebuglog.ControllerDebugLogImpl] [ctrlDebugLog0] _componentManager[Defective:ess0[Unsatisfied reference for timedata] ctrlBalancing0[Unsatisfied reference for ess ((&(enabled=true)(!(service.pid=Controller.Symmetric.Balancing.1852d392-5407-456a-986a-e888ed99dafe))(|(id=ess0))))]|State:FAULT: A configured OpenEMS Component was not activated] _sum[State:Fault Grid:1260 W Production:1843 W Consumption:3103 W] battery0[SoC: 54 %] batteryInverter0[Undefined
Limits (Charge/Discharge: Battery/Inverter/Config: null/null null/null 3500/3500] meter0[L:1260 W] modbus1[CycleDelay:953 ms] pvInverter0[L:1843 W]

UI view

Configuration




I am not sure if all copying is correct as I don´t have a unit-ID in my battery-implementation.

The two controllers are still in development-state although they are working in a live setup.

I`ve never tested the victron components with one phase. This is still one of my toDos…

Your DebugLog says that you are missing a timedata controller. That might cause the error you are facing

It´s good to see that someone makes use of my development. We should stay in contact!

Hi Klinki,

thanks for the tips. I had already included a modbus unit ID in the configuration of the victron battery component.

Now I have setup a timedate controller and more important corrected the modbus unit ID of the Victron ESS to 239, which helped running it without problems.

I will take a deeper look in the next days.

Regards
Dirk

2024-11-28T20:54:56,620 [modbus1 ] INFO  [e.modbus.api.task.AbstractTask]   Execute FC3ReadHoldingRegisters [batteryInverter0;unitid=100;priority=LOW;ref=855/0x357;length=1;response=0000]
2024-11-28T20:54:56,631 [modbus1 ] INFO  [e.modbus.api.task.AbstractTask]   Execute FC3ReadHoldingRegisters [ess0;unitid=239;priority=HIGH;ref=3/0x3;length=102;response=0938 0000 0000 0007 0000 0000 1392 0000 0000 0006 0000 0000 0938 0000 0000 0002 0000 0000 1383 0140 0006 0000 0000 148e fff9 0001 0000 028a 0003 0000 0003 0000 0000 0000 003f 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 0001 0000 0000 0000 0000 0000 0000 0001 0148 0000 0000 0000 0000 0000 0001 0000 0000 0507 0000 0f8a 0000 0000 0000 0000 0000 0000 0000 0000 0000 087a 0000 0000 0000 00de 0000 000d 0000 0001 0000 003f 0000 0000 0000 0000 0000 0000 0000]
2024-11-28T20:54:56,634 [modbus1 ] INFO  [e.modbus.api.task.AbstractTask]   Execute FC3ReadHoldingRegisters [battery0;unitid=1;priority=HIGH;ref=259/0x103;length=68;response=1490 0000 fffd 00c3 0000 0000 0000 028a 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00ad 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 2d33 0000 0220 01e0 02a0 02bc 0514 0000 0000 0000 0000 0000 0000 0000 0000 00be 00c8 0000 0000 0000 0000 0000 0000 0000]
2024-11-28T20:54:56,635 [modbus1 ] INFO  [e.modbus.api.task.AbstractTask]   Execute FC3ReadHoldingRegisters [battery0;unitid=1;priority=HIGH;ref=1282/0x502;length=20;response=0000 0000 0000 0000 0000 0000 0000 0010 0149 0149 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000]
2024-11-28T20:54:56,635 [modbus1 ] INFO  [e.modbus.api.task.AbstractTask]   Execute FC3ReadHoldingRegisters [batteryInverter0;unitid=100;priority=HIGH;ref=800/0x320;length=27;response=6238 3237 6562 3530 6665 6466 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 008c 0036 01dd 008d 0036 01dd 0000 0000 0000 0001]
2024-11-28T20:54:56,635 [modbus1 ] INFO  [e.modbus.api.task.AbstractTask]   Execute FC3ReadHoldingRegisters [batteryInverter0;unitid=100;priority=HIGH;ref=840/0x348;length=7;response=020e fffd fff0 0041 0000 0000 2d33]
2024-11-28T20:54:56,635 [modbus1 ] INFO  [e.modbus.api.task.AbstractTask]   Execute FC3ReadHoldingRegisters [batteryInverter0;unitid=100;priority=HIGH;ref=865/0x361;length=2;response=0000 0000]
2024-11-28T20:54:56,635 [modbus1 ] INFO  [e.modbus.api.task.AbstractTask]   Execute FC3ReadHoldingRegisters [batteryInverter0;unitid=100;priority=HIGH;ref=2700/0xa8c;length=11;response=000a 0064 0064 0000 0000 ffff 0000 0000 0000 0000 0000]
2024-11-28T20:54:56,682 [_cycle  ] INFO  [.ro.VictronBatteryInverterImpl] [battery0] Listener triggered with incoming capacity: 130 Ah
2024-11-28T20:54:56,682 [_cycle  ] INFO  [.ro.VictronBatteryInverterImpl] [battery0] Current State of Charge (SoC): 65
2024-11-28T20:54:56,685 [_cycle  ] INFO  [.ro.VictronBatteryInverterImpl] [battery0] checkSocControllers: MinSoC set to 0, MaxSoC set to 100
2024-11-28T20:54:56,685 [_cycle  ] INFO  [.ro.VictronBatteryInverterImpl] [battery0] SoC limits updated - MinSoC: 0, MaxSoC: 100
2024-11-28T20:54:56,685 [_cycle  ] INFO  [.ro.VictronBatteryInverterImpl] [battery0] Calculated total capacity (Ah): 200
2024-11-28T20:54:56,685 [_cycle  ] INFO  [.ro.VictronBatteryInverterImpl] [battery0] Normalized usable SoC: 65% based on current SoC: 65
2024-11-28T20:54:56,685 [_cycle  ] INFO  [.ro.VictronBatteryInverterImpl] [battery0] installListener: SoC: real|usable 65|65[%] Capacity real|usable 9600|6240 [Wh]
2024-11-28T20:54:56,685 [_cycle  ] INFO  [ebuglog.ControllerDebugLogImpl] [ctrlDebugLog0] _sum[State:Ok Ess SoC:65 %|L:-60 W Grid:672 W Production:0 W Consumption:612 W] battery0[SoC: 65 %] batteryInverter0[Undefined
Limits (Charge/Discharge: Battery/Inverter/Config: null/null null/null 3500/3500] ess0[SoC:65 %|L:-60 W/UNDEFINED|Phase:L1|Allowed:UNDEFINED;UNDEFINED
|On-Grid] meter0[L:672 W] modbus1[CycleDelay:949 ms] pvInverter0[L:0 W]

Great!
The time data provider is essential for calculating AC energy to and from the system. Unfortunately, Victron does not offer these registers, even though they provide a wealth of information.

I’ve made a few improvements to Victron’s energy calculation, such as adding a channel for the DC side.

Our peak shaver has been operating well for the past two weeks. However, there are still questions regarding the efficiency of the inverters. To enable a deeper analysis, I’ve added channels to the peak shaver as well.

I look forward to your feedback.

Regards,
klinki

PS: I´ve pushed the latest code a few minutes ago…