Sungrow iSolarCloud sensor mapping¶
The integration models each iSolarCloud plant as a Home Assistant device, with the plant's physical devices (inverter, battery, meter, WiNet-S) nested underneath it. It adds a sensor for every realtime measure point the plant returns and groups each one under the physical device it belongs to when that device can be identified (see Device grouping). The point codes come from the iSolarCloud API; this guide maps the most common ones to the values shown in the iSolarCloud app.
Not every inverter / battery / meter returns every point. The available set depends on your model, firmware, and region. For a per-family breakdown of what to expect, see the Model support matrix. If a value you expect is missing, see Adding extra measure points below.
Device grouping¶
The integration mirrors your real hardware in Home Assistant's device tree: one iSolarCloud account maps to one config entry, which holds one plant device per plant, and each physical device (inverter, battery/ESS, meter, WiNet-S) is nested under its plant via via_device.
flowchart TD
ACC["π Config entry<br/><i>iSolarCloud account Β· App ID</i>"]
ACC --> P1["π Plant device<br/><i>My Solar Plant Β· service</i>"]
ACC -. "many plants per account" .-> P2["π Plant device<br/><i>β¦another site</i>"]
P1 --> INV["π Inverter<br/>SG3.6RS"]
P1 --> MET["π Meter<br/>SGSmartMeter"]
P1 --> COM["πΆ Comm module<br/>WiNet-S"]
P1 --> BAT["π Battery / ESS<br/><i>if fitted</i>"]
The plant is a service device (no physical hardware of its own) that anchors the tree. Each plant reading is then attached to the physical device it describes β inverter power/yield to the inverter, state-of-charge and battery flows to the battery/ESS, grid and import/export readings to the meter. A reading is only moved onto a device when the plant has exactly one device of that type; genuine plant aggregates (e.g. Total Active Power on a two-inverter site) and household-load or forecast readings stay on the plant device. Grouping is automatic and changes only where entities appear β entity IDs and history are unchanged, so existing automations and dashboards keep working.
Why the device list looks flat
Home Assistant lists every device on a config entry in one flat list, so the plant appears alongside the inverter/meter/comm module rather than visually nested. The parent link is still there: open a device and you'll see βConnected via <plant>β, and the topology drives area assignment. Nothing to fix β that's just how HA renders the list.
Common dashboard values¶
| iSolarCloud app / diagram | Likely sensor (code) | Notes |
|---|---|---|
| Solar Production | total_active_power or inverter_ac_power |
Total AC power from the inverter(s). |
| Battery Usage | total_field_energy_storage_active_power (aliased as Battery Power) |
Positive = charging, negative = discharging. |
| Battery Charge % | battery_level_soc, battery_soc, total_field_soc, or energy_storage_soc_ems |
Depends on your system topology. |
| Load | load_power or total_load_active_power |
Household consumption. |
| Usage from Grid | grid_active_power or grid_active_power_ems |
Positive = importing, negative = exporting. |
| Daily Solar Yield | daily_yield / inverter_daily_yield / daily_pv_yield_ems |
Resets at midnight local time. |
| Daily Feed-in | feed_in_energy_today / daily_feed_in_energy_pv |
Energy exported to the grid today. |
| Total Feed-in | feed_in_energy_total / point 83123 (Total Feed-in Energy (PV)) |
Lifetime export; user-cloud getPsDetail uses 83123, open API often 83075. |
| Daily Import | energy_purchased_today / total_purchased_energy |
Energy imported from the grid today. |
Battery-specific points¶
The following codes are surfaced for many hybrid inverters / battery systems:
total_field_energy_storage_active_powerβ Battery Power (kW)total_field_maximum_rechargeable_powerβ Battery Max Charge Powertotal_field_maximum_dischargeable_powerβ Battery Max Discharge Powertotal_field_chargeable_energyβ Battery Chargeable Energytotal_field_dischargeable_energyβ Battery Dischargeable Energydaily_field_charge_capacityβ Battery Daily Charge Capacitydaily_field_discharge_capacityβ Battery Daily Discharge Capacity
If you need separate Battery Charge Power and Battery Discharge Power sensors (rather than a single signed value), these are now automatically requested for energy-storage inverter (ESS/hybrid) devices β no manual configuration needed. They appear as device-level sensors on your inverter. If they don't appear, your inverter model may not report them; in that case, see the next section for how to try the point IDs manually.
Adding extra measure points¶
Some point IDs are not included in the default request because they vary by inverter model or firmware. The integration can request any point ID you provide:
- Open Settings β Devices & services β Sungrow iSolarCloud β Configure.
- In Extra measure points, enter a comma-separated list of
point_id=codepairs, for example: - The point IDs must be numeric; the codes can be any descriptive name you like.
- Save β the integration will reload and create sensors for those codes.
You can find the actual point IDs for your hardware by:
- Checking the Common Measuring Point Enumeration in the iSolarCloud Developer Portal.
- Running a diagnostics dump from the device page in Home Assistant.
- Using community tools such as GoSungrow to list points for your plant.
Recommended measure points (from the official docs)¶
The official iSolarCloud measuring-point catalogs β also served by the mcp-isolarcloud docs server β list the point IDs, names and units per device type. The integration ships a grounded catalog of ~640 documented points (all 17 device types), so pasting the matching point_id=code pairs into Extra measure points gives nicely-named, correctly-classified sensors.
Classification is automatic. Device and state class are inferred from the API-reported unit, and β new in this release β from the documented point when the API reports no unit. So the dimensionless points (SOC, SOH, power factor, performance ratio, charge/discharge cycle counts) now classify correctly instead of showing up as plain text, and status points (EV charger status, inverter operating state) render as human-readable text via a SensorDeviceClass.ENUM. Energy points feed the Energy dashboard automatically. The friendly name comes from the point ID even if you pick your own code, so you don't have to memorise the exact code.
Battery (Common Battery Measuring Points):
58604=battery_level, 58605=battery_soh, 58601=battery_voltage, 58602=battery_current, 58603=battery_temperature, 58606=battery_total_charge_energy, 58607=battery_total_discharge_energy
EV charger (Common Charger Measuring Points):
Energy meter (Common Energy Meter Measuring Points):
8030=meter_forward_active_energy, 8031=meter_reverse_active_energy, 8062=meter_daily_forward_active_energy, 8063=meter_daily_reverse_active_energy, 8018=meter_active_power, 8014=meter_power_factor, 8026=meter_apparent_power, 8064=meter_frequency
Energy storage inverter (Common Energy Storage Inverter Measuring Points):
13126=battery_charge_power, 13150=battery_discharge_power, 13141=battery_soc, 13142=battery_soh, 13034=battery_total_charge_energy, 13035=battery_total_discharge_energy, 13119=load_power, 13121=feed_in_power, 13149=purchased_power, 13146=inverter_operating_status
EMS device (Common EMS Device Measuring Points):
24625=ems_storage_power, 24629=ems_storage_soc, 24626=ems_grid_power, 24624=ems_pv_power, 24631=ems_active_load, 24622=ems_total_charge, 24623=ems_total_discharge
Microinverter (Common Microinverter Measuring Points):
51303=micro_active_power, 51302=micro_total_yield, 51346=micro_yield_today, 51307=micro_power_factor, 51301=micro_running_status
Combiner-box, PCS, CMU/BSC, LC, environment-monitoring and communications catalogs are covered too β browse them via the docs server and add any point_id=code pair you need. Point IDs are consistent per device type but not guaranteed across every model/firmware, so confirm against your hardware if a point is missing.
Device-level diagnostic & health entities¶
Alongside the plant sensors, the integration adds diagnostic entities that describe the state of the hardware itself. These are grouped under each device's card (enriched with its model, serial number and manufacturer) and default to the Diagnostic entity category. The commissioning date is exposed as an attribute on the device's Connectivity sensor.
Per-device binary sensors (created for every discovered device with a UUID):
| Entity | Device class | Meaning |
|---|---|---|
| Fault | problem |
On when the device reports a fault or alarm (dev_fault_status); Off when normal. Exposes an operating_status attribute with a human-readable reason for inverter/ESS devices (e.g. Shut down due to faults, Low insulation resistance, Running with alarm), so you see why β available even without per-device sensors enabled. |
| Connectivity | connectivity |
On = online, Off = offline (dev_status). Exposes the commissioning/grid-connection date as an attribute. |
Per-device diagnostic sensors β surfaced when Create per-device sensors is enabled (Configure β options), polled per device type from the documented measure-point catalog:
- Inverter: operating status, total DC power, internal temperature, grid frequency, array insulation resistance, MPPT 1β3 voltage/current, per-string DC voltage & current (strings 1β8, for array analysis), and grid-side health β per-phase voltage & current (A/B/C), reactive & apparent power, power factor, DC bus voltage, on-grid running time, negative-voltage-to-ground and AFCI fault count. (Points a given model doesn't report β e.g. strings beyond what it has β are simply skipped.)
- Battery / ESS (hybrid systems): battery level (SOC), state of health, voltage, current, temperature, and total charge/discharge energy, plus cell/module health β max/min cell voltage (imbalance), max/min module temperature (thermal spread), operation status, DC-contactor status and fault-module ID. Health-oriented points (voltage, current, temperature, SOH, and all the cell/module health points) are marked Diagnostic; SOC and charge/discharge energy stay primary sensors for dashboards.
- Energy meter: instantaneous active / reactive / apparent power, power factor, grid frequency, per-phase voltage & current, and forward/reverse (import/export) active energy. (A meter that only reports energy β e.g. the SGSmartMeter β surfaces just those.)
- Communication module (WiNet-S): WLAN signal strength and wireless signal strength.
Plant health & tariffs¶
Alongside the realtime measure points, the integration surfaces a few fields from the plant record itself (refreshed periodically, attached to the plant device):
| Sensor | Source | Notes |
|---|---|---|
| Alarm Count / Fault Count | alarm_count / fault_count |
Plant-wide counts, Diagnostic β a quick "is anything wrong?" at the plant level. |
| Installed Power | install_power |
Nameplate power of the plant (W). |
| Import Price / Export Price | ps_consumption_power_price_kwh / ps_feedin_power_price_kwh |
Your configured tariffs, in the plant's currency per kWh (e.g. GBP/kWh) β handy for cost automations. |
Fields your plant doesn't report are simply not created.
Dispatch / control entities¶
If your inverter / ESS supports parameter configuration, the integration also creates Number and Select entities per plant for dispatch control. The Battery? column marks the controls that only appear when the plant actually has a battery/ESS device β on a PV-only plant they are hidden (see the warning below):
| Entity | Parameter | Range / options | Battery? |
|---|---|---|---|
| Battery Mode | battery_mode |
Self-consumption / Force charge / Force discharge / Stop | β |
| Charge/Discharge Power | charge_discharge_power |
0 W β device rating (fallback 5000 W) | β |
| SOC Upper Limit | soc_upper_limit |
70β100 % | β |
| SOC Lower Limit | soc_lower_limit |
0β50 % | β |
| Forced Charging | forced_charging |
Disable / Enable | β |
| Forced Charge Target SOC (Window 1) | forced_charging_target_soc_1 |
0β100 % | β |
| Forced Charge Target SOC (Window 2) | forced_charging_target_soc_2 |
0β100 % | β |
| Battery First Mode | battery_first |
Disable / Enable | β |
| Export Limitation | feed_in_limitation |
Disable / Enable | β |
| Export Limit (Power) | feed_in_limitation_value |
0 W β device rating | β |
| Export Limit (%) | feed_in_limitation_ratio |
0β100 % | β |
| Active Power Limiting | limited_power_switch |
Disable / Enable | β |
| Active Power Limit | active_power_limit_ratio |
0β100 % | β |
| Reactive Power Mode | reactive_power_regulation_mode |
Off / Power Factor / Q(t) / Q(P) / Q(U) | β |
| Reactive Power Ratio Q(t) | q_t |
β60β60 % | β |
| Power Factor | pf |
β1 to 1 | β |
| Forced Dispatch Duration | (local) | 0β1440 min (default 60; 0 = off) | β |
The power sliders (charge/discharge power, export limit power) are sized to the device's rated power, parsed from its model code (e.g. SG3.6RS β 3.6 kW), falling back to 5000 W when the rating can't be derived.
The reactive-power controls work together: set Reactive Power Mode first, then the relevant value β Power Factor only takes effect in Power Factor mode, and Reactive Power Ratio Q(t) only in Q(t) mode. These are grid-quality controls and are available on PV-only plants too (they aren't battery-gated).
Battery Mode (#255)¶
Battery Mode is the single select for force charge/discharge (replacing the older Charge/Discharge Command entity). Options:
| Option | What it does |
|---|---|
| Self-consumption | Safe default β EMS Self-consumption + stop command |
| Force charge | Compulsory/Forced EMS mode + charge command + heartbeat |
| Force discharge | Compulsory/Forced EMS mode + discharge command + heartbeat |
| Stop | Same safe write as Self-consumption (ends a forced command) |
When you select Force charge or Force discharge, the integration:
- Switches Energy Management Mode (param
10003) to Compulsory / Forced β required for the command to take effect (writing charge/discharge alone is accepted by the device but ignored while the plant stays in Self-consumption). - Writes Charge/Discharge Command (param
10004). - Starts the External EMS heartbeat (param
10017) every 60 seconds. - Arms auto-revert (see below).
Self-consumption / Stop restore Self-consumption mode and turn the heartbeat off.
Automations can use the sungrow.set_battery_mode service (with an optional per-call duration_minutes) instead of driving the select entity directly β useful for tariff schedules.
If that heartbeat ever stops unexpectedly while a forced mode is active (so the inverter would silently time out of forced mode), the integration raises a "Dispatch keepalive stopped" Repair β see Troubleshooting.
After a forced command, the integration also reads the Energy Management Mode back to confirm the inverter actually entered Forced mode. If it was accepted but stayed in Self-consumption, the command is re-sent once; if it still hasn't switched, a "Dispatch command was not applied" Repair is raised so a silently-ignored command doesn't look successful.
Auto-revert (safety). Forced Dispatch Duration defaults to 60 minutes. A forced Force charge / Force discharge automatically reverts to Self-consumption after that long β so a forced command can't silently persist and curtail your solar (the #148 footgun). The countdown survives a Home Assistant restart (if it expires while HA is down, the command reverts on startup). Set it to 0 only if you deliberately want no auto-revert. The
set_battery_modeservice can override duration for a single call. It's a local control β it writes nothing to the inverter itself.Breaking change. The old
select.*_charge_discharge_commandentity is replaced byselect.*_battery_modewith options Self-consumption / Force charge / Force discharge / Stop. Update automations accordingly (or usesungrow.set_battery_mode). Restored Charge/Discharge/Stop states from the old entity map onto the new options. Dispatch support requires the correct iSolarCloud API plan and firmware. The integration will only create dispatch entities if it can discover a compatible inverter or ESS device for the plant.β οΈ Battery controls are hidden on PV-only plants. Charge/discharge, SOC, forced-charging and battery-first controls only appear when the plant has a battery/ESS. Sending a charge/discharge command to a battery-less inverter can force it into External-EMS mode and suppress generation, so these controls are withheld on PV-only systems. Export- and active-power-limiting controls remain available.
EV charger support¶
If your EV charger appears as a separate device in iSolarCloud, request its points via the Extra measure points option (or enable per-device sensors, which polls each discovered device). The documented charger point IDs are listed under Recommended measure points above; verified additions from other charger models are welcome.
Still missing a sensor?¶
- Enable debug logging for the integration:
- Reload the integration and look for the raw realtime data in the logs.
- Find the point ID / code for the value you want and add it via the options, or open an issue with the redacted raw data.