Based on: https://github.com/vladyspavlov/esphome-must-inverter
ESPHome configuration for MUST inverter (PV18 / EP series) with RS485 Modbus integration. Provides smart battery charge control via Home Assistant with seasonal modes, night charging, emergency protection, and voltage-based stop logic for LiFePO4 batteries.
| Component | Details |
|---|---|
| MCU | ESP8266 (Wemos D1 Mini) |
| Inverter | MUST PV18 / EP series |
| Communication | RS485 → UART via MAX485 module |
| Battery | LiFePO4 (8S / 16S / 24S configurable) |
Wiring:
| ESP8266 | MAX485 |
|---|---|
| GPIO13 (TX) | DI |
| GPIO12 (RX) | RO |
| GPIO14 | DE + RE (flow control) |
- Night charge automation (23:00–07:00): charges to configurable SoC target, pauses when reached, restarts on drop
- Emergency day charge: kicks in when SoC drops below threshold during the day
- Battery protection: stops charging above critical SoC, force-starts at critical low SoC
- Smart ramp-up: gradually increases charge current to avoid grid voltage sag
- Battery Preserve Mode: keeps battery at grid power, useful during extended outages
- Seasonal modes: Winter (charge to 96-98%) / Summer (charge to 40-45%), auto-switchable via HA automation
- SoC → Voltage curve: LiFePO4 discharge curve used to calculate
batt_stop_chg(modbus 20119) for precise charge cutoff - Watchdog: periodically verifies inverter registers haven't been reset
- Throttled notifications: HA push notifications via
esphome.battery_notificationevent, 1h cooldown per type
- Set
battery_cells_sin the substitutions block:
battery_cells_s: "16" # 8 = 24V | 16 = 48V | 24 = 72V- Change CHARGE PARAMETERS and TIME PARAMETERS if needed
Add automation/helpers.yaml content to your HA configuration.yaml, or create the helpers manually via Settings → Devices & Services → Helpers.
Import automation/automation.yaml into HA. It automatically switches between Winter/Summer mode based on tomorrow's solar forecast and weather conditions.
Requires:
sensor.energy_production_tomorrow(e.g. from Forecast.Solar or Solcast integration)sensor.energy_production_tomorrow_2(optional second array)weather.forecastentity
Night (23:00-07:00)
SoC < target_night → start charge
SoC >= stop_night → pause
SoC <= restart → resume
07:02 → morning stop (solar tops up)
Day
SoC < emergency_start → emergency charge
SoC >= emergency_stop → stop
Protection (always)
SoC >= 99% → force stop
SoC < 25% → force start at max current
MIT
