I recently wrote about our upcoming solar PV adventure. But before updating our system, I thought it was time to document and explain our current setup (with the help of KiCad).
This system is the main electricity for our barn and currently consists of three batteries with an energy (often referred to as “capacity”) of 3* 14.33kWh = 43kWh (battery bank A, A1:A2 on the plan). These batteries are charged by a JCB G20QS (B1) via three MultiPlus-II 48/5000/70 inverters/chargers (B1:C2) which are by default in “Charge Only” mode. The MultiPlus-II are configured in a 3-phase configuration but only turned on when 3-phase is actually needed.
The main power is delivered by a MultiPlus-II 48/3000/35 (B4:C5) that is connected to a separate battery bank (battery bank B, BYD LVS Premium Battery-Box with an energy of 8kWh). This latter MultiPlus-II is connected to L1 of the 3-phase MultiPlus-II. So, whenever the main batteries get charged the cascaded inverter will also be charged. In addition, we can then use PowerAssist to up to supply 8'000VA (= 5'000VA + 3'000VA) when running on batteries and up to 14'500VA (= 6'500VA + 5'000VA + 3000VA) on a single phase.
Though the generator can supply up 14'400W the chargers of the Multiplus-II can only charge with a power of up to 3* 48V* 70A = 10'080W. This is actually an advantage as the optimal efficiency factor of the generator is roughly at 12'000W. So with 210A we are pretty close. If we ever added more chargers to the system we could even slightly increase the charge current to 250A.
System A with the 3-phase inverter configuration is connected to a Lynx bus bar (A1:B4) that also includes a Lynx shunt (B3) used for measuring over all batteries. In addition, there is an islolated Orion-Tr DC-DC charger (A5) that constantly feeds system B.
System A and B are connected to their separate GX:
system A Cerbo GX, A5:A6 MultiPlus-II via VE.Bus, Lynx Shunt via VE.Can, JK-BMS via RS485/USB
system B Raspberry Pi4running VenusOS, B5:B6 MultiPlus-II via VE.Bus, BYD BMS via VE.Can (on a Pi GPIO Hat)
And this is it for the electricity installation in our barn.
Note: This cascaded setup is officially not supported by Victron, but it has been working for us without problems for months now. This might be different in your case.
This is sort of a never ending story for me – just as the installation of our workshop container on the truck bed by our trusty mechanic which has been “in the making” since October 2022.
It is clear that we want and need electricity in the container. Just how and how much is not clear yet. In the following, I will consider our rquirements and different apsects and constraints of the electrical installation to hopefully come to a conclusion. This is a rather dry article with a lot of numbers – so beware …
Here is what we know (or at least think we know):
The truck has a 24V system
Charging any “leisure” batteries via the truck engine on a regular basis does not seem to be a good idea, as the fuel consumption is already 33l/100km without the container (that makes an astonishing 8.56mpg in the UK)
It is a EURO0diesel so we will not be able to get into all the cities (regardless of its problematic weight, length, height and width anyway).
Solar panels are still no real option (most of the time too way up in the North)
Charging from an EVSE might not always be possible as most of these EVSEs are for cars and do not have space for trucks
We want to be able to cook and wash in the vehicle
We will have a 2kWdiesel heater
We will have a 900W single phase petrol generator
We will be using Eve LF280K cells
The inverter must at least provide 2'250VA or 1'800W (concurrently, but not neccessarily on a single phase)
(optional) We would like to have 3-phase power in the container (as the cabling is already in place) – but also we know we would only use it very seldomly (such as for welding, then we need at least 11A per phase)
We would like to be able to charge 60% of the batteries (from 20% to 80%) within 3h
Refrigerator (able to run on 12V DC/24V DC or 230V AC)
Microwave (1'000W)
Water heater (immersion heater with 1'000W or 2'000W and/or kettle with 2'000W)
Table grill (1'250W)
Steam cooker (450W/900W)
Bread baking machine (600W)
Coffee machine (1'150W)
Washing machine (750W)
Water pressuriation system (850W)
Computers peripherals (USB-C charging with 36W via AC or DC, or 60W AC)
Lights (12V or 24V DC)
Water pump (12V or 24V DC)
Fan (12V or 24V DC)
Diesel heater (12V DC)
Starlink (60W AC, possibly 48V DC)
Infrared heating panel (150W AC)
Battery charger (12V/24V DC or 230V AC, depending on model)
Other USB powered and/or chargeable devices (via 12V/24V DC or separate 230V AC charger)
built-in 6t winch (powered by engine)
(optional) electric shower (8'000W)
Sizing the electrical installation comes with a number of additional constraints:
The crane in the workshop garage can lift up to 500kg this mean, all batteries, inverters, washine machine and water tanks must be less that weight
No single battery can charge or discharge with more than 140A
We can only charge from EVSEs with a Type 2 connector
A 12V system is very quickly out of the picture (and the largest and only MultiPlus-II with 12V is a 3’000VA system). Besides, the truck has 24V system anyway. So it is either 24V or 48V. Here is an overview of all current 24V and 48V MultiPlus-II models and their charge and discharge values:
MultiPlus-II 24V and 48V
Let’s first evaluate a 24V system:
Combination of 24V batteries and invertes
1* 8s battery
Capacity is likely to be too small
Single battery is not redundant
1*3’000VA can draw too much discharge current
1* 5’000VA can draw too much discharge current
2* 8s battery
2* 3’000VA can draw too much discharge current
1* 5’000VA possible
3* 8s battery
1-phase charge requirement can only be met with EVSE 7kW 32A Type 2
3* 3’000VA can draw too much discharge current
2* 5’000VA can draw too much discharge current
4* 8s battery
1-phase charge requirement can only be met with EVSE 7kW 32A Type 2
4* 3’000VA can draw too much discharge current
So, in a 24V 1-phase system only the 5'000VA inverter would be possible with either 2 (14’336Wh) or 4 (28’673Wh) batteries.
For a 3-phase setup to support our Kemppi Kempact 253A we would need at least 4 batteries and 3* 5'000VA inverters.
And now let’s have a look at a 48V system where we have a couple of more inverter options:
Combination of 48V batteries and inverters
1* 16s battery
Single battery is not redundant
2* 3’000VA inverters needed
1* 5’000VA inverter possible
1* 8’000VA can draw too much discharge current
1* 10’000VA can draw too much discharge current
1* 15’000VA can draw too much discharge current
2* 16s battery
1-phase charge requirement can only be met with EVSE 7kW 32A Type 2
3’000VA not as 3-phase setup feasible (otherwise 6 devices necessary)
8’000VA only as 3-phase setup, but then too heavy
1* 10’000VA possible
1* 15’000VA can draw too much discharge current
3* 16s battery
1-phase charge requirement cannot be met
charge requirement can only be met with 3-phase EVSE (16A or 32A) Type 2 (11kW+)
3’000VA possible, but too heavy with combined battery weight
5’000VA possible
8’000VA only as 3-phase setup, but then too heavy
10’000VA only as 3-phase setup, but then too heavy
15’000VA possible
4* 16s battery
batteries too heavy
1-phase charge requirement cannot be met
charge requirement can only be met with 3-phase EVSE (16A or 32A) Type 2 (11kW+)
3’000VA too heavy with combined battery weight
5’000VA too heavy with combined battery weight
8’000VA only as 3-phase setup, but then too heavy
10’000VA only as 3-phase setup, but then too heavy
15’000VA only as 3-phase setup, but then too heavy
So, this leaves us with really 3+2 choices:
2* 8s (14’336Wh) batteries in a 1-phase system with a single 5’000VA inverter
Battery and inverters would weigh roughly 140kg
2* 8s (14’336Wh) batteries in a 3-phase system with three 5’000VA inverters
Battery and inverters would weigh roughly 250kg
Not possible for 3-phase welding
4* 8s (28’672Wh) batteries in a 3-phase system with three 5’000VA inverters
Battery and inverters would weigh roughly 310kg
1* 16s (14’336Wh) battery in a 1-phase system with a single 5’000VA inverter
Battery and inverter would weigh roughly 140kg
2* 16s (28’672Wh) batteries in a 3-phase system with three 5’000VA inverters
Battery and inverters would weigh roughly 310kg
3h on a 1-phase 16A Type 2 would charge about 38% (a 60% charge takes 4.7h)
From there, we can narrow this down even further:
1-phase system: 24V, 2*8s
Price: batteries 2* 1’364GBP = 2’728CHF plus inverter 1* 1’359GBP total = 4'087GBP
Con: 24V MultiPlus-II are considerably more expensive (than 48V)
Con: only have the capacity
Con: cannot run electric shower
3-phase system: 48V, 2* 16s
Price: batteries 4* 1’364GBP = 5’456CHF plus inverter 3* 812GBP = 2’436GBP total = 8'802GBP
Con: charge requirement can only be met with 32A Type2 on 1-phase
Con: additional 48V|24V DC-DC converter required
Con: heavier, 300kg+ Con: higher self-consumption in 3-phase configuration
So – drum roll – my conclusion: for roughly double the money in a 48V we would get double the capacity and triple the charge and output power and pretty much can do everything we want the system to be able to do.
The 3-phase system can be reconfigured to a parallel 1-phase system, so we would even be able to use an electric shower (though very unlikely – we have our mobile shower). We can either charge 1-phase or 3-phase and have a longer window of electric autarky. And for most of the time we would leave the system in a 1-phase single device InverterCharger configuration. And additionally, for charging the other 2 devices would bet set to ChargeOnly (but be configured independently configured from each other).
The exact setup I will have to layout some other time, but right out of my head I would think of the following components:
External power in with CEE 16-5, CEE32-5, CEE32-1, CEE16-1 and Neutrik PowerCON True1 TOP (the more the better) connected to an ATS
AC out from MultiPlus-II connected to ATS
Orion-Tr 24V|48V DC-DC converter charging from alternator (though not the norm)
Orion-Tr 48V|24V DC-DC converter as power supply: to support 24V loads in the container as charger: as an emergency charger for the truck batteries
Lynx Power In, Distributor
Venus OS with Raspberry PI for RS-486 and DVCC
So, in case our Saurer ever gets finished – at least I know how to do the electricity …
The other day, I realised that I never wrote about the case build of our 16s 48V batteries, as I did for the 8s case and the 4s case. So, here it is – and I am actually describing 2 revisions as we made some adjustments.
First, the total weight of the cells alone would be roughly 16 * 5.3kg ~ 85kg. This is way beyond what a single person can – or at least should – lift. So, I deciced to split the battery into 2 separate cell blocks of 8 cells each (similar as I did split the 8s battery in the Toyota HiAce). With this approach, I would be able to:
reuse the 8s design (including the RAKO boxes)
be able to move or lift half a battery (which weighs roughly 53kg)
This battery has a nominal capacity of 3.2V * 16 * 280Ah = 14'336Wh and can be charged or discharge with up to 140A ^= 7'168W. We currently have 2 of these batteries running on our 3-phase setup with 3 * Victron MultiPlus-II 48/5000/70-50.
So essentially, I built 2 8s batteries with a connection cable between cells 8 and 9. The main negative and the BMS would be in one box and the main positive with the DC breakers would be in the other box. To avoid confusion, in this setup I went for coloured Anderson SB175 housings, with
Red 2 * 35mm2 H07RN-F cable main positive
Grey 2 * 35mm2 H07RN-F cable main negative
Blue Interconnecting both blocks 2 * 35mm2 H07RN-F cable connecting from cell 9 positive to cell 8 negative
In all cases
16s Battery Connectors
To connect the cells to the BMS balancer cables I extended the balancer cables with 2.5mm2 wire via WAGO 221-2411 inline splicing connectors. I then measured the increased resistance of the additional cable length and adjusted the values in the BMS configuration for cells 1 to 9.
With these inline connectors I am now able to disconnect the blocks from each other so I can move them around independently, if needed.
On the BMS, I connected a USB RS-485 TTL adapater with a USB extension cable which leads to one of the USB ports of the Victron Cerbo GX. With the help of dbus-serialbattery and BatteryAggregator I can control the DVCC settings in Venus OS.
The rest of the build is, as I already mentioned, pretty much like the 8s build.
Revision 1
Here are some images of the completed build of revision 1.
16s Battery top view16s Battery Block 1 main negative with BMS16s Battery Block 2 main positive with DC breaker
Revision 2
These are the changes I am currently making for the next revision:
add additional connectors for the balancer cables to further facilitate the disconnection of both blocks;
use 16mm2 M6 Klauke DIN46235 compression cable lugs for the connection of the main negative (cell 16) to the B- of the BMS (only relevant to the older JK-BMS), to be able to disconnect and potentionally replace the BMS;
use a WAGO 35mm2 DIN rail connector in the main negative block on cell 1/9 for the outgoing cable;
use cable glands on the external connections; (this allows for easy disconnection and re-building the block as an 8s battery);
use ratchet straps for compressing and mounting the cells to enable easier maintainability of the cells;
use Anderson PowerPole PP180 connectors instead of SB175, so I can use mounting plates for the PP180 and do not have dangling cables on the outside of the case (these connectors are expensive and increase the price of the overall build by roughly 60GBP).
Top balancing is a topic where a lot of people have written about – and now it is my turn …
It is common understanding to use a regular charger when top balancing, and one the one hand set the Charge Voltage Limit (CVL) to cellCount * 3.65V and use a reasonable current and wait for an extended period of time until all cells have reached their cell voltage maximum. And reasonable means to use a current where the BMS balancer keep up with and distribute the Amps across the cells without going into a Overvoltage (OVP) for a single cell.
So, instead of using a charger with a high supported current of at least 20A we now can use our regular Victron MultiPlus-II inverter/charger – with the help of Venus OS.
The reason why we cannot use a Victron MultiPlus-II out of the box as a charger is the fact, that is does not support fixed Amp configurations (only maximums). And after a while at a specific voltage the MultiPlus-II would enter Absorption phase and thereby reducing the current over time and stopp charging after a while altogether.
So with the help of a custom service (or Python script based on the dummyservice) we can create a battery monitor and set a fixed current.
I am not going into details on how to get a Venus OS device (Victron Cerbo GX or Raspberry Pi) up and running. There is plenty of information on the internet. Or have a look at this article where I briefly describe the setup of a Pi for our BYD battery system.
The *service* itself can be run from a shell: /data/VirtualBatteryMonitor/VirtualBatteryMonitor.py (I copied the script into /data to survive a firmware update).
And then the service should appear in the “Device List”:
Our service as a device to support a constant charge current
There are two more configuration entries needed:
Enable our service as “Battery Monitor” (Settings, System setup, Battery Monitor)
Our service configured as a “Battery Monitor”Enable DVCC
The actual parameters (charge current and maximum voltage) can be configured via dbus-spy from a shell:
Service parameters as shown by dbus-spy
The actually configured values are then shown under “Parameters” of the service (Service, Parameters):
Current configuration set to 5A constant charge current
Note1: There is no need for an actual integration of the BMS with the Venus OS.
Note2: Use at your own risk. Misconfiguring could potentionally harm the BMS, the battery or both.
Note3: Do not leave the script running / the battery charging unattendedly.
#!/usr/bin/env python3
"""
A class to put a simple service on the dbus, according to victron standards, with constantly updating
paths. See example usage below. It is used to generate dummy data for other processes that rely on the
dbus. See files in dbus_vebus_to_pvinverter/test and dbus_vrm/test for other usage examples.
To change a value while testing, without stopping your dummy script and changing its initial value, write
to the dummy data via the dbus. See example.
https://github.com/victronenergy/dbus_vebus_to_pvinverter/tree/master/test
"""
from gi.repository import GLib
import platform
import argparse
import logging
import sys
import os
import dbus
import os
# our own packages
sys.path.insert(1, os.path.join(os.path.dirname(__file__), "../ext/velib_python"))
sys.path.insert(1, "/opt/victronenergy/dbus-systemcalc-py/ext/velib_python")
from vedbus import VeDbusService
from vedbus import VeDbusItemImport
class VirtualBatteryMonitor(object):
def __init__(
self,
servicename,
deviceinstance,
paths,
productname="MultiPlus Charger",
connection="dbus",
):
try:
# Connect to the sessionbus. Note that on ccgx we use systembus instead.
logging.debug("Opening SystemBus ...")
dbusConn = dbus.SystemBus()
logging.info("Opening SystemBus SUCCEEDED.")
except:
logging.error("Reading system SOC FAILED.")
logging.debug("Opening dbus '%s' ...", servicename)
self._dbusservice = VeDbusService(servicename)
logging.info("Opening dbus '%s' SUCCEEDED.", servicename)
self._paths = paths
logging.debug("%s /DeviceInstance = %d" % (servicename, deviceinstance))
# Create the management objects, as specified in the ccgx dbus-api document
self._dbusservice.add_path("/Mgmt/ProcessName", __file__)
self._dbusservice.add_path("/Mgmt/ProcessVersion", "Unkown version, and running on Python " + platform.python_version())
self._dbusservice.add_path("/Mgmt/Connection", connection)
# Create the mandatory objects
self._dbusservice.add_path("/DeviceInstance", deviceinstance)
self._dbusservice.add_path("/ProductId", 0)
self._dbusservice.add_path("/ProductName", productname)
self._dbusservice.add_path("/FirmwareVersion", 0)
self._dbusservice.add_path("/HardwareVersion", 0)
self._dbusservice.add_path("/Connected", 1)
# Create all the objects that we want to export to the dbus
self._dbusservice.add_path('/Dc/0/Voltage', 3.4 * 16, writeable=True)
self._dbusservice.add_path('/Dc/0/Current', 5, writeable=True)
self._dbusservice.add_path('/Dc/0/Power', 3.4 * 16 * 2, writeable=True)
self._dbusservice.add_path('/Dc/0/Temperature', 15, writeable=True)
self._dbusservice.add_path('/Dc/0/MidVoltage', None)
self._dbusservice.add_path('/Dc/0/MidVoltageDeviation', None)
self._dbusservice.add_path('/ConsumedAmphours', 123, writeable=True)
self._dbusservice.add_path('/Soc', 75, writeable=True)
self._dbusservice.add_path('/TimeToGo', None)
self._dbusservice.add_path('/Info/MaxChargeCurrent', 5, writeable=True)
self._dbusservice.add_path('/Info/MaxDischargeCurrent', 0, writeable=True)
self._dbusservice.add_path('/Info/MaxChargeVoltage', 3.65 * 16, writeable=True)
self._dbusservice.add_path('/Info/BatteryLowVoltage', 2.75 * 16, writeable=True)
self._dbusservice.add_path('/Info/ChargeRequest', False, writeable=True)
self._dbusservice.add_path('/Alarms/LowVoltage', 0, writeable=True)
self._dbusservice.add_path('/Alarms/HighVoltage', 0, writeable=True)
self._dbusservice.add_path('/Alarms/LowSoc', 0, writeable=True)
self._dbusservice.add_path('/Alarms/HighCurrent', 0, writeable=True)
self._dbusservice.add_path('/Alarms/LowCellVoltage', 0, writeable=True)
self._dbusservice.add_path('/Alarms/LowTemperature', 0, writeable=True)
self._dbusservice.add_path('/Alarms/HighTemperature', 0, writeable=True)
self._dbusservice.add_path('/Capacity', 156, writeable=True)
self._dbusservice.add_path('/CustomName', "Virtual Battery Monitor (%/V/W)", writeable=True)
self._dbusservice.add_path('/InstalledCapacity', 280, writeable=True)
self._dbusservice.add_path('/System/MaxCellTemperature', 15, writeable=True)
self._dbusservice.add_path('/System/MaxCellVoltage', 3.4, writeable=True)
self._dbusservice.add_path('/System/MaxTemperatureCellId', "C5", writeable=True)
self._dbusservice.add_path('/System/MaxVoltageCellId', "C2", writeable=True)
self._dbusservice.add_path('/System/MinCellTemperature', 15, writeable=True)
self._dbusservice.add_path('/System/MinCellVoltage', 3.4, writeable=True)
self._dbusservice.add_path('/System/MinTemperatureCellId', "C6", writeable=True)
self._dbusservice.add_path('/System/MinVoltageCellId', "C3", writeable=True)
self._dbusservice.add_path('/System/NrOfCellsPerBattery', 16, writeable=True)
self._dbusservice.add_path('/System/NrOfModulesBlockingCharge', 0, writeable=True)
self._dbusservice.add_path('/System/NrOfModulesBlockingDischarge', 0, writeable=True)
self._dbusservice.add_path('/System/NrOfModulesOffline', 0, writeable=True)
self._dbusservice.add_path('/System/NrOfModulesOnline', 1, writeable=True)
self._dbusservice.add_path('/System/Temperature1', 15, writeable=True)
self._dbusservice.add_path('/System/Temperature2', 15, writeable=True)
self._dbusservice.add_path('/System/Temperature3', 0)
self._dbusservice.add_path('/System/Temperature4', 0)
# === All code below is to simply run it from the commandline for debugging purposes ===
# It will created a dbus service called com.victronenergy.pvinverter.output.
# To try this on commandline, start this program in one terminal, and try these commands
# from another terminal:
# dbus com.victronenergy.pvinverter.output
# dbus com.victronenergy.pvinverter.output /Ac/Energy/Forward GetValue
# dbus com.victronenergy.pvinverter.output /Ac/Energy/Forward SetValue %20
#
# Above examples use this dbus client: http://code.google.com/p/dbus-tools/wiki/DBusCli
# See their manual to explain the % in %20
def main():
logging.basicConfig(level=logging.DEBUG)
from dbus.mainloop.glib import DBusGMainLoop
# Have a mainloop, so we can send/receive asynchronous calls to and from dbus
DBusGMainLoop(set_as_default=True)
pvac_output = VirtualBatteryMonitor(
servicename="com.victronenergy.battery.VirtualBatteryMonitor.ttyO1",
deviceinstance=0,
paths={
"/Ac/Energy/Forward": {"initial": 0, "update": 1},
"/Position": {"initial": 0, "update": 0},
"/Nonupdatingvalue/UseForTestingWritesForExample": {"initial": None},
"/DbusInvalid": {"initial": None},
},
)
logging.info(
"Connected to dbus, and switching over to GLib.MainLoop() (= event based)"
)
mainloop = GLib.MainLoop()
mainloop.run()
if __name__ == "__main__":
main()
For my use case, this really helps as now I have a powerful charging (3 * Victron MultiPlus-II 48/5000/70-32 in parallel) that can charge the battery initally with 140A+ and later with smaller and smaller currents until all cells have reached their maximum voltage.