TapHome

Sofar Solar HYD KTL-3PH

Modbus RTU
Submitted by
Last updated: 03. 2026
Sofar Solar HYD KTL-3PH

The Sofar Solar HYD 5/6/8/10/15/20KTL-3PH is a three-phase hybrid inverter series combining solar PV generation with battery energy storage. TapHome connects via Modbus RTU over RS-485 using the inverter’s 16-pin COM port, reading holding registers for real-time PV output, battery status, grid power, per-phase voltages, and energy counters.

The inverter supports up to 31 devices on a single RS-485 bus with daisy-chain wiring. Each inverter requires a unique Modbus Slave ID (configurable, default 1). Communication parameters are fixed at 9600 baud, 8N1.

Hardware connection

Communication interfaces
Sofar Solar HYD KTL-3PH communication interfaces location

The RS-485 connection for TapHome monitoring uses the COM port — a 16-pin multifunctional connector on the bottom of the inverter.

COM port pinout
Sofar Solar HYD KTL-3PH COM port 16-pin connector pinout

Relevant pins for TapHome connection:

PinFunctionNote
1RS485A1-1 (+)Monitoring/control RS-485 signal A
2RS485A1-2 (+)Daisy-chain second connector
3RS485B1-1 (-)RS-485 signal B
4RS485B1-2 (-)Daisy-chain second connector
5RS485A2 (+)Smart meter — separate bus
6RS485B2 (-)Smart meter — separate bus
7CAN0_HBMS communication (CAN)
8CAN0_LBMS communication (CAN)

Connect TapHome to Pins 1+3 (or 2+4):

  • Pin 1 (RS485A1) → A+/D+ on TapHome RS-485
  • Pin 3 (RS485B1) → B-/D- on TapHome RS-485

Do not use Pins 5+6 — these are dedicated to the smart meter on a separate RS-485 bus. TapHome must connect to Pins 1+3 (or 2+4) for Modbus monitoring.

RS-485 daisy-chain wiring
Sofar Solar RS-485 daisy-chain wiring for multiple inverters

When connecting multiple inverters, wire them in a daisy chain using the RS-485 bus. Place a 120 Ohm termination resistor between Pin 1 and Pin 4 at the first and last device on the bus.

Cable specification:

  • Type: Shielded twisted pair, copper diameter > 0.5 mm²
  • Maximum length: 1200 m
  • Keep cables away from power cables and electric fields

Configuration

Modbus communication parameters

The RS-485 communication parameters are fixed and do not require configuration on the inverter side:

ParameterValue
Baud rate9600 bps
Data bits8
ParityNone
Stop bits1
Slave ID1 (default, configurable 1–31)

For multiple inverters on the same bus, each inverter must have a unique Slave ID. The Slave ID can be configured through the inverter’s LCD menu or the SolarMAN app.

Device capabilities

Battery monitoring

The template provides state of charge monitoring for up to two battery packs. Battery 1 SOC is available on all HYD KTL-3PH models, while Battery 2 SOC is available on the HYD 10–20KTL-3PH models with dual battery inputs.

Each battery SOC device includes five service attributes for detailed battery diagnostics: temperature, voltage, charge/discharge current, charge/discharge power, and state of health (SOH).

Two energy counter devices track daily battery charge and discharge in kWh, each with a service attribute for the lifetime total.

PV generation monitoring

The template reads power output from up to three individual PV strings (PV1, PV2, PV3), each with service attributes for string voltage and current. A combined PV Power Total device shows the aggregate output across all strings.

Two energy counter devices track PV generation — daily and lifetime totals in kWh.

Grid and load energy

Four energy counter devices provide daily readings for grid interaction and load consumption:

  • Energy Purchase Today — energy bought from grid (kWh)
  • Energy Selling Today — energy sold to grid (kWh)
  • Load Consumption Today — total load consumption (kWh)

Each daily counter includes a service attribute with the lifetime total.

AC output monitoring

The template provides three per-phase voltage devices (R/S/T-phase, corresponding to L1/L2/L3), each with a service attribute for phase current. Grid Frequency is reported in Hz.

Two power devices monitor the inverter output at different measurement points:

  • Total Active Power Output — inverter output power in kW, with service attributes for reactive power (kVAR) and apparent power (kVA)
  • Total Active Power PPC — power at the Point of Common Coupling (grid connection point) in kW, with reactive and apparent power service attributes. This measurement is used for feed-in limitation and power plant controller functions.
Module service attributes

The module exposes three service attributes for inverter diagnostics:

  • Product Code — inverter product identification
  • System State — current operating state: Waiting, Detection, Grid-connected, Emergency Power Supply, Recoverable Fault, Permanent Fault, Upgrade, or Self-charging
  • Ambient Temperature — inverter inner temperature in °C

The module ReadScript also monitors three fault bitmask registers (H:0x0405–H:0x0407), reporting grid protection faults, sampling errors, and hardware faults as errors in TapHome.

Additional capabilities

The HYD KTL-3PH inverters also expose registers for remote on/off control, energy storage mode selection (Self-use, Time-of-Use, Timing, Passive, Peak Shaving, Off-grid), and passive battery charge/discharge control for external energy management systems. Per-phase active power and power factor, off-grid/EPS output monitoring, additional PV string inputs (PV4+), battery cycle counts, heatsink temperature, and parameters for batteries 3–6 are also available via Modbus. These can be added in a future template update.

The Passive Mode registers (H:0x1110 and H:0x1187) allow external Modbus control of battery charge/discharge power. This is particularly useful for TapHome smart rules to implement energy management strategies such as charging batteries during low-tariff periods.

Troubleshooting

No Modbus communication
  1. Verify the RS-485 cable is connected to Pins 1+3 (or 2+4) on the COM port — not Pins 5+6 (smart meter bus)
  2. Check cable polarity: Pin 1 (A+) to TapHome A+, Pin 3 (B-) to TapHome B-
  3. Confirm TapHome is configured for 9600 baud, no parity, 1 stop bit
  4. Verify the Slave ID matches between the inverter and TapHome
  5. Check the 120 Ohm termination resistor on the first and last device on the bus
Intermittent communication errors
  1. Ensure the RS-485 cable is shielded twisted pair with copper diameter > 0.5 mm²
  2. Keep RS-485 cables away from power cables and DC wiring
  3. Check total bus length does not exceed 1200 m
  4. Verify no duplicate Slave IDs on the bus
System State shows fault
  1. Check the System State service attribute for the specific state code (4 = Recoverable Fault, 5 = Permanent Fault)
  2. Review fault register details in TapHome service diagnostics — the template reads three fault bitmask registers covering grid protection, sampling errors, and hardware faults
  3. Consult the inverter LCD display or SolarMAN app for detailed error codes

Available devices

Sofar Solar HYD KTL-3PH Module
Service Attributes
Product Code
System StateInverter operating state — Waiting, Detection, Grid-connected, Emergency Power Supply, Recoverable Fault, Permanent Fault, Upgrade, Self-charging
Ambient TemperatureInverter inner temperature in °C

SofarSolar

Read (module)
#fault 1
var fault :=MODBUSR(H, 0x0405, Uint16);
IF fault !=0 
IF(GETBIT(fault, 0) != 0, ADDERROR("Grid over-voltage"));
IF(GETBIT(fault, 1) != 0, ADDERROR("Grid undervoltage"));
IF(GETBIT(fault, 2) != 0, ADDERROR("Grid overfrequency"));
IF(GETBIT(fault, 3) != 0, ADDERROR("Grid underfrequency"));
IF(GETBIT(fault, 4) != 0, ADDERROR("Leakage current fault"));
IF(GETBIT(fault, 5) != 0, ADDERROR("High penetration error"));
IF(GETBIT(fault, 6) != 0, ADDERROR("Low penetration error"));
IF(GETBIT(fault, 7) != 0, ADDERROR("Islanding error"));
IF(GETBIT(fault, 8) != 0, ADDERROR("Grid voltage transient value overvoltage 1"));
IF(GETBIT(fault, 9) != 0, ADDERROR("Grid voltage transient value overvoltage 2"));
IF(GETBIT(fault, 10) != 0, ADDERROR("Grid line voltage error"));
IF(GETBIT(fault, 11) != 0, ADDERROR("Inverter voltage error"));
IF(GETBIT(fault, 12) != 0, ADDERROR("Anti-backflow overload"));
END

#fault 2
fault :=MODBUSR(H, 0x0406, Uint16);
IF fault !=0 
IF(GETBIT(fault, 0) != 0, ADDERROR("Grid current sampling error"));
IF(GETBIT(fault, 1) != 0, ADDERROR("Grid current DC component sampling error (AC side)"));
IF(GETBIT(fault, 2) != 0, ADDERROR("Grid voltage sampling error (DC side)"));
IF(GETBIT(fault, 3) != 0, ADDERROR("Grid voltage sampling error (AC side)"));
IF(GETBIT(fault, 4) != 0, ADDERROR("Leakage current sampling error (DC side)"));
IF(GETBIT(fault, 5) != 0, ADDERROR("Leakage current sampling error (AC side)"));
IF(GETBIT(fault, 6) != 0, ADDERROR("Load voltage DC component sampling error"));
IF(GETBIT(fault, 7) != 0, ADDERROR("DC input current sampling error"));
IF(GETBIT(fault, 8) != 0, ADDERROR("DC component sampling error of grid current (DC side)"));
IF(GETBIT(fault, 9) != 0, ADDERROR("DC input branch current sampling error"));
IF(GETBIT(fault, 12) != 0, ADDERROR("Leakage current consistency error"));
IF(GETBIT(fault, 13) != 0, ADDERROR("Grid voltage consistency error"));
IF(GETBIT(fault, 14) != 0, ADDERROR("DCI consistency error"));
END

#fault 3
fault :=MODBUSR(H, 0x0407, Uint16);
IF fault !=0 
IF(GETBIT(fault, 0) != 0, ADDERROR("SPI communication error (DC side)"));
IF(GETBIT(fault, 1) != 0, ADDERROR("SPI communication error (AC side)"));
IF(GETBIT(fault, 2) != 0, ADDERROR("Chip error (DC side)"));
IF(GETBIT(fault, 3) != 0, ADDERROR("Chip error (AC side)"));
IF(GETBIT(fault, 4) != 0, ADDERROR("Auxiliary power error"));
IF(GETBIT(fault, 5) != 0, ADDERROR("Inverter soft start failure"));
IF(GETBIT(fault, 8) != 0, ADDERROR("Relay detection failure"));
IF(GETBIT(fault, 9) != 0, ADDERROR("Low insulation impedance"));
IF(GETBIT(fault, 10) != 0, ADDERROR("Grounding error"));
IF(GETBIT(fault, 11) != 0, ADDERROR("Input mode setting error"));
IF(GETBIT(fault, 12) != 0, ADDERROR("CT error"));
IF(GETBIT(fault, 13) != 0, ADDERROR("Input reversal error"));
IF(GETBIT(fault, 14) != 0, ADDERROR("Parallel error"));
IF(GETBIT(fault, 15) != 0, ADDERROR("Serial number error"));
END
Service Attributes
Product Code
MODBUSR(H, 0x2000, Uint16);
System State
SWITCH(MODBUSR(H, 0x0404, Uint16),
0, "Waiting",
1, "Detection",
2, "Grid-connected",
3, "Emergency power supply",
4, "Recoverable fault",
5, "Permanent fault",
6, "Upgrade",
7, "Self-charging",
"Fault")
Ambient Temperature
MODBUSR(H, 0x0418, Int16) + "°C";
Battery 1 SOC Analog Input Read-only

Battery 1 state of charge as percentage — includes service attributes for temperature, voltage, current, power and SOH

Register: H:0x0608 Uint16 Unit: % numeric
Service Attributes
Temperature
Voltage
Current
Power
SOH

Battery 1 SOC

Read input level
MODBUSR(H, 0x0608, Uint16)
Service Attributes
Temperature
MODBUSR(H, 0x0607, Int16) + "°C";
Voltage
MODBUSR(H, 0x0604, Uint16) + " V";
Current
MODBUSR(H, 0x0605, Int16)/100 + " A";
Power
MODBUSR(H, 0x0606, Int16)/100 + " kW";
SOH
MODBUSR(H, 0x0609, Uint16) + " %";
Battery 2 SOC Analog Input Read-only

Battery 2 state of charge as percentage — available on HYD 10–20KTL-3PH models with dual battery input

Register: H:0x060F Uint16 Unit: % numeric
Service Attributes
Temperature
Voltage
Current
Power
SOH

Battery 2 SOC

Read input level
MODBUSR(H, 0x060F, uint16)
Service Attributes
Temperature
MODBUSR(H, 0x060E, Int16) + " °C";
Voltage
MODBUSR(H, 0x060B, Uint16) + " V";
Current
MODBUSR(H, 0x060C, Int16) + " A";
Power
MODBUSR(H, 0x060D, Int16) + " kW";
SOH
MODBUSR(H, 0x0610, Uint16) + " %";
Battery Discharge Today Variable Read-only

Daily battery discharge energy in kWh — includes lifetime total

Register: H:0x0698 Uint32 Unit: kWh numeric
Service Attributes
Battery Discharge Total

Battery Discharge Today

Read
MODBUSR(H, 0x0698, Uint32)/100
Service Attributes
Battery Discharge Total
MODBUSR(H, 0x069A, Uint32)/10
Battery Charge Today Variable Read-only

Daily battery charge energy in kWh — includes lifetime total

Register: H:0x0694 Uint32 Unit: kWh numeric
Service Attributes
Battery Charge Total

Battery Charge Today

Read
MODBUSR(H, 0x0694, Uint32)/100
Service Attributes
Battery Charge Total
MODBUSR(H, 0x0696, Uint32)/10
Energy Purchase Today Variable Read-only

Daily energy bought from grid in kWh — includes lifetime total

Register: H:0x068C Uint32 Unit: kWh numeric
Service Attributes
Energy Purchase Total

Energy Purchase Today

Read
MODBUSR(H, 0x068C, Uint32)/100
Service Attributes
Energy Purchase Total
MODBUSR(H, 0x068E, Uint32)/10 + " kWh"
Energy Selling Today Variable Read-only

Daily energy sold to grid in kWh — includes lifetime total

Register: H:0x0690 Uint32 Unit: kWh numeric
Service Attributes
Energy Selling Total

Energy Selling Today

Read
MODBUSR(H, 0x0690, Uint32)/100
Service Attributes
Energy Selling Total
MODBUSR(H, 0x0692, Uint32)/10
Grid Frequency Variable Read-only
Register: H:0x0484 UInt16 Unit: Hz numeric

Grid Frequency

Read
MODBUSR(H, 0x484, UInt16)/100
Load Consumption Today Variable Read-only

Daily load consumption in kWh — includes lifetime total

Register: H:0x0688 Int32 Unit: kWh numeric
Service Attributes
Load Consumption Total

Load Consumption Today

Read
MODBUSR(H, 0x0688, Int32)/100
Service Attributes
Load Consumption Total
MODBUSR(H, 0x068A, Int32)/100 + "kWh"
PV Power Total Variable Read-only

Combined power output from all PV strings in kW

Register: H:0x05C4 Uint16 Unit: kW numeric

PV Power Total

Read
MODBUSR(H, 0x05C4, Uint16)/10
PV1 Power Variable Read-only
Register: H:0x0586 Uint16 Unit: kW numeric
Service Attributes
Voltage
Current

PV1 Power

Read
MODBUSR(H, 0x0586, Uint16)/100
Service Attributes
Voltage
MODBUSR(H, 0x0584, Uint16)/10 + " V";
Current
MODBUSR(H, 0x0585, Uint16)/100 + " A";
PV2 Power Variable Read-only
Register: H:0x0589 Uint16 Unit: kW numeric
Service Attributes
Voltage
Current

PV2 Power

Read
MODBUSR(H, 0x0589, Uint16)/100
Service Attributes
Voltage
MODBUSR(H, 0x0587, Uint16)/10 + " V";
Current
MODBUSR(H, 0x0588, Uint16)/100 + " A";
PV3 Power Variable Read-only
Register: H:0x058A Uint16 Unit: kW numeric
Service Attributes
Voltage
Current

PV3 Power

Read
MODBUSR(H, 0x058A, Uint16)/100
Service Attributes
Voltage
MODBUSR(H, 0x058A, Uint16)/10 + " V";
Current
MODBUSR(H, 0x058B, Uint16)/100 + " A"
PV Generation Today Variable Read-only

Daily PV generation energy in kWh

Register: H:0x0684 Int32 Unit: kWh numeric

PV Generation Today

Read
MODBUSR(H, 0x0684, Int32)/100
PV Generation Total Variable Read-only

Lifetime PV generation energy in kWh

Register: H:0x0686 Int32 Unit: kWh numeric

PV Generation Total

Read
MODBUSR(H, 0x0686, Int32)/100
R-phase Voltage Variable Read-only

L1/R-phase grid voltage in V — includes phase current service attribute

Register: H:0x048D Uint16 Unit: V numeric
Service Attributes
Current R

R-phase Voltage

Read
MODBUSR(H, 0x048D, Uint16)/10
Service Attributes
Current R
MODBUSR(H, 0x048E, Uint16)/100 + " A";
S-phase Voltage Variable Read-only

L2/S-phase grid voltage in V — includes phase current service attribute

Register: H:0x0498 Uint16 Unit: V numeric
Service Attributes
Current S

S-phase Voltage

Read
MODBUSR(H, 0x0498, Uint16)/10
Service Attributes
Current S
MODBUSR(H, 0x0499, Uint16)/100 + " A"
T-phase Voltage Variable Read-only

L3/T-phase grid voltage in V — includes phase current service attribute

Register: H:0x04A3 Uint16 Unit: V numeric
Service Attributes
Current T

T-phase Voltage

Read
MODBUSR(H, 0x04A3, Uint16)/10
Service Attributes
Current T
MODBUSR(H, 0x04A4, Uint16)/100 + " A"
Total Active Power Output Variable Read-only

Inverter total active power output in kW — includes reactive and apparent power

Register: H:0x0485 Int16 Unit: kW numeric
Service Attributes
Reactive Power Output
Apparent Power Output

Total Active Power Output

Read
MODBUSR(H, 0x0485, Int16)/100
Service Attributes
Reactive Power Output
MODBUSR(H, 0x0486, Int16)/100 + " kW" ;
Apparent Power Output
MODBUSR(H, 0x0487, Int16)/100 + " kW" ;
Total Active Power PPC Variable Read-only

Active power at the Point of Common Coupling (grid connection point) in kW — used for feed-in limitation

Register: H:0x0488 Int16 Unit: kW numeric
Service Attributes
Reactive Power PPC
Apparent Power PPC

Total Active Power PPC

Read
MODBUSR(H, 0x0488, Int16)/100
Service Attributes
Reactive Power PPC
MODBUSR(H, 0x0489, Int16)/100 + " kW" ;
Apparent Power PPC
MODBUSR(H, 0x048A, Int16)/100 + " kW" ;
Connection: Modbus RTU • 9600 baud• 8N1 • Slave ID: $[SlaveId]
Possible improvements (12)
  • H:0x1104 Remote Switch On/Off — Remote inverter on/off control — useful for TapHome automation
  • H:0x1110 Energy Storage Mode — Operating mode selection: Self-use, Time-of-Use, Timing, Passive, Peak Shaving, Off-grid
  • H:0x1187 Passive Battery Charge/Discharge — S32, external Modbus control of battery charge/discharge power — enables TapHome smart rule energy management
  • H:0x0200 Running State — 0=Wait, 1=CheckState, 2=Normal, 3=CheckDischarge, 4=Discharge, 5=EPS, 6=Fault, 7=Permanent — older register range, covered by H:0x0404 System State in module
  • H:0x0504 Off-Grid Active Power — EPS/backup output power (S16, 0.01 kW) — relevant for off-grid/backup scenarios
  • H:0x050A-0x0522 Off-Grid Per-Phase Voltage/Current/Power — L1/L2/L3 off-grid output monitoring — 9 registers for 3-phase EPS output
  • H:0x0507 Off-Grid Frequency — EPS output frequency (U16, 0.01 Hz)
  • H:0x048F-0x04A7 Per-Phase Active/Reactive Power and Power Factor — L1/L2/L3 individual active power, reactive power, and power factor — template only reads voltage+current per phase
  • H:0x058D-0x058F PV4 Voltage/Current/Power — PV string 4 input — template supports up to PV3. HA integration supports up to PV10
  • H:0x0612-0x0627 Battery 3–6 Parameters — Additional battery packs (voltage, current, power, temperature, SOC, SOH, cycles) — template supports battery 1–2 only
  • H:0x022C Battery Cycle Count — Battery cycle times (Uint16, 0–65536) — available at 0x060A per battery in HA integration
  • H:0x0419 Heatsink Temperature — Inverter heatsink temperature (S16, °C) — template reads inner temperature (0x0418) only

Sources