---
title: "SolaX X3-Ultra Hybrid Inverter — monitoring and power control (Modbus RTU)"
description: "SolaX X3-Ultra over Modbus RTU (RS-485): Energy Dashboard meters, battery SOC, grid, faults and remote AC power control to charge or discharge the battery."
url: "https://taphome.com/en/compatibility/solax-x3-ultra-power-control-modbus-rtu/"
language: en
lastmod: 2026-11-10
generator: hugo
ai:
  topics: ["modbus-rtu","rs485","inverter","solar","battery-storage","3-phase","hybrid-inverter","energy-monitoring","remote-power-control"]
  questions: ["How to integrate the SolaX X3-Ultra hybrid inverter with TapHome?","What does the SolaX X3-Ultra power control template measure and control?","How to wire RS-485 from the SolaX X3-Ultra COM 1 port to TapHome?","How to charge or discharge the SolaX X3-Ultra battery from TapHome by spot electricity prices?","Why does the SolaX X3-Ultra remote control target return to 0 right after it is set?","Which device should the TapHome Energy Manager use with the SolaX X3-Ultra?"]
---

# SolaX X3-Ultra Hybrid Inverter — monitoring and power control (Modbus RTU)

Communication: Modbus RTU

## Integration guide

The SolaX X3-Ultra (X3-ULT-15K, 20K, 25K, 30K) is a three-phase hybrid PV and battery inverter. This community template by Martin Keller connects it to TapHome over **Modbus RTU on the COM 1 RS-485 port** (19200 baud, 8N1) and is built on the SolaX Modbus protocol V3.29 read registers and the SolaX Modbus protocol V001.02. It provides a complete set of meters for the Energy Dashboard, battery, grid and fault monitoring, inverter settings that are written only when their value really changes, and remote AC power control (SolaX remote control mode 1) — charging the battery from the grid or discharging it into the grid on command, for example by spot electricity prices.

## 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 on the Modbus RTU interface (or on a Modbus TCP interface when an RS-485-to-Ethernet gateway is used). For monitoring without remote power control, the official template [SolaX X3 Hybrid Ultra](https://taphome.com/en/compatibility/solax-hybrid-ultra-x3/) is available. A module imported earlier from the official template does not update itself — import this template as a new module and remove the old one.

## Hardware connection

The X3-Ultra has a single multi-function **COM 1 port** (RJ45 connector with a labeled cable fixture). The same physical pins serve different functions depending on which labeled position of the cable fixture is used. For third-party Modbus integration use the **RS485** position — the **REMOTE_485A** and **REMOTE_485B** lines.

### COM 1 port pinout

![SolaX X3-Ultra COM 1 port pin assignment for all six labeled positions (Parallel-1, Parallel-2, BMS-1, BMS-2, RS485, DRM)](https://taphome.com/images/compatibility/solax-x3-ultra-power-control-modbus-rtu/com1-pinout_hu_4124a3cd9e8bc981.jpg)

Pin assignment of the **RS485 position** (the only position relevant to TapHome):

| Pin | Signal | TapHome wiring |
|-----|--------|----------------|
| **1** | **REMOTE_485A** | A+ / D+ |
| **2** | **REMOTE_485B** | B− / D− |
| 3 | PARALLEL_485AA | do not use (SolaX accessories only) |
| 4 | PARALLEL_485AA | do not use (SolaX accessories only) |
| 5 | PARALLEL_485BB | do not use (SolaX accessories only) |
| 6 | PARALLEL_485BB | do not use (SolaX accessories only) |
| **7** | **REMOTE_485A** | same signal as pin 1 |
| **8** | **REMOTE_485B** | same signal as pin 2 |

> [!WARNING]
> Pins 3–6 belong to the SolaX PARALLEL_485 channel and are reserved for SolaX products (Adapter Box G2, EV-Charger, DataHub). Pins 1, 2, 7 and 8 are intended for devices other than SolaX products. Do **not** connect a third-party Modbus master to pins 3–6.

### RS-485 wiring

![Installing the RJ45 terminal into the RS485 position of the COM 1 cable fixture](https://taphome.com/images/compatibility/solax-x3-ultra-power-control-modbus-rtu/wiring-rs485_hu_ac07cf89af382c1.jpg)

Wiring rules from the X3-Ultra user manual (section 8.6.4):

- **Cable type:** network cable CAT5E or CAT6
- **Max length:** the RS-485 communication cable must not exceed **30 m**
- **RJ45 terminal:** the existing connector of the cable is cut off and a new RJ45 terminal is crimped according to the pin assignment; not all devices accept a fully wired 8-pin network cable
- **Cable fixture position:** the RJ45 terminal goes into the slot labeled **RS485** (not into Parallel-1, Parallel-2, BMS-1, BMS-2 or DRM); the connector clicks into the COM 1 port and is secured with the swivel nut
- **Single Modbus master:** only one Modbus master may use the port. Disconnect other Modbus monitoring on the same port, otherwise the inverter answers both and the readings become unstable

The user manual gives no rule for RS-485 bus termination on the COM 1 RS485 position.

### Meter or CT for grid values

The grid devices of this template (**Grid - power balance**, **From Grid**, **To Grid**, **Load**) read the feed-in power that the inverter measures with its own meter or CT. The meter or CT is wired to the **COM 2** port (Meter/CT: METER_485A on pin 4, METER_485B on pin 5, or the CT inputs) and set up on the inverter display in `Menu → Setting → Advance Setting → Meter/CT Setting`. This is a separate RS-485 line — do not connect TapHome to it.

### Connection options

- **Direct Modbus RTU:** wire the COM 1 RS485 pair directly to the RS-485 bus of the TapHome Core. Lowest latency, recommended for remote power control.
- **RS-485-to-Ethernet gateway:** when the inverter is far from the TapHome Core, a third-party RS-485-to-Ethernet gateway on the COM 1 RS485 pair can be used; the template is then imported on a Modbus TCP interface.
- **SolaX monitoring module:** the inverter itself does not support Modbus TCP. Modbus TCP (port 502) is only available through a SolaX monitoring module, with a query cycle of about 1 second (protocol V3.29).

## Configuration

### Enabling Modbus communication on the inverter

On the inverter LCD navigate to:

```
Menu → Setting → Advance Setting → Modbus
```

The Advance Setting menu requires the installer password (initially **2014** according to the user manual, which recommends changing it). In the Modbus menu set the **Baud Rate** and the **Address** of the external communication protocol:

| Parameter | Template default | Inverter default (protocol V3.29) |
|-----------|------------------|-----------------------------------|
| Modbus address (Slave ID) | 1 | 1 |
| Baud rate | 19200 | 19200 |
| Parity | None | None |
| Data bits | 8 | 8 |
| Stop bits | 1 | 1 |

> [!WARNING]
> The baud rate must be the same on the inverter and on the TapHome Modbus RTU interface. If communication fails, check the baud rate first.

The inverter also reports the Modbus address in holding register `H:0x00AF` and the baud rate in holding register `H:0x00B0` (protocol V3.29).

### Import parameter

When the template is imported, the import parameter **Modbus Slave ID** (default `1`) must match the Modbus address set on the inverter display.

## Device capabilities

### Energy Dashboard

| Device | Reading |
|---|---|
| **PV Production** | PV1 + PV2 + PV3 input power (`A:0x000A`, `A:0x000B`, `A:0x0124`) in kW; total PV energy (`A:0x0094`–`0x0095`) in kWh. PV1–PV3 power and the inverter's total AC output energy (`A:0x0052`) are service attributes. |
| **From Grid** / **To Grid** | Import and export part of the grid power from the meter or CT (`A:0x0046`–`0x0047`, low word first) with their total energy counters (`A:0x004A` and `A:0x0048`, 0.01 kWh). |
| **To Battery** / **From Battery** | Charging and discharging part of battery 1 power (`A:0x0016`) with total charge and discharge energy (`A:0x0021`, `A:0x001D`). |
| **Load** | Calculated house load: inverter AC power minus grid export. SolaX has no load register; loads on the EPS (backup) output are not included. |
| **Battery (SOC)** | Battery 1 state of charge (`A:0x001C`). Remaining and chargeable energy (`A:0x0118`, `A:0x0116`) are service attributes. |

### Energy Manager

For the Energy Manager smart rule select **Grid - power balance**. It is signed: positive when importing from the grid, negative when exporting surplus. The **From Grid** and **To Grid** meters never go negative and do not show surplus.

### Monitoring

- **Battery 2 - state of charge** — the second battery terminal (BAT 2), with its power and temperature as service attributes; reads 0 without a second battery
- **Battery - temperature** — read as a signed value, so temperatures below 0 °C are shown correctly
- **Inverter - AC power** — sum of the three phase powers at the inverter AC port in kW
- **Grid - voltage L1** — with grid voltage L2, L3 and the three grid frequencies as service attributes

### Inverter settings

| Device | Read | Write |
|---|---|---|
| **Settings - work mode** | `H:0x008B`: Self use, Feed-in priority, Backup, Manual, Peak shaving, Time of use (the last two depend on the firmware) | `0x001F` |
| **Settings - manual mode** | `H:0x008C`: Stop charge and discharge, Force charge, Force discharge (effective only in work mode Manual) | `0x0020` |
| **Settings - self-use minimum SOC** | high byte of `H:0x0093` | `0x0061` |
| **Settings - night charge from grid** | low byte of `H:0x0093` | `0x0062` |
| **Settings - night charge target SOC** | `H:0x0094` | `0x0063` |
| **Settings - export limit** | `H:0x00B6`, in kW (10 W per count on X3) | `0x0042` |

SolaX reads these settings from other addresses than it writes them, so TapHome's built-in "write only if different" function cannot be used. Each write script therefore reads the setting first and writes (function 06) only when the new value differs; when the inverter reports the settings as locked, it first writes the settings password 2014 to register `0x0000`. The minimum SOC and the night charge target never go below 10 % (the SolaX range). None of these devices writes periodically.

> [!WARNING]
> These settings are EEPROM registers (marked ★ by SolaX, about 1 million write cycles). Change them rarely and never from frequent automations — for spot-price charging and discharging use **Remote control - AC power target**.

### Remote control - AC power target

This device uses SolaX remote control (VPP) mode 1 — power control at the inverter AC port.

- **Sign:** a positive target means the inverter takes power at its AC port (it charges the battery, from the grid if PV is not enough); a negative target means it outputs power (it discharges the battery, and what the house does not use goes to the grid). Value in kW.
- **0** ends remote control: the template writes mode 0 once and the inverter returns to its work mode. Targets below 0.5 W count as 0.
- **Any other value:** if the inverter is locked, the template first writes the settings password 2014 (the unlock is lost after every inverter restart), then writes the 13 registers `0x007C`–`0x0088` in one Modbus request (function 0x10): mode 1, target, duration 120 s and timeout 60 s. The command is repeated every 60 s while the target is not 0. If TapHome stops sending it, the inverter keeps the target for up to 2 minutes, holds 0 W at its AC port for 1 more minute and then returns to its work mode on its own.
- **Work mode Manual blocks remote control.** SolaX does not start remote control while the inverter is in work mode Manual — switch it to Self use (or another mode) first.
- The inverter limits the target to the range shown in the module attributes (remote control minimum and maximum target).
- The module action **End remote control** writes mode 0 immediately. While the target is not 0, the next repetition starts remote control again — set the target to 0 to stop it for good.
- Do not combine this device with remote control from SolaX Cloud or an energy aggregator: while the target is 0, the template ends any remote control mode within 60 s.
- Remote control needs a Core that writes all 13 registers in one request. That is the case on every Core since 2022 when the module keeps `MaxPrefetchGroupSize` 32 from this template.
- The service attribute **Actual AC power** shows the active power the inverter reports at its AC port in W (`A:0x0106`).

> [!WARNING]
> SolaX does not mark the remote control registers (`0x007C`–`0x0088`) as EEPROM registers in its protocol, but it does not confirm the opposite in writing either. This template relies on the experience of the Home Assistant and openHAB communities, which write these registers every few seconds to minutes.

### Module attributes and actions

- **Run mode** (service attribute) — inverter state as text: Waiting, Checking, Normal, Fault, Permanent fault, Update, Off-grid waiting, Off-grid, Self testing, Idle, Standby, Remote control (code 20); other codes show as Other
- **Machine type** (service attribute) — X1 (single-phase) or X3 (three-phase), holding register `H:0x0105`
- **Settings lock** (service attribute) — Locked or Unlocked (`A:0x0054`)
- **Remote control mode** (service attribute) — active remote control mode (`A:0x0100`): Off, Power control, Energy target, SOC target
- **Remote control - maximum target** / **minimum target** (service attributes) — allowed power target range reported by the inverter in W (`A:0x010A`, `A:0x010C`)
- **Unlock settings (password 2014)** (service action) — writes `2014` to register `0x0000`
- **End remote control** (service action) — writes mode 0 to the remote control registers `0x007C`–`0x0088`

### Fault detection

The module read script reports a TapHome error when the run mode (`A:0x0009`) is 3 (Fault) or 4 (Permanent fault). It also parses two error registers bit by bit, each fault with its own error code:

- **Inverter fault code** (32-bit, `A:0x0040`–`A:0x0041`, read low word first) — all 32 bits, from TZ Protect Fault, grid, PV, bus and battery voltage faults, isolation and overtemperature faults to Parallel Fault, Hard Limit Fault and the relay faults
- **Manager error code** (16-bit, `A:0x0043`) — Power Type Fault, Mgr EEPROM Fault, NTC Sample Invalid, battery temperature low and high, Meter Fault, Bypass Relay Fault and Fan 2 Fault as errors, Port OC Warning as a warning

## Troubleshooting

### No communication with the inverter

1. Verify that the RS-485 wires are on the **REMOTE_485A / REMOTE_485B** pins (1 + 2 or 7 + 8 in the RS485 position of the COM 1 cable fixture), not on the PARALLEL_485 pins 3–6 and not on the meter line of COM 2
2. Check that the baud rate matches between the inverter (`Menu → Setting → Advance Setting → Modbus`) and the TapHome Modbus RTU interface — 19200 by default
3. Confirm that the import parameter **Modbus Slave ID** matches the inverter's Modbus address (default `1`)
4. Make sure only **one** Modbus master is connected to the port
5. Swap the A and B wires if the cable polarity is uncertain
6. Confirm the RS-485 cable does not exceed **30 m**

### Remote control target returns to 0 right after it is set

The inverter is in work mode Manual, the firmware does not support remote control mode 1, or the target is outside the minimum and maximum target shown in the module attributes. Check the work mode first.

### Settings write is rejected

The inverter is locked. Run the module action **Unlock settings (password 2014)**; the lock comes back after every inverter restart (module attribute **Settings lock**).

### Grid values are 0 or Load looks wrong

**Grid - power balance**, **From Grid**, **To Grid** and **Load** depend on the inverter's meter or CT. Check its wiring on COM 2 and its setup in `Menu → Setting → Advance Setting → Meter/CT Setting`.

### PV3 power or Battery 2 shows 0

PV3 exists only on the three-tracker models (for example X3-ULT-25K and X3-ULT-30K, see the MPPT count in the user manual); Battery 2 only when a second battery is connected to BAT 2. Hide the unused devices in TapHome.

## Available devices 19

These devices appear in TapHome after import.

SolaX X3-Ultra Module

Service Attributes

|                                 |
|---------------------------------|
| Run mode                        |
| Machine type                    |
| Settings lock                   |
| Remote control mode             |
| Remote control - maximum target |
| Remote control - minimum target |

Service Actions

|                                 |
|---------------------------------|
| Unlock settings (password 2014) |
| End remote control              |

Read (module)

```taphome
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, 21) = 1, ADDERROR(121, "Parallel Fault"));
IF(GETBIT(inv, 22) = 1, ADDERROR(122, "Hard Limit 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

```taphome
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", 20, "Remote control", "Other")
```

Machine type

```taphome
SWITCH(MODBUSR(H, 0x0105, UInt16), 1, "X1 (single-phase)", 3, "X3 (three-phase)", "Unknown")
```

Settings lock

```taphome
SWITCH(MODBUSR(A, 0x0054, UInt16), 0, "Locked", 1, "Unlocked", "Unknown")
```

Remote control mode

```taphome
SWITCH(MODBUSR(A, 0x0100, UInt16), 0, "Off", 1, "Power control", 2, "Energy target", 3, "SOC target", "Other")
```

Remote control - maximum target

```taphome
TOSTRING(MODBUSR(A, 0x010A, LittleEndianInt32)) + " W"
```

Remote control - minimum target

```taphome
TOSTRING(MODBUSR(A, 0x010C, LittleEndianInt32)) + " W"
```

Service Actions

Unlock settings (password 2014)

```taphome
MODBUSW(SH, 0x0000, Uint16, 2014);
```

End remote control

```taphome
MODBUSW(H, 0x007C, Uint16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
```

${deviceType\_PVProduction} Electricity Meter

Service Attributes

|                                   |
|-----------------------------------|
| PV1 power                         |
| PV2 power                         |
| PV3 power                         |
| Inverter AC output - total energy |

Read total consumption

```taphome
MODBUSR(A, 0x0094, LittleEndianUint32) / 10
```

Read demand

```taphome
(MODBUSR(A, 0x000A, UInt16) + MODBUSR(A, 0x000B, UInt16) + MODBUSR(A, 0x0124, UInt16)) / 1000
```

Service Attributes

PV1 power

```taphome
TOSTRING(MODBUSR(A, 0x000A, UInt16)) + " W"
```

PV2 power

```taphome
TOSTRING(MODBUSR(A, 0x000B, UInt16)) + " W"
```

PV3 power

```taphome
TOSTRING(MODBUSR(A, 0x0124, UInt16)) + " W"
```

Inverter AC output - total energy

```taphome
TOSTRING(MODBUSR(A, 0x0052, LittleEndianUint32) / 10, "F1") + " kWh"
```

Grid - power balance Electricity Meter

Read demand

```taphome
MODBUSR(A, 0x0046, LittleEndianInt32) / -1000
```

${deviceType\_PVFromGrid} Electricity Meter

Read total consumption

```taphome
MODBUSR(A, 0x004A, LittleEndianUint32) / 100
```

Read demand

```taphome
MAX(-MODBUSR(A, 0x0046, LittleEndianInt32), 0) / 1000
```

${deviceType\_PVToGrid} Electricity Meter

Read total consumption

```taphome
MODBUSR(A, 0x0048, LittleEndianUint32) / 100
```

Read demand

```taphome
MAX(MODBUSR(A, 0x0046, LittleEndianInt32), 0) / 1000
```

${deviceType\_PVToBattery} Electricity Meter

Read total consumption

```taphome
MODBUSR(A, 0x0021, LittleEndianUint32) / 10
```

Read demand

```taphome
MAX(MODBUSR(A, 0x0016, Int16), 0) / 1000
```

${deviceType\_PVFromBattery} Electricity Meter

Read total consumption

```taphome
MODBUSR(A, 0x001D, LittleEndianUint32) / 10
```

Read demand

```taphome
MAX(-MODBUSR(A, 0x0016, Int16), 0) / 1000
```

${deviceType\_PVLoad} Electricity Meter

Read demand

```taphome
((MODBUSR(A, 0x006C, Int16) + MODBUSR(A, 0x0070, Int16) + MODBUSR(A, 0x0074, Int16)) - MODBUSR(A, 0x0046, LittleEndianInt32)) / 1000
```

${deviceType\_BatterySOC} Analog Input

Service Attributes

|                   |
|-------------------|
| Remaining energy  |
| Chargeable energy |

Read input level

```taphome
MODBUSR(A, 0x001C, UInt16) / 100
```

Service Attributes

Remaining energy

```taphome
TOSTRING(MODBUSR(A, 0x0118, LittleEndianUint32) / 1000, "F2") + " kWh"
```

Chargeable energy

```taphome
TOSTRING(MODBUSR(A, 0x0116, LittleEndianUint32) / 1000, "F2") + " kWh"
```

Battery 2 - state of charge Analog Input

Service Attributes

|                       |
|-----------------------|
| Battery 2 power       |
| Battery 2 temperature |

Read input level

```taphome
MODBUSR(A, 0x012D, UInt16) / 100
```

Service Attributes

Battery 2 power

```taphome
TOSTRING(MODBUSR(A, 0x0129, Int16)) + " W"
```

Battery 2 temperature

```taphome
TOSTRING(MODBUSR(A, 0x0131, Int16)) + " °C"
```

Battery - temperature Temperature Sensor

Read temperature

```taphome
MODBUSR(A, 0x0018, Int16)
```

Inverter - AC power Variable

Read

```taphome
(MODBUSR(A, 0x006C, Int16) + MODBUSR(A, 0x0070, Int16) + MODBUSR(A, 0x0074, Int16)) / 1000
```

Grid - voltage L1 Variable

Service Attributes

|                   |
|-------------------|
| Grid voltage L2   |
| Grid voltage L3   |
| Grid frequency L1 |
| Grid frequency L2 |
| Grid frequency L3 |

Read

```taphome
MODBUSR(A, 0x006A, UInt16) / 10
```

Service Attributes

Grid voltage L2

```taphome
TOSTRING(MODBUSR(A, 0x006E, UInt16) / 10, "F1") + " V"
```

Grid voltage L3

```taphome
TOSTRING(MODBUSR(A, 0x0072, UInt16) / 10, "F1") + " V"
```

Grid frequency L1

```taphome
TOSTRING(MODBUSR(A, 0x006D, UInt16) / 100, "F2") + " Hz"
```

Grid frequency L2

```taphome
TOSTRING(MODBUSR(A, 0x0071, UInt16) / 100, "F2") + " Hz"
```

Grid frequency L3

```taphome
TOSTRING(MODBUSR(A, 0x0075, UInt16) / 100, "F2") + " Hz"
```

Settings - work mode Multi-value Switch

Values / States: Self use · Feed-in priority · Backup · Manual · Peak shaving · Time of use

Read switch state

```taphome
MODBUSR(H, 0x008B, UInt16)
```

Write switch state

```taphome
IF(MODBUSR(H, 0x008B, UInt16) != Mu AND MODBUSR(A, 0x0054, UInt16) = 0, MODBUSW(SH, 0x0000, Uint16, 2014));
IF(MODBUSR(H, 0x008B, UInt16) != Mu, MODBUSW(SH, 0x001F, Uint16, Mu));
```

Settings - manual mode Multi-value Switch

Values / States: Stop charge and discharge · Force charge · Force discharge

Read switch state

```taphome
MODBUSR(H, 0x008C, UInt16)
```

Write switch state

```taphome
IF(MODBUSR(H, 0x008C, UInt16) != Mu AND MODBUSR(A, 0x0054, UInt16) = 0, MODBUSW(SH, 0x0000, Uint16, 2014));
IF(MODBUSR(H, 0x008C, UInt16) != Mu, MODBUSW(SH, 0x0020, Uint16, Mu));
```

Settings - self-use minimum SOC Dimmer

Read level

```taphome
GETBYTE(MODBUSR(H, 0x0093, UInt16), 1) / 100
```

Write level

```taphome
VAR v := MAX(ROUND(Le * 100), 10);
IF(GETBYTE(MODBUSR(H, 0x0093, UInt16), 1) != v AND MODBUSR(A, 0x0054, UInt16) = 0, MODBUSW(SH, 0x0000, Uint16, 2014));
IF(GETBYTE(MODBUSR(H, 0x0093, UInt16), 1) != v, MODBUSW(SH, 0x0061, Uint16, v));
```

Settings - night charge from grid Switch

Values / States: ON · OFF

Read switch state

```taphome
GETBYTE(MODBUSR(H, 0x0093, UInt16), 0)
```

Write switch state

```taphome
IF(GETBYTE(MODBUSR(H, 0x0093, UInt16), 0) != St AND MODBUSR(A, 0x0054, UInt16) = 0, MODBUSW(SH, 0x0000, Uint16, 2014));
IF(GETBYTE(MODBUSR(H, 0x0093, UInt16), 0) != St, MODBUSW(SH, 0x0062, Uint16, St));
```

Settings - night charge target SOC Dimmer

Read level

```taphome
MODBUSR(H, 0x0094, UInt16) / 100
```

Write level

```taphome
VAR v := MAX(ROUND(Le * 100), 10);
IF(MODBUSR(H, 0x0094, UInt16) != v AND MODBUSR(A, 0x0054, UInt16) = 0, MODBUSW(SH, 0x0000, Uint16, 2014));
IF(MODBUSR(H, 0x0094, UInt16) != v, MODBUSW(SH, 0x0063, Uint16, v));
```

Settings - export limit Variable

Read

```taphome
MODBUSR(H, 0x00B6, UInt16) / 100
```

Write

```taphome
VAR v := MAX(ROUND(Va * 100), 0);
IF(MODBUSR(H, 0x00B6, UInt16) != v AND MODBUSR(A, 0x0054, UInt16) = 0, MODBUSW(SH, 0x0000, Uint16, 2014));
IF(MODBUSR(H, 0x00B6, UInt16) != v, MODBUSW(SH, 0x0042, Uint16, v));
```

Remote control - AC power target Variable

Service Attributes

|                 |
|-----------------|
| Actual AC power |

Read

```taphome
IF(MODBUSR(A, 0x0100, UInt16) = 1, MODBUSR(A, 0x0102, LittleEndianInt32) / 1000, 0)
```

Write

```taphome
VAR w := ROUND(Va * 1000);
VAR u := IF(w < 0, w + 4294967296, w);
IF(w = 0 AND MODBUSR(A, 0x0100, UInt16) != 0, MODBUSW(H, 0x007C, Uint16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
IF(w != 0 AND MODBUSR(A, 0x0054, UInt16) = 0, MODBUSW(SH, 0x0000, Uint16, 2014));
IF(w != 0, MODBUSW(H, 0x007C, Uint16, 1, 1, MOD(u, 65536), FLOOR(u / 65536), 0, 0, 120, 0, 0, 0, 0, 0, 60));
```

Service Attributes

Actual AC power

```taphome
TOSTRING(MODBUSR(A, 0x0106, LittleEndianInt32)) + " W"
```

**Connection:** Modbus RTU • 19200 baud• 8N1 • Slave ID: $\[SlaveId]

## Import parameters

Enter these values when you import the XML.

| Asked in the app | Default |
|------------------|---------|
| Modbus Slave ID  | `1`     |

## Related Documentation

- [Modbus Integration](https://taphome.com/en/compatibility/modbus-guide/)
- [Modbus](https://taphome.com/en/docs/integration/modbus/)
- [Simple configuration using templates](https://taphome.com/en/docs/integration/modbus/templates/)
- [Modbus scripts and prefetch](https://taphome.com/en/docs/script/modbus-scripts/)
- [Modbus functions](https://taphome.com/en/docs/script/modbus/)
- [Modbus data types](https://taphome.com/en/docs/script/modbus-data-types/)

