fyi folks here design BMS's for fun so don't expect much production value.
caveats:
balancing: don't bother. More likely to hurt than help (except maybe oem units). If you can install a bms, you can manually balance, and it is rarely if ever needed. Just need an idiot light to tell you something is out of balance really. Ignoring something going out of balance and just letting it balance automatically is ignoring cell specific aging information anyway.
units that cause imbalance: This is just dumb.
diy packs occasionally are opened: deliberately or accidentally, if you break the circuit between two cells (or a cell fails open), whatever is bridging the gap will be exposed to high reverse voltage, and if it is level shifted signaled or multi-cell vs isolated it can cascade.
power draw: keep it very tiny or it will kill more batteries than you can count. having zero draw when not charging or running is ideal. A lot of batteries have died just sitting there. powering the bms via isolated dc converters is one, albeit expensive, method. op amps can reduce the voltage sensing load. Or an opto-controlled mosfet on the divider/cpu power, etc. etc.
accuracy: you probably still need a calibration method/rig after assembly. could be software (eprom) or some solder pads on unused logic pins or (gag) trim pots.
network speed, reliability, noise immunity, vs ease of installation, cost/etc: Depending what you are hoping to accomplish, having all the nodes measure the cells at exactly the same time (combined with a concurrent overall current measurement) might be important. Or it might not be. It is often acceptable to trigger a concurrent measurement with a broadcast, then go back and collect the results individually.
Bus type networks have addressing headaches though, i.e each node needs to be addressable, and often that is more solder pads for the end user or firmware/eprom updates to give it an address. And to give more meaningful messages to the user the address has to relate to the battery cell in question.
plus you should consider stuff like twisted pairs (power, signal/ground or differential, constant current (i.e. digital 4-20ma), possible clock lines, sr lines, etc. etc.).
for simple installation, I tend towards a uart token-ring style (preferably with hardware majority vote and an xtal). As it just needs a twisted pair between bms nodes, and can handle automatic addressing easily on initialization. If you are brave you can level shift between nodes, but otherwise it is just an opto per interconnection. It doesn't do concurrent readings, but it works. And you can add low power/sleep modes that wake on signal (just keep pinging the first node from the bms controller till it hears back from the last node), lots of protocol fun.
And having said and learned all that, this is what I use on 48v systems

(monitor it like you would a gas gauge as it also gives you the pack voltage if you multiply the reading by 2, if the numbers get too different then time to investigate)
