Skip to main content

sungrow-isolarcloud

A maintained fork of the pysolarcloud library for interacting with Sungrow's iSolarCloud API.

Install from PyPI:

pip install sungrow-isolarcloud

This fork adds:

  • Support for requesting additional / custom measure points without modifying the upstream point map (useful for battery charge/discharge power fields that vary by inverter model).
  • A best-effort per-device realtime helper for devices such as EV chargers (Plants.async_get_device_realtime).
  • A heartbeat helper for External EMS dispatch mode (Control.async_heartbeat / Control.heartbeat_loop).
  • Convenience constants for dispatch command value sets (Control.CHARGE_DISCHARGE_COMMANDS, Control.FORCED_CHARGING).

The package supports the following functionality:

  • OAuth2 authentication
  • Getting a list plants
  • Getting details of a plant
  • Getting devices of a plant
  • Getting "real-time" data of a plant (Data is updated every 5 minutes according to Sungrow's documentation)
  • Getting historical data
  • Getting and updating grid control settings

Quirks

The iSolarCloud API is quite new and not very mature. Some tips:

  • The authorisation flow is based on OAuth2 but doesn't work exactly as you would expect
  • The state parameter is not passed back after to the authorisation step. This makes it more tricky to resume the flow in a client application.
  • User is asked to approve the authorisation if the flow is invoked again, e.g. in case the tokens have expired - unlike many OAuth2 implementations who will perform a "silent" authorisation if the user has already approved the access.
  • The API documentation lists a lot of data points which do not seem to be returned from my inverter, it probably varies between models.
  • There are different iSolarCloud servers for different regions, see the pysolarcloud.Server enum
  • API endpoints accept a language code but respond with Chinese text when when English is requested

Usage

Register your app

  1. Create an account in the iSolarCloud Developer Portal
  2. Create an app in the developer portal
    • Answer "Yes" to authorize with OAuth2.0
    • Enter a Redirect URL for your app (this can be changed later)
  3. Wait for approval by Sungrow
  4. Find the needed configuration details in the developer portal. You will need:
    • Appkey
    • Secret Key
    • Application Id (This is shown as a query parameter within the Authorize URL in the developer portal)

Example

from pysolarcloud import Auth, Server
from pysolarcloud.plants import Plants

app_key = "your app key"
secret_key = "your secret key"
app_id = "your app id"
redirect_uri = "your redirect uri"

auth = Auth(Server.Europe, app_key, secret_key, app_id)
url = auth.auth_url(redirect_uri)
  1. Redirect user to url
  2. User selects plant(s) and grants authorisation
  3. iSolarCloud will redirect the user to redirect_uri with query parameter code
await auth.async_authorize(code, redirect_uri)
plants_api = Plants(auth)
plant_list = await plants_api.async_get_plants()
if plant_list:
   print(f"{len(plant_list)} plants found:")
   for plant in plant_list:
         print(f"Plant ID: {plant["ps_id"]}, Name: {plant["ps_name"]}")
else:
   print("No plants found.")
   return

print("\nFetching detailed information for each plant...\n")
plant_ids = [str(plant["ps_id"]) for plant in plant_list]
plant_details = await plants_api.async_get_plant_details(plant_ids)
for plant in plant_details:
   print(f"Details for Plant ID {plant["ps_id"]}: {plant}")

print("\nFetching real-time data for each plant...\n")
real_time_data = await plants_api.async_get_realtime_data(plant_ids)
for plant_id, data in real_time_data.items():
   # Print only the data points where value is not None
   data_values = {k: v for k, v in data.items() if v and v.get("value") is not None}
   print(f"Real-time data for Plant ID {plant_id}: {data_values}")

The Auth class keeps the access between calls and refreshes it when needed. If you prefer to manage this state yourself, you can create your own subclass of AbstractAuth.

Grid Control

The Control class enables retrieving and updating grid control settings. Parameters and value sets are documented in the iSolarCloud Developer portal.

Example

from pysolarcloud.control import Control
from pysolarcloud.plants import DeviceType

devices = await plants_api.async_get_plant_devices(plant_id, device_types=[DeviceType.ENERGY_STORAGE_SYSTEM])
device_uuid = devices[0]["uuid"]
control_api = Control(auth)
# Fetch current config
current_settings = await control_api.async_read_parameters(device_uuid)
print(current_settings)
# Make an update using the canonical command values
await control_api.async_update_parameters(
    device_uuid,
    {
        "charge_discharge_command": Control.CHARGE_DISCHARGE_COMMANDS["charge"],
        "charge_discharge_power": "2500",
    },
)

# When using External EMS mode, send a heartbeat periodically to keep the inverter in dispatch mode.
# 10017 = external_ems_heartbeat, value is the heartbeat interval in seconds (1-1000).
await control_api.async_heartbeat(device_uuid, interval_seconds=60)

Contributions

Ideas or contributions are welcome. I am not afiliated with Sungrow, I'm just another user of the API. My main use case will be a HomeAssistant integration based on this package.

Enjoy!

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sungrow_isolarcloud-0.10.2.tar.gz (22.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sungrow_isolarcloud-0.10.2-py3-none-any.whl (21.1 kB view details)

Uploaded Python 3

File details

Details for the file sungrow_isolarcloud-0.10.2.tar.gz.

File metadata

  • Download URL: sungrow_isolarcloud-0.10.2.tar.gz
  • Upload date:
  • Size: 22.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for sungrow_isolarcloud-0.10.2.tar.gz
Algorithm Hash digest
SHA256 9fd0ea0b0ffe7fb1baa48652e1e997e24a3e96375e90539c28b73087777e42b6
MD5 214eeff079a730a5014dd1a3566b9461
BLAKE2b-256 a67455f262f0ae7b430f61ff9328b69d439dfe771910a9b583c4800da51f2503

See more details on using hashes here.

Provenance

The following attestation bundles were made for sungrow_isolarcloud-0.10.2.tar.gz:

Publisher: release-please.yml on KRoperUK/pysolarcloud

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sungrow_isolarcloud-0.10.2-py3-none-any.whl.

File metadata

File hashes

Hashes for sungrow_isolarcloud-0.10.2-py3-none-any.whl
Algorithm Hash digest
SHA256 c7e46d218e585fbaa402e486fd8d57dd6dc2f1b05993236dce3ea62e15656e5b
MD5 d6c1dc96307bc5f4578b6293d61aa095
BLAKE2b-256 9b6f6727c7e066dd84b77613056a1f7bd3e66773e5e5776ce78684913021f6a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for sungrow_isolarcloud-0.10.2-py3-none-any.whl:

Publisher: release-please.yml on KRoperUK/pysolarcloud

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.15.0

2 files

0.14.0

2 files

0.13.0

2 files

0.12.1

2 files

0.12.0

2 files

0.11.0

2 files

0.10.4

2 files

0.10.3

2 files

This release

0.10.2 This release

2 files

0.10.1

2 files

0.10.0

2 files

0.9.1

2 files

0.9.0

2 files

0.8.0

2 files

0.7.0

2 files

0.6.0

2 files

0.5.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page