Author Archives: Josh

SP Error while getting price guide : INVALID PARAMETER

While trying to retrieve https://www.bricklink.com/v2/catalog/catalogitem_pgtab.page?idItem=None&idColor=0&gm=0&gc=1&ei=0&prec=4&showflag=0&showbulk=0 I got the error “SP Error while getting price guide : INVALID PARAMETER” which means “data type mismatch” because ‘None’ should be a number

Programatic submission of Australia Post’s CN23 customs form

A number of major international destinations of packages now will only accept packages with electronic CN23 customs declaration. Normally, you’d do this by rocking up to the Post Office with your pre-addressed parcel, filling in a CN23 paper form, and have that transcribed into Australia Post’s computer system by the postal worker behind the counter. You can elect to receive SMS notifications of change of status (landed, delivered, etc) for 50c.

Australia Post also allows you to fill in the appropriate details on their website; if you do this, then you get a QR code sent to you via SMS (free) and email (free) which the postal worker scans in and all the details (your name and address, destination name and address, contents, etc) are attached to your package’s details without any error-prone re-keying. The downside of going down this path is the dismal website Aussie Post provides, a JavaScript heavy, painfully slow dog of a site that doesn’t cache your own address.

Once the QR code is scanned, and the postal worker checks everything with you, they’ll print out the CN23, get you to sign it , and then it gets attached to your parcel. Because the To and From addresses are on the CN23 form (and those details are in electronic form, associated with the barcode for the package), it’s perfectly acceptable to present an unaddressed package to the post office (make sure you can tell which package is which, if you go down this route).

One thing you need to be aware of: Australia Post hasn’t heard of Unicode. You absolutely can’t use any characters not in the ASCII character set, and even then a very limited range of them. Certain fields allow some characters, which in turn aren’t allowed in other fields.

One of the fields you can supply is the HS tariff code, which is an international standard group of codes to describe “stuff” – the Harmonised System Tariff code. The sourcecode below uses the code for “Toy, plastic construction” – you should use the code for what you’re actually sending. You can specify multiple HS codes. Dollar values are in decimal dollars, weights are in decimal kilograms.

After calling the Australia Post website with your customs declaration, it returns to you a base-64 encoded PNG of the QR code to present at the counter, and a base-64 encoded PDF of the CN23 form – there’s no point printing this out, because it’s not paid for yet; let the Post Office print it out with the postage on it. You’ll also get the PNG via email and SMS (free).

Here’s some Python to make this submission:


    AP_session = requests.Session()
    jsonFormData =  {"customDeclaration":{
      "label":{"source":"AEM","postagePaidIndicator":False,"eadIndicator":False},
      "parcelCharacteristics":{
        "productClassification":11,
        "dangerousGoodsIndicator":False,
        "returnInstructions":"Return By Most Economical Route",
        "confirmationMobileNumber":"0411111111",
        "content":[{
          "content":"HS traffic code name for your stuff",
          "contentQuantity":1,
          "contentUnitValue":subtotal,
          "totalContentValue":subtotal,
          "contentWeight":int(order["total_weight"])/1000,
          "hsTariff":"95030039",
          "contentCountryOfOrigin":"DK"
          }],
        "totalConsignmentValue":subtotal},
      "senderAddress":{"firstName":"Josh","lastName":"FromGeekrant.org",
        "addressLine":["11 Example St"],"suburb":"YourSuburbName","state":"VIC",
        "postcode":"3000","email":"addr@example.com",
        "phone":"0411111111","smsConfirmation":False,"countryCode":"AU"},
      "receiverAddress":{"firstName":CustomsString(order["label_address_name_first"]),
        "lastName":CustomsString(order["label_address_name_last"]),
        "countryCode":order["label_address_two_char_country_code"],
        "addressLine":CustomsAddress(order),
        "suburb":CustomsString(order["label_address_city"]),
        "state":CustomsString(order["label_address_state"]),
        "postcode":CustomsString(order["label_address_postal_code"]),
        "email":order["buyer_email"]}
    }}

    stopact = {"jsonFormData":json.dumps(jsonFormData) }
    result = AP_session.post(url='https://auspost.com.au/bin/form/stopact', 
      data=stopact, timeout=2)
    response = json.loads(result.text)
    result.raise_for_status()
    filename = "{}-customsQRcode.png".format(orderid)
    with open(filename, "wb") as fh:
      fh.write(base64.b64decode(response['qrCode']))
    filename = "{}-CN23.pdf".format(orderid)
    with open(filename, "wb") as fh:
      fh.write(base64.b64decode(response['label']))

LEGO Pick-a-brick container sizes, dimensions and capacity

There are three Pick A Brick containers – The 950ml tumbler, 475ml tumbler and 30ml lid. I have measured the volume of these containers using a 0.1g scale and water; I have high confidence in the measurements. Other measurements have been taken with callipers and rulers; I have lower levels of confidence in those numbers.

The lid’s stud (where you can store LEGO if you’re particularly cunning) is 48mm diameter and approximately 16mm deep – six studs in diameter by two studs deep. This means you can’t fit something six studs wide (48mm) into it, because LEGO bricks aren’t 0mm tall or long. You might be able to store one 1×6 plate if you jammed it in, as plastic objects are plastic (bendy).

The 475ml tumbler has a profile matching that of the 950ml tumber, cut off at the bottom. They share an opening of over 100mm. They both have an indentation that matches that in the lid, allowing stacking. The displacement of the indentation of the base is 55mm wide and has three strengthening piers projecting into the interior of the base.

The length of the interior wall top-to-bottom depth of the 475ml tumbler is 76mm; it can hold 1675 1×1 round plates. The top-to-bottom depth of the 950ml tumbler is 170mm.

Dear ABC: use English better

It’s been several years, but now it’s time to complain about the use of certain phrases by ABC News journalists:
– “Quote Unquote” is meant to surround what you’re quoting, not preface it. If you’re just going to preface it and use a different tone of voice, just use “Quote.” If you want to clearly signal the end of a quote, say “Unquote” at that part.
– All crimes happened in the past, and are thus historic. There is no such thing as historic rape. It’s rape. Find another way to communicate “very old”. Vintage rape? Much classier.
– If a court order or law forbids naming someone, then you “mustn’t” name them, not “can’t”. You can, but you’re just unwilling to go to jail for contempt. “can’t be named for legal reasons” is also wrong, but less wrong than “can’t”. I hope you’re not trying to avoid sounding like characters in Harry Potter and “He who mustn’t be named”
– Vehicle crashes are not best described as accidents. As reporters you don’t generally know at the time of reporting the intent of drivers, so it could well not be an accident. Try crash, collision, or even the bland “incident”.

And on another matter, could your staff stop editorializing misfortune? “The driver reversed and tragically didn’t see the three year old, who sadly died as a result” ought to be reported as “The driver reversed and didn’t see the three year old, who died as a result”

BrickLink API PushNotificationMethod Get Notifications callback semantics

The documentation for the BrickLink API PushNotificationMethod suggests that the data sent to the URL you registered on the BrickLink API Consumer Registration Page is sent to this URL (via a POST verb, by the way) and as such you don’t need to call Get Notifications. Given the body of the POST is empty, this is not right – what you instead need to do is use any POST to your registered URL as a prompt to call Get-Notifications. It’s probably best to periodically call it too, given “it does not guarantee delivery of all events” and doesn’t either based on my experience.

A notification to be created when:

  • Order
    • You received a new order.
    • Buyer updates an order status.
    • Items of an order are updated (added or deleted).
  • Message
    • You received a new message.
  • Feedback
    • You received a new feedback or reply

Also note: NULL fields are not included in the returned JSON. Some fields names don’t match the documentation (eg: drive_thru_sent instead of the documented sent_drive_thru).

Setting up a public facing webserver behind a Netcomm NF18ACV

Note: this will move your Broadband Router’s web-configuration to an unexpected port :8080, instead of the :80 your browser expects.

Navigate to Management | Access Control | Services then disable the WAN side HTTP service (why would you even expose this?), change the port for the LAN side to the Alternate HTTP port of 8080, and hit Apply/Save.

Navigate to Advanced Setup | NAT | Virtual Servers and hit Add. Select the correct interface, fill in the other details including the Web Server’s LAN address, ensure you’ve got Status: Enabled for the port forwarding, and hit Apply/Save.

Run up a trial HTTP server using something like
sudo python -m SimpleHTTPServer 80
and check for access from outside. Kill the server, because that isn’t safe for production use.

Air conditioner upgrade

I can’t find any technical data on one of our two existing air conditioners. It’s 1960s through-window technology, and it seems it might be somewhere around 130% efficient. A run-of-the-mill air conditioner today is about 400% efficient. What I do know is, when that air conditioner runs our power consumption spikes 2kW; for the cooling we’re getting, this suggests we should be using 700W. It’s costing 40 cents/hour more to run than a modern unit, and it isn’t providing us with heating. It also sounds like a jet aircraft. We don’t use it much.

If it’s replaced with a $2000 unit, the payback is 5000 operating hours. It actually operates for something like 150 or 200 hours a year, so there’s a more than 25 year payback – which isn’t outlandish, given the existing unit is 50 years old now, but I will be surprised if a unit manufactured today survives that long.

Modern units come with DRED support.

Picking an air conditioner is… complex. We’ve taken our home off gas, so we need some kind of electric heating, which I expect to run daily for a number of hours for four months of the year, and the cooling side is something that will get much less use. So, where I live, I need to optimize my “heat pump” for heating performance – COP in the lingo.

As of March 2020, there are more than 3700 air conditioners with performance metrics listed by the Australian government. Thankfully this data is available is CSV format, so can be folded, sorted and mangled. 2000 can be eliminated because they’re not single-split units, so their efficiency will suck balls. Another 450 can be eliminated because they’re not the classic wall hung variety, so will be stupid expensive. Anything smaller than 3KW and larger than 5KW is badly sized for the areas I’m looking at, so now I’m at a “manageable” 300 units. Purging others for efficiency reasons, and I’m down to less than 80. I sort for COP, and start down the list.  The first is $2550, then $1420, then can’t be purchased anywhere, then $880 (a ten-year TCO of $3000, plus installation). A feature check confirms it can be set to a weekday operating cycle and a weekend cycle; we’re off to the races. I locate a supplier who will deliver two for $1,716.00 after trying the local retailer who refuses to answer the phone.

Now for the easy task: I’ve simply got to find a tradie to install my units.

uBank: Sorry, Internet Banking is temporarily unavailable.

uBank is an Australian “Internet bank”, in such that they don’t have any branches. That’s fine, they can do everything except deal with cash. They’re owned by the NAB.

They have an app, which gets an absolute bollocking in the App Store. So people use the website instead. I need to do things with that account about once a month.

Close enough to half the time I try to login, I get the error message “Sorry, Internet Banking is temporarily unavailable.” with a page title of “Login Maintenance”. There’s no other kind of banking with these guys. The last time this happened was just before 4pm, which I believe is the close of transactions for that day. Why the hell would you do site changes in the middle of the day, and why just before the close of business? The NAB is a real bank, and I presume it doesn’t pull this kind of crap. They don’t even give a window (“Out until 14:30” or “Down for five minutes”). No post on their FaceBook website saying “there’s a planned downtime this afternoon” or “Sorry for the emergency outage, but rats were chewing on the coolant lines and that just isn’t okay. We humanely hit them with sticks until they stopped.”.

This is a very bad railroad.

Sanden Heat Pump water tank outlet size

The outlet size on a Sanden Heat Pump’s water tank is 3/4 inch (DIN20) with a BSP thread, so be aware you’ll have to use a reducer to get down to the normal 1/2 inch (DIN15) copper pipes. At least, that’s what I was told on the phone. The Sanden specification sheet, which has legible diagrams and writing compared to the installation instructions for an Australian Sanden, says the thread is NPT – but admittedly the model numbers are different (GAU-315EQTE on the clearly Australian installation instructions, GAUS-315EQTD on the American spec sheet). It also gives the dimensions, which when turned into SI units are 756mm H x 883mm W x 362mm D for the compressor and 1490mm H x 678mm W diameter for the 315L tank. For further fun, the installation manual includes a photo of an installed system on the first page – the system is installed too close together, according to the instructions.

However, 3/4″ pipes are able to transport a greater volume of water per unit time. If you’re running warm water down them for bathing, rather than hot for subsequent mixing, greater carrying capacity means better water pressure when running multiple showers, for example. If one was replumbing a whole house, and doing so with pre-mixed warm water, replumbing with 3/4″ copper would be a reasonable thing to do.

Be aware that the cold water inlet has a maximum pressure of 650 kpa.

Refactoring the tax code

Our tax system is broken, properly.  It is insanely complex.  It’s a messy mix of transfers (e.g. the old age pension) and taxes (e.g. income tax).  Normally, when code ends up as a huge ball of mud someone steps in and re-writes it, or re-expresses it bit-by-bit (refactoring) until it’s much better – clearer, faster with a smaller footprint.

Before you refactor, you’ve got to figure out what the system is meant to do – what kind of country do we want Australia to be?


Generally I imagine Australians agree they want a progressive taxation system, where poorer taxpayers pay a smaller proportion of their income in tax compared to the richer members of society.  They want one where tax can’t be evaded (the system has high integrity), and the proportion of the economy devoted to the evaluation, collection and remittance of tax is low (it is efficient).  There seems to be an appetite for a system that operates, over the long term, neutrally – no Greek-style runaway spending, nor perpetual budgetary surpluses.  Equally, while Australians like the idea of a small government, they actually want a large one – one that intervenes to take the rough edges off of life, that provides a safety net no matter what misfortune befalls you; but they don’t want their government’s generosity to be exploited by those without need.  I look at as: I don’t want to look at poor people; make it better.


We’ve got unemployment benefits, single parent benefits, old age benefits, disability benefits and more.  But the nub of all of these payments is that a civilised society doesn’t leave anyone in abject poverty, and that problems that aren’t your fault ought to be covered by broader society. So what makes the unemployed less in need of support than a single parent?  Free money reduces the incentive to work, if one can.  How can a government tell if you’re merely free-loading?  Should it care, or should we – as a society – deem that if you don’t want to work, you shouldn’t have to?  What should we be doing when there’s a worldwide depression, and there just isn’t any work to be had?  If there’s no work for you locally, ought to be compelled to move, potentially away from friends and family – it reasonable to say that if your friends and family are so great that you refuse to move, they (instead of the government) can look after you?  If you bought your own home while you were working, ought the government give you have an easier go of it once you retire?  If you retire in the city, ought payments be made to you to compensate for the higher cost of rents than rents in the country?

The recent budget has decided that tertiary students ought to contribute more towards their education (by way of paying for a greater proportion of the cost of their education, and then paying more for the associated debt), and do so more quickly (by way of lowering the repayment threshold to basically the minimum wage).  Which is all good and well, but it seems that all those who got their education at lower rates or even free ought to shell out too – so if you got your education in the late 1970s, you ought to have a retrospective charge levied against you today.  I’m not clear on what use art degrees are to our economy, but if fewer are undertaken, is that so bad?  Don’t we want a well-educated citizenry?  It’s been pointed out that graduates earn more, so they ought to pay their way – but don’t they do that in higher tax brackets? What, if anything, should we do about the perpetual student – gaining education but never applying it to the benefit of society? What of those who build up a substantial education debt and then move to another country to apply said education?


The tax system is a little more complex – there are some taxes (sin taxes) that try to discourage legal but morally undesirable things – drinking, gambling, smoking, greenhouse gas emissions.  Other taxes discourage consumption – taxes on insurance, land transfer, Goods and Services Tax, excise on fuel.  Still more taxes try to level income inequality; our income tax system taxes are proportionally higher on higher incomes. In Australia we don’t have much in the way of asset taxes to level out disparity in asset ownership, but there are the odd example here and there.

If you design a tax system wrong, it discourages desirable behaviour and relatively encourages undesirable behaviour.  These behaviours ought to be enumerated somewhere.  Is saving better than consumption?  Can you have too much of one or the other?  Societal happiness increases with greater income and asset uniformity, but communist societies have shown that reward must follow effort or work becomes demoralising. So how much equality is enough, and how much inequality is too much? Should sin taxes be eliminated by eliminating the associated sin, as New Zealand is doing with tobacco?


I see a lot of our tax expenditures don’t mesh with any reasonable model of how the world ought to be, or commonly held views.

FBT – what the hell? Weddings are funded by the taxpayer? Allow me to refactor FBT for you: Organisations can spend money on whatever they like.  If they want to deduct that expenditure from their taxable income, they need to either: show it was a legitimate business expense, or attribute it to another taxpayer for whom it will be income.  Thousands of pages of legislation replaced with two sentences.

There’s been a lot of rhetoric lately, and from it I’ve learned that apparently debt is bad – especially being indebted to foreigners.  If it’s bad, make interest payments to foreign entities deductible at 98% rather than 100%, and keep lowering the proportion of the international interest bill that Australian taxpayers will subsidise until an acceptable mix of domestic-international debt is reached.

The Howard government decided that we needed more children, and women in the home, so paid for giving birth and underfunded childcare.  Payments were made for birthing and having children, almost regardless of income.  Welfare payments blew out to be by far the largest part of the budget, and importing children (via adoption) just got harder, slower and more expensive. I guess they were the wrong colour or something – bloody protectionists. Anyway, we ought not be growing babies locally, we ought to be importing them.  The demographic issues have been well studied.  Global population is expected to top out after the next couple of billion people, and then start dropping, but as I understand things Australia has no plan to balance its population growth. Is that the kind of country we want, covered in population centres, with cities that smear across hundreds of kilometres?

The biggest expenditure is on the Department of Defence, but I’m unclear what that department is tasked with or why it costs so much.  Apparently its role is to “protect and advance Australia’s strategic interests by providing military forces“, but that could be any armed force in the world.  Is it meant to repel a foreign invasion?  Is it meant to protect our exclusive economic zone?  Is it meant to provide an acceptable contribution to UN interventions?  Is it a coiled spring, ready to train up millions of soldiers in case of emergency?  Why does it need tanks, or fighter aircraft?  The USA is clear what their DoD is for, it’s the employer of last resort and a jobs program for domestic companies that can’t find other purchasers elsewhere. What is our DoD for?

There’s currently a bunch of whining about how Australian median Real Disposable Income has been stagnant for the last decade. The Liberal party is convinced the only way to get it moving is with Trickle-down economics – dropping the corporate tax rate. Labour seems to think if we get rid of enterprise bargaining, roll-back anti-union legislation and raise the minimum wage everything will be sorted. I think it’s globalisation at work – everything will level out, with wages in the developing world rising, and those in the developed world dropping. If you want less of something: tax it; if you want more of something: tax it less. If you want employees to be paid more, make wages deductible at more than 100%, rather than taxing corporate profits less.

So, tax system broken, needs more income (and perhaps dramatically less air superiority fighter jets).


Increasing and broadening the GST would dramatically increase the tax take, but that comes at a cost.  The GST is a regressive tax.  Taxing things like fresh food, health-care and financial payments (interest, insurance) is complex, in that there are a large number of interacting considerations. On the whole, I’m in favouring of taxing everything (broadening that tax) and hiking the rate.  But this is where the complicating considerations come in.

Push up GST and a lot of high-value purchases will go overseas – cameras, phones, breast implant surgery, etc. – because international transactions are not taxed.  This no-tax on international transactions has the effect of pushing multinational companies to bill from foreign countries and avoid GST on their sales (e.g. Google, Apple, et al). So: just tax international financial transactions; credit cards and PayPal to start with, that will catch 99% of low-value transactions, but you’re going to have to keep moving to catch whatever the latest work-around becomes. I can see health insurance funds moving overseas, for example. Or just tax all international transactions, with a simple piece of paperwork to fill in if that wasn’t a payment for goods or services, but was in fact a transfer.

There’s a complaint that if taxes are set too high, the taxpayers will leave.  High income earning English speaking workers are highly mobile, and can move to whatever tax jurisdiction they like, and they can move their money there too.  But if they’re living in Australia, consuming Australian government services, they’ll get taxed here.

Anyway, once you’ve hiked up the GST tax take, you’re going to have to compensate the poor – consumption taxes are regressive (i.e. the proportion of your income gobbled up by them is higher the lower your income is).  This is where negative income taxes come in; everybody (children included) becomes a taxpayer, and gets a cut of the negative income tax goodness.  And thus we’ve closed off this inequity – yes, more GST is paid, but if you don’t have any income the government hands over money that ought to cover the additional GST you’ll be shelling out.


Companies and Trusts are taxed as a different rate to the rest of the population, although I’m not clear as to why that is.  In fact, I’m not clear as to why companies pay tax at all.  Companies and Trusts ought to be legally obligated to hand over their profits to their owners each tax year, and have the owners deal with the tax liability arising from that.  Doing so would remove an enormous world of complexity and opportunity to manipulate the tax system.  Naturally taxpayers without TFNs will have to have tax withheld at the highest marginal rates, for later imputation.  Admittedly, this will lead to an increase in unemployment for accountants and lawyers, but I’m really not upset by that.

Although donations to a registered charitable cause are wholly tax deductible, for some weird reason there’s a company tax exemption on companies owned by charities – why not just donate all of this year’s profits to the owning entity?  In the same breath, government-owned businesses pay tax, but the tax paid by businesses owned by state governments are refunded to those same state governments. No doubt this is some relic from the transfer of taxation power from the States to the Commonwealth, but enough is enough.

Often companies don’t pay out all of their profits as dividends – some of that money is retained to fund growth.  This can continue to happen under my proposed system; the liability for the full profit is transferred to owner, but the amount of cash transferred is up to the directors.

So, by taking companies out of the tax-paying regime an enormous amount of fiddling and pissing around will be removed – creating a simpler, more straight-forward and transparent tax system.


Capital Gains Tax makes a poor attempt at smearing the real (i.e. inflation-adjusted) realised capital gain over period it was made and taxing it as income, but while treasurer Peter Costello introduced concessional taxation and since then Australian housing has become unaffordable for a large section of the population.  The ATO is perfectly capable of applying capital gains over the entire earning history, and ought to do so.  50% CGT concession ought to be removed, as it doesn’t encourage investment but instead speculation.

CGT exemption for housing is a hard problem, but one I think I have a solution for.  Read below.


Houses have proven to be a failing in our taxation system.  Concessional taxation treatment means CGT is not payable on homes.  State governments have become addicted to the revenue of turnover in the property market, which is a volatile income stream.  Stamp duty on property is a substantial impediment to transactions – it costs a lot of money to move home, which means labour will be much less willing to move to follow work. Inflexible labour markets drive up employment/business costs. Instead of stamp duty on property transfers, state governments ought to do as the ACT is doing and move from stamp duty to levying annual property taxes.


Tony Abbott said in 1995, “The basic objective of compulsory superannuation is that the government is taking our money now so that it does not have to pay us a pension when we retire.

“The government is making us worse off now so that it will be better off in the future.”

This is a laudable goal. Choosing to not work merely because you’re old is foreseeable, and the government ought not be expected to insure you, or the broader populous, against foreseeable certitudes.

Super is not a con as Abbott asserted, and the rates need to be increased.  Given that people can generally be expected to earn income for 45 years and be retired for 20, putting away a third of your income for old age wouldn’t be outrageous.

Superannuation is fabulous idea, tucking away income for the future, and is concessionally taxed on the way in, and also while in the super system – enabling growth of superannuation savings.  On the way out – if you wait long enough (60 years of age) – the money is tax-free.  Why tax free?  Isn’t it income?  This is madness, and needs to stop.

Because of the tax-free status, super is seen as a fantastic mechanism for inheritance planning, and that’s outrageous.

It’s time to rework superannuation; make it an income-smoothing scheme:

Make all contributions 100% tax deductible, and split each contribution into two – one part vested until retirement, the equivalent of today’s super system.  Money transferred into super, or earned while in super, will be non-taxable. If you inherit super money, it’s income – but you can shove it straight into your own superannuation account and avoid paying tax on it.  When you pull money out of super, it’s income. Employers won’t pay their employee any more – it will all go to their super fund, who withhold appropriate amounts for tax and old age, and pay the employee whatever they ask for – more or less than they earned, it’s up to them, because it is all smoothed out and tax accounted for. There’s only hundreds or thousands of super funds, so push the tax paperwork onto them rather than the millions of businesses around Australia.

If you want to buy a house, they’re considered superannuation investments and can be bought with your superannuation money. When you sell it the sale proceeds are wholly income – which you can pay tax on or shove back into your super account.

When not working, for example if you’ve retired, you draw down on your super account and pay tax on it like everyone else.

This set-up will demolish the distinction between assets and income. For too long you’ve been able to build up enormous assets and hand them on to subsequent generations without being clipped for a contribution to running the country.


Of course, much of this was considered by the Henry Tax Review,  The Australia’s Future Tax System Review couldn’t consider super or GST, and they’re two areas that need reform too.  But this stuff is simultaneously obvious and too hard for our politicians.

Replacement Hot Water Service

All my electricity is green: my retailer buys RECS sufficient to back my electricity purchases. As such, I don’t care how much electricity I use, except such that it costs me money.

Breakeven analysis is fun.

My house has a twelve year old 160 litre resistive electric hot water service (HWS). General opinion seems to be that a HWS will last perhaps as long as 12 years before failing (my last house had one that was 30 years old and still going strong). It’s currently inside the house (taking up valuable floorspace), and may not survive being moved outside in the coming renovation. I want an instantaneous gas HWS (unlimited hot water at exactly the temperature I dictate), but refuse to use gas.

Instantaneous electric HWS exist and are only about $1000, but require three-phase power (an upgrade costing a surprisingly small $1000, plus electrical work on my side of the divide).  How much power will it consume?  Turns out, the same as resistive heating the water, but it’s all peak electricity.  That pushes its daily cost quite high.  There are other HWS options; reusing the existing tank (free-ish), replacing it with a larger tank (still resistive, $1000), sucking up all the spare electricity from the PV solar system (perhaps $1000), or a heat pump ($3400), and combinations of the above.

I was able to figure out how much electricity we’re using to power our HWS by virtue of it being on a separate meter to the rest of the house – 4.6kWh/day, costing about $0.85/day because it runs off peak. Hot water consumption is expected to increase after the renovations.  It turns out that how much hot water is consumed, and when, is very important for accurately pricing electricity consumption. I’ve a fairly complex spreadsheet modeling current and projected consumption patterns, and the resultant energy requirement timing and costs. We have a PV solar system, which is how I thought I could push our cost of hot water down – heat it from the panels during the day, when electricity is cheap for me ($0.119/kWh).  If your tank is too small (which ours will be/nearly is already) then you’ve got to heat using electricity other than cheap solar electricity.

I calculated the Total Cost of Ownership at the 5 year mark, and the average daily cost of hot water for the various options (note, this is for my projected hot water consumption profile – yours will differ, altering the values):

Option TCO Daily Cost
Keep existing HWS, peak electricity $4,340 $2.27
Keep existing HWS, off peak only, coupled to instantaneous electric HWS $7,411 $2.69
Buy 315L resistive HWS, off peak only $5,497 $2.46
Keep existing resistive HWS, run off PV solar and off-peak $3,764 $1.51
Buy 315L resistive HWS, run off PV solar $4.968 $1.63
Buy 315L heat-pump HWS, run off PV solar $3,888 $0.27

The heat pump can run off solar using its built-in clock, saving $1000 in diverter costs. You can see that its TCO is a little more than a salvage job on the existing HWS run from solar power, but the daily cost means the heat pump is going to pull away at a mad rate. Hot water that cheap is making me think of grand ways to heat my house.