This script lets you download your full solar history (whatever is left, anyway) from SunStrong cloud servers straight to a CSV file -- no emulator, no rooting, no browser. You log in with the same username/password you use in the app, and the tool pulls data from the same private API the app uses. This will NOT connect to your local PVS5/PVS6, and is firmware agnostic. It is purely to download your historical data from SunStrong's servers. It was last tested on 7/16/2026.
| Command | Scope | Granularity | Identity | History* |
|---|---|---|---|---|
power |
Whole system | hourly (5/15 mins don't work) | site | back to system start |
energy |
Whole system | day / month / year totals | site | back to system start |
panels |
Per panel | hourly power and energy | microinverter serial | ~2 years |
panels also writes per-panel daily totals and the physical layout (x/y/rotation/azimuth).
*History depth varies by account. SunPower had some database crashes a few years ago, so some of your data may have been wiped out. Also, panel-level seems to go back only a few years, so YMMV.
When SunStrong acquired these assests, they reduced system granularity from 5/15 minute intervals to 1 hour (at least for my system).
pip install requestsCredentials via environment (.env) (or you'll be prompted):
export SUNSTRONG_USERNAME="you@example.com"
export SUNSTRONG_PASSWORD="your-app-password" # Windows PowerShell: $env:SUNSTRONG_PASSWORD="..."1. Probe first — logs in, lists your site(s), and confirms the panel date format:
python sunstrong_downloader.py probeNote your siteKey and account timezone from the output. It writes raw_sample.json so you can
eyeball the real response shape.
2. Download. Examples (adjust dates; your system's install date is a good --start):
# System hourly power/production, full history
python sunstrong_downloader.py power --start 2019-01-01 --interval hour --out power_hourly.csv
# System energy totals per month (or day/year)
python sunstrong_downloader.py energy --start 2019-01-01 --interval month --out energy_monthly.csv
# Panel-level, hourly power+energy per microinverter serial (last ~2 years)
python sunstrong_downloader.py panels --start 2024-01-01 --out panels_hourly.csv
# -> panels_hourly.csv, panels_hourly_daily.csv, panels_hourly_site_hourly.csv, panels_hourly_layout.csvDates are treated as site-local. Pick a specific site with --site <siteKey> if you have more
than one. If a power/energy call returns bad query params, your interval must be lowercase.
- power —
timestamp, production_kw, consumption_kw, storage_kw, grid_kw(at--interval hour, eachproduction_kwvalue equals that hour's kWh, so this doubles as system hourly energy — validated to match theenergymonthly totals within ~1%) - energy —
bucket_start, production_kwh, consumption_kwh, net_grid_import_export_kwh, net_storage_kwh - panels (hourly) —
timestamp, serialNumber, power_w, energy_kwh - panels (daily) —
date, serialNumber, dailyEnergyProduction_kwh, sevenDayAverage, peakTimestamp, peakValue, energyColorCode, lastCommunicationTimestamp - panels (layout) —
serialNumber, xCoordinate, yCoordinate, rotation, azimuth, orientation
- Without a subscription: the
panelscommand still works — per-panel and system production at hourly resolution (last ~2 years).powerandenergyreturn empty/zero. - With an active subscription:
power(system hourly, full history) andenergy(totals, full history) light up — reaching back to system commissioning, far deeper than panel data.
So a subscription is mainly worth it to get system history older than the panel-level window. Note the tool needs the interval lowercase on those two commands (the paid API validates it).
- Calibration: dates are sent as UTC. If the very first/last buckets look shifted, your data may
be keyed to site-local time — check
probe'sraw_sample.jsonand adjust--start/--endby your offset. Thepanels--date-formatcan be switched to the ISO fallback ifprobesays so. - Be gentle: downloads run one chunk/day at a time with retries and backoff. Pulling many years
of 5-minute data is a lot of requests — expect it to take a while.
storage/gridare blank if you have no battery/consumption metering. - Credentials are sent only to
edp-api.edp.sunstrongmonitoring.com/v1/auth/okta/signin; the access token stays in memory and is never printed or written to disk. - Blending in: the tool does not advertise itself.
curl_cffiimpersonates Chrome, so both the TLS handshake and theUser-Agentlook like an ordinary Chrome browser (a UA that can't be blocked wholesale). It sends no custom/identifying headers. (This is also required for the GraphQL host, which drops Python's default TLS fingerprint outright.) - Endpoints are undocumented and may change; if a call starts failing, the app may have been updated.