The BMS already knows everything about your cells. The problem is that it only tells the phone app. Here are the ways to get it onto a Raspberry Pi instead, and what the numbers mean once you have them.
The phone app is not a boat system
A JK BMS is a good piece of hardware for the money. It measures every cell individually, it balances them, and it will disconnect the bank before anything gets damaged. All of that is already happening inside the box.
What you get out of it, by default, is a phone app. Which means the state of your batteries is only knowable when somebody is standing there holding a phone with Bluetooth on. Nothing is logged. Nothing is alarmed. Nothing else on the boat can see it.
Get it onto a Pi and it becomes a boat system: on the chart plotter, logged, trended, alarmed, and readable from anywhere aboard without opening an app.
Bluetooth or a cable. Both work.
The same radio the phone app uses. The Pi has Bluetooth built in, so there is nothing to buy and nothing to wire. A driver on the Pi connects to the BMS, asks it for a frame of data, and decodes it.
On the software side the usual starting points are the jkbms Python library and the dbus-serialbattery project, which gained BLE support for JK units and documents the setup. If you're going the Venus OS route rather than plain Signal K, dbus-serialbattery is the one to read first.
JK units have a serial port. Depending on the model and what came in the box, that's either a 4-pin JST connector carrying TTL serial (ground, RX, TX, and battery positive) or JK's own RS485 dongle, which converts that TTL to RS485 on three wires.
Either way you need a converter — TTL-to-USB for the bare connector, or USB-to-RS485 for the dongle — and then it appears on the Pi as an ordinary serial device.
| Bluetooth LE | Cable | |
|---|---|---|
| Extra hardware | None | A USB converter, and the run to the BMS |
| Setup effort | Low — pair and go | Moderate — wiring and port permissions |
| Reliability | Good, but it does drop | Better. It's a wire. |
| Phone app | Locked out while the Pi is connected | Still works |
| Distance | Whatever the radio reaches through your boat | Whatever you're willing to pull |
Honestly? Because it was already there
We were in the middle of chasing crashes on the boat's network hub at the time. The last thing that job needed was another cable run and another USB device on the Pi.
Bluetooth was sitting there, costing nothing, needing no hardware. It worked the same afternoon. So that's what went in, and it has stayed in.
That's a decision, not a recommendation. If you're starting clean and you can get a cable to the BMS, run the cable. A wire doesn't lose connection because somebody walked past with a phone.
What the data looks like once it's yours
Three banks on one page. Two JK units over Bluetooth, and an AGM bank with only a shunt.
One card per bank. The layout is the same for each so you learn it once.
Current, voltage, state of charge. Current reads at rest, charging or discharging rather than making you work out what a minus sign means at two in the morning. Under the voltage is the per-cell figure, which is the number that actually tells you anything — 26.9 V on an eight-cell bank means nothing until you divide it.
Every cell voltage, and above them the spread: the gap between the highest and lowest cell in millivolts. That single number is the health of the bank.
A few millivolts is a happy pack. A spread that grows over weeks is a cell going weak, and it will quietly cost you capacity long before anything alarms, because the whole bank stops when the first cell hits a limit.
Not what it's measuring — what it's permitting right now. Is charging allowed. Is discharging allowed. Is it balancing. What the discharge limit is. How many amp-hours have come out since the bank was last full.
This is the section people miss, and it's the one that explains the mystery. When your solar is making power and the bank isn't taking it, the answer is here: the BMS has said no, and it will tell you why.
Spread now, spread at the end of the last full charge, and the best spread ever recorded with the date. Three numbers that turn "the pack seems fine" into something you can actually track.
And on a self-built boat, only one of them should be gospel
Two three-letter acronyms, one letter apart, and people use them interchangeably. They are completely different devices, and getting this wrong costs you either money or accuracy.
A BMV is a Battery Monitor. Victron's BMV-712 is the one most people have met. It is a very good instrument and it does exactly one thing: it counts coulombs.
All the current entering or leaving the bank is forced through a shunt — a precision resistor in the negative cable. Current through a resistor makes a tiny voltage across it, and measuring that voltage tells you the current. Multiply by time, add it up, and you have amp-hours in and out.
From that it reports voltage, current, power, amp-hours consumed, state of charge, and time remaining. It has clever extras — Peukert compensation for lead acid, charge efficiency, mid-point voltage monitoring on a split bank. For a lead-acid house bank it is close to the best thing you can fit.
A BMS is a Battery Management System, and the difference is that word. It doesn't observe from outside the bank — it is wired into it.
Every cell has its own sense wire. The BMS reads each cell individually, measures temperature, balances cells against each other, and — the part no monitor can do — it can open the circuit when something is wrong. It is not a gauge. It is a safety device with a gauge built into it.
| BMV (monitor) | BMS (management) | |
|---|---|---|
| Where it sits | Outside, on the main negative | Inside, wired to every cell |
| Sees individual cells | No — one voltage for the whole bank | Yes, every one |
| Cell temperature | Optional single sensor | Yes, built in |
| Can balance cells | No | Yes — that's half its job |
| Can protect the bank | No. It can only tell you. | Yes. It disconnects. |
| How it knows the charge | Counts current in and out, and infers | Counts, and checks against the cells themselves |
| Needs calibrating | Yes, and it drifts between syncs | It has a reference the monitor doesn't |
We ran Victron BMVs. They are well-made and we have no complaint about the hardware. The problem is structural, and no amount of quality fixes it.
1. It is guessing, and the guess drifts.
A shunt counts current, it doesn't measure charge. Every reading has a tiny error, and because the figure is a running total, those errors accumulate. The displayed state of charge wanders away from the truth a little more every day.
The cure is a sync: when the bank hits a set voltage and the current falls below a set tail, the BMV declares 100% and resets. That works beautifully on a boat that charges fully every day. On a boat that cycles between 40 and 80 percent for three weeks, it never syncs, and the number quietly becomes fiction.
And lithium makes it worse, because its voltage curve is flat. A lead bank's voltage at least hints at its state. A LiFePO4 cell reads almost the same at 40% as at 70%, so there is nothing to sanity-check the count against.
2. Anything that bypasses the shunt is invisible.
This is the one that actually bit us, and it is the strongest argument on this page.
A BMV is only correct if every single amp in or out of that bank passes through its shunt. One negative wire landed on the wrong side — on the battery post instead of beyond the shunt — and that circuit's current is never counted.
It does not throw an error. Nothing lights up. The bank simply appears to use less power than it does, and the state of charge reads high, and keeps reading high, for ever.
On a factory boat with one bank and a tidy negative bus, that's easy to get right. On a boat you built yourself over years — four banks, six DC-DC converters, a thruster, a windlass, an inverter, and every one of them added on a different weekend — keeping every return on the correct side of the shunt is a discipline that is genuinely hard to maintain. And the penalty for one mistake is a gauge that lies to you confidently for months.
3. It can't see the thing that actually kills the bank.
A BMV reports the bank. One cell quietly falling behind the other seven shows up as nothing at all, because seven healthy cells hide it in the total. By the time the pack voltage moves enough to notice, the damage is done.
The BMS is inside the bank. It is not inferring the bank's state from the outside — it is reading it.
None of this means shunts are obsolete. They are the right answer when there is no BMS to ask:
The distinction worth holding on to: use a shunt to measure current. Use the BMS to know the battery. Trouble starts when you ask a shunt to tell you about a battery it cannot see inside.
And what they're really for
Cells in series drift apart. They have slightly different capacities and slightly different self-discharge, and over cycles the gap widens. Balancing bleeds a little charge off the high cells so the rest can catch up.
Balance start voltage is the one to understand. The LiFePO4 voltage curve is almost flat through the middle of its range — a cell at 40% and a cell at 70% read nearly the same. Only near the top does voltage move enough to tell cells apart. So the BMS waits until cells are up near full before it balances, because that's the only point where the readings mean anything.
That has a consequence people don't expect: a bank that never gets charged all the way up never balances. If you float around at 60% for a month, the pack drifts and nothing corrects it. An occasional full charge isn't just good for the gauge, it's what keeps the cells together.
Balance trigger delta is how far apart cells have to be before it bothers. Too tight and it balances constantly for no benefit; too loose and drift goes unchecked.
Never charge LiFePO4 below freezing. This is the one setting that will destroy a bank, and it will do it silently.
Below about 32 °F (0 °C) the lithium coming out of solution during charge plates onto the anode as metal instead of going where it should. It doesn't come back. You permanently lose capacity, and in the worst case you grow internal shorts.
There is no warning. The battery accepts the charge, the numbers look right, and you find out months later that the bank is smaller than it was.
Set the charge low-temperature cutoff and leave it set. Every JK BMS has it. There is no reason to ever turn it off.
Discharging cold is fine. That asymmetry surprises people. LiFePO4 will happily deliver current well below freezing — you just get less of it and a bit more sag. It's only charging that does damage. So the discharge cutoff sits much lower than the charge cutoff, and that's correct, not a mistake in the defaults.
High temperature cutoffs matter at the other end. Hot cells age faster and a genuinely hot cell is a problem. Both charge and discharge have an upper limit.
Over-voltage and under-voltage protection per cell, plus the release points where protection clears. These are the hard stops. If you set them tight you'll trip on a normal day; if you set them loose you've removed the protection you bought the BMS for. The cell datasheet decides, not the internet.
How much the bank is allowed to deliver, and for how long before it opens. Worth setting deliberately rather than leaving at whatever arrived, because this is the number that decides whether your BMS or your wiring is the fuse.
And one that catches people with alternators. A BMS protecting itself opens the circuit — instantly, with no warning to anything upstream. If an alternator is charging at the moment that happens, it's suddenly driving an open circuit, and that destroys alternators. Design for it before it happens. See the charging write-up for how we dealt with it.
Take it and change it
The source for this display will be on GitHub. The readers, the page, the watchdog, all of it. It's built for two JK units and an AGM shunt on one particular boat, but the shape of it will suit anybody doing the same thing.
If you adapt it and find something we got wrong, say so — come and tell us on the Discord. Corrections are genuinely welcome.