TapHome
Community Beta Energy & metering

SolaX X1/X3-Hybrid G4 — corrected monitoring (Modbus RTU)

Community template for the SolaX X1-HYBRID and X3-HYBRID Gen 4 inverters over Modbus RTU on RS-485: the official TapHome Gen 4 template with corrected readings — fault code word order, total energy scale, PV production meter and signed battery temperature. Reads battery SOC and temperature, PV1/PV2 power, grid feed-in, energy totals, charger mode and night charge SOC; writes stay disabled. 19200 baud, 8N1, Slave ID 1.

SolaXModbus RTU9 devicesRevision 1.0 Last updated: November 12, 2026

Submitted by Martin Keller

SolaX X1/X3-Hybrid G4 — corrected monitoring (Modbus RTU)

Import into the TapHome appHardware › Modbus › Add from template

Download Template
On this page

Integration guide

The SolaX X1-HYBRID and X3-HYBRID Gen 4 are energy storage inverters with PV and battery, available as single-phase (3–7.5 kW) and three-phase (5–15 kW) models. This community template is the official TapHome SolaX Gen 4 template with its readings corrected against the SolaX Modbus protocol (V3.21 and V001.02). It communicates via Modbus RTU over RS-485 and reads battery state of charge and temperature, PV string power, grid power flow, energy totals, charger mode and night charge SOC. Device names are the same as in the official template, so an older import can be compared device by device. All write scripts stay commented out, as in the official template, so the template is read-only.

The module also parses the 32-bit inverter fault code and the 16-bit manager error code and reports every fault in TapHome with its own error code.

How to get the template

Community templates are not offered in the TapHome app’s template list. Sign in to portal.taphome.com, download the XML of this template and import it into the Core. A module imported earlier from the official template SolaX Hybrid X1/X3 Gen 4 does not update itself — either import this template as a new module, or correct the scripts of the old module as shown in the table under “What this template corrects” below.

Hardware connection

The SolaX Gen 4 inverter provides an RS-485 COM port for Modbus RTU communication on the bottom panel. The COM port uses an RJ45 connector.

SolaX X3-HYBRID G4 bottom panel — terminal layout with COM, BMS, Meter/CT, PV, BAT and GRID connections

COM terminal pin assignment (RJ45):

PinAssignmentDescription
1Drycontact_A(in)System switch connection
2Drycontact_B(in)System switch connection
3+13V—
4485ARS-485 data+ (for TapHome)
5485BRS-485 data− (for TapHome)
6GNDGround
7Drycontact_A(out)Generator connection
8Drycontact_B(out)Generator connection

Connect TapHome to the inverter COM port:

  • Pin 4 (485A) on inverter COM to A+/D+ on TapHome RS-485
  • Pin 5 (485B) on inverter COM to B-/D- on TapHome RS-485
  • Pin 6 (GND) connection recommended for reliable communication

The SolaX manual specifies a CAT5E network cable crimped into the RJ45 plug supplied with the inverter, and a COM cable length of at most 30 m.

Pin 3 (+13V) and pin 6 (GND) must not be connected together. Insulate the pins that are not used.

The inverter itself does not support Modbus TCP natively. Modbus TCP is only available through the SolaX monitoring module (Wi-Fi dongle) and is not used by this template.

For installations where RS-485 wiring is not practical, the SolaX Inverter (Cloud API) template provides monitoring through the SolaxCloud platform via HTTPS — no physical connection required. It supports all SolaX inverter types, not just the Gen 4 Hybrid.

Charger use mode and the night charge settings are EEPROM registers in the inverter (marked ★ by SolaX, about 1 million write cycles). Excessive write operations can cause irreversible hardware damage — never enable a write on them that runs periodically. This template has all write scripts disabled.

Configuration

Enabling Modbus communication

Modbus RTU is available on the inverter’s RS-485 COM port by default. The following parameters must match between the inverter and the TapHome module:

  1. Slave ID – default is 1, configurable on the inverter display. The template asks for it as its only import parameter, Modbus Slave ID (default 1)
  2. Baud rate – 19200 baud, the SolaX factory default; the template uses 19200 as well. If the inverter was set to another speed (for example 9600), change either the inverter setting or the speed of the TapHome interface so that both match
  3. Data format – 8 data bits, no parity, 1 stop bit

To configure on the inverter display: Menu > Setting > Advance Setting > Modbus. Set the slave address and baud rate. Advanced settings require the installer password, which is available from the dealer. The baud rate can also be read from holding register H:0x00B0 and written via register 0x00CA (values: 0=115200, 1=57600, 2=56000, 3=38400, 4=19200, 5=14400, 6=9600).

In TapHome, the template is then imported on the Core’s RS-485 Modbus RTU interface set to the same speed and data format, with the inverter’s Slave ID.

Communication timing

The protocol requires a minimum interval of 1 second between consecutive Modbus instructions and a character-gap timeout of at least 100 ms. The response timeout is 1 second. The template uses individual poll intervals per device (2.5 s to 150 s) which satisfy these constraints.

RS-485 COM port function

Register H:0x013E (485CommFunSelect) determines whether the RS-485 port is used for Modbus communication (value 0) or EV Charger communication (value 1). Ensure this is set to 0 (Modbus 485) for TapHome integration.

Device capabilities

Battery monitoring

  • Battery (SOC) – reads battery state of charge (A:0x001C) as a percentage, every 15 seconds. The raw register value in 1% units is divided by 100 for the TapHome 0–1 analog input range (e.g. 85% becomes 0.85)
  • Battery Temperature – reads battery temperature (A:0x0018) in degrees Celsius as a signed value (Int16), so temperatures below 0 °C are shown correctly. Polled every 80 seconds

Solar PV power

  • PV1 – DC power output from PV string 1 (A:0x000A), displayed in kW after /1000 conversion from watts
  • PV2 – DC power output from PV string 2 (A:0x000B), displayed in kW after /1000 conversion from watts

PV1 and PV2 are plain values without an energy type, so they do not count twice in the Energy Dashboard.

Grid power and energy metering

  • Purchase/Feed to Grid – instantaneous grid power (A:0x0046–0x0047, LittleEndianInt32) in kW, a plain value without an energy type. Positive values indicate feed-in to the grid, negative values indicate purchase from the grid. The inverter takes this value from the meter or CT connected to it
  • Daily/Actual Energy – the PV production meter for the Energy Dashboard. Its power is PV1 + PV2 (A:0x000A + A:0x000B) in kW and its total is the total PV energy (A:0x0094–0x0095, SolarEnergyTotal, 0.1 kWh units) in kWh. Despite its name, the total does not reset at night
  • Total Energy – lifetime cumulative energy output from the inverter AC port (A:0x0052–0x0053, LittleEndianUint32, 0.1 kWh units), displayed in kWh

Charger mode and night charge

  • Charger Use Mode – reads the active solar charger mode (H:0x008B): Self Use Mode (0), Feedin Priority (1), Backup Mode (2), or Manual Mode (3). The write register (H:0x001F) exists in the template but is commented out, making this read-only
  • SelfUse Night Charge – reads the upper SOC target for night charging in Self Use mode (H:0x0094) as a percentage. The write register (H:0x0063) and enable register (H:0x0062) are both commented out, so night charge configuration cannot be changed through TapHome

Fault detection

The module read script monitors the inverter run mode (A:0x0009) and two error registers. Every fault has its own error code:

  • Run mode faults – error 1 when the run mode is 3 (Fault), error 2 when it is 4 (Permanent Fault)
  • Inverter fault code (A:0x0040–0x0041, LittleEndianUint32) – 30 individual faults with codes 100–131 (100 + bit number), including grid voltage/frequency faults, PV voltage faults, battery faults, isolation faults, overtemperature, overcurrent protection, relay faults, and communication errors. The fault names follow the X3 table of the SolaX protocol
  • Manager error code (A:0x0043) – codes 200–211 (200 + bit number) for power type faults, EEPROM errors, NTC sensor issues, battery temperature low/high, meter faults, bypass relay and fan faults. Port OC Warning (201) is reported as a warning, the others as errors

The Run mode service attribute on the module displays the current inverter state as text: Waiting, Checking, Normal, Fault, Permanent fault, Update, Off-grid waiting, Off-grid, Self testing, Idle, or Standby.

What this template corrects

The official TapHome template SolaX Hybrid X1/X3 Gen 4 reads several registers incorrectly (verified against SolaX Modbus protocol V3.21 and V001.02). This template corrects them:

WhereOfficial templateThis templateEffect of the error in the official template
Module — read scriptvar x3 := MODBUSR(A, 0x0040, Uint32);VAR inv := MODBUSR(A, 0x0040, LittleEndianUint32);The two halves of the 32-bit fault code are swapped: a fault in bit 1 (Grid Lost Fault) is reported as bit 17 (Bat Power Low)
Total EnergyMODBUSR(A, 0x52, LittleEndianInt32) / 1000MODBUSR(A, 0x0052, LittleEndianUint32) / 10Value 100× too small (the register counts in 0.1 kWh)
Daily/Actual Energy — totalMODBUSR(A, 0x50, UInt16) /10MODBUSR(A, 0x0094, LittleEndianUint32) / 100x0050 is a daily counter of the inverter AC port that falls to 0 every night; 0x0094 is the total PV energy
Daily/Actual Energy — powerMODBUSR(A,0x02, Int16)/1000(MODBUSR(A, 0x000A, UInt16) + MODBUSR(A, 0x000B, UInt16)) / 10000x0002 is the grid power of single-phase X1 models, not PV production; it reads 0 on many X3 units
Battery TemperatureMODBUSR(A,0x0018, UInt16)MODBUSR(A, 0x0018, Int16)Below 0 °C the official template shows about 65535 °C
Interface speed9600 baud19200 baud19200 is the SolaX factory default

With the corrected scripts the Daily/Actual Energy meter measures PV production (PV1 + PV2), which is what its energy type in the Energy Dashboard expects. PV1, PV2 and Purchase/Feed to Grid no longer carry an energy type — they are plain values. All writes stay disabled, like in the official template.

Troubleshooting

No communication with inverter

  1. Verify the RS-485 cable connections: A+ to A+, B- to B-, GND to GND
  2. Check that register H:0x013E is set to 0 (Modbus 485 mode, not EV Charger)
  3. Confirm the baud rate matches between inverter and TapHome – the template uses 19200, the inverter default; an inverter set to 9600 needs one side changed
  4. Verify the Modbus Slave ID in TapHome matches the inverter setting (default: 1)
  5. Ensure no other Modbus master is connected to the same RS-485 bus – Modbus supports only a single master

Values look like the official template

When Total Energy is 100× too small, Daily/Actual Energy falls to 0 every night or Battery Temperature shows about 65535 °C below freezing, the module still runs the scripts of the official template. A module does not update itself from a newer template — import this template as a new module, or correct the scripts as shown in the table above.

Battery (SOC) reading incorrect

The Battery (SOC) register (A:0x001C) reports values in 1% units. The template divides by 100 for the TapHome 0–1 analog input range. If the displayed value seems wrong, verify the TapHome device is configured as an analog input (0–1 range, not 0–100).

Grid power sign convention

Purchase/Feed to Grid (A:0x0046) uses a sign convention where positive values mean feed-in (export to the grid) and negative values mean purchase (consumption from the grid). The inverter obtains this value from its meter or CT, so it depends on a correctly connected meter or CT.

X1 vs X3 differences

The template reads PV power (A:0x000A and A:0x000B) instead of the X1 grid power register, so the Daily/Actual Energy meter works on X1 and X3 models alike. The fault names follow the X3 table of the SolaX protocol. On an X1 inverter some fault bits mean different faults — bit 9 and most bits from bit 15 upward (for example, bit 15 is Missed CT Fault on X1 but Off-grid Overload on X3).

Available devices 9

These devices appear in TapHome after import.

SolaX X3-Hybrid G4 Module
Service Attributes
Run mode

SolaX X3-Hybrid G4

Read (module)
VAR mode := MODBUSR(A, 0x0009, UInt16);
IF(mode = 3, ADDERROR(1, "Inverter fault (run mode 3)"));
IF(mode = 4, ADDERROR(2, "Inverter permanent fault (run mode 4)"));
VAR inv := MODBUSR(A, 0x0040, LittleEndianUint32);
IF(GETBIT(inv, 0) = 1, ADDERROR(100, "TZ Protect Fault"));
IF(GETBIT(inv, 1) = 1, ADDERROR(101, "Grid Lost Fault"));
IF(GETBIT(inv, 2) = 1, ADDERROR(102, "Grid Volt Fault"));
IF(GETBIT(inv, 3) = 1, ADDERROR(103, "Grid Freq Fault"));
IF(GETBIT(inv, 4) = 1, ADDERROR(104, "PV Volt Fault"));
IF(GETBIT(inv, 5) = 1, ADDERROR(105, "Bus Volt Fault"));
IF(GETBIT(inv, 6) = 1, ADDERROR(106, "Bat Volt Fault"));
IF(GETBIT(inv, 7) = 1, ADDERROR(107, "AC10mins Volt Fault"));
IF(GETBIT(inv, 8) = 1, ADDERROR(108, "DCI OCP Fault"));
IF(GETBIT(inv, 9) = 1, ADDERROR(109, "DCV OCP Fault"));
IF(GETBIT(inv, 10) = 1, ADDERROR(110, "SW OCP Fault"));
IF(GETBIT(inv, 11) = 1, ADDERROR(111, "RC OCP Fault"));
IF(GETBIT(inv, 12) = 1, ADDERROR(112, "Isolation Fault"));
IF(GETBIT(inv, 13) = 1, ADDERROR(113, "Temp Over Fault"));
IF(GETBIT(inv, 14) = 1, ADDERROR(114, "BatConnDir Fault"));
IF(GETBIT(inv, 15) = 1, ADDERROR(115, "Off-grid Overload"));
IF(GETBIT(inv, 16) = 1, ADDERROR(116, "Overload"));
IF(GETBIT(inv, 17) = 1, ADDERROR(117, "Bat Power Low"));
IF(GETBIT(inv, 18) = 1, ADDERROR(118, "BMS Lost"));
IF(GETBIT(inv, 19) = 1, ADDERROR(119, "Fan Fault"));
IF(GETBIT(inv, 20) = 1, ADDERROR(120, "Low Temp Fault"));
IF(GETBIT(inv, 23) = 1, ADDERROR(123, "INV Volt Sample Fault"));
IF(GETBIT(inv, 24) = 1, ADDERROR(124, "Inner Comm Fault"));
IF(GETBIT(inv, 25) = 1, ADDERROR(125, "INV EEPROM Fault"));
IF(GETBIT(inv, 26) = 1, ADDERROR(126, "RCD Fault"));
IF(GETBIT(inv, 27) = 1, ADDERROR(127, "Grid Relay Fault"));
IF(GETBIT(inv, 28) = 1, ADDERROR(128, "Off-grid Relay Fault"));
IF(GETBIT(inv, 29) = 1, ADDERROR(129, "PV ConnDir Fault"));
IF(GETBIT(inv, 30) = 1, ADDERROR(130, "Charger Relay Fault"));
IF(GETBIT(inv, 31) = 1, ADDERROR(131, "Earth Relay Fault"));
VAR mgr := MODBUSR(A, 0x0043, UInt16);
IF(GETBIT(mgr, 0) = 1, ADDERROR(200, "Power Type Fault"));
IF(GETBIT(mgr, 1) = 1, ADDWARNING(201, "Port OC Warning"));
IF(GETBIT(mgr, 2) = 1, ADDERROR(202, "Mgr EEPROM Fault"));
IF(GETBIT(mgr, 4) = 1, ADDERROR(204, "NTC Sample Invalid"));
IF(GETBIT(mgr, 5) = 1, ADDERROR(205, "Battery Temperature Low"));
IF(GETBIT(mgr, 6) = 1, ADDERROR(206, "Battery Temperature High"));
IF(GETBIT(mgr, 9) = 1, ADDERROR(209, "Meter Fault"));
IF(GETBIT(mgr, 10) = 1, ADDERROR(210, "Bypass Relay Fault"));
IF(GETBIT(mgr, 11) = 1, ADDERROR(211, "Fan 2 Fault"));
Service Attributes
Run mode
SWITCH(MODBUSR(A, 0x0009, UInt16), 0, "Waiting", 1, "Checking", 2, "Normal", 3, "Fault", 4, "Permanent fault", 5, "Update", 6, "Off-grid waiting", 7, "Off-grid", 8, "Self testing", 9, "Idle", 10, "Standby", "Other")
${deviceType_BatterySOC} Analog Input

${deviceType_BatterySOC}

Read input level
MODBUSR(A, 0x001C, UInt16) / 100
Battery Temperature Temperature Sensor

Battery Temperature

Read temperature
MODBUSR(A, 0x0018, Int16)
Daily/Actual Energy Electricity Meter

Daily/Actual Energy

Read total consumption
MODBUSR(A, 0x0094, LittleEndianUint32) / 10
Read demand
(MODBUSR(A, 0x000A, UInt16) + MODBUSR(A, 0x000B, UInt16)) / 1000
Charger Use Mode Multi-value Switch
Values / States: Self Use Mode · Feedin Priority · Backup Mode · Manual Mode

Charger Use Mode

Read switch state
MODBUSR(H, 0x008B, UInt16)
Write switch state
#MODBUSW(SH, 0x001F, Uint16, Mu)
Purchase/Feed to Grid Variable

Purchase/Feed to Grid

Read
MODBUSR(A, 0x0046, LittleEndianInt32) / 1000
PV1 Variable

PV1

Read
MODBUSR(A, 0x000A, UInt16) / 1000
PV2 Variable

PV2

Read
MODBUSR(A, 0x000B, UInt16) / 1000
SelfUse Night Charge Dimmer

SelfUse Night Charge

Initialize
#MODBUSWNE(SH, 0x0062, Uint16, 1);
Read level
MODBUSR(H, 0x0094, UInt16) / 100
Write level
#MODBUSW(SH, 0x0063, Uint16, Le * 100)
Total Energy Variable

Total Energy

Read
MODBUSR(A, 0x0052, LittleEndianUint32) / 10
Connection: Modbus RTU • 19200 baud• 8N1 • Slave ID: $[SlaveId]

Import parameters

Enter these values when you import the XML.

Asked in the appDefault
Modbus Slave ID1

Found a problem with this device template?

Tell us what's wrong, what's missing, or how the template should behave. We rely on your feedback to keep the catalog accurate.

Template · TapHome portal SolaX X1/X3-Hybrid G4 — corrected monitoring (Modbus RTU) Open this template in the Customer Portal to apply it to one of your homes, or to draft a refinement and submit it back to the catalog. Modbus RTU View in TapHome portal