Priestley Place Charge HQ

15kW Fox ESS H3 · CQ6-L8 battery stack (47.92kWh nominal) · 44 panels / 20.9kW array
Monitoring only
 
Data sources

Inverter Connection

FoxESS Cloud
Only change this if you're routing through your own CORS proxy in front of FoxESS Cloud.
Sent as X-Proxy-Secret on both FoxESS and Solcast calls if this and the matching base URL below are set — one worker, one secret, both APIs.

Inverter Schedule Inspector

Read-only — shows exactly what's actually configured on the inverter right now, straight from FoxESS, not from this app's own memory of what it last sent.

Automatic Control (Cloudflare)

Moving the automatic decision loop off this browser page and onto Cloudflare, so it keeps running whether or not this tab is open. Stage 1: config mirrors into Cloudflare KV. Stage 2a: a Cron Trigger proves FoxESS is reachable directly from Cloudflare's servers, every 5 minutes. Stage 2b: the same reserve-target / cycle-budget / sell-floor engine as this app, ported function-for-function, runs on that same schedule and computes a genuine plan. Stage 3a/3b (see the Control Authority card below): the Worker can now genuinely send real commands too, not just compute them — gated off by default (Control Authority defaults to "This browser", so nothing changes here unless that's deliberately switched). See the setup notes at the top of energy-proxy-worker.js.

Who's In Control

Exactly ONE of these is ever allowed to send real commands to the inverter at a time — the master on/off switch (Monitoring only / Live, above) still gates whether anything sends at all; this decides WHICH engine does the sending when it's on. Both this browser and the Worker keep computing and logging their own full plan regardless of this setting (see the Decision Log card, and "Check Worker decision log" above) — switching this never stops either engine from thinking, only from acting. Defaults to "This browser", matching every session before this one; nothing about today's behavior changes until this is deliberately switched. Configured here only — the Worker has no settings UI of its own and never will, it just reads whatever this app last saved.

Test Live Control

A small, deliberate, real command — separate from the automatic system, so the write path can be watched and confirmed once before trusting it to run unattended.
Export curtailment: disabled — the ExportLimit write path is confirmed unreliable (a restore silently failed to lift the cap on 2026-09-19, after a real 2-day export loss on 2026-09-17). Planned replacement is a DRM0-via-smart-relay approach once that hardware's wired up.

Forecast Sources

BOM's own open-data feed has had outages during platform upgrades — if a BOM request fails, this automatically falls back to the blended model for that run.

Live Pricing Connection

Polls a live-priced retailer's real price feed and logs actual cost against your real usage from today onward. Past days can't be backfilled. Amber Electric is the only provider actually wired up right now — the Provider field exists so a different live-pricing retailer can be added later without restructuring anything else that reads from this connection.

Site & System

 
System losses (soiling, wiring, inverter) — typical 0.78–0.85

Storm Precaution

In-app banner only — nothing here is sent to the inverter automatically. Watches for a forecast damaging wind gust, heavy rain, or thunderstorm — the three biggest real-world causes of storm-driven outages (wind bringing down trees/branches onto lines is the single most common; lightning and heavy rain/flooding affecting substations are the other two). When triggered, shows how much charge is currently on hand versus how much is recommended to hold back for the EPS/backup circuit, so you can decide whether to top up or hold off selling manually.
90km/h is BOM's threshold for a "damaging wind" Severe Weather Warning; 70mm in an hour is BOM's threshold for "intense" rainfall in a Severe Thunderstorm Warning.

Reserve Safety Margin

Extra buffer added on top of the bad-weather reserve figure and any peak-window pre-charge, to absorb ordinary LOAD forecast error (load coming in higher than predicted) rather than planning to the exact wire. Solar-side uncertainty is already covered by Solcast's own pessimistic (p10) forecast and the day-3 derate, so this margin is scoped to load only rather than compounding a second layer of caution on top of an already-pessimistic solar figure.

Battery Cycle Budget

Tracks cycles used against your warranty's own allowance — kept purely as visibility now that deliberate battery-draining sells have been removed (2026-09-21): ordinary surplus-solar export still happens automatically and costs nothing extra in cycles either way, so this exists to flag if usage is running ahead of pace, not to pace any selling decision. FoxESS's CQ6 warranty (and most LFP home batteries) guarantees capacity retention until EITHER a cycle count OR a number of years passes, whichever comes first.
Usage history & accuracy

Usage History

For prediction

Correct Usage from Retailer CSV

FoxESS's CT clamps read badly at low currents — this scales your logged usage to match what your retailer actually billed, so cost and payback figures stay accurate.
Providers
Payback Ledger

Payback Summary

Plan History

One segment per real plan you were actually billed under. When you switch, set this segment's end date and add a new one starting the next day — that locks in what it actually cost/saved for good.
Live-connected to FoxESS for real telemetry and history — solar/load predictions use your actual logged data once enough is available, falling back to a weather/shape-based estimate otherwise.