Add a Kconfig voltage-class choice (BMU_PACK_CLASS: 24V default /
48V) plus an sdkconfig.defaults.48v overlay, implementing lot 4 of
the 48V design note.
48V class defaults: min 44600 mV (3.43 V/cell, same fleet policy
as 24V), max 55200 mV (charger CV 54.6 V + 600 mV margin),
imbalance 2000 mV (x13/7), VRM SOC window 44600-53500 mV.
Blocking fixes found while implementing:
- bmu_protection: plausibility guard rejected any reading above
35 V as an I2C glitch -> class macro BMU_V_PLAUSIBLE_MAX_MV.
- bmu_ina237: BOVL/BUVL hardwired 30000/24000 -> programmed from
runtime thresholds (NVS/Kconfig) at init; log real values.
- bmu_ble control + display steppers: hardcoded 20-30/25-35 V
setting bounds rejected any 48V config -> class-derived macros
BMU_VMIN/VMAX_SET_FLOOR/CEIL_MV in bmu_config.h.
- bmu_ui_detail: chart autoscale seeds 35000/15000 broke above
35 V -> neutral 65535/0.
- bmu_ble_victron: SOC window hardcoded 24.0/28.8 -> reads the
VRM Kconfig (class fallback when VRM disabled).
- legacy firmware/src/config.h: BATTERY_PACK_CLASS_48V ifdef.
Validated: idf.py build green for both classes (esp32s3, isolated
sdkconfig; 48V generates 44600/55200/2000), no new warnings in
touched files, legacy sim-host tests 13/13 pass. NVS erase needed
when reflashing a board that has 24V thresholds persisted.