Skip to main content

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

  1. Open System → Devices → Add Device.

  2. Set the Driver to Sol-Ark Inverter and Enabled to Yes.

  3. Pick a Subsystem of Power (see the note below), give the device a name, and Save.

  4. 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:

    AttributeTypeValue
    ipstringIP of the Modbus-TCP gateway (or the inverter, if it has native Modbus TCP). Leave blank for a direct RS-485/RTU connection.
    portint502 for Modbus/TCP, unless you changed it on the gateway.
    unit_idintThe inverter's Modbus slave address (commonly 1; valid range 0–247).
    caution
    Use unit_id, not slave_id

    The driver reads the slave address from the attribute named unit_id. A slave_id attribute is ignored. (The driver's built-in sample config labels it slave_id — that value does nothing; always set unit_id.)

    For a Modbus/RTU (direct serial) connection instead of TCP, leave ip blank and add the serial port and baud-rate attributes documented on the Modbus page.

  5. (Optional) Adjust Register Poll Rate (ms) — the polling_rate attribute, shown under the device's Advanced settings. Default is 30000 (30 s); the minimum is 1000. Lower values poll the inverter more often but put more traffic on the Modbus link.

  6. Reload the device. It connects over Modbus and starts polling. Within one poll cycle the telemetry attributes below appear on the device row.

Subsystem placement

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.

No zones to create

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

AttributeUnitNotes
serial_numberInverter serial number (ASCII, read from registers 3–7).
device_addressThe Modbus device address the inverter reports for itself.
default_voltageVDefault output voltage.
rated_powerWNameplate rated power. The driver combines the inverter's low and high rated-power registers into this single value.

PV (solar) input

AttributeUnitNotes
total_pv_powerWTotal PV input power across all strings.
pv1_powerpv4_powerWPer-string input power (PV1–PV4).
pv1_voltage, pv1_currentV, APV string 1 voltage and current.
pv2_voltage, pv2_currentV, APV string 2 voltage and current.
pv_energy_todaykWhPV energy generated today.
energy_todaykWhTotal energy generated today.

Battery

AttributeUnitNotes
battery1_soc%Battery 1 state of charge.
battery1_voltageVBattery 1 voltage.
battery1_currentABattery 1 current. Signed — a negative value means the battery is charging.
battery1_powerWBattery 1 power. Signed — a negative value means the battery is charging.
battery1_temp°CBattery 1 temperature (offset already applied — see Reading the values).
battery_charge_todaykWhEnergy charged into the battery today.
battery_discharge_todaykWhEnergy discharged from the battery today.

Grid

AttributeUnitNotes
grid_voltage_a, grid_voltage_b, grid_voltage_cVGrid phase A / B / C voltage.
grid_frequencyHzGrid frequency.
grid_import_todaykWhEnergy imported from the grid today.
grid_export_todaykWhEnergy exported to the grid today.

Load (output)

AttributeUnitNotes
load_voltage_a, load_voltage_b, load_voltage_cVLoad phase A / B / C voltage.
load_frequencyHzLoad frequency.
load_energy_todaykWhLoad energy consumed today.

Generator

AttributeUnitNotes
generator_energy_todaykWhGenerator energy today.

Temperatures

AttributeUnitNotes
inverter_temp°CInverter DC-side temperature.
heat_sink_temp°CHeat-sink temperature.

Warnings and faults

AttributeUnitNotes
warning_message_1, warning_message_2Raw 16-bit warning words.
fault_message_1, fault_message_2Raw 16-bit fault words.
Fault and warning words are raw bitfields

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, and battery1_temp read 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_power is 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_power attribute.

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_soc drops below a threshold, when a fault word goes non-zero, or when grid_export_today crosses a target.

Troubleshooting

SymptomLikely cause / fix
No telemetry attributes ever appearThe 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 logsThe 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 populateWrong 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 valuesThe −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 chargingThe signed-register convention differs on this firmware. Negative is expected during charge on the documented map; verify the firmware revision.
Values update slowlyRaise the poll rate by lowering polling_rate (default 30000 ms), but keep RS-485 traffic in mind — too low can saturate the link.
  • Devices — adding and managing device rows
  • Attributes — adding the ip / port / unit_id connection attributes and viewing live telemetry
  • Subsystems — the Power subsystem this device belongs to
  • Commands — running get_status and 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