Your CSV is parsed into 30-minute (timestamp, kWh) readings, combining the unbilled and billed columns. Only the most recent 365-day window is used — every individual data point, no averaging or sampling.
Daily generation uses Perth-specific monthly yields (kWh per kW per day):
daily_gen_kWh = PERTH_YIELD[month] × solar_kW
That daily total is spread across 48 half-hour slots using a cosine-squared shape centred on 12:30, zero outside 6am–7pm:
slot_gen = daily_gen_kWh × SHAPE[hour, minute] (Σ SHAPE = 1)
Solar only:
self_consumed = min(gen, usage) grid_import = usage − self_consumed exported = gen − self_consumed
Solar + battery (SOC = state of charge; battery starts each day empty):
surplus = gen − self_consumed
deficit = usage − self_consumed
if surplus > 0:
charge = min(surplus, battery_kWh − SOC)
SOC += charge × 0.92 # round-trip efficiency
exported = surplus − charge
if deficit > 0:
discharge = min(deficit, SOC)
SOC -= discharge
grid_import = deficit − discharge
Exports are tagged peak (3pm–9pm) or off-peak per slot. DEBS rates apply the same across every Synergy plan.
import_cost = Σ (import_by_hour[h] × rate(h, plan)) supply_cost = daily_supply_charge × n_days export_credit = export_peak × 0.10 + export_offpeak × 0.02 total_bill = import_cost + supply_cost − export_credit
Plan rates (1 July 2025 schedule):
Federal rebate is tiered from 1 May 2026 under the Cheaper Home Batteries Program (STC factor 6.8). Working dollar figures based on current STC spot price:
fed_rebate = (first 14 kWh) × $252/kWh # 100% of factor
+ (14–28 kWh next) × $151/kWh # 60% of factor
+ (28–50 kWh next) × $38/kWh # 15% of factor
+ (above 50 kWh) × 0 # no rebate
wa_rebate = $130 × min(battery_kWh, 10) # WA Residential Battery Scheme, Synergy
battery_net = max(0, battery_gross − fed_rebate − wa_rebate)
option_B_total = solar_cost + battery_net
solar_savings = no_solar_bill − solar_only_bill batt_savings = no_solar_bill − solar_battery_bill solar_payback_yrs = solar_cost / solar_savings batt_payback_yrs = option_B_total / batt_savings incremental_yrs = battery_net / (batt_savings − solar_savings)
The winner per scenario (No Solar / Solar Only / Solar + Battery) is the plan with the lowest total annual bill.