Going Green
Solar shed · Mosgiel, Aotearoa NZ

Solar in Mosgiel.

Overview

The system, in short

Our house in Mosgiel runs off a grid-connected solar and battery system. I built an insulated plant-room shed in the garden to hold it. 27 panels on the roof make power through the day, a ~16 kWh battery holds it for the evening, and software I wrote — kaitiaki-hiko — decides when to store each kilowatt-hour, use it, or send it to the grid. The aim is to cut our carbon, with a lower bill following on.

saved so far net after finance 97% solar self-consumed

The numbers that matter

The fixed system specs, alongside live figures that update from the meter each morning.

27
Rooftop PV panels (12.15 kWp)
16 kWh
LiFePO₄ storage (16S, 314 Ah)
10 kW
Solis inverter (clips midday peaks)
Avg solar generated / day
Avg house demand / day
Best solar day so far
Live reading on demand

What the system is doing right now

This isn't a live stream. Press the button to pull one reading straight from the system.

Costs & payback

Return on investment

The model uses our confirmed tariffs and real winter usage. Generation and full-year figures are still being measured.

Progress to payback tracking

Real savings since the array came online: avoided grid imports plus export earnings, net of the ~5% mortgage cost on the money that paid for it, counting up toward the total system cost.

Net ahead (after finance)
System cost (CAPEX)
Of the way to payback
Net cumulative savings after finance (NZ$)

Measured vs projected early estimate

The tracker above is real money, but every day in it is midwinter, the two darkest months of the year. Scaling that measured performance up the site's solar-radiation seasonal curve gives a first estimate of the full-year return.

Projected annual saving (gross)
Implied payback
Measured saving / day (winter)
Of the year's sun captured so far

Capital cost

Energy system (solar + Victron + battery + electrical)$32,651
Shed (shell, pad, framing, cladding)$1,487
Total CAPEX$34,138

Simple payback

Annual savingPaybackROI
$3,00011.4 yr8.8%
$3,930 (base)8.7 yr11.5%
$5,2006.6 yr15.2%

As grid prices rise, every self-consumed kWh saves more; at +5%/yr the base payback drops toward about 8 years.

Time-of-use tariffs confirmed

ecotricity ecoSOLAR plan (Aurora network, partially-controlled), marginal c/kWh. Components are ex GST; the all-in row adds GST. Network peak = 7am–12pm & 5pm–10pm, every day.

Import — what you payOff-peakPeak
Energy + EA levy (ex GST)17.1617.16
Network (ex GST)8.8714.87
All-in (incl GST)29.9336.84

Real bill (June 2026)

1,530 kWh imported over 30 days = 51 kWh/day, at $19.11/day incl GST (~39% in the peak window). Fixed charges add ~$2.04/day incl GST — Aurora lines, metering and the climate-positive premium. Export is negligible — about 99% self-consumed.

Weekday time-of-use rate card
Weekday rate card
Weekend time-of-use rate card
Weekend rate card (peaks are identical to weekdays)
Forecast

Projected solar — next week

Predicted daily generation for the coming days, using yr.no as the default forecast. The scale is fixed to the system's best day so far, so you can read each day against full capacity.

Expected generation (kWh/day)

Forecast accuracy

Which forecast predicts our solar best

Success = a day predicted within ±30% (or ±3 kWh) of what the array actually made, by how far ahead the forecast was issued. We track overall and the last 30 days, and run on whichever model scores best.

This week

Where every kilowatt-hour came from

The past week's daily energy, stacked: grid import at the base, solar used in the house, then solar exported on top.

Daily energy — grid, car and solar, by source (kWh)

The car's charging only, and where it came from (kWh)

Generation history

Solar & grid use over time

Daily totals from the system meter since the array came online.

Solar generated (kWh/day)
Grid imported (kWh/day)

By week

Week by week

Each week's daily solar and grid use, with the change on the week before. Page back through earlier weeks with the arrows.

The car

Charging the MG4 on our own sun

Our MG4, bought in 2023, is the household's only car — currently 40,000 km on the odometer. Its odometer, battery charge and range are now read straight from the car over MG iSMART, and it charges through the house on a Tuya charging pile, so every charge lands in the home energy data and I can see how much of it came from our solar rather than the grid.

MG4 · bought 2023 40,000 km on the clock the only car · 30–90 km/day charged through the house

Charging so far measuring

Logged every minute from the charger's own meter since , split solar-vs-grid by what the house was doing at the time. Battery discharge counts as stored solar.

Charged into the car
Came from our solar
Topped up from the grid
Grid electricity it cost
Saved charging on our sun
Cheaper than petrol so far

What it costs to drive estimated

Total running cost per kilometre: the grid electricity the car actually needed, plus Road User Charges of 7.6c/km (NZ EVs pay RUC on every km), plus ~2c/km servicing. Distance is estimated from energy at ~18 kWh/100 km between odometer updates.

The MG4 on our power

Total cost / km
Electricity / km
Road user charges / km
Servicing / km

A petrol car, same road

Total running cost / km
Fuel / km (8 L/100 km @ $2.70)

Fuel (pump price already includes road tax) plus 7c/km servicing — oil, brakes, plugs, filters, transmission — against just ~2c/km for the EV (NZ industry figures). Like-for-like with the EV's electricity + RUC + servicing.

Most kilometres are sunshine. Charging figures fill in here as more is logged.

Method: the charger's energy counter is read each minute and split solar-vs-grid by the concurrent house mix. Distance and cost-per-km are estimated from energy at the efficiency shown; the grid share is priced on the real time-of-use tariff, plus Road User Charges at the current NZ EV rate (7.6c/km). The charging hardware is in the System details tab.

Keeping it road-legal

Prepaid Road User Charges and the Warrant of Fitness, tracked against the odometer and the calendar. I get a phone reminder as each nears due, and update the figures in Home Assistant when I buy more RUC or renew the WoF.

Road User Charges

RUC km remaining
Paid up to (odometer)

Warrant of Fitness

Days remaining
Expires

The system

How the energy flows

A grid-connected Victron ESS with AC-coupled solar. Panels feed a Solis grid-tie inverter; a Victron MultiPlus-II manages the battery, the grid, and backup power.

Grid · Ecotricity
import / export
27 panels
12.15 kWp
Solis
10 kW inverter
Victron MultiPlus-II
inverter · charger · transfer
16 kWh battery
charge / discharge
House
loads

PV serves the house first → surplus charges the battery → the remainder exports to the grid (Ecotricity). After dark the battery discharges to cover load; the grid only tops up. On a power cut the Victron carries essential loads in under 20 ms.

Component inventory

ComponentIdentificationKey specs
Battery inverter/chargerVictron MultiPlus-II 48/10000/140-10010 kVA / 8000 W cont · charge 140 A ≈ 7 kW · <20 ms UPS
PV inverterSolis S6-GR1P10K single-phase grid-tie + datalogger10 kW · dual-MPPT · AS/NZS 4777.2
Battery48 V LiFePO₄, 16S314 Ah ≈ 16.1 kWh nominal
BMSJK BMS (Jikong)Active balance · RS485/CAN
PV DC isolators2 × NLINE NL432PVAS 60947.3 · IP66
PV array27 × 450 W panels, 2 strings12.15 kWp DC · 1.22× the 10 kW inverter
RetailerEcotricity — ISO 14067 climate positiveTime-of-use plan, Aurora network

A day in the life: use the sun first, store the rest

The hardware follows this priority order by default; the software refines it.

Dawn

The battery carried the house through the night.

Morning

PV covers the house directly — zero cost, zero carbon.

Midday

Surplus charges the battery, then exports the remainder.

Evening peak

The battery discharges to cover the most expensive, highest-carbon hours.

Night

Grid tops up only when it's both cheap and clean.

So far: over days the array has generated in total — averaging a day, with about of it self-consumed rather than exported. Updated each morning from the system meter.

What the house actually uses

Half-hourly meter data, 25 May – 13 Jun 2026 (20 midwinter days). The battery exists to shift the load that lands in the expensive peak windows.

Heatmap, average load profile and daily totals for the house
Top: per-day half-hourly heatmap (green boxes = sustained high-power blocks, likely EV charging). Middle: the average day — a sharp 7am heating spike (~5 kW), a midday dip, a long evening ramp. Bottom: daily totals, 38–81 kWh/day.

~53 kWh / day

Midwinter average demand across the 20-day window.

47% in peak

Share of consumption in the ~37c/kWh peak windows — the load the battery time-shifts.

The EV is the load

Our EV is the household's only car, driving 30–90 km a day (the weekday Mosgiel↔Dunedin commute, ice hockey and other trips), and it's charged through the house. That's the bulk of the demand, and the obvious thing to move onto midday sun rather than the evening peak.

The plant room

A purpose-built, insulated shed in Mosgiel — built by hand — houses the whole energy system.

Why a separate shed

I built the shed myself and kept it detached from the house on purpose. A big lithium battery and inverter are better off in their own structure with their own air space, so the only building that touches the house is the garage, not the energy store. That keeps the heat, the noise and any fault risk out of the living space.

Building the Shed

I dug down and filled the hole 1.6m x 1.1m with AP2 gravel to 100mm. Then 18x20kg bags of concrete set with a rebates of 30mmx20mm so the walls of the Rite 2 shed sit below the conrete floor. Outside 1530 × 1080mm. Internal framing in 100×50 mm with a damp course; 15 mm ply on three sides, 6 mm on the street side, then 6 mm fibre-cement cladding. Roof: fibre-cement → Expol insulation → building paper → steel. Bolted down with 8 concrete screws and 10 roof screws.

AI on sunshine

Running my AI work on stored sun

A lot of my work involves AI. Where it makes sense I run that compute on the array's surplus, so midday sun does local processing instead of exporting cheaply. When a job can't wait for the sun it runs on ISO 14067 climate-positive grid power instead.

AI for coding

Most of my AI use is as a coding partner. I work with agents to build and maintain projects like PVEbot (a Discord moderation bot for extremism prevention), the Six-Animal-Model site, and the system this page describes.

University work

For teaching and research I run AI assistance on my work machine, keeping that separate from the home setup.

Local batch processing

For my own work I run models locally with Ollama to analyse documents and encode information. It stays on my machine and none of it is urgent, so it batches well.

Two clean pathways to run a job

Every batch job takes one of two lanes, both clean, chosen by how long it can wait.

Lane 1: guaranteed solar

Deferrable work waits for real surplus. It runs only when the panels are making more than the house is using and the battery is already full. No grid draw at all, just spare sun that would otherwise export at about 19c.

PV − load ≥ 1.2 kW battery ≥ 80% pause below 400 W

Lane 2: certified-green grid

Work that can't wait for the sun still runs clean. Our retailer Ecotricity is ISO 14067 certified climate positive, offsetting more carbon than its electricity emits, so grid power here is renewable and net-negative. The job runs now and the power is still green.

100% renewable ISO 14067 climate positive no wait

How the solar-gated queue works

Local models run under Ollama on the workstation GPU; a small scheduler decides when to let them loose.

Queue
Drop a job script in the watched dir
Gate
Read live PV · load · SOC from Victron
Block
Hold until there's surplus sun
Run
One model at a time on the GPU

Deferrable by design

Jobs are document analysis and encoding. They're private and not time-critical, so they can wait hours for the sun. Each one is a shell script (an ollama run … call) dropped into a queue folder.

Power-source-aware gate

Every ~2 minutes the runner reads live solar from the Victron system and releases a job only when surplus ≥ 1.2 kW and the battery is ≥ 80%. A lower 400 W stop threshold gives hysteresis, so a running job's own draw doesn't flap the gate off.

One at a time

The GPU runs a single model at once; finished jobs move to done/, failures to failed/, each with its log. When the sun dips the queue pauses and resumes later, so no job is lost.

The work and the sun line up. My coding and analysis happen during the day, so the GPU runs while the panels do, and surplus midday sun becomes local compute instead of a cheap export. After dark, jobs that can wait hold for tomorrow's sun (Lane 1); anything urgent draws climate-positive grid power (Lane 2).

Why local, not the cloud

Running my own models isn't just about power. Water, privacy and control matter too.

No water for cooling

Big AI data centres shed heat with evaporative cooling that uses fresh water, a real and growing draw on local supply. This GPU is air-cooled in the shed. It uses no water, and its waste heat warms the plant room instead of a cooling tower.

Data sovereignty

Documents are analysed on my own machine and nothing is uploaded to a foreign cloud. The data never leaves the house, so it stays private and under NZ jurisdiction because of how it's built, not because of a policy promise.

Compute sovereignty

My own hardware, running open-weight models I control. No dependence on an overseas provider's API, its pricing, throttling or uptime. It's self-hosted and runs off my own roof.

The control software

kaitiaki-hiko (guardian of electricity)

The software sits on top of the hardware. It isn't only there to save money. It tries to make sure every kilowatt-hour we move avoids carbon rather than causing it, and that we can measure the difference.

Read
Solar · battery · grid telemetry
Decide
What we want to do
Make safe
The only gate to the inverter
Act
Write setpoint, log everything

Safe by default

It boots monitor-only. Control is gated behind two explicit flags and dry-runs for weeks before it ever touches the inverter.

One write path

Nothing commands the inverter except through safety.clamp() — enforcing SOC limits, the LiFePO₄ cold-charge block, and BMS faults.

Carbon-aware

The goal is to charge when the grid is cheap and clean, and discharge when it's expensive or high-carbon. It optimises on price and gCO₂/kWh together, not price on its own.

The green claim, in four levels. Maximise self-consumption (always true) → charge when the grid is clean and discharge when it's dirty → shift the evening peak off the grid's worst hour → and back it up with logged avoided-carbon figures. NZ's grid is about 80–85% renewable, but its carbon intensity moves hour to hour, and that movement is where the gains are.
Built & powered by

The people behind the system

Designed, installed and powered by Otago businesses.