Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ You need an Amber API key from [app.amber.com.au/developers](https://app.amber.c
- Multi-site picker when your Amber account has more than one NMI
- Editable Amber daily connection, subscription and demand rates for this financial year and last (days before 1 July 2026 use last year's); an uploaded bill fills the year it belongs to
- More Stats: average import and feed-in prices, price-spike and negative-price exposure, evening import share, grid-free days
- Solar & battery planner: from the last 12 months of meter readings (Amber's, an imported Amber CSV, or any household's NEM12), tries every mix of new solar size, battery size and plan for the network, half hour by half hour, and ranks them by 20-year value, payback or yearly bill. Every option is measured against one yardstick: nothing new on the plan to compare against, by default whichever of the plans you'd use is cheapest with nothing new (switching is free). Companies, or single plans, can be ticked or unticked: only ticked plans are searched and shown. Any of the three can be fixed ("a size I choose", "none", or one plan). Shows next year's bill month by month against today's, a payback chart at today's prices and ±20% (payback is when it's ahead for good, after any battery replacement), worth in today's money and IRR (a battery replaced within the years compared is credited with the life it has left at the end), a "How keen to be" rating (Not worth it, Marginal, Modest, Good or Strong, from the value per $1 up front, whether it still pays with prices 20% lower, and payback, plus whether waiting a year would cost anything), and a 'Where the saving comes from' breakdown for each option (power bought, power sent to the grid, export and demand charges, and where the new panels' power goes: used at home, stored or sent out, lost to the export limit or clipped by the inverter), a "wait a year" check, and what just switching plan would save. Each plan is priced exactly as on Compare (free windows and caps, capped and time-varying feed-in, demand, Amber's export charge); missing Amber feed-in prices are rebuilt from AEMO wholesale prices. The battery charges from spare solar and from free or cheap grid hours, covers the home when power is dear and sells into high feed-in prices, knowing each day's prices in the morning. The export limit applies to the whole home and is measured against what the meter already sent out; a battery stores spare solar before the limit throws the rest away. When a feed-in price is negative the panels switch off by default (a battery soaks up what it can first), so nothing is paid to export; a setting says if they can't, and then exporting at negative prices costs money. The "How keen to be" rating also checks the result if feed-in prices from 10am to 3pm halve. Solar comes from a PVGIS 5.3 typical year (ERA5) for 22 towns (`data/solar`, fetched by `scripts/update-solar.js`), with sun position, tilt, facing, shade, temperature and inverter clipping, scaled to PVGIS's own yield. Homes that already have panels or a battery: the app spots them in the readings (solar sent out; selling after dark or quiet nights) and pre-fills a guess. Existing panels stay in the readings and new ones are added on top. An existing battery is taken out of the readings (selling to the grid is seen directly; what it covered at home is estimated from its size, the days it filled up and ran flat, and the home's use on nights it was empty; its charging from spare solar first, then from the grid in the cheapest half hours that bought more than usual) and run again on every plan with any new battery, since it would behave differently on another plan. A check card compares the planner's run of that battery on today's plan with the real readings, and shows what the battery saves. Allows for the federal solar (STC) and battery rebates shrinking each year, hardware getting cheaper, panel and battery wear, battery and inverter replacement, the export limit, and planned changes: an electric car, heat-pump hot water, gas heating and cooking to electric (with the gas bill saved)
- Solar & battery planner: from the last 12 months of meter readings (Amber's, an imported Amber CSV, or any household's NEM12), tries every mix of new solar size, battery size and plan for the network, half hour by half hour, and ranks them by 20-year value, payback or yearly bill. Every option is measured against one yardstick: nothing new on the plan to compare against, by default whichever of the plans you'd use is cheapest with nothing new (switching is free). Companies, or single plans, can be ticked or unticked: only ticked plans are searched and shown. Any of the three can be fixed ("a size I choose", "none", or one plan). Shows next year's bill month by month against today's, a payback chart at today's prices and ±20% (payback is when it's ahead for good, after any battery replacement), worth in today's money and IRR (a battery replaced within the years compared is credited with the life it has left at the end), a "How keen to be" rating (Not worth it, Marginal, Modest, Good or Strong, from the value per $1 up front, whether it still pays with prices 20% lower, and payback, plus whether waiting a year would cost anything), and a 'Where the saving comes from' breakdown for each option (power bought, power sent to the grid, export and demand charges, and where the new panels' power goes: used at home, stored or sent out, lost to the export limit or clipped by the inverter), a "wait a year" check, and what just switching plan would save. Each plan is priced exactly as on Compare (free windows and caps, capped and time-varying feed-in, demand, Amber's export charge); missing Amber feed-in prices are rebuilt from AEMO wholesale prices. The battery charges from spare solar and from free or cheap grid hours, covers the home when power is dear and sells into high feed-in prices, knowing each day's prices in the morning. The export limit applies to the whole home and is measured against what the meter already sent out; a battery stores spare solar before the limit throws the rest away. When a feed-in price is negative the panels switch off by default (a battery soaks up what it can first), so nothing is paid to export; a setting says if they can't, and then exporting at negative prices costs money. Where the feed-in price goes below zero (Amber), the recommendation and "what to ask installers for" say the panels need a "curtailable" inverter (one the retailer can switch off remotely), and on Amber a battery that SmartShift can run. A "Check the numbers" card for the option on show gives the average price paid per kWh bought and earned per kWh sent out (for the yardstick, the same plan with nothing new, and the option), daily and demand charges, the plan's average buy and feed-in prices through the day and how often feed-in is below zero, rules of thumb (kWh a day per kW of panels; what each kWh of new solar or battery output is worth against what it costs per kWh), and the settings it was worked out with. The "How keen to be" rating also checks the result if feed-in prices from 10am to 3pm halve. Solar comes from a PVGIS 5.3 typical year (ERA5) for 22 towns (`data/solar`, fetched by `scripts/update-solar.js`), with sun position, tilt, facing, shade, temperature and inverter clipping, scaled to PVGIS's own yield. Homes that already have panels or a battery: the app spots them in the readings (solar sent out; selling after dark or quiet nights) and pre-fills a guess. Existing panels stay in the readings and new ones are added on top. An existing battery is taken out of the readings (selling to the grid is seen directly; what it covered at home is estimated from its size, the days it filled up and ran flat, and the home's use on nights it was empty; its charging from spare solar first, then from the grid in the cheapest half hours that bought more than usual) and run again on every plan with any new battery, since it would behave differently on another plan. A check card compares the planner's run of that battery on today's plan with the real readings, and shows what the battery saves. Allows for the federal solar (STC) and battery rebates shrinking each year, hardware getting cheaper, panel and battery wear, battery and inverter replacement, the export limit, and planned changes: an electric car, heat-pump hot water, gas heating and cooking to electric (with the gas bill saved)

## Data completeness and CSV backups

Expand Down
2 changes: 1 addition & 1 deletion css/app.css

Large diffs are not rendered by default.

54 changes: 29 additions & 25 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'; style-src 'self'; connect-src 'self' https://api.amber.com.au; img-src 'self' data:; font-src 'self'; worker-src 'self'; base-uri 'self'; form-action 'self'">
<title>Amber Compare &amp; Export v1.58</title>
<title>Amber Compare &amp; Export v1.59</title>
<link rel="icon" href="favicon.ico" type="image/x-icon">
<link rel="stylesheet" href="css/app.css?v=1.58">
<link rel="stylesheet" href="css/app.css?v=1.59">
</head>
<body class="bg-gray-100 text-gray-800">
<a href="#mainTabs" class="sr-only focus:not-sr-only focus:absolute focus:top-2 focus:left-2 focus:z-50 focus:bg-white focus:px-3 focus:py-2 focus:rounded">Skip to the tabs</a>
Expand All @@ -19,7 +19,7 @@ <h1 class="text-2xl sm:text-3xl font-bold text-gray-900 flex items-center">
<img src="favicon.ico" alt="" class="mr-3 h-12 w-12 sm:h-14 sm:w-14"> Amber Compare &amp; Export
</h1>
<p class="mt-2 text-gray-600">See what your electricity really costs on Amber, check an Amber bill, and find out whether another plan (or Amber) would be cheaper for you.</p>
<p class="mt-1 text-xs text-gray-500">Free and private: everything runs in this browser and nothing is uploaded. Version 1.58.</p>
<p class="mt-1 text-xs text-gray-500">Free and private: everything runs in this browser and nothing is uploaded. Version 1.59.</p>
</div>
<div class="relative flex items-center">
<button id="settingsBtn" type="button" aria-label="Settings" aria-haspopup="true" aria-expanded="false" class="p-2 rounded-full text-gray-500 hover:bg-gray-100 hover:text-gray-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
Expand Down Expand Up @@ -669,7 +669,7 @@ <h3 class="text-sm font-semibold text-gray-800 mb-2" data-help="planDecide">What
<input type="number" id="planShading" min="0" max="80" step="1" value="0" class="plan-input">
</div>
<div class="sm:col-span-3">
<label class="inline-flex items-start gap-2 text-sm text-gray-700" data-help="planSwitchOff" data-help-label="Panels switch off when the feed-in price is negative"><input type="checkbox" id="planSwitchOff" checked class="mt-0.5"> Panels switch off when the feed-in price is negative</label>
<label class="inline-flex items-start gap-2 text-sm text-gray-700" data-help="planSwitchOff" data-help-label="Panels switch off when the feed-in price is negative"><input type="checkbox" id="planSwitchOff" checked class="mt-0.5"> <span>Panels switch off when the feed-in price is negative <span class="text-gray-500">(a "curtailable" inverter)</span></span></label>
</div>
</div>
</details>
Expand Down Expand Up @@ -764,6 +764,10 @@ <h3 class="text-xl font-bold text-gray-900" data-help="planOptions">Your options
<h3 id="planDetailTitle" class="text-xl font-bold text-gray-900 mb-1">Next year, month by month</h3>
<div id="planDetailBody"></div>
</div>
<div class="bg-white rounded-lg shadow-md p-6 mb-6 overflow-x-auto">
<h3 class="text-xl font-bold text-gray-900 mb-1" data-help="planNumbers">Check the numbers</h3>
<div id="planNumbersBody"></div>
</div>
<div class="bg-white rounded-lg shadow-md p-6 mb-6">
<h3 class="text-xl font-bold text-gray-900 mb-1" data-help="planPayback">Paying it back</h3>
<div class="relative h-64"><canvas id="planPaybackChart" aria-label="Money saved over the years, after paying for the system"></canvas></div>
Expand Down Expand Up @@ -794,26 +798,26 @@ <h3 class="text-xl font-bold text-gray-900 mb-1" data-help="planPayback">Paying

<script src="chart.umd.min.js"></script>
<script src="chartjs-plugin-zoom.min.js"></script>
<script src="js/constants.js?v=1.58"></script>
<script src="js/help.js?v=1.58"></script>
<script src="js/time.js?v=1.58"></script>
<script src="js/templates.js?v=1.58"></script>
<script src="js/storage.js?v=1.58"></script>
<script src="js/costs.js?v=1.58"></script>
<script src="js/api.js?v=1.58"></script>
<script src="js/bill.js?v=1.58"></script>
<script src="js/csv.js?v=1.58"></script>
<script src="js/charts.js?v=1.58"></script>
<script src="js/calendar.js?v=1.58"></script>
<script src="js/stats.js?v=1.58"></script>
<script src="js/monthly.js?v=1.58"></script>
<script src="js/redispatch.js?v=1.58"></script>
<script src="js/import.js?v=1.58"></script>
<script src="js/networks.js?v=1.58"></script>
<script src="js/estimate.js?v=1.58"></script>
<script src="js/solar.js?v=1.58"></script>
<script src="js/planner.js?v=1.58"></script>
<script src="js/planner-ui.js?v=1.58"></script>
<script src="js/app.js?v=1.58"></script>
<script src="js/constants.js?v=1.59"></script>
<script src="js/help.js?v=1.59"></script>
<script src="js/time.js?v=1.59"></script>
<script src="js/templates.js?v=1.59"></script>
<script src="js/storage.js?v=1.59"></script>
<script src="js/costs.js?v=1.59"></script>
<script src="js/api.js?v=1.59"></script>
<script src="js/bill.js?v=1.59"></script>
<script src="js/csv.js?v=1.59"></script>
<script src="js/charts.js?v=1.59"></script>
<script src="js/calendar.js?v=1.59"></script>
<script src="js/stats.js?v=1.59"></script>
<script src="js/monthly.js?v=1.59"></script>
<script src="js/redispatch.js?v=1.59"></script>
<script src="js/import.js?v=1.59"></script>
<script src="js/networks.js?v=1.59"></script>
<script src="js/estimate.js?v=1.59"></script>
<script src="js/solar.js?v=1.59"></script>
<script src="js/planner.js?v=1.59"></script>
<script src="js/planner-ui.js?v=1.59"></script>
<script src="js/app.js?v=1.59"></script>
</body>
</html>
2 changes: 1 addition & 1 deletion js/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
// Compare "This month" when the page opens with a saved API key (a test can preset
// window.Amber.AUTO_COMPARE = false to start idle).
Amber.AUTO_COMPARE = Amber.AUTO_COMPARE !== false;
Amber.APP_VERSION = '1.58';
Amber.APP_VERSION = '1.59';
Amber.TEMPLATES_AS_AT = '2026-07-01';
// All editable rates (plans, custom, Amber fixed charges) are GST-inclusive,
// matching Energy Made Easy, DMO/VDO, retailer fact sheets and Amber perKwh.
Expand Down
3 changes: 2 additions & 1 deletion js/help.js
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,8 @@
planOptions: 'Each row is one mix of new solar, battery and plan, with next year\'s bill, what it saves, when it pays back and what it\'s worth over the years. Tap the ? on a column heading for what it counts. Tap a row to see its year month by month and its payback chart.',
planEnthusiasm: 'A quick verdict on the option. Strong: every $1 you pay up front comes back as $1.75 or more in today\'s money, it still pays if power prices are 20% lower than you set (and, with new panels, if feed-in prices from 10am to 3pm halve), and it pays back within 8 years. Good: $1.40 or more back, and still pays in both of those cases. Modest: $1.15 or more back. Marginal: just over $1 back. Not worth it: less back than you put in. It also says whether waiting a year would cost you anything. It\'s a rule of thumb: how keen to be also depends on how sure you are about prices, rebates and your plans for the home.',
planBreakdown: 'The option against the same plan with nothing new, part by part: what you\'d pay for power bought, what you\'d earn for power sent to the grid, and any export or demand charge. Underneath, where the new panels\' power goes over a year: used at home, stored or sent out, or lost to the export limit or the inverter. On Amber, power sent out earns last year\'s actual feed-in prices for each half hour; if a lot more solar is installed around you, daytime prices could be lower in future.',
planSwitchOff: 'On Amber the feed-in price goes negative at times, mostly in the middle of sunny days: sending power out then costs you. Ticked: your panels stop sending power out at those times (Amber can switch off inverters it supports; a battery soaks up what it can first), so you neither pay nor earn. Untick if your inverter can\'t: the planner then charges you for power sent out at negative prices.',
planSwitchOff: 'On Amber the feed-in price goes negative at times, mostly in the middle of sunny days: sending power out then costs you. Ticked: your panels stop sending power out at those times (a battery soaks up what it can first), so you neither pay nor earn. That takes a "curtailable" inverter: one Amber can switch off remotely, from Amber\'s list of supported inverters, so ask for one if you\'re buying and check the one you have. Untick if your inverter can\'t: the planner then charges you for power sent out at negative prices.',
planNumbers: 'The averages behind the option on show (tap a row in "Your options" to change it), so you can check they look right. Compare the price per kWh bought and the daily charges with your bills or the plan\'s price list, and the panels\' kWh a day per kW with installers\' quotes. As a rule of thumb, each kWh from new panels should be worth somewhere between the feed-in price and the price of power (more of it used at home means nearer the price of power), and should be worth more than it costs; a battery should save more per kWh it gives back than it costs per kWh. Prices through the day are plain averages of every half hour, to show when power is cheap or dear.',
planPayback: 'The total you\'re ahead (or behind) each year after paying for the system, in plain dollars, against nothing new on the plan you compare against. Where the line crosses zero for good is the payback year. Replacing the battery and inverter makes it dip, and can put you behind again for a while. The dashed lines show power prices 20% higher or lower.',

// ---------- Glossary ----------
Expand Down
Loading
Loading