FranklinWH · Home battery
aPower battery with aGate (SunSpec DER) Modbus register map
Default configuration
- Protocol
- Modbus TCP
- Port
- 502
- Unit ID
- 1
- Addressing
- 0-based
- Byte order
- Big endian
- Word order
- High word first
Register map
| Address | Count | Name | Type | Unit | Scale | Access |
|---|---|---|---|---|---|---|
| 0 | 2 | SunSpec identifier ("SunS") 0x53756E53. The aGate serves its SunSpec model chain from PDU 0; the M1 header at 2 and the M701 header at 70 only line up when the marker is read here. | UInt32 | - | 1 | R |
| 2 | 1 | SunSpec model ID (common) 1 = common model. | UInt16 | - | 1 | R |
| 3 | 1 | SunSpec common model length 66 registers follow. | UInt16 | - | 1 | R |
| 4 | 16 | Manufacturer "FranklinWH" on firmware V12R02B60D00 and later, "FranklinWH Technologies Co., Ltd" before. | Ascii | - | 1 | R |
| 20 | 16 | Model e.g. "aGate X". | Ascii | - | 1 | R |
| 36 | 8 | Options | Ascii | - | 1 | R |
| 44 | 8 | Firmware version Model 1 Vr, e.g. "V12R02B60D00". | Ascii | - | 1 | R |
| 52 | 16 | Serial number | Ascii | - | 1 | R |
| 68 | 1 | Modbus device address (DA) 1 on the reference unit; the aGate answers on unit ID 1 and 2 alike. | UInt16 | - | 1 | RW |
| 70 | 1 | SunSpec model ID (DER measurement AC) 701. | UInt16 | - | 1 | R |
| 71 | 1 | SunSpec model 701 length 153 registers follow. | UInt16 | - | 1 | R |
| 74 | 1 | Inverter operating state (InvSt) 0 = off, 1 = sleeping, 2 = starting, 3 = running, 4 = throttled, 5 = shutting down, 6 = fault, 7 = standby (the values SunSpec model 701 defines). | UInt16 | - | 1 | R |
| 75 | 1 | Connection state (ConnSt) 0 = disconnected, 1 = connected (the values SunSpec model 701 defines). | UInt16 | - | 1 | R |
| 78 | 2 | DER operating mode (DERMode) Bitfield: bit 0 = grid following, bit 1 = grid forming, bit 2 = PV clipped. | UInt32 | - | 1 | R |
| 80 | 1 | AC active power at the point of connection (W) SunSpec M701 W: the power the aGate exchanges with the grid. Scale comes from W_SF (186); 0 on the reference unit, so the raw value is watts. | Int16 | W | 1 | R |
| 86 | 1 | AC line-to-neutral voltage (LNV) Scale from V_SF (184), which reads -1 on the reference unit. | UInt16 | V | 0.1 | R |
| 87 | 2 | AC frequency (Hz) Scale from Hz_SF (185), which reads -3 on the reference unit. | UInt32 | Hz | 0.001 | R |
| 184 | 1 | AC voltage scale factor (V_SF) Multiply the raw voltage by 10^this. -1 on the reference unit. | Int16 | - | 1 | R |
| 185 | 1 | Frequency scale factor (Hz_SF) Multiply the raw frequency by 10^this. -3 on the reference unit. | Int16 | - | 1 | R |
| 186 | 1 | AC active power scale factor (W_SF) Multiply the raw power by 10^this. 0 on the reference unit. | Int16 | - | 1 | R |
| 225 | 1 | SunSpec model ID (DER capacity) 702. | UInt16 | - | 1 | R |
| 226 | 1 | SunSpec model 702 length 50 registers follow. | UInt16 | - | 1 | R |
| 227 | 1 | Maximum rated active power (WMaxRtg) Reads 0 on the reference aGate; the charge and discharge ratings below carry the real figures. | UInt16 | W | 1 | R |
| 235 | 1 | Maximum charge rate (WChaRteMaxRtg) 5000 W with one aPower battery on the reference site. Scale from W_SF (270). | UInt16 | W | 1 | R |
| 236 | 1 | Maximum discharge rate (WDisChaRteMaxRtg) 5000 W with one aPower battery on the reference site. Scale from W_SF (270). | UInt16 | W | 1 | R |
| 270 | 1 | Capacity active power scale factor (W_SF) Multiply the raw capacity values by 10^this. 0 on the reference unit. | Int16 | - | 1 | R |
| 1033 | 1 | SunSpec model ID (DER storage capacity) 713. | UInt16 | - | 1 | R |
| 1034 | 1 | SunSpec model 713 length 7 registers follow. | UInt16 | - | 1 | R |
| 1035 | 1 | Storage energy rating (WHRtg) 13600 Wh on the reference site. Scale from WH_SF (1040). | UInt16 | Wh | 1 | R |
| 1036 | 1 | Storage energy available (WHAvail) SunSpec defines it as WHRtg * SoC * SoH. Scale from WH_SF (1040). | UInt16 | Wh | 1 | R |
| 1037 | 1 | Battery state of charge (SoC) Scale from Pct_SF (1041), which reads -1 on the reference unit. | UInt16 | % | 0.1 | R |
| 1038 | 1 | Battery state of health (SoH) Scale from Pct_SF (1041). | UInt16 | % | 0.1 | R |
| 1039 | 1 | Storage status (Sta) SunSpec storage status, not a charge/discharge state: 0 = OK, 1 = warning, 2 = error. | UInt16 | - | 1 | R |
| 1040 | 1 | Energy scale factor (WH_SF) Multiply the raw energy values by 10^this. 0 on the reference unit. | Int16 | - | 1 | R |
| 1041 | 1 | Percentage scale factor (Pct_SF) Multiply the raw percentage values by 10^this. -1 on the reference unit. | Int16 | - | 1 | R |
| 1042 | 1 | SunSpec model ID (DER measurement DC) 714. | UInt16 | - | 1 | R |
| 1043 | 1 | SunSpec model 714 length 43 registers follow. | UInt16 | - | 1 | R |
| 1044 | 2 | DC port alarms (PrtAlrms) Bitfield of the SunSpec DC port alarm flags. | UInt32 | - | 1 | R |
| 1046 | 1 | Number of DC ports (NPrt) | UInt16 | - | 1 | R |
| 1048 | 1 | Battery DC power (DCW) Positive while discharging, negative while charging (-100 W was a charging battery on the reference site). Scale from DCW_SF (1059), 0 there. | Int16 | W | 1 | R |
| 1059 | 1 | DC power scale factor (DCW_SF) Multiply the raw DC power by 10^this. 0 on the reference unit. | Int16 | - | 1 | R |
| 1087 | 1 | SunSpec model ID (DER control) 715. | UInt16 | - | 1 | R |
| 1088 | 1 | SunSpec model 715 length 7 registers follow. | UInt16 | - | 1 | R |
| 1089 | 1 | Local / remote control (LocRemCtl) 1 = local control on the reference unit; the aGate must be in remote control before a client can dispatch the battery through model 704. | UInt16 | - | 1 | R |
| 1096 | 1 | SunSpec model ID (solar module) 502. | UInt16 | - | 1 | R |
| 1097 | 1 | SunSpec model 502 length 28 registers follow. | UInt16 | - | 1 | R |
| 1100 | 1 | PV DC power scale factor (W_SF) Multiply the raw PV power values by 10^this. 0 on the reference unit. | Int16 | - | 1 | R |
| 1101 | 1 | PV energy scale factor (Wh_SF) Multiply the raw PV energy by 10^this. 0 on the reference unit. | Int16 | - | 1 | R |
| 1117 | 2 | PV lifetime energy (OutWh) Scale from Wh_SF (1101). Matches the vendor extension register 15510. | UInt32 | Wh | 1 | R |
| 1119 | 1 | PV output power (OutPw) Total PV output the aGate reports. Scale from W_SF (1100). | Int16 | W | 1 | R |
| 15502 | 1 | Total PV power (FranklinWH extension) FranklinWH extension register outside the SunSpec chain: all PV sources combined. | UInt16 | W | 1 | R |
| 15506 | 1 | Home load, quantised (FranklinWH extension) FranklinWH extension register: house consumption in steps of about 100 W. Use 16000 for the fine value. | UInt16 | W | 1 | R |
| 15507 | 1 | Operating mode (FranklinWH extension) 1 = emergency backup, 2 = self-consumption, 3 = time-of-use. Those three are measured; no other value has been observed. Writes are not documented and did not take effect on the reference firmware. | UInt16 | - | 1 | R |
| 15508 | 1 | Self-consumption reserve (FranklinWH extension) SoC reserve used in self-consumption mode. | UInt16 | % | 1 | R |
| 15509 | 1 | Time-of-use reserve (FranklinWH extension) SoC reserve used in time-of-use mode. Firmware V10R01B04D00 repeated 15508 here; V12R02B60D00 reports the TOU reserve. | UInt16 | % | 1 | R |
| 15510 | 2 | PV lifetime energy (FranklinWH extension) FranklinWH extension copy of the solar module lifetime energy (M502 OutWh). | UInt32 | Wh | 1 | R |
| 16000 | 1 | Home load, high resolution (FranklinWH extension) Undocumented FranklinWH register, measured: house consumption in about 1 W steps. | UInt16 | W | 1 | R |
| 16001 | 1 | Reserve of the active mode (FranklinWH extension) Undocumented FranklinWH register, measured on V12R02B60D00: 100 in emergency backup, 15508's value in self-consumption, 15509's in time-of-use. | UInt16 | % | 1 | R |
Notes
FranklinWH aPower batteries are read through the aGate gateway's Modbus TCP server (port 502; the aGate ignores the unit identifier - every UID tried (1, 2, 3, 126, 247) returned the same 17 models - so the unit_id of 1 in this file is arbitrary (the community project's default is 2); DA = 1). FranklinWH publishes no register map, so this file follows the SunSpec 700-series (IEEE 1547) model definitions (github.com/sunspec/models, models 1, 502, 701, 702, 713, 714, 715) with the absolute PDU addresses and scale-factor values recorded in the community project david2069/franklinwh-modbus (docs v0.10.1, snapshot of firmware V12R02B60D00, 2026-10-20). Addresses are 0-based PDU addresses: SunS at 0-1, model headers at 2 (M1), 70 (M701), 225 (M702), 1033 (M713), 1042 (M714), 1087 (M715), 1096 (M502), each block starting two registers after its header; the guide's 4xxxx numbers are the same PDU + 40000, and the firmware also mirrors the chain at 40000. SunSpec scale factors are themselves registers (184 V_SF, 185 Hz_SF, 186 W_SF, 270 and 1100 W_SF, 1040 WH_SF, 1041 Pct_SF, 1059 DCW_SF); the fixed factors here are the values those registers held on the reference unit, so re-read them if numbers look wrong. Omitted on purpose: the 64-bit accumulators (M701 TotWhInj/TotWhAbs, M714 DCWhInj/DCWhAbs) because the app has no 64-bit integer type (extension 15510 carries the PV total in 32 bits); M714 DCA because the aGate leaves it at 0; and the model 704 dispatch registers (WSetEna at PDU 318, WSetMod 319, WSet 320) because the write path is only partly understood and the charge/discharge sign convention differs between the vendor's app and the hardware. FranklinWH extension registers 15500-16002 are vendor-specific and undocumented; their meanings were measured on real hardware, writes did not take effect, and they can change with firmware. Only one Modbus client can poll an aGate at a time.