Along with some others I am waiting for Raspberry PIs to become available again (while *not* supporting these overpriced resellers on eBay, Amazon and elsewhere).
Luckily, back in 2016 (or was it 2015?) I bought two Raspberry PI2 Model B Rev. 1.1 with 1 GB RAM and an Edimax EW-7811Un WLAN adapter. At that time the PI did not have built-in WLAN and it was said that the original Wifi dongle Raspberry Pi WLU6331 did not work with all distributions.
We had some plans what to do with the Pi – but they never made it into reality. Instead, they went into the locker.
Edimax EW-7811Un WLAN adapter
Fast forward into the future, the whole world experiences stock supply shortages and a Raspberry Pi (now in its 4th generation) is hard to get hold of.
As I am building a couple of batteries mostly with JK-BMS I need a RS-485 connection to my Victron inverters to control charge and discharge currents. Except for the GX versions of the MultiPlus-II and EasySolar-II that _sort of_ support RS-485 (not out-of-the-box, but) in a single box, I always need an additional device like a Cerbo, BBB or: a Raspberry Pi!
But as I already wrote: I did not want to support resellers with their pharmacy pricing, so I had a look at the Venus OS compatibility list and saw that – surprisingly – even a Pi 2 is supported. So, I went looking in my shelves, lockers and other places to find these rusty old Pi 2s – and after a couple of weeks I actually found them (when I was looking for something completely different). Anyway, here they are – but only with a single GB of RAM.
Nostalgic side note: yes, there were times where I would have left out the word “only” …
I was not to sure if Venus OS would run on it. And if – how quick. It was time to find out …
Installation was straight forward: following Getting Started was all it needed. I connected the Pi to my local wired network for that purpose and makes updating and installing software much easier. At the very start I also enabled superuser and SSH access.
Note: There was a minor issue or whatever one might call it. After the install of v3.00 (via the SD card) I had the device check for an update (which at that time should not have been available). But for whatever reason, I was offered to update from v3.00 to v3.00. I did that and it worked and after that no more updates were recommended.
From then on, installing additional packages worked without an issue – but took considerably longer than on a Cerbo, Pi 4 or even the GX in the EasySolar.
One thing just seemed to be missing. Having the Pi to act as a Wifi access point (and router with DNS and DHCP). Why would I want this?
Some of my batteries are just standalone installations in a car, trailer or other machinery. And external network is not always available. And I do appreciate the comfort of wirelessly connecting to the GX – just as I am used to when using my EasySolar-II GX.
And as nearly always: I was not the first one to ask for such a feature:
After a reboot, I could successfully connect to the access point and VictronConnect immediately found the “Cerbo”:
Raspberry Pi 2 Model B Rev. 1.1 as a Victron GX device while acting as an access point
After I enabled the access point (or tether option) I could no longer see or access any other SSIDs from the Pi:
WLAN client is deactivated when running an access point
Running ifconfig gave me this output:
ifconfig output after enabling the access point
Certainly, I was interested in the performance or resource consumption of the Pi 2. As it turned out, the UI really took some CPU but the additional network services themselves were not quite as hungry: idle floats between 71% and 92%.
Pi 2 running with a RS-485 adapter and enabled access point
So, this is it. My investment of roughly 35$ in 2016 (even with intereste rate) really paid off. I have a working GX device that does everything I want – plus an access point – all in a single box.
Pi 2 running with dbus-serialbattery, BatteryAggregator and access point
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.
Out of the box the MultiPlus comes preconfigured with a pair of 1m35mm2 (2AWG) welding cables (and as a side note: with unusually thin M8 cable lugs).
When connected to a 12V battery based on 4s Eve LF280K cells, the maximum current drawn can go beyond the recommended 0.5C rating – especially when the cell voltage decrease under the nominal 3.2V or the total cable length is longer than 1m. Using a larger inverter or smaller cells will make things even worse.
And when we look at Victron’s Recommended battery cables document, we see that they are recommending 50mm2 for currents up to 150A anyway (for cable lengths of up to 5m).
For a 1m cable the theoretical voltage drop is within their recommended range of 0.259V. But they explicity state that resistance leading to additional voltage drop due to contacts is not calculated into the recommended cables size.
Already a cable size of 2m will lead to over 3% and 0.3V voltage drop when the cell voltage is only 4* 2.6V = 10.4V (and by default raise a “Low Voltage Alarm” on the MultiPlus). And even a cell voltage of 4* 2.75V = 11V is close to 3% and over the recommended threshold (of course, calculation is based on full inverter load of 1600VA). Besides Victron explicitly recommends a voltage drop of under 2.5% in their Wiring Unlimited document.
So why is Victron fitting the inverters with only 35mm2 cables? Especially since they are using welding cables that are only rated up to 60°C. I do not know.
But I do know, how I can fit an additional 35mm2 pair into the inverter and minimise a potential heating problem.
Adding a second pair makes particular sense at least in my case, as I am using a JK-BMS and Eve cells that both come with two M6 terminals per connection point. So running two cable pairs to battery and BMS saves me from using a bulkier and stiffer 70mm2 cable that I would have to split at the BMS and main positive cell anyway. And with that, I can still use the Anderson SB175 connectors with regular housing and 1383 wire contacts and without having to resort to 2/0 housings and 1328G1 wire contacts.
The inverter comes with 30mm holes in the front panel where the supplied cable is fitted with an M25x15mm cable gland (side note: why are they using IP68 glands when the whole inverter is only rated at IP21). Eland H07RN-F 35mm2 cable has a diameter of 14.6mm, so actually two of these cables do not fit through the holes at once.
But as the cable lugs are actually that long that they stick out of the chassis the required diameter is 2* 12.5mm = 25mm which is just the size of the hole. When wrapped in heat shrink we need some more space. And certainly we want a little bit of head room, so the cables do not scratch against the metal when moving.
So, the M25 holes had to be enlarged slightly to make space for the double cable lugs as seen on the picture below. I used a Hilti GDG 6-A22 grinder for this. I covered the inverter to prevent metal splices and dust getting inside (board, circuity) of it. And I added extra insulation around the cable lugs to prevent them cutting into the metal.
Bottom side of MultiPlus with enlarged holes and extra cable insulation
Mounting the cables to the connection points is done with two Klauke M8 35mm2 DIN 46235 compression cable lugs (back to back).
Note: the compression cable lugs from Weidmüller will not fit, as their connection plate is too long.
Instead of the factory supplied washers, spring locks and nuts, I use M8 serrated washers and lock nuts. As the negative connection point (which is directly under the 250A MEGA fuse) is around 2mm higher than with only one cable lug, I added an additional (copper) washer under the fuse terminal to make more space.
I could cover the original bolts with insulation tape to prevent accidental contact with the chassis when squeezed (but this is something that could have happened even before).
Victron MultiPlus Compact 12/1600/70-16 with dual 35mm2 battery cables
Now we have a 2* 35mm2 = 70mm2 connection to our battery as seen below.
2* 35mm2 connection between battery and inverter
So the voltage drop over the whole cable (1.5m from invert to battery with 70mm2) should be around 114mV:
Voltage drop at different cell voltages
So as it seems, the main difference between the larger and the smaller cable is the power loss (17.22W vs 34.44W at full power or 15W vs 30W at 0.5C). So all in all we save nearly 0.84% battery capacity per cycle with the thicker cables (which is 5000Wh over the whole cell life) – probably less than we spend on the cables and lugs, the labour and the time to do the calculation and writing up the article …
For this build, I planed all the boards after cutting, before putting in the cells. With this, I hoped to minimise the chance of any particles on the board damaging the cell insulation.
And for the small board at the short side of the case, I did also use 20mm plywood, but planed it several times until it I could just slide it in.
This is how the wooden case looks with the cells and insulation boards (shown in red):
Top view: battery cells with depicted insulation boards (shown in red)
Note: when using a JK-BMS I found it important to have the main negative connection point on the upper left (or lower right). Only with this orientation it was (relatively) easy to connect the cell to the BMS.
BMS connected to cells
It needed some fiddling to get the main negative cable pair to the BMS and the main positive cable pair out of the frame, as we can see from the image above.
The connection to the individual cells are fed through WAGO 221-2411 2 conductor inline splicing connectors. The holes into the top board were done with a forstner bit and a jigsaw. This version of the BMS can be fixed with four screws to the board (so no need for wire straps as with the 24s version).
Again, instead of a display I just used the pluggable power button that is connected to the display port of the BMS to power on and off the device.
In the end, I added Anderson SB175 connectors and 1383 (2AWG) contacts to both pairs and connected them to the inverter.
cell contacts were secured with M6 serrated washers and M6 16mm steel bolts;
BMS threads B- and P- were secured with M6 lock nuts to M6 16mm steel bolts (with the bolt upside down);
cell wires from the BMS were fitted with uninsulated ferrules;
cell wires on the positive cell poles were fitted with ring lugs and a 2.5mm2 hookup wire;
I added handles to the SB175 connectors to facilitate disconnecting the cable pairs;
I added dust covers to the SB175 connectors;
all compression cable lugs and the SB175 were crimped with a Hilti NUN54-22;
all cable lug connections and Sb175 were heat shrinked;
I added 2*35mm2 cable pairs with SB175 connectors to the inverter by replacing the existing 35mm2 welding cable with M8 lugs (you still need M8 lugs on the inverter positive and negative terminals).
Things to improve next time
Mount the SB175 connectors to the outside of the container With this the lid can be closed and the cables and BMS are better protected against pulling;
add 3A inline fuses to the cell wires;
use 45° angled cable lugs for main positive and main negative to make it easier to get the wires routed outside the container;
feed an additional wire pair for the voltage sensor from the main positive outside the container to be able to connect it to the inverter (but I am not too sure about this, as I think the voltage drop on the 2*35mm2 connection is neglectable – it might better to add a temperatur sensor to the main positive):
add a Victron MK-3 USB-C interface with RJ-45 cable into the case (to be able to restrict AC power on the inverter).
What did it cost?
Cost calculation for the 4s battery including case and inverter
Summary
This case is not as complete as the 8s version – due to its form factor. Neither the inverter has an RCBO nor the battery has a DC MCB. This has to be added separately (incurring additional cost and space). As written above, the 4s version is more like a traditional battery. However, the form factor is quite compelling; 3.5kWh in 400mm x 300mm x 325mm case. Especially in combination with the compact edition of the Victron MultiPlus. And the cost (as always without labour) is very reasonable, as well.
The inverter delivers 1200W constant power – in my opinion, enough for a small and mobile electricity build. Runnig a Krups Inissia Nespresso machine is not a problem, and boiling water with our 1000W immersion heater neither. Worst case, you could also run a 300W infrared panel heater for more than 11 hours.
One drawback of the inverter is probably the relatively small charger. With 70A at 12V it can only charge the battery with around 840W. This is certainly not the problem of the battery which would support charging up to 1344W.
The other day, I received my Victron MultiPlus Compact 12/1600/70-16. One of the first steps to do upon commissioning was to update the firmware. In my case from v481 to v502.
With my Windows PC running the latest VictronConnect App and a MK3 to USB-C Interface, I connected to the MultiPlus and enabled the advanced settings by entering the infamous zzz password (which you officially can only get from an official Victron training or distributor or simply by searching the internet).
I was offered to install 2606502.vff to which I happily clicked OK. So it seemed, I was running on a new microcontroller with 230V (hence 26) and really had a MultiPlus Compact 12/1600 (06). But I did not know this at that time.
After a couple of seconds into the update process, the operation stopped by telling me something failed. And after a restart, the only thing I could see was the yellow LED constantly flashing as soon as power was connected to the device and regardless of the main switch position.
Victron MultiPlus Compact flashes yellow after failed firmware update
When I tried to reconnect with the VictronConnect app, the detection phase took very long – but the MultiPlus was not recognised.
VictronConnect trying to detect the MultiPlus after the failed firmware updateDetection unsuccessful after the failed firmware update
Even when I tried the “Force detection” option (which is intended to be used after a failed firmware update) no usable result was yielded.
“Force detection” did not work either
So, then I resorted to VEFlash (which is deprecated and has to be selected explicitly when installing the Victron tools on Windows).
But this did not work either, as it could not find anything behind the MK3:
VEFlash failed to recognise the MultiPlus
However, having a closer look at the hints VEFlash gave me before the recovery I was confused that VEFlash asked me to unplug the AC power source. How would I be able to update the firmware? Via DC? And why would it matter anyway which power source was connected?
VEFlash hint at not using AC power on a MultiPlus Compact
Using a Blue Smart Charger as a DC power source for the MultiPlus
As soon as I connected a Blue Smart IP65 Charger in “Power Supply” mode to it (and configured a voltage of 14.4V) the “Force detection” option in VictronConnect worked.
Note1: I did not alter any of the DIP switches as recommended by VEFlash.
In one of our previous articles, we stated that, due to power, weight and size, we would rather go for a 24V 8s (280Ah) battery configuration instead of 48V 16s.
However, there are relatively few battery cases for 8s battery packs that fit our Eve LF280K cells. And they are pricey! So, instead of spending a 500+ USD per case, I was thinking to repeat what others have done before me: build a case myself. And certainly, I took inspiration from variousothers and commercialkits.
So first, here are my requirements:
Case must fit 8 EVE LF280K cells including all electronics and cabling such as BMS, MCB, GX.
Battery must be pluggable to the inverter via Anderson SB 175 connector. Check: why not use Amphenol sockets/plugs?
Case must not absorp moisture/liquids that would build up from below.
Case must have no external display or buttons (i.e. solid walls).
Cells must be insulated against each other.
Cells must be fixed to the case so the do not fly around when the box is moved.
Battery status should be readable from the box itself (optional).
The case should be usable independant of any BMS.
Battery is meant to be used 1:1 with a single inverter.
Battery must have an integrated MCB that can also act as a mains switch.
Basic considerations
Zerobrain – LiFePO4 – ALLES und noch viel mehr über Lithium Akkus
Of course, there are more questions to be answered. And I took a lot of inspiration and advice from the discussion above and came to these conclusions:
Fire resistance The cells should not involve themselves in a “chain reaction” if a cell becomes faulty. The critical temperature of the cells starts at around 90°C. If something is really getting sideways, the resin board will not withstand any of that at all. But as the battery case will be contained either within an aluminium container or directly inside in an aluminium box, I will take that as a mitigation (only the brave).
Moving and lifting the cells should have a weight of roughly 8* 5.5kg = 44kg; the 20mm resin board weight roughly 3.34kg (13.67kg/m2); BMS, MCB, cables, lugs etc might add another 3kg; the Rako(R) box has a weight of 2.35kg; resulting in a total weight of 52.69kg – which certainly is over the official limit of 32.5kg to be lifted by a single person – but still doable if one has to. For moving the battery box around I have a trolley where the RAKO box just fits on.
Compression Initially I thought, I would *have* to compress. But according to the above video, it seems the is only needed (or recommended) during the initial charging of the cells (to minimise gas bubble inside the cells). And from then on, it is not *required* for a safe operation of the battery, but instead might contribute to an extended cell life – how much? we do not know. So, I will probably only slightly compress the cells by placing them firmly into the frame inside the box.
Layout
So, I started with some sketches in FreeCAD and came up with the follwoing layout.
It should be possible to fit 8 EVE LF280K batteries in a 600mm x 400mm x 325mm RAKO box and still have space for the electronic components. Inside the plastic box there is a wooden structure, so the weight of the batteries is better balanced (the plastic floor might like this).
Batteries will be insulated against each other and fitted with sponge strip. Internal cabling will be fed through the lid where the BMS is mounted on. Cables to the outside (VE.Bus, 2*35mm2 DC, 2* 3-core AC) will be fed through the side wall.
Empty utz RAKO box 600mm x 400mm x 325mmBox with batteries and electronic components on topView of frame with cells inside box
BMS Cabling
I am going to use a 150A JK-BMS for the battery which comes with 2 pairs of 7 AWG wiring (approx. 10.5mm2 per wire). As I am going to have a mximum current of 150A (at 20V; or 117A at 25.6V) this will result in a voltage drop between 0.1% and 0.2% on the BMS cable. For the rest of the cable to the battery I will use a 50mm2 that results in an additional max 1% of voltage drop. The actual connection to the batter will be done via an Anderson SB 175 connector.
The individual BMS cell wires will be fed through a WAGO TOPJOB S 3-conductor through terminal block (with a separate fuse) (or I use a WAGO 2-conductor fuse terminal block – don’t know yet). With this I can easily connect and disconnect the individual wires from/to the cells. And with the 3-conductor terminal block if needed, I can later add an additional balancer to the system without having to rewire the cells either.
The cells will be wired in a regular 8s cconfiguration to the BMS. Both voltage sensors will be placed in the middle of the batteries.
Bus bars
My Eve LF280K cells have 2 M6 thread for each pole. The bus bars that came with the cells (cross section is 2mm * 20mm) were not flexible and only suitable for connecting the poles on the long sides. However, with my 8s configuration, I need 4 connections on the short side and 3 connections on the long side of the cells.
So, I created my own bus bars with the help of 2* 35mm2 DIN46235 M6 cable lugs per connection.
Dimensions: short side 30mm + 29mm; long side 30mm + 80mm (cutting at 30mm for the cable lugs to be crimped).
The Build
So, I with this information I started the actual build. And certainly I made some adjustments to the layout. This is what it looks like:
Case with all the cells on one side
As you can see, I moved the batteries to one side. With that I have more space on one end to install a MCB and leave room for cables.
Updated drawing with cells on one sideWago fused terminal blocks for connecting the indivisual cell wires
Connection of the BMS to the cellsCase with cells covered
The BMS rests on a board that can be fixed to the side walls. I intentionally left some space between both boards to have room for the temperature sensors. On the right hand side, we see the BMS wires connected to the terminals. With this it is easy to see which cable goes where. I could have cut the BMS wires. Maybe I will do this later.
As the DC cables were quite stiff, I used a screw to support a 90° angle on the cable going out of the box. The screws are fitted with electrical insulation wire. Let’s see how long this holds up.
Victron MultiPlus-II 24/3000/70-32 with Neutrik connectors
The inverter now has Neutrik panel connectors. I used a 24mm and 29mm hole saw for this. With this I do not have AC cables hanging out of the inverter. The connectors are rated for 16A (VDE) or 20A (UL). I set the maximum current on the inverter settings (as the inverter supports up to 32A which is beyond the capabilities of the socket).
Of course, the DC cable is still present. Maybe I can install a socket for that as well.
Inverter with battery
Above you see the “final” case. The battery is connected via Anderson SB 175 to the inverter. The battery cables fits into the case when not in use.
Not seen on the picture. The inverter has been fitted with a Siemens 16A RCBO for AC out. And inside the case is a non-polarised Thomzn 125A DC MCB.
The BMS charge and discharge current is set to 125A (though the inverter only supports up to 70A, and in reality only seldomly charge with more than 63A).
The Specs
With this inverter/battery duo, I have a system with a nominal power of 7168Wh that can deliver 2400W of constant power (below the 0.5C rating of 140A). Down to a cell voltage of 3V I can make use of the full power (then running at 125A). As the current minimum cell voltage is configured to 2.55V I always have a minimum power of 2550VA (or 2040W). But in reality I have never seen all the cells at the minimum voltage at the same time.
The case weighs around 51+kg and the inverter is around 20kg.
The maximum charge current of 70A @24V result in a maximum charge power of 1680W. So theoretically it takes slightly over 4h to fully charge the battery. In reality we can expect the battery to be charged around 20% per hour. A real life test shows that within 3h we can charge from 20% to 85%.
The Aftermath
What went well, what went wrong? Here are some of my thoughts:
The case looks and feels solid when lifted. So I really think the weight will not by a problem, though the RAKO box is not certified for that weight. I think, I could have used even thinner plywood and that would have saved some additional space.
Moving the cells to the right made more space on the other side, so I was able to fit the DC cable with the Anderson plug into the case as well (in addition to a MCB).
Creating the bus bars was relatively easy. The cable is still quite stiff. And the longer bus bars bend over the edges. That is why I had to add an extra piece of board to the sides.
The JK BMS wires are very fine strained and hard to get into the lugs (it literally took me over an hour to connect the 4 wires).
The addition to the fused terminal blocks makes the cabling much cleaner. But the WAGO terminals are not cheap.
Unfortunately, with my JK BMS the cables are soldered to the BMS and cannot be replaced. I think 2* 7 AWG is relatively small/thin. I would have preferred 2* 35mm2 (as for the bus bars). With the new JK BMS model there is the option to connect my own cable to the BMS.
This version of the BMS comes with a power button, making it much easier to turn it on than before. No need for a DC power source with higher voltage than the cells.
Fitting the cells into the case (with some compression) was easier than I thought. I used some insulation board between the rubber and the board to push it between the frame and the cells.
I actually do not use the RS485 option for this standalone installation. The BMS seems to take care of the the charge and discharge currents. And if I have really have to know the SOC, I connect via bluetooth to the BMS directly. And I only use the VE.BUS connection with the VictronConnect App when I want to change or limit the AC input current. For this I use the VE.BUS bluetooth dongle.
Having the Neutrik connectors makes it much easier to disconnect the inverter when moving.
Regarding the Neutrik panels on the inverter. I could not fit them in the holes where the AC wirng would normally go through, as the cable clamps were in the way. So I had to use the space between the ventilation slots. It is quite fiddly to get them screwed onto the cover. I used a 24mm and 29mm hole saw with M3 x 20mm hex bolts and M3 hex nuts for it.
The integrated RCBO saves me from having a separate elecitrical panel.
Maybe I change the DC connectors to Amphenol sockets as the SB175 is quite bulky. (update on this: probably not; they are quite expensive and only have 50+ connection cycles guaranteed; plus, it is not specified if they can be switched under load)
The cost
Here is a rough estimate of the accrued cost for this build:
Estimate for the material used for this build
If I only count the cost for the case (excluding cells, inverter, BMS) I come up with approx. 400CHF/450USD/350GBP/400EUR. So it seems, that I could have bought a prebuilt case for nearly the same amount of money, right? True. But … with this case, I have the exact dimensions that I want and with much less weight. And with the exact components I want. Plus, I can repair (if needed) everything by myself, as I completely know how it was built.
Let’s see what I will change on the next case I build.
Updates
Here are some hints and thoughts that arose after I wrote the article.
Getting the cells into place I used a 12mm marina plywood with an extra sheet of insulation board, so the board could “slide” (be pushed) between the frame and the cell. I used a planer with a depth of 0.5mm to cut away just as much so I could just firmly squeeze it in.
Frame and any wooden part in general It is a good idea to grind the surface of the wood facing the cells to remove any pieces sticking out that could damage the very thin insulation of the cells.
Insulation boards At first, I cut the insulation boards from a 250mm x 500mm board. I found it the easiest way to use a drawing pin to mark the cut and then bend it bothways. But this means we have to do 5 cuts for getting 3 boards – that takes time. So, I now have precut 170mm x 200mm insulation board with rounded corners. Much easier to handle.
Fixing the M6 bolts to the contacts I used an insulated torque ratchet wrench (4Nm) to tighten the bolts to the contact.
For the cable lugs I used Klauke M6 35mm and 16mm DIN 46235 cable compression lugs.
For the cell voltage sense cable I used 2.5mm wires (I know, 1.5mm would have been more than enough, but it was the only wire size I had). The JK-BMS supplied voltage sense cables were fitted with uninsulated ferrules, so they would fit into the WAGO 2002-1681 terminal fuse blocks.
Regarding cost The other day, I saw Pylon US3000 3.55kWh Lithium Battery being sold at CCL Components for 860.06GBP (excl. VAT). This includes a 19″ rack metal case, a BMS, connectivity and the cells and equates to roughly 269 GBP/kWh. Quite a bargain! Why making your own battery (case) any more?
I will replace the 24s BMS with an 8s version so I can use 35mm2 cable all along. Plus, I will use two pairs of 35mm2 cables from the inverter to the battery. That also means, I will have 2 separate 63A DC MCBs instead of a single 125A MCB.
Cutting the plywood
I found web site that offers help in cutting rectangles in a more efficient way that I could come up with: Cut list optimiser. The board for the case could be cut like in the image shown below.
The other day, I connected my BYD Battery-Box Premium LVS 8.0 to a Victron MultiPlus-II 48/3000/35-32. Here are the steps I took to do it and some errors I ran into.
The Battery-Box needs to communicate via CAN with the inverter. And as Victron inverters do not come with a CAN port by default (unless you go for a MultiPlus-II GX or EasySolar-II GX) we need a GX device. Originally, I wanted to use my Victron Cerbo GX for that, but since we moved into the caravan the device is gone missing. Luckily last year, I supplied myself with a couple of Raspberry Pis (at least model 3and 4 are supported) that could run a Venus OS and act as a GX device. And as I was not the first one doing that, I thought it would be just too easy – well, it was easy after I did everything right.
Normally, Victron requests to use a VE.Can to CAN-bus BMS Type A cable to connect to a BYD battery. This is actually an ordinary CAT 5e network cable with RJ45 connectors where only the relevant CAN pins (and GND) are connected.
In order to screw the wires to the CAN hat terminal, I used uninsulated ferrules. Otherwise the Cat 5e wires would have been too soft and light for the terminal.
Installing Venus OS on the Raspberry PI 4
For the Raspberry PI 4, I followed the documentation and installed the standard (and not the large) image. At that time, v2.93 was the newest version (see here for directory of all versions). I uncompressed it and used Win32DiskImager to write the OS to a MicroSD card (all done on a Microsoft Surface Go2 running Windows 11).
Note1: at first, I did the install with a Raspberry Pi 3 Model B V1.2 which also worked fine. However, the CAN device on the Victron UI then did not show any packets but worked without problem.
Note2: The Raspberry Pi 4 is a model B Rev. 1.5 (I mention this, as I saw comments that indicated that there might be a difference between different revision from 1.2 onwards).
Note3: I activated the “Mobile” tile to be able to change the charge current via the overview screen.
The CAN driver then had to be installed separately. As I did not have direct internet access from the Pi, I used the offline install method with a USB memory stick.
As written in the documentation, I copied the compressed installation files as venus-data.tar.gz to the root of the USB drive and restarted the Pi. To verify the automatic installation was successful check if there is a new menu item Package manager at the end of the Settings list. If not visible check if you can find SetupHelper in /data. You can always manually copy it from the SDCard (use mount to see where the card is mounted) and then run setup yourself. I did a reboot after every package.
New menu item in Settings after installation of SetupHelper
Same procedure here. Copying the compressed installation files to the SDCard as /venus-data.tar.gz. Then run the package installation manually if for whatever reason the automatic install does not succeed. See below what the package manager should look like after the installation of both packages.
List of active packages in Package manager
Installing the driver
Configuring the driver had to be done from the terminal. There was a minor issue for me which I did not get right the first time. When asked to install an interface via the i option I actually had to type in a hat. I named the device hat0 and after the reboot it showed up as hat0 (can8) can8 spi0.0. In my case it was the “Waveshare 1-channel CANbus Hat 12 MHz crystal” (check the imprint on the silver part on the hat to see the crystal speed).
Configuring CAN bus
There is really not much to configure. The only option under “Services” is to set the communication speed which is 500kB/s for BYD. If the CAN adapter does not show up make sure the correct type has been selected in VeCanSetup. For me it just worked out of the box.
CAN hat showing up in ServicesSetting the CAN speed for BYD Battery-Box BMUConfigured CAN bus
Before the BMS is connected the CAN should show up as ERROR-PASSIVE. As soon as the communcîcation worked it changed to ERROR-ACTIVE.
CAN bus ERROR-ACTIVE with actual traffic
Note: When I tried with the v2.93 on the Raspberry Pi 3 the RX/TX counters were always empty (but nevertheless worked). Via ifconfig the packets were correctly shown. But with the Pi 4 traffic was shown on the UI right from the start.
CAN bus traffic via ifconfig
I did not connect the CAN cable at that point but configured the Battery-Box and the inverter first.
Commissioning the inverter
I used a USB MK3 adapter with an RJ45 Cat 5e cable connected to the VE.Bus of the inverter to configure the MultiPlus.
I used VEConfigure 3 and VictronConnect (to be able to configure via VictronConnect I had to use the zzz password to get out of the read-only mode).
First, I updated the firmware of the MultiPlus via VictronConnect and then continued with VeConfig.
Basically, I set the inverter to off-grid and did not enter a country code. For the battery type I selected “Lithium Iron Phosphate” and accepted the default settings. I set the “AC current limit” to a maximum of 20A (the maximum my generator could handle) and activated the option to have it overruled by “Remote” (which can also be done via the GX Remote Console or VictronConnect).
Setting AC current limit via GX remote console
I also activated DVCC to later have the BMS tell the inverter when to charge and how to discharge. This was pretty much it. So I connected the MultiPlus via the VE.Bus and the MK3 cable to the Raspberry where it showed up instantly.
Inverter shows up after connecting VE.Bus to the Raspberry via MK3
Commissioning the Battery-Box
After assembling the battery which conisted of only stacking both battery modules on top of each other followed by the PDU on the very top I connected the BMU via the grey RJ45 to the PDU. After turning on the top most battery the BMU started as well and I was able to connecto to the WiFi of the BMU from the BeConnect app (Android or Windows both worked for me, the latter actually showed more information).
Via the app I pre-downloaded a current firmware and after switching to the BYD access point I applied the firmware (actually two different firmwares). After some waiting the new firmware had been applied and I could configure the basic settings: inverter manufacturer, number of battery modules.
At this stage I connected the 35mm2 cables from the battery to the inverter. I bought the cable preconfigured with the battery. And I used a Littelfuse JLLN-125X (class T) as a fuse between both devices.
Connecting the battery to the Venus OS
And then I connected the BMU to the GX. After some seconds, the inverter clicked and started charging. Essentially, DVCC turns on automatically (even if turned off before) as soon as the CAN communication is established.
In the GX overview the battery appeared and gave some additional information (see next section for details). All parameters between battery and inverter were exchanged automatically.
Things I noted
The battery turns itself off after a while when no communication via CAN is possible. This behaviour is described somewhere in the BYD manuals.
Charging the battery does not work when no CAN connection can be established. The inverter stays in “Absorption” mode with a current of 0A.
A more detailed description of the pin layout can be found on the BYD manuals. See images below.
The GND pin is not required for communication between the BMU and the VE.Can GX. Only BLUE for CAN-H and BLUE-WHITE for CAN-L are going into the CAN hat.
In addition to the official web site bydbatterybox.com the web site eft-systems.de provides additional information and downloadable documentation.
When charging the Battery-Box for the first time, I eventually reached a 100% SOC. Until that point the charge current stayed nearly constant at around 30A (Bulk). It decreased to around 1.2A and the inverter turned to “Absorption” but never stopped charging. At some point one of the cells reached a voltage of over 3.7V which resulted in a warning on the GX. Nevertheless, charging continued. I manually switched off the charger after the second time I received a warning due to high cell voltage. I would have expected to have the inverter automatically stop charging at a 100% SOC. Maybe the BMS only measures the charge voltage limit (CVL) which is defined as 58.4V and not the individual cells?
The cells in a battery were not really well balanced (delta >= 100mV). I would have expected a better balancing. Actually, I do not know if the BMS has a balancer at all. I could not find anything in the documentation.
Each LVS 4.0 has a capacity of 78Ah @ 51.2V = 3993.6Wh. The GX shows this information in the “Details” item within the battery. I could not find this information in the manual.
The BYD manuals state, that the lifetime of the battery can only be achieved at 0.2C, which limits a single LVS 4.0 to 798.72W (or 1597.44W for a LVS 8.0) – this is a ridiculous small amount.
Charge current was initially restricted to 38.4A by the battery, only after a day or so, the charge (CCL) and discharge current (DCL) went up to 128A. In my case the inverter only support 35A max, so no issue with that.
Startup sequence Start top-most battery first by pressing the power button for a couple of seconds; then start the BMU if not automatically started; next start the inverter; then start the GX (in my case currently on the AC side).
Shutdown sequence Turn off the inverter; turn off the BMU; turn off the individual batteries (keep buttons pressed for a couple of seconds); GX turns off automatically.
Adding a CAN hat in VeCanSetup needs to be entered literally as a hat.
Though I set the AC charge current to 20A the inverter only drew 16A at most.
The WiFi of the BMU cannot be changed, nor the password.
BYD RS485 CAN pin layout, taken from the BYD BMU maualBYD to Victron CAN pin layout, taken from the BYD BMU manualBYD Battery-Box voltage and charge limitsSpecification of BYD LVS 8.0, taken from the BYD manuals
Future improvements
I want to connect the Raspberry to the DC side with a 48V/12V step-down converter and a 12V to USB-C adapter. Inbetween I want to add a power bank, so the GX can be configured even if all power sources are down.
Replace the CAN hat with a USB CAN adapter
Strengthen the connection of the CAN wire to the CAN adapter
All in all, the installation was straightforward. A couple of uncertainties are probably normal when doing this the first time. I would have expected more documentation (articles, videos) for this to be around. But I could not find anything for a BYD, Victron, VenusOS via Raspberry setup. Maybe others are only using a Cerbo GX?
The batteries are well built (all IP55) but extremely bulky and pricey. With around 400 CHF per KW this is more than 300% of regular LiFePO4 cells. But nevermind, lead and delivery times are in the magnitude of months.
I would have liked the BMU to be integratable into one of the PDU boxes. Now it is just hanging around separately.
Would I buy another Battery-Box? Probably not – too pricey. But good for starters. Plug and play when used with Victron and a Cerbo GX.
On our seemingly never-ending quest to the perfect “mobile home” and its electrical setup.
Once, someone told me the perfect vehicle for a mobile home would be a tri-fold:
a 20m truck when stationary;
a Unimog when off-road;
and a Porsche when on roads.
As it seems hard to get hands on such a vehicle we have tried different combinations over the years – with a few “failed” attempts such as our VW California T6 or the Hymer B-MC I WhiteLine.
So, recently we took a different tac and went for a trailer. A “König KHC303630” to be precise; which is a 2m high, 2m wide, 3.66m long sandwich cabin on a twin-axle trailer (with an overall length of under 5m). The idea was to have something more comfortable and spacious than our Hilux with the roof-top tent. If you want to get an impression of how this looks have a look at one of thesevideos.
Before we actually made the decision to purchase the trailer, we went to Trochtelfingen to see for ourselves. It was then when we decided to have the main battery system voltage different from the 12V standard.
Originally, I thought to have a 16s 48V system with Eve 3.2V 280Ah cells. However, the resulting weight would be over 80kg – without BMS, case or inverter. So, I thought about installing an 8s 24V system with a resulting nominal power of 7168W. And it seemed that such a system would still satisfy our requirements.
The mximum single load would be 2000W for a duration of up to 35min.
The sum of all 12V loads would not exceed 360W.
The total load would not exceed 2300W.
The Eve cells support 0.5C, meaning I could constantly draw up to 2800W (at 2.5V) and 4088W (at 3.65V) at 140A. However, as my largest DC MCB is only rated for 125A I could only use between 2500W and 2650W. But that would be still more than sufficient. And the Victron EasySolar-II GX 24/3000/70-32, the inverter which I had in mind for this installation, supports sustained loads only up to 2400W anyway.
So first determine, how many 24V connections do we need?
For the 12V system, I expect to use a 12 port Plus/Minus distribution:
Refridgerator
Bed
5* lights
12V socket for shower
4* 12V sockets
To convert the battery voltage to 12V, I opted for a Victron isolated Orion-Tr 24/12-30 converter. The whole 24V/12V converter will be able to be by-passed and directly connected to the 12V of the trailer, as well.
For minimum chargin on the road, I plan for a Victron Buck-Boost DC-DC Converter 50A. But as this would take more than 6 hours of driving to fully charge, the idea is to mainly charge via AC. However, the EasySolar can only charge with up to 70A. And in order to get closer to the maximum of 125A, I would add a Skylla-24/50 TG . Why I chose the Skylla-TG over the Skylla-I? I only need it for sporadic AC charging and the TG model is lighter and cheaper.
So, with the EasySolar and the Skylla the total amount of charge current adds up to 70A + 50A = 120A, which totals in a theoretic 3072W (just over 13A at 230V). So, any standard 16A cable would do to charge the battery.
With the next Toyota Hiace and the Saurer 2DM around the corner waiting to be converted, I thought it was time for consolidating our vehicular electrical installations.
But before going into details, some history first: In 2019, we started on the VW Calkifornia T6 with a Super B Epsilon 12V90Ah LiFePO4 battery as a simple drop-in replacement and added a Votronic SMI 1200 ST inverter to it. And this was probably where I made my first two mistakes. At that time, I decided for Votronic and against Victron Energy. And I did not pay attention to the non-existing programmability and extensibility features of the Votronic inverter.
Once with a vendor stick with that vendor? There a pros and cons to it as we will later see.
When we later prepared our Hilux for our first longer trip to Loch Watenan, I opted for a Liontron 12V200Ah battery again (for the reason Liontron being way cheaper than Super B). And for the inverter/charger, I went for Votronic again (SMI 1200 and the same DC-DC charger 1212-45) .
But when I tried to get the DC-DC charger working, I realised that the D+ signal was not available on the Hilux. All in all, I did not get it to work in any configuration and looked for alternatives – which came in the form of the Victron Orion-Tr Smart DC-DC Charger family. And when I had to add an AC charger (where in the Hymer I could use the existing AC charger) to load the Liontron battery “on-shore”, I chose the Victron Blue Smart IP22 Charger.
So, at that time there was some kind of tie between Victron and Votronic. And the setup was getting more complicated and more complicated. And I am not only talking about the diminishing space in the trunk of the Hilux.
If I had known about the Victron MultiPlus series at that time I could have saved me a lot of headaches and complications.
It was shortly after our first and very successful trip to Loch Watenan, when we got rid of the Hymer and I added the battery from it as a second battery to the Hilux. And I got 2 more Victron DC-DC chargers. But I sticked to my Votronic inverter. And this is how the final layout looked like:
Toyota Hilux setup with 2 Liontron 12V 200Ah batteries, 4 DC-DC 30A chargers
This all worked well end of 2021 when one of the Liontron batteries did not want to charge properly anymore. The combined cell voltage stayed low at 13.1V with no single cell near at 3.5V and the internal BMS still reported 100% SOC.
So it was time for a change. And while doing that eliminting some design shortcomings of the current installation:
Invertert has a power maximum of 1200W.
AC charging is limited 30A.
Both 200Ah batteries are operating separated with one of them feeding the inverter and the other feeding the 12V DC sources.
Each pair of DC-DC chargers is bound to a single battery.
The alternator cannot feed all 4 DC-DC but only 3 chargers at the same time.
Have both batteries run in parallel to feed the inverter and the DC sources at the same time and thus reducing the maximum current at 1300W to 65A (when both batteries are dropping down to the minimu of 4* 2.5V = 10V) or considerably lower when running at 14V (45A) .
But the “best” of it, I then got rid of all the Votronic devices and can integrate and configure more easily with Victron. And I can do the same in the Saurer and HiAce.
I hope I can start with the conversion mid of March and will post updates on the way.
So, what do you think? (And no, I have no affiliation with Victron at all.)