Sol-Ark Inverter
Telemetry driver for Sol-Ark commercial hybrid inverters. It polls the inverter over Modbus and exposes live PV, battery, grid, load, energy, and temperature readings as device attributes, each trended in history so you can graph it and drive automations off it.
This is a monitoring integration. It reads the inverter; it does not start, stop, curtail, or change any inverter setting — Sol-Ark exposes no write control on this register map. If you need to write registers for a non-standard installation, the generic Modbus commands are available (see Commands), but a stock Sol-Ark setup is read-only.
The register map follows the Sol-Ark Commercial Modbus mapping document (MCU 1095 / COMM 1040). Register offsets can drift on other firmware revisions; if your readings look offset or scaled wrong, confirm your inverter firmware against that document.
How it connects
The driver rides GEM's generic Modbus transport, so it speaks either:
- Modbus/TCP — the inverter's RS-485 port wired into a Modbus-TCP gateway (RS-485 ↔ Ethernet) on the LAN. This is the typical install. You give GEM the gateway IP, TCP port (502), and the inverter's Unit ID.
- Modbus/RTU — a direct RS-485 serial run into a serial port visible to the GEM server. Leave the IP blank and provide the serial port and baud rate. The serial wiring specifics are covered on the Modbus integration page.
Only one Modbus request is in flight at a time on the shared link, and the driver reads a register at a time with a short gap between reads, so keep the poll rate sensible (see below) — especially on RS-485.
Prerequisites
- The Sol-Ark inverter's Modbus interface enabled (RS-485, or RS-485 behind a Modbus-TCP gateway).
- For TCP: the gateway reachable on the LAN, and its IP and port. A static DHCP reservation is strongly recommended so the gateway IP doesn't move.
- The inverter's Modbus slave (Unit) address. Sol-Ark units are commonly addressed at
1; confirm on the inverter if you have changed it.
Setup steps
-
Open System → Devices → Add Device.
-
Set the Driver to Sol-Ark Inverter and Enabled to Yes.
-
Pick a Subsystem of Power (see the note below), give the device a name, and Save.
-
Open the new device's Attributes and add the Modbus connection settings by hand. The Sol-Ark quick-add form only exposes the poll rate, so these are entered here:
Attribute Type Value ipstring IP of the Modbus-TCP gateway (or the inverter, if it has native Modbus TCP). Leave blank for a direct RS-485/RTU connection. portint 502for Modbus/TCP, unless you changed it on the gateway.unit_idint The inverter's Modbus slave address (commonly 1; valid range 0–247).cautionUse unit_id, notslave_idThe driver reads the slave address from the attribute named
unit_id. Aslave_idattribute is ignored. (The driver's built-in sample config labels itslave_id— that value does nothing; always setunit_id.)For a Modbus/RTU (direct serial) connection instead of TCP, leave
ipblank and add the serial port and baud-rate attributes documented on the Modbus page. -
(Optional) Adjust Register Poll Rate (ms) — the
polling_rateattribute, shown under the device's Advanced settings. Default is30000(30 s); the minimum is1000. Lower values poll the inverter more often but put more traffic on the Modbus link. -
Reload the device. It connects over Modbus and starts polling. Within one poll cycle the telemetry attributes below appear on the device row.
Put the device under the Power subsystem. The driver hints power, and a stock install seeds a subsystem named Power, but the device editor does not auto-select it — choose Power by hand from the Subsystem picker. This is a plain monitoring device, not an AV integration.
This driver does not create or require zones. All telemetry lands directly on the device as attributes — there is no per-zone breakdown to set up, and the inverter's Address field is unused. (Advanced users who want a specific register mapped onto a zone can use the generic Modbus zone-mapping described on the Modbus page; it is not needed for normal Sol-Ark monitoring.)
Attribute reference
Every telemetry attribute below is read-only, updated on each poll, and stored with history enabled — so each one is available in the History charts and as an attribute-trigger source. The driver writes an attribute only when its value changes.
Identity and nameplate
| Attribute | Unit | Notes |
|---|---|---|
serial_number | — | Inverter serial number (ASCII, read from registers 3–7). |
device_address | — | The Modbus device address the inverter reports for itself. |
default_voltage | V | Default output voltage. |
rated_power | W | Nameplate rated power. The driver combines the inverter's low and high rated-power registers into this single value. |
PV (solar) input
| Attribute | Unit | Notes |
|---|---|---|
total_pv_power | W | Total PV input power across all strings. |
pv1_power … pv4_power | W | Per-string input power (PV1–PV4). |
pv1_voltage, pv1_current | V, A | PV string 1 voltage and current. |
pv2_voltage, pv2_current | V, A | PV string 2 voltage and current. |
pv_energy_today | kWh | PV energy generated today. |
energy_today | kWh | Total energy generated today. |
Battery
| Attribute | Unit | Notes |
|---|---|---|
battery1_soc | % | Battery 1 state of charge. |
battery1_voltage | V | Battery 1 voltage. |
battery1_current | A | Battery 1 current. Signed — a negative value means the battery is charging. |
battery1_power | W | Battery 1 power. Signed — a negative value means the battery is charging. |
battery1_temp | °C | Battery 1 temperature (offset already applied — see Reading the values). |
battery_charge_today | kWh | Energy charged into the battery today. |
battery_discharge_today | kWh | Energy discharged from the battery today. |
Grid
| Attribute | Unit | Notes |
|---|---|---|
grid_voltage_a, grid_voltage_b, grid_voltage_c | V | Grid phase A / B / C voltage. |
grid_frequency | Hz | Grid frequency. |
grid_import_today | kWh | Energy imported from the grid today. |
grid_export_today | kWh | Energy exported to the grid today. |
Load (output)
| Attribute | Unit | Notes |
|---|---|---|
load_voltage_a, load_voltage_b, load_voltage_c | V | Load phase A / B / C voltage. |
load_frequency | Hz | Load frequency. |
load_energy_today | kWh | Load energy consumed today. |
Generator
| Attribute | Unit | Notes |
|---|---|---|
generator_energy_today | kWh | Generator energy today. |
Temperatures
| Attribute | Unit | Notes |
|---|---|---|
inverter_temp | °C | Inverter DC-side temperature. |
heat_sink_temp | °C | Heat-sink temperature. |
Warnings and faults
| Attribute | Unit | Notes |
|---|---|---|
warning_message_1, warning_message_2 | — | Raw 16-bit warning words. |
fault_message_1, fault_message_2 | — | Raw 16-bit fault words. |
These four attributes hold the inverter's raw register values, not decoded text — each bit corresponds to a specific condition in the Sol-Ark Modbus manual. A non-zero value means at least one warning or fault bit is set. To trigger on a specific condition, set an attribute trigger on the relevant value, or decode the bits against the manual. The driver does not yet translate these into human-readable messages.
Reading the values
Three quirks of the Sol-Ark register map are already handled by the driver, so the attribute values you see are the real-world numbers — but it helps to know why:
- Temperatures carry a −100 °C offset. The inverter encodes temperature with a +100 °C bias (so 25 °C is sent as a raw 125.0). The driver subtracts the offset for you, so
inverter_temp,heat_sink_temp, andbattery1_tempread true degrees Celsius. If a temperature attribute reports a wildly low number (for example around −75 °C), the firmware is applying the offset differently than this map expects — re-check firmware against MCU 1095 / COMM 1040. - Battery power and current are signed. Negative means the battery is charging; positive means it is discharging. If
battery1_poweris always positive even while you know the battery is charging, the inverter's register isn't using the signed convention this map expects. - Rated power spans two registers. The inverter splits nameplate rated power across a low word and a high word; the driver combines them into the single
rated_powerattribute.
Commands
The device exposes these commands (run them from the device's command panel — see Commands):
get_status— returns the latest cached register values and a timestamp. Useful to confirm the device is polling and reading sensible numbers without waiting for the next attribute change.
The remaining commands — read_register, read_registers, read_coil, read_coils, read_input, read_inputs, write_register, write_registers, write_coil, write_coils, open, close, pulse — are the generic Modbus read/write/relay verbs inherited from the Modbus transport. On a standard Sol-Ark monitoring install you do not need them: the telemetry above populates automatically, and the inverter has no controllable coils, so the relay-style verbs (open/close/pulse) have nothing to act on. They are present for advanced Modbus access and diagnostics only.
Energy dashboard
Sol-Ark telemetry is not yet wired into the generic Power Flow dashboard. Drivers like Tesla Powerwall, Enphase, SolarEdge, and Fronius tag their readings into a shared normalization layer so they appear on the Power Flow widget automatically; the Sol-Ark readings are not tagged that way, so they will not show up on that widget on their own. (See Power Management for how that dashboard works.)
In the meantime, every Sol-Ark attribute is history-enabled, so you can still build the picture you need:
- Graph any value over time from the History page — PV power, battery SOC, grid import/export, temperatures, daily energy totals.
- Automate on values with attribute triggers — for example, notify when
battery1_socdrops below a threshold, when a fault word goes non-zero, or whengrid_export_todaycrosses a target.
Troubleshooting
| Symptom | Likely cause / fix |
|---|---|
| No telemetry attributes ever appear | The connection attributes aren't set. Confirm ip (TCP) or the serial settings (RTU) and unit_id are present on the device, then reload it. The quick-add form does not collect these — add them in the device's Attributes. |
sol-ark: modbus not connected, skipping poll repeats in the logs | The Modbus transport isn't connected. For TCP, check the gateway IP/port; for RTU, check the serial port and baud rate. Verify the gateway is reachable on the LAN. |
| Device connects but no values populate | Wrong unit_id, or the inverter's Modbus address differs from what's configured. Confirm the inverter's slave address and that it matches unit_id (not slave_id). |
| Temperatures report around −75 °C or other wild values | The −100 °C offset doesn't match the firmware. Confirm the inverter firmware against the MCU 1095 / COMM 1040 mapping document. |
battery1_power / battery1_current always positive while charging | The signed-register convention differs on this firmware. Negative is expected during charge on the documented map; verify the firmware revision. |
| Values update slowly | Raise the poll rate by lowering polling_rate (default 30000 ms), but keep RS-485 traffic in mind — too low can saturate the link. |
Related documentation
- Devices — adding and managing device rows
- Attributes — adding the
ip/port/unit_idconnection attributes and viewing live telemetry - Subsystems — the Power subsystem this device belongs to
- Commands — running
get_statusand the generic Modbus commands - History — graphing the trended telemetry attributes
- Modbus — the underlying Modbus transport, RTU serial settings, and zone-point mapping
- Power Management — the generic energy-flow dashboard