No Cloud Required: Talking Directly to My SunPower Hardware

harrisonpage1 pts1 comments

No Cloud Required: Talking Directly to My SunPower Hardware – Harrison Was Here

No Cloud Required: Talking Directly to My SunPower Hardware

01 Apr, 2026

TL;DR: I discovered an official API for my SunPower hardware. I can use Python (or whatever) to talk to my system.

BACKGROUND

I bought a Sunpower solar/battery system in January 2023. After securing permits, installation began later that year. Despite some hiccups, such as having to reboot and reset everything when the battery is exhausted, the system works well enough. We survive power outages by flipping breakers to run the refrigerator and nothing else. When the house is quiet and only the refrigerator is drawing power, the site load drops to around 0.1 kW.

⚡Record: 80 hours without power on February 2024

SunPower filed for Chapter 11 bankruptcy on August 6, 2024. SunStrong Management, which bought out SunPower's share in SunStrong Capital, took over the monitoring app. They wanted $200/year for the app! Excessive but not too surprising: Supporting a bespoke app for a tiny customer base can't be cheap.

THE SUNFLOWER CLUE

While researching a replacement, I came across a third party app called Sunflower.

To my complete surprise, Sunflower could connect directly to the monitoring gateway. All I had to do was:

Put the PVS6 on my Internet of Shit network, a dedicated wireless segment for untrustworthy devices

Disable client device isolation (sigh)

Assign it a static IP

But how the heck was Sunflower talking to it when my own attempts failed?

% curl '10.10.10.134/cgi-bin/dl_cgi?Command=DeviceList'<br>{ "status":403, "error" : "Unauthorized", "path":"" }

AN EXCITING DISCOVERY

After Kagi-ing around, I was floored to discover that SunStrong has published official documentation for the local API including how authentication works. The username is always ssm_owner and the password is the last five characters of the serial number.

WHAT I BUILT

I've been having a lot of fun coding with Claude over the last year. Together we wrote a Python script to explore PVS6 data: pvs6_query.py

It expects two environment variables:

PVS_IP e.g. 10.10.10.134

PVS_SERIAL

Output:

PVS6 Local Monitor<br>Device : 10.10.10.134<br>Auth : ssm_owner:***** (19-char serial)

────────────────────────────────────────────────────────────<br>Gateway / Firmware<br>────────────────────────────────────────────────────────────<br>Model PVS6<br>Serial<br>SW version 2025.10, Build 61846<br>FW version 1.0.0<br>Build 61846

✓ Authenticated (session: REDACTED)

────────────────────────────────────────────────────────────<br>Live Power (updates every ~15 s)<br>────────────────────────────────────────────────────────────<br>Timestamp 2026-04-01 11:19:32 PDT

Solar PV output +6,688 W<br>Site load -5,801 W (negative = consuming)<br>Grid -5,794 W (negative = exporting ✓)<br>Battery -7 W (− charging + discharging)

Lifetime solar generated 37,650.1 kWh<br>Lifetime net grid 3,978.7 kWh<br>Lifetime site load 2,480.6 kWh<br>Lifetime battery net -1,498.2 kWh

────────────────────────────────────────────────────────────<br>Battery (ESS / SunVault)<br>────────────────────────────────────────────────────────────<br>Operating mode TARIFF_OPTIMIZER<br>Measurement time 2026-04-01 11:10:00 PDT

State of charge (SOC) 100.0%<br>Customer SOC 100.0% (what the app shows)<br>State of health (SOH) 100.0%<br>Minimum customer SOC 50.0% (reserve floor)

Battery power now -7 W<br>Charge limit +178 W<br>Discharge limit +10,117 W

Battery voltage 54.23 V<br>AC voltage L1 120.05 V<br>AC voltage L2 120.05 V<br>Inverter temp 35.9 °C<br>Cell temp (max) 29.9 °C<br>Cell temp (min) 2.1 °C<br>Cell voltage (max) 3.41 V<br>Cell voltage (min) 3.38 V

Lifetime charged 2,246.5 kWh<br>Lifetime discharged 3,744.6 kWh

Product model SPWR-Equinox-model<br>Serial(s)

────────────────────────────────────────────────────────────<br>System Info (varserver)<br>────────────────────────────────────────────────────────────<br>hwrev 6.02<br>sw_rev 2025.10.20.61846<br>boardtype B0K LIB 1.0 PSoC5<br>model PVS6<br>serialnum

────────────────────────────────────────────────────────────

The 37,650 kWh of lifetime solar generation represents about three years of production in Monterey, California.

TARIFF_OPTIMIZER is a neat trick:I can feed power back to PG&E starting at 4PM M-F.

WEB UI

The newest design includes a warning when the battery isn't charging:

An earlier version on mobile:

The daily summary screen:

NOTIFICATION: POWER'S OUT

Sent via Slack when grid power to the home is OFF and solar/battery is exclusively powering the house — i.e. the system has islanded due to an outage. A notification is sent when state changes: UP→DOWN or DOWN→UP

NOTIFICATION: HIGH WINDS

Pulls weather data and warns if tomorrow looks particularly windy and to reserve battery capacity.

NOTIFICATION: BATTERY NOT CHARGING

This happens when power flickers and puts the battery hardware in a bad state:

LIFE IN A FOREST

This sort of thing happens from time to time:

ADDITIONAL LEARNINGS

The SunPower brand now belongs to Complete Solaria with no legacy warranty liability.

EmPhase...

battery power sunpower lifetime hardware system

Related Articles