(Update - recently designed and ordered a PCB using EasyEDA for this project - see picture in gallery) When the ESP is reset it comes up in mode where it is monitoring each of the battery's cell voltages. Every one second, voltage measurements are taken; data is stored in the esp from the time it is last booted, as the time interval expands older data is averaged and newer data is decimated over an expanding window so that between 64 and 128 equally spaced data points are stored in esp memory. An I2C interface to an OLED display provides local real time monitoring of state. 

The esp runs in one of four modes:

The operation of the monitoring/charging/testing/storage-prep functions of the board can be accomplished with three push buttons with the OLED display, once the operation is started the OLED reports status and process monitoring feedback - cell voltages, accumulated (or dissipated charge), and approximate time to task completion. 

The esp is also running a web server that hosts a webpage for the control of and detailed monitoring of the state of the running application. The webpage does not need to be connected to the system while running, but easier control of the unit and much better monitoring is performed by the webpage (or a curl command). The data for graph of cell voltages vs elapsed time since reset is stored in the esp and not by the browser, so the browser does not need to be connected during operation and can be accessed from several clients at the same time (so you can check out progress from your cell phone for example).

The voltage measurements are made with two ads1015 i2c 4 channel adc modules, resistor dividers on upper channels for 25v full scale, middle channels 15v full scale and lower channels 10v fullscale. The 0-2Amp current source is made wit a FQP30N06L (actually 2x) heat-sinked fet, 0.5 ohm source follower and a  MCP4725 DAC i2c module to make the gate control voltage. The current source is adjusted by measuring the voltage across the source follower resistor and raising or lowering the gate voltage to keep the correct amount of current flowing through the source. 

The PCB also has a 20 ohm heat-sinked power load resistor which can be switched in with another FQP30N06L fet.

Output header for custom JST XH connector adapter cables to support batteries 1s-6s, built in headers for  3s and 4s batteries.

Discussion - 

Two of the webpage snapshots included in gallery show the discharge of two different 2S/350mA-hr batteries that were included with a minidrone that my daughter got for Christmas, they have gone through about 20 use cycles. Analyzing this data shows us that each of the batteries have well matched cells and exceed their rated charge specifications. The series resistance on each cell (including hookup wire) is about 0.8ohms. The charger that came with the kit takes about two hours to charge a battery and the minidrone flight time is about 8 minutes, so I'm guessing that the charge rate of the charger is about 200mA and the discharge rate during flight is about 3 Amps. Have not tried charger on these batteries yet but hope to charge at more than 200mA.

1/9/2020 - Have the current source working, only tested to a couple hundred milliamps - still need to get higher current power supply and heat sinks setup. So far closes good and stays stable.

Tested a couple type of single cell li-ion batteries that were sitting on my desk (my understanding is that li-ion and lipo batteries are similar chemically - differing in packaging technology).

2x parallel 18650 2000mAh salvaged from four year old laptop battery pack (or some cordless drills, etc..) - these came out pretty much as expected, less than .1ohms series impedance, handled 2A current draw well and capacity measured at over 90% of specification (picture in gallery - labeled 2x 18650).

18650 10000mAh (GTL - from china ~2/ea) -  these also came out pretty much as expected I suppose. Series impedance ~0.7ohms, does not handle 1A+ current draw at all well and rated capacity overstated by ~50x! The batteries weigh about half as much as the above batteries (hint hint). It looks as though you could drag about 200mAh out of this battery if discharge current rate < 100mA. I guess you gets what you pays, the batteries that were scavenged from four year old laptop battery pack have at least 10x the capacity, 10x less series impedance and able to handle at least 20x the discharge rate.

16340 1800mAh (UltraFire - from china ~$2/ea) - Similar to above battery with about half as much capacity, capacity only overstated by 2000%.

Note - I like the 18650 batteries scavenged from old laptop battery packs along with a module charger (search ebay "5V Micro USB 16340 18650 lithium Battery Shield V3 ESP32 Battery Holder Module") for powering esp projects, very convenient module with usb charging and 3 and 5v regulated outputs all built in for about $3.

1/10/2020 - Got the charger breadboarded and working on the GTL 18650 battery, battery started at 3.52 volts and after a half hour of 200mA charging rest voltage of battery was 3.99v, confirming a total charge capacity of about 200mAh (2% of advertised capacity - wow). 

1/11/2020 - Added a screen shot of 18650 battery being charged at one amp with 0.5mAh of charge current. On the graphic the red line is the battery voltage, the black line is the voltage across the FET and the green line is the voltage across the 0.51 ohm source follower resistance, the current is controlled by changing gate voltage so that the correct voltage across the resistor is obtained. Notice that the charging current is off several times during this trace, this is where the voltage across the source follower is zero volts. In order for the charging current to flow into the battery the voltage has to be increased by about a quarter of a volt in this case, in order to monitor the charging state of the battery the current is shut off to read the voltage - the battery will be charged until the zero current voltage reaches ~4.2 volts. Notice on the graph that the zero charging current voltage was measured at several intervals, between these points 1 Amp of current was pushed into the battery - as the total number of electrons pushed into the battery increased (mAh) so did the battery voltage.

Explanation of noise - The noise on the right hand side of the graph is an artifact of my data decimation process. Data is collected every second until the number of points graphed reaches 128, at that point the 128 points are averaged to produce 64 points and every second data point is graphed and the time scale adjusted, this process is iterated so that the the entire interval from start is stored in the esp data table. The graph shows single measurement points for the latest collected data while the data at the beginning of the graph has been averaged over 16 samples in this case. I should probably modify the program to average the collected data instead of tossing 15 of 16 measurements on the right hand side.

1/14/2020 - Decided to build with built-in 20 ohm switchable load power resister with ability to add external load to battery power socket. For a power supply plan on using an external adjustable voltage supply with help from web page to adjust the optimum voltage. Both of these choices were made in order to simplify the management of waste power within the unit - figure I can handle a few watts within the unit that I build much easier than trying to handle up to fifty watts. 

1/25/2020 - Tried out EasyEDA for the first time. Loaded in schematic, designed PCB and ordered from JLC ($2 + $6.33 shipping - show take about three weeks).