[ST Edge Driver] SolarEdge PV Inverter

[LAN Driver] SolarEdge Inverter via local Modbus TCP (SunSpec)

Reads live power, lifetime energy, DC voltage/power, temperature, and operating status from a SolarEdge inverter over its local Modbus TCP interface — no cloud dependency, no SolarEdge API key or monitoring-portal rate limits. If you have a SolarEdge production/consumption meter attached (e.g. the SE-RGMTR series), it also reads live net grid power (import vs. export) and lifetime exported/imported energy as a separate “Grid” component — read-only, detected automatically at startup, no config needed.

Channel invite: SmartThings. Add a little smartness to your things.

GitHub:smartthings-drivers/se-modbus-driver at main · ST-SmartHome/smartthings-drivers · GitHub

Tested against an SE5000AU (single-phase, SunSpec Model 101). Should work on any SolarEdge inverter with Modbus TCP enabled and reachable on your LAN — SunSpec’s inverter model (101/single-phase, 102/split-phase, 103/three-phase) shares the same register layout, and the driver locates it dynamically rather than assuming a fixed address (see “Notes for other models” below).

Requirements

  • SolarEdge inverter with Modbus TCP enabled (on the inverter: Communication
    → LAN Conf → Modbus TCP). Disabled by default.
  • Known LAN IP of the inverter, and its Modbus TCP port (usually 502, some units/firmware use 1502 — check yours).
  • A SmartThings Hub (this is a Hub-local LAN Edge Driver, not cloud-connected).

Setup

  1. Accept the channel invite above and enroll your hub.
  2. Install the driver (“SE Modbus” or similar) from the channel onto your hub.
  3. In the SmartThings app: Add Device → Scan Nearby. It should offer a generic “SolarEdge Inverter” device immediately — this driver doesn’t wait on any network broadcast (see why, below), so there’s no scan delay.
  4. Add it, then open its device settings and fill in your inverter’s IP, Modbus port, and unit ID (SolarEdge’s default unit ID is 1). Save.
  5. Polling starts automatically on save, on the interval you set (default 30s).

Why this exists / what’s different from a “normal” LAN driver

Most SmartThings LAN drivers use search-parameters.yml to gate discovery on SSDP or mDNS traffic — the hub only bothers running your driver’s discovery code when it sees a matching network broadcast, which saves resources. SolarEdge’s Modbus TCP service never broadcasts anything — per SolarEdge’s own docs, it’s a passive server that “does not initiate a connection… waits for a client to connect.” A driver gated on SSDP for a device like this will never be invoked — confirmed the hard way, via a live logcat capture during an actual “Add Device” attempt that produced zero log lines.

This driver doesn’t use search-parameters.yml at all. Discovery unconditionally offers one device when triggered, and you supply the real IP as a device preference afterward. If you’re adapting this pattern for another self-announcing-nothing LAN device, that’s the part worth copying.

(Worth being precise about why stock drivers gate on SSDP/mDNS in the first place, credit to a community reply for the correction: it’s because they’re installed automatically on every single hub, so without gating, every hub would offer to create devices for protocols the user might not even own hardware for. A community driver is opt-in — you only install it if you already know you have the device — so that particular problem doesn’t apply here, and unconditional discovery is the simpler, correct choice rather than a compromise standing in for the “real” pattern.)

Notes for other SolarEdge models / three-phase units

  • The driver walks the SunSpec model chain (reads the SunS identifier, then follows the model header chain) to find the Inverter model (101/102/103) rather than assuming a fixed register address — this varies by device/firmware, don’t hardcode it.
  • SunSpec defines four temperature slots (Cabinet/Sink/Transformer/Other); vendors typically populate only one, leaving the rest at the “not implemented” sentinel value. This driver reads all four and uses whichever one actually has data — on the SE5000AU tested, that’s the Heat Sink slot, not Cabinet.
  • On the inverter side, only reads total AC power, lifetime energy, DC voltage/power, temperature, and status — doesn’t currently read per-phase voltage/current (relevant mainly for three-phase units). Would be a straightforward addition using the same model-relative offset pattern in src/solaredge.lua if anyone wants it. (The optional grid meter, below, is a separate thing and already implemented.)

Grid meter

If a SunSpec meter model (201/202/203/204) is found in the Modbus chain right after the inverter model, the driver reads it in the same Modbus session (see “known limitations” below on why) and exposes it as a second “Grid” component:

  • Power meter: net grid power in watts, signed — negative means importing from the grid (consuming), positive means exporting (selling back). Confirmed against a live overnight reading (inverter asleep, 0W production) showing a negative value matching real household draw.
  • Grid Energy: lifetime exported and imported totals in kWh, as two separate read-only values (a custom capability — SmartThings has no standard capability for this).

No meter, no component — this degrades cleanly, it’s not a hard requirement.

Known limitations

  • SolarEdge inverters accept one Modbus TCP connection at a time — if you already have something else (Home Assistant, etc.) polling the same inverter, this driver’s connection attempts will conflict with it. This is also why the grid meter is read in the same connection as the inverter data rather than a second one.
  • Operating status (OFF/SLEEPING/STARTING/MPPT/THROTTLED/SHUTTING_DOWN/FAULT/STANDBY) is exposed as a free-text custom capability (“Inverter Status”) rather than a strict enum — there’s no great standard capability fit for inverter operating state, and SmartThings doesn’t support custom enum-typed attributes as cleanly as free text.

The stock LAN drivers do that because they are all automatically installed on the hub. For community drivers a similar outcome is better achieved by not installing the driver unless you need it.

Good point, and thanks for the correction — I’d confused “how stock drivers do it” with “the correct general pattern,” when really it’s about auto-install-everywhere (stock) vs. opt-in (community). Since you only install this driver if you already know you have the hardware, unconditional discovery isn’t a workaround, it’s just the right call for that context.

Updated the original post with additional feature info and a new invite URL:

Oh you weren’t the only one. A number of us saw what the the stock drivers were doing and then later read the documentation which explained the what but left out a key bit of the why. When one of the engineering team pointed out that it was not really helpful outside of stock drivers I suspect there was a lot of face palms across the world. I was certainly kicking myself and I haven’t even written LAN drivers.

Update: DC-side readouts added

New “DC Input” component on the inverter device, exposing:

  • DC Voltage — straight off the solar panels, before inversion.
  • DC Power — same, panel-side, before inversion.

These use the standard voltageMeasurement/powerMeter capabilities, same as the existing AC output readings on main — just a separate component so it’s clear which side of the inverter you’re looking at. Useful for spotting panel-side issues (a string underperforming, etc.) that wouldn’t necessarily show up in the AC output number alone.

No new preferences or setup needed — this is automatic on your next driver update.

Driver renamed: se-modbus-v4 → se-modbus-tcp

The platform doesn’t support renaming an existing driver in place, so this is technically a new driver (se-modbus-tcp), not an update to the old one — but your existing device can switch over to it without losing anything, no need to remove and re-add.

To switch your existing SolarEdge device:

  1. Make sure you’re already subscribed to the channel (same invite link as before — nothing’s changed there).
  2. On your Hub in the SmartThings app: Hub → Driver → find se-modbus-tcp in the list (it should already be there from the channel, may take a few minutes to show up after a fresh subscribe/refresh).
  3. Go to your SolarEdge Inverter device → gear icon (device settings) → look for a “Driver” option. If it’s there, select se-modbus-tcp from the list.
  4. Check your device preferences afterward (same gear icon → the inverter’s IP address, port, unit ID, poll interval) — in one test this carried over automatically, but the platform doesn’t guarantee that for every driver, so it’s worth a 10-second check. Re-enter them if they reset to placeholder values.
  5. Confirm it’s working: the app should show fresh power/energy readings within a poll cycle or two.

Once you’ve confirmed it’s working, you can optionally remove the old driver from your own hub (Hub → Driver → se-modbus-v4 → uninstall) — purely cosmetic cleanup, not required.

The old se-modbus-v4 driver will stay available on the channel for a few weeks to give everyone time to switch, then may be removed later.

The v4 version has now been removed. Refer to previous instructions on how to change to the new version.

Hello!

First of all, thank you very much for this great driver. It connects perfectly and is running very stably.

I am using it with a SolarEdge SE10K-RWB48 (a three-phase Low-Voltage Hybrid Inverter) on Unit ID 1. The driver successfully discovers the Inverter and the Grid Meter values. However, the connected battery (storage) does not appear in SmartThings.

The reason for this seems to be that SolarEdge does not export the battery storage data via the standard SunSpec blocks on these hybrid models. Instead, SolarEdge stores the battery telemetry in its manufacturer-specific register blocks (holding registers starting at 0xE000 / 57344).

Specifically, the relevant registers on Unit ID 1 are:

  • 0xE004 (57348): Battery Rated Capacity (Wh)
  • 0xE006 (57350): Battery Max Charge/Discharge Power (W)
  • 0xE008 (57352): Battery State of Energy / SoC (%)
  • 0xE00A (57354): Battery State (0 = Off, 1 = Standby, 3 = Charge, 4 = Discharge…)

Would it be possible to extend the driver so that it checks for these SolarEdge-specific storage registers on Unit ID 1 if a hybrid setup is detected, and exposes the Battery State of Charge (SoC) to SmartThings?

Thank you so much for your help and effort!


Update: battery support and per-phase grid readings

A new version is on the channel. If you’re already enrolled, your hub picks it up automatically, though it can take a while to roll out. Restart the hub afterwards so the new layout loads.

1. Battery support (read-only)
If a SolarEdge-connected battery is fitted (StorEdge / Home Battery), a Battery section now appears automatically, showing:

  • power (+ charging / − discharging);
  • temperature;
  • status (Charging, Discharging, Idle…);
  • charge level, health and energy available.

2. A row per grid phase
With a SolarEdge meter fitted, the Grid section now has a row per phase, showing Power, Voltage and Current side by side. Current is measured by the meter.

  • Three-phase sites get Grid Phase One, Two and Three. They’re detected automatically from real voltage on L2 and L3.
  • Single-phase sites get one row. It’s handy for watching grid voltage rise while exporting.
  • The power sign gives each phase’s direction (+ export / − import).

3. Tidier numbers
Phase power is shown in whole watts and lifetime grid energy in whole kWh, so the values no longer wrap onto a second line.

Nothing needs setting up: the driver detects the battery and a three-phase meter on its own and switches the device’s layout once. All values can be used in Routines.

A big thank you to @Hupsy for testing every build on his battery and three-phase system, with screenshots and comparisons against his own meter. This release wouldn’t exist without his help!

As always, feedback and logs are welcome here.

Driver version: 2026-10-09T10:44:00.075294905