SolarEdge
SolarEdge solar PV (and StorEdge / Energy Hub battery) sites integrated through the public monitoringapi.solaredge.com REST API.
One GEM device represents one SolarEdge site. The driver polls power-flow and overview endpoints on a configurable interval and surfaces production, consumption, grid, and battery telemetry as device attributes. The integration is read-only — SolarEdge's public API exposes no documented write actions.
Prerequisites
- A SolarEdge monitoring account with at least one site.
- "Account API access" toggled on in mySolarEdge → Admin → Site Access → API Access. The toggle is one-time per account and reveals an
api_keyfield. - The site's numeric
site_id, visible in the URL of any site dashboard. - Outbound HTTPS (port 443) from the GEM controller to
monitoringapi.solaredge.com.
Setup
- Sign in to monitoring.solaredge.com → Admin → Site Access.
- Toggle API Access on. Copy the generated
api_key. The key is per-account and gives access to all sites the account can see. - Note the numeric
site_idfor the site you want to track (it is the integer in the URL of the site dashboard). - In GEM admin, create a device using the
solaredgedriver. Set:api_key— the key from step 2 (stored encrypted).site_id— the numeric id from step 3.
- Save and reload. The driver will hit
/site/{site_id}/detailsto verify the credentials, then begin polling/currentPowerFlowand/overview. - Inspect device attributes for live telemetry (
pv_power,grid_power,load_power,storage_power,storage_charge_level,lifetime_energy_wh, etc.).
Attribute reference
Configuration
| Attribute | Required | Description |
|---|---|---|
api_key | yes | Per-account SolarEdge monitoring API key. Stored encrypted; sent as the ?api_key=… query parameter on every call. |
site_id | yes | Numeric site id. |
ip | no | API host override. Defaults to monitoringapi.solaredge.com. |
port | no | HTTPS port. Defaults to 443. |
status_interval | no | Poll interval in milliseconds. Defaults to 300000 (5 min) to stay inside the 300/day rate limit. |
Driver-managed telemetry
| Attribute | Source | Notes |
|---|---|---|
pv_power | currentPowerFlow.PV.currentPower | Always ≥ 0. Unit = power_unit (typically kW). |
load_power | currentPowerFlow.LOAD.currentPower | Site consumption. |
grid_power | currentPowerFlow.GRID.currentPower | Negative when exporting (LOAD → GRID edge present). |
storage_power | currentPowerFlow.STORAGE.currentPower | Negative when charging (any → STORAGE edge present). Hybrid sites only. |
storage_charge_level | currentPowerFlow.STORAGE.chargeLevel | Percent state-of-charge. |
storage_status | currentPowerFlow.STORAGE.status | e.g. Charging / Discharging / Idle. |
power_unit | currentPowerFlow.unit | Usually kW. |
current_power_w | overview.currentPower.power | Latest production reading from the overview endpoint. |
lifetime_energy_wh, day_energy_wh, month_energy_wh, year_energy_wh | overview.{lifeTimeData,lastDayData,lastMonthData,lastYearData}.energy | Lifetime / current-day / current-month / current-year energy totals. |
Zones are not used by this driver — all telemetry lives on the device.
Commands
| Command | Description |
|---|---|
get_sites | Lists every site the API key can see. Useful for finding a site_id. |
get_site_details | Returns the full site detail block for the configured site. |
get_overview | Lifetime / yearly / monthly / daily / current-day energy plus current power. |
get_power_flow | PV / LOAD / GRID / STORAGE snapshot used by the polling loop. |
get_inventory | Inverters, meters, batteries, gateways for the site. |
get_storage_data | Battery telemetry for the last hour. Hybrid sites only. |
Limitations
- No write endpoints. Battery charge schedules, inverter modes, and curtailment cannot be set through the public Monitoring API. Anyone needing this should look at SolarEdge's Modbus/TCP interface on the inverter (a separate driver, not yet implemented).
- No LAN fallback. This driver depends on SolarEdge's cloud. If the site loses internet, telemetry stops updating until connectivity returns.
- Rate-limited. The Monitoring API caps each account at 300 requests per day. The driver makes two requests per poll (currentPowerFlow + overview), so the default 5-minute interval consumes ~576 requests/day across two GEM polls per cycle — verify your account headroom before running multiple SolarEdge sites or shortening the interval. If you have many sites under one key, raise
status_interval. - Storage telemetry is best-effort. Direction (charging vs discharging) is derived from the
connections[]graph; if SolarEdge changes that schema in a future API release, signs may need to be re-derived.
Troubleshooting
detailsreturns 403 — API access is not toggled on for the account, or the API key is from a different account that can't see this site. Re-check Admin → Site Access.detailsreturns 401 / 400 INVALID_TOKEN — the API key was regenerated and the old key was invalidated. Mint a new one and update theapi_keyattribute.- All requests fail with
429 Too Many Requests— you've exceeded the 300/day quota. The counter resets at midnight UTC. Raisestatus_intervaland/or consolidate sites under one device. - Storage attributes never populate — your site is PV-only with no SolarEdge battery. The
STORAGEnode is absent fromcurrentPowerFlowand the driver intentionally leaves storage_* attributes unchanged. - Overview energy values look off by 1000× — SolarEdge returns Wh in the overview endpoint and kW/kWh in the power-flow endpoint. Different attributes intentionally use different units (the names end in
_whvs the flow values being kW). Don't try to reconcile them — they come from different views.