Newer li ion batteries are usually built from 3,7 nominal and 4.2 charge cells. It seems like custom build, so the stats directly depends on how many cells you have in series and how many parallel. It's propably good, but still wouldn't hurt to see the specs.
The Azurit code or more likely the PCB1.3 really doesn't have a clue when to charge and when not. As soon as you hit the station the charge voltage and battery voltages are identical and 95% of the time starting charge fails. I have built custom code for that also to fire another one time manual charge start after the robot has been 15 seconds or so in the station. Also because of that it luckily protects the battery from being float charged as the battery voltage always equals to the charging voltage. 2 months in the charger and it will not start again.
Charging starts if Voltage is below = 25 is good maybe for testing something, but if it starts raining and your battery is at 27 or so, I definately want it charged and ready to go after the weather clears. 25 pretty much only charges when empty battery. Chargers can handle the job, but why remove extra layer of safety? I always have charge stops after charging Amps are lower than 0,1A - 0,3A. With this you can also control how full you charge your battery. Always charging it to 100% will not yield the best life expectancy.
And yes, I know there is the stop charging timeout too. Which is very nicely setup by default:
C++:
chargingTimeout = 2147483647; // safety timer for charging (ms) 12600000 = 3.5hrs (2147483647=disabled)
The chargingTimeout should be considered only the last line of defence if something goes terribly wrong. The timeout needs to be long enough to allow from empty to full, but it's too long if you like to charge your battery from 27 volts like I do.
Also the charging relay repeatedly opening and closing is some kind of special case and very hard to repeat. I believe it happened to me like 2 times in last 18 months with Azurit.