Confirmed against Sungrow's own docs and live-tested against a real
battery plant: SOC and charge/discharge power live at the *device*
level (getDeviceRealTimeData against the hybrid inverter's ps_key,
device_type 14), not in the plant-aggregate points used elsewhere in
this client -- querying them via the plant-level endpoint just returns
null. Battery status is fetched once per live "today" poll (not
backfilled historically) and stored in three new nullable columns,
self-migrated on startup since there's no Alembic here.
Also fixes the dashboard's self-consumption line to derive from
load - import rather than generation - export, which overstated
"solar -> house" for battery systems (a chunk of that gap was going
into charging, not the house). The live flow diagram now shows a
Battery node (SOC + charge/discharge) that stays hidden entirely for
solar-only plants like Kallangur.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
New /api/usage/live endpoint derives instantaneous-ish kW from the most
recent interval reading, shown as a solar -> house/grid flow diagram
that updates every 30s and flips direction/color between exporting and
importing. /api/usage/summary now also reports net revenue for the
selected period, reusing the existing costing engine against the
current plan.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Settings always showed the full "how to connect" steps and code-paste
form for oauth2 mode regardless of connection status, which read as
broken even when the token was live and polling successfully. Collapse
it behind a "Reconnect" toggle once connected.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The stack manager runs docker compose inside its own container (talking
to the host daemon over the mounted socket), so env_file paths resolve
against its filesystem, not the host's -- unlike volume bind-mount
sources, which the daemon resolves against the real host. Point env_file
at the stack manager's own data mount instead.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The stack manager re-clones this repo fresh on every deploy, which was
silently wiping a .env and bind-mounted data placed inside the checkout
directory. Point both at a stable location outside it instead.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Matches the etsy-finance-tracker pattern: Forgejo Actions builds and
pushes the image on every push to main, and docker-compose.yml now
pulls that image instead of building from source on the deploy host.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
FastAPI app that pulls interval usage from Sungrow iSolarCloud (OAuth2),
caches AER Consumer Data Right electricity plan data, and compares actual
metered usage against every available plan to estimate real annual cost
(TOU, tiered feed-in, and flat tariffs).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>