# MUST PV1800 register map Derived from the manufacturer protocol document `PH1800 PV1800 EP1800 PV3500 EP3500 RS485 Modbus RTU communication Protocol 1.4.15.xlsx` shipped in the [taHC81/MUST-ESPhome](https://github.com/taHC81/MUST-ESPhome) GitHub repo. Only the registers this monitor reads are listed here; the full document covers hundreds more. All values are Modbus RTU holding registers (function code 0x03), unless otherwise noted. RO = read-only, RW = read/write. The monitor reads everything below as contiguous blocks: - CHARGER block: 15201..15221 (with gaps at 15204, 15213, 15214) - INVERTER block: 25201..25275 (with gaps at 25204, 25220, 25224, 25227, 25228, 25232, 25236, 25243, 25244, 25262..25272, 25276) - SETTINGS: two short contiguous reads at 10103..10104 and 20118..20132 The firmware ignores the `count` field and dumps the entire block regardless, so the monitor always asks for the widest range that covers what we care about. --- ## CHARGER block (start at 15201) | Addr | RO/RW | Name | Unit | Notes | |------|-------|------|------|-------| | 15201 | RO | Charger workstate | — | decoded: Init / SelfTest / Work / Stop | | 15202 | RO | MPPT state | — | decoded: Stop / MPPT / Current limiting | | 15203 | RO | Charging state | — | decoded: Stop / Absorb / Float / EQ | | 15204 | RO | reserved | | | | 15205 | RO | PV voltage | 0.1 V | | | 15206 | RO | Battery voltage (charger side) | 0.1 V | | | 15207 | RO | Charger current | 0.1 A | | | 15208 | RO | Charger power | W | | | 15209 | RO | Charger radiator temperature | 1 °C | | | 15210 | RO | External temperature | 1 °C | | | 15211 | RO | Battery Relay | bool | 0=Open, 1=Closed | | 15212 | RO | PV Relay | bool | 0=Open, 1=Closed | | 15213 | RO | reserved | | | | 15214 | RO | reserved | | | | 15215 | RO | Battery voltage grade | V | 12, 24, or 48 | | 15216 | RO | Charger rated current | 0.1 A | | | 15217 | RO | Accumulated PV energy MWh part | MWh | combine with 15218 for total kWh | | 15218 | RO | Accumulated PV energy kWh part | 0.1 kWh | combine with 15217 for total kWh | | 15219 | RO | Accumulated runtime days | days | | | 15220 | RO | Accumulated runtime hours | hours | | | 15221 | RO | Accumulated runtime minutes | minutes | | The accumulated energy at 15217+15218 combines as `total_kWh = 15217 * 1000 + 15218 * 0.1`. --- ## INVERTER block (start at 25201) ### Operating state & configuration | Addr | RO/RW | Name | Unit | Notes | |------|-------|------|------|-------| | 25201 | RO | Work state | — | decoded: PowerOn / SelfTest / OffGrid / GridTie / ByPass / Stop / GridCharging | | 25202 | RO | AC voltage grade | V | 230 or 120 | | 25203 | RO | Rated power | VA | | | 25204 | RO | reserved | | | ### Voltages | Addr | Name | Unit | |------|------|------| | 25205 | Battery voltage (inverter side) | 0.1 V | | 25206 | Inverter voltage | 0.1 V | | 25207 | Grid voltage | 0.1 V | | 25208 | BUS voltage | 0.1 V | ### Currents | Addr | Name | Unit | |------|------|------| | 25209 | Control current | 0.1 A | | 25210 | Inverter current | 0.1 A | | 25211 | Grid current | 0.1 A | | 25212 | Load current | 0.1 A | ### Power (real / apparent / reactive) | Addr | Name | Unit | |------|------|------| | 25213 | PInverter | W (signed in our script) | | 25214 | PGrid | W (signed; negative = exporting) | | 25215 | PLoad | W (signed) | | 25216 | Load percent | % | | 25217 | SInverter | VA (signed) | | 25218 | SGrid | VA (signed) | | 25219 | SLoad | VA (signed) | | 25220 | reserved | | | 25221 | Qinverter | var (signed) | | 25222 | Qgrid | var (signed) | | 25223 | Qload | var (signed) | ### Frequencies | Addr | Name | Unit | |------|------|------| | 25225 | Inverter frequency | 0.01 Hz | | 25226 | Grid frequency | 0.01 Hz | ### Temperatures | Addr | Name | Unit | |------|------|------| | 25233 | AC radiator temperature | 1 °C | | 25234 | Transformer temperature | 1 °C | | 25235 | DC radiator temperature | 1 °C | (often 0 on units without that sensor) | ### Relays | Addr | Name | Notes | |------|------|-------| | 25237 | Inverter relay | 0=Disconnect, 1=Connect | | 25238 | Grid relay | | | 25239 | Load relay | | | 25240 | N_Line relay | | | 25241 | DC relay | | | 25242 | Earth relay | | ### Energy accumulators (each is a HIGH+LOW pair) | Addr | Name | Scale | |------|------|-------| | 25245 | Acc charger MWh part | 1000 kWh | | 25246 | Acc charger kWh part | 0.1 kWh | | 25247 | Acc discharger MWh part | 1000 kWh | | 25248 | Acc discharger kWh part | 0.1 kWh | | 25249 | Acc grid-buy MWh part | 1000 kWh | | 25250 | Acc grid-buy kWh part | 0.1 kWh | | 25251 | Acc grid-sell MWh part | 1000 kWh | | 25252 | Acc grid-sell kWh part | 0.1 kWh | | 25253 | Acc load MWh part | 1000 kWh | | 25254 | Acc load kWh part | 0.1 kWh | | 25255 | Acc self-use MWh part | 1000 kWh | | 25256 | Acc self-use kWh part | 0.1 kWh | | 25257 | Acc PV-sell MWh part | 1000 kWh | | 25258 | Acc PV-sell kWh part | 0.1 kWh | | 25259 | Acc grid-charge MWh part | 1000 kWh | | 25260 | Acc grid-charge kWh part | 0.1 kWh | Each accumulator combines as `total_kWh = HIGH * 1000 + LOW * 0.1`. The monitor does this combination in `_combine_accumulators()` and displays each as a single `Acc (total) = X.X kWh` line. ### Alarm / warning / status bits Registers 25261..25268 hold error/warning bits. Not currently polled. ### Battery telemetry | Addr | Name | Unit | |------|------|------| | 25273 | Battery power | W (signed) | | 25274 | Battery current | 0.1 A (signed) | | 25275 | Battery voltage grade | V (12, 24, or 48) | --- ## SETTINGS blocks (split into two ranges) ### 10103..10104 | Addr | RO/RW | Name | Unit | |------|-------|------|------| | 10103 | RW | Float voltage | 0.1 V | | 10104 | RW | Absorption voltage | 0.1 V | ### 20118..20132 | Addr | RO/RW | Name | Unit | |------|-------|------|------| | 20118 | RW | Battery stop discharging voltage | 0.1 V | | 20119 | RW | Battery stop charging voltage | 0.1 V | | 20127 | RW | Battery low voltage | 0.1 V | | 20128 | RW | Battery high voltage | 0.1 V | | 20132 | RW | Max combine charger current | 0.1 A | --- ## Decoded state values These are the canonical values from protocol v1.4.15, verified by cross-checking the XLSX shipped with the [taHC81/MUST-ESPhome](https://github.com/taHC81/MUST-ESPhome) repo against the same document uploaded to [Scribd](https://www.scribd.com/document/881604771/) (document 881604771). ### Charger workstate (15201) | Value | Meaning | |-------|---------| | 0 | Initialization mode | | 1 | SelfTest mode | | 2 | Work mode | | 3 | Stop mode | ### MPPT state (15202) | Value | Meaning | |-------|---------| | 0 | Stop | | 1 | MPPT | | 2 | Current limiting | ### Charging state (15203) | Value | Meaning | |-------|---------| | 0 | Stop | | 1 | Absorb charge | | 2 | Float charge | | 3 | EQ charge (equalization) | ### Inverter workstate (25201) | Value | Meaning | |-------|---------| | 0 | PowerOn | | 1 | SelfTest | | 2 | OffGrid | | 3 | Grid-Tie | | 4 | ByPass | | 5 | Stop | | 6 | GridCharging | --- ## Notes on this unit - Battery voltage grade is 24 V (24V battery system). - AC voltage grade is 120 V (120V variant, not the 230V default). - Confirmed against live readings: `Battery voltage = 28.2 V`, `Inverter voltage = 115.5 V`, `Grid voltage = 117.0 V`. - Frequencies are 60 Hz (US-style). - The `Acc grid-charge (total) = 1.0 kWh` reading shows the inverter has charged the battery from grid once for a total of ~1 kWh. - The `Acc grid-buy (total) = 17.0 kWh` reading shows the inverter has bought 17 kWh from the grid over its lifetime. - These lifetime counters survive power cycles.