Stuff I’ve Liked

Turns out I’ve had a bit of a problem with writing blog posts the last few years. Every time I look at my drafts folder in WordPress, this sense of overwhelm takes over – nothing is quite good enough to compare against some of the great ‘content’ I consume every day. So, I write nothing.

So I thought, fuck it, and instead here’s a list of some of that content I’ve enjoyed over the last month or two…

  • This video from the YouTube channel Climate Town about free shipping and free returns was an eye-opener. I really didn’t realise how big of a problem free returns are. It’s wild that we’re just throwing so much stuff away.
  • Nick Feik’s article on Why Albanese is in Trouble. It perfectly summarises how I feel about the Labor party in the world today: good, but not good enough.
  • My friend Tom has written a thought-provoking article on generative AI in the open source world. I really need to publicly share my own thoughts on AI some time. I’ve written an internal policy for use at Loop Foundry that might be useful for others so I should get around to that.
  • If you’re a fan of computer science, and you’re not already watching Dr Matt Regan’s Youtube channel, you need to subscribe yesterday.
  • Likewise if you’re a fan of retro PC and server hardware and haven’t already subscribed to Clabretro. They both deserve far more subscribers than they have.
  • Another friend Robin Riley has written a list of the sources they get news from, which I think is an excellent thing to share. I should share the same, but my list is nowhere near as comprehensive (it’s basically ABC News Australia, The Economist, and The Guardian). Still, an updated list of my RSS feed subscriptions could be interesting (I did write one 15 years ago, but it’s hopelessly out of date).
  • Lastly, Alan Kohler’s article on how Donald Trump has impacted the Australian federal election was a fantastic read.

The featured image at the top of the post is from a recent flight. I think the lights below are Midway Point and Sorell in Tasmania.

Hopefully I can do this more often!

My Vote in the Australian Federal Election 2025

I’m not one that usually shares my political views that openly. Generally, those close to me already know how I feel about things, and I don’t want to impose my views on others who probably don’t care. Those who are observant can probably pick it out from my Mastodon (and earlier, Twitter) reposts.

However, I feel a bit differently about the state of the world this year. And I’ve also reasoned with myself that I’m not going to tell anybody how to vote. But I will tell you who I’m going to vote for, why I’m going to vote for them, and why I’m telling you who I’m voting for.

I’m going to tackle that last point first. I’m well aware that as a mid-thirties straight white male living in the “global north” (a term I loathe with the power of a thousand suns, as a resident of Hobart and the Huon Valley the only place I’m north of is Antarctica) I have a lot of privilege in being able to share my views without placing myself in any danger. And I’d like to perhaps speak for others who aren’t quite so able to speak for themselves.

Secondly, who I’m going to vote for. It’s important to note that in Australia we have preferential voting, so you can put minor parties or candidates first, and go down the list in decreasing order of how much you want them to represent you until finally you end up at the party who you least want to represent you.

I said “want to represent” there, not “will be the best for me”. That’s critical. I’m already (relatively) well off. There are more important issues than my personal well being, and I believe that what’s good for society and the environment will be best for me in the end.

In my electorate of Franklin, there are five candidates (as I write this, anyway) and my ranking of them is as follows:

  1. Peter George, Independent
  2. Owen Fitzgerald, Greens
  3. Julie Collins, ALP
  4. Brendan Blomely, Independent
  5. Josh Garvin, Liberal
  6. Stefan Popescu, Pauline Hanson’s One Nation

“Five” candidates and yet the list has six? A demonstration of why, despite absolutely loving the Greens as a concept, they completely fail as a modern political party. This is basic stuff. Like white girl ordering pumpkin spice lattes kind of basic.

My first preference will be for Peter George. He’s running primarily on an anti-salmon farming platform, but has a complete policy platform that I quite like. And my take on the salmon farming issue? If you can’t run an industry for 100 or more years in the way that it’s currently being run, it’s an unsustainable industry. And we shouldn’t be taking from our children’s future just to make profits now. This is also why I’m opposed to generative AI / large language models (ChatGPT, Deepseek, etc) and cryptocurrency. Is there a way of running all of these industries in sustainable ways? Yes (although in the case of crypto I’m less sure). Are we doing so? No. So something needs to change.

My second preference will go to Julie Collins. Whilst I’d like the ALP to win the election, I believe that Julie Collins has been safe in her seat for far too long and is not representing or delivering results for the people of Franklin. She needs a scare, and I really hope that Peter George delivers her a scare (at the very least). I want to make her to work again.

My third preference will go to the Greens, but for what purpose I don’t know. But if I rank them below the others I couldn’t forgive myself.

After that it gets depressing. The Liberal party is probably more preferable to me than either One Nation or Brendan Blomely, but that’s hardly saying much. I have a lot of queer friends that I care about a lot, and any candidate that wants to make their lives harder is not a candidate for me. Then there’s the issue of migration. A lot of people are opposed to migration either because it’s “bad for the culture” or “increasing property prices”. On property prices, just change the law so only citizens and permanent residents (or companies majority owned by citizens and permanent residents) can own property, like most other countries do. Sorted. And on culture? The culture of Australia is by definition a multi-cultural one. My family are migrants, and just because I’m white doesn’t mean I should ignore that fact. Every single person in Australia either came from somewhere else or has ancestors who did. Every. Single. Person. Even the Aboriginal people.

That was a bit of a ramble.

I’ll be voting in the senate in a similar way to the house of representatives. Now that Eric Abetz is a member of the Tasmanian parliament rather than a senate candidate, I no longer feel compelled to vote below the line just to put him dead last, so I’ll be saving some time by voting above the line for the party groups.

Finally, I hope you can all join me watching the ABC election coverage on election night, for no other reason than that it is Antony Green’s last election. What a legendary man.

Photo of Antony Green from Wikipedia.

Integrating a Selectronic Solar Inverter with Home Assistant

As we all know, solar systems are all the rage these days (and for good reason, we’ve got to fix the climate somehow). We got a Selectronic-branded inverter and battery system installed at my family’s property a few years ago, and whilst the web portal provided by the manufacturer is fine, I’ve always wanted to integrate it with Home Assistant. Integration would allow me to use the Home Assistant Energy dashboard to view history, as well as automate a few things (primarily the hot water system and heat pump) based on battery levels.

My first attempt at this integration involved scraping the web portal using a .NET application and publishing the data via MQTT to the Mosquito broker inside Home Assistant. Whilst this was excellent experience in writing web scrapers and using MQTT, it turns out there is a much better way!

Home Assistant has in-built functionality to poll REST endpoints and parse the JSON it finds. And it also turns out Selectronic inverters have REST endpoints in their local controllers.

A screenshot of the 'RESTful' integration within Home Assistant.

Thanks to this post on the Home Assistant forums, I was able to put together some configuration to read my local controller and present the data as a bunch of sensors:

sensor:
  - platform: rest
    name: "selectronic"
    json_attributes_path: "$.items"
    json_attributes:
      - 'battery_in_wh_today'
      - 'battery_in_wh_total'   #
      - 'battery_out_wh_today'
      - 'battery_out_wh_total'  #
      - 'battery_soc'           #
      - 'battery_w'             #
      - 'fault_code'
      - 'fault_ts'
      - 'gen_status'
      - 'grid_in_wh_today'
      - 'grid_in_wh_total'      #
      - 'grid_out_wh_today'
      - 'grid_out_wh_total'     #
      - 'grid_w'                #
      - 'load_w'
      - 'load_wh_today'
      - 'load_wh_total'         #
      - 'shunt_w'
      - 'solar_wh_today'
      - 'solar_wh_total'        #
      - 'solarinverter_w'
      - 'timestamp'
    resource: "http://192.168.1.105/cgi-bin/solarmonweb/devices/BB9FDF8BB64FE24C7CD183FC75E64423/point"
    value_template: '{{ value_json.device.name }}'
    force_update: true
    
template:
  sensor:
    # Data from selectronic for long term statistics
    - name: "Selectronic - Battery State of Charge"
      device_class: battery
      state_class: measurement
      state: "{{(state_attr('sensor.selectronic', 'battery_soc')|float) | round(3)}}"
      unit_of_measurement: "%"
      unique_id: sensor.selectronic.battery_soc
      
    - name: "Selectronic - Battery Watts"
      device_class: power
      state_class: measurement
      state: "{{(state_attr('sensor.selectronic', 'battery_w')|float) | round(3)}}"
      unit_of_measurement: "w"
      unique_id: sensor.selectronic.battery_w
      
    - name: "Selectronic - Grid Watts"
      device_class: power
      state_class: measurement
      state: "{{(state_attr('sensor.selectronic', 'grid_w')|float) | round(3)}}"
      unit_of_measurement: "w"
      unique_id: sensor.selectronic.grid_w
      
    - name: "Selectronic - Load Watts"
      device_class: power
      state_class: measurement
      state: "{{(state_attr('sensor.selectronic', 'load_w')|float) | round(3)}}"
      unit_of_measurement: "w"
      unique_id: sensor.selectronic.load_w
      
    - name: "Selectronic - Solar Watts"
      device_class: power
      state_class: measurement
      state: "{{(state_attr('sensor.selectronic', 'solarinverter_w')|float) | round(3)}}"
      unit_of_measurement: "w"
      unique_id: sensor.selectronic.solarinverter_w
      
    - name: "Selectronic - Battery Out Total"
      device_class: energy
      state_class: total
      state: "{{(state_attr('sensor.selectronic', 'battery_out_wh_total')|float) | round(3)}}"
      unit_of_measurement: "kWh"
      unique_id: sensor.selectronic.battery_out_wh_total
        
    - name: "Selectronic - Battery In Total"
      device_class: energy
      state_class: total
      state: "{{(state_attr('sensor.selectronic', 'battery_in_wh_total')|float) | round(3)}}"
      unit_of_measurement: "kWh"
      unique_id: sensor.selectronic.battery_in_wh_total
        
    - name: "Selectronic - Load Usage Total"
      device_class: energy
      state_class: total
      state: "{{(state_attr('sensor.selectronic', 'load_wh_total')|float) | round(3)}}"
      unit_of_measurement: "kWh"
      unique_id: sensor.selectronic.load_wh_total
        
    - name: "Selectronic - Solar Production"
      device_class: energy
      state_class: total
      state: "{{(state_attr('sensor.selectronic', 'solar_wh_total')|float) | round(3)}}"
      unit_of_measurement: "kWh"
      unique_id: sensor.selectronic.solar_wh_total
      
    - name: "Selectronic - Grid In Total"
      device_class: energy
      state_class: total
      state: "{{(state_attr('sensor.selectronic', 'grid_in_wh_total')|float) | round(3)}}"
      unit_of_measurement: "kWh"
      unique_id: sensor.selectronic.grid_in_wh_total
      
    - name: "Selectronic - Grid Out Total"
      device_class: energy
      state_class: total
      state: "{{(state_attr('sensor.selectronic', 'grid_out_wh_total')|float) | round(3)}}"
      unit_of_measurement: "kWh"
      unique_id: sensor.selectronic.grid_out_wh_total

If you choose to use this configuration yourself, the only change that should be required is the URL endpoint. Change the IP address to that of your controller on your network, and the device ID will also need to be changed. You can find the correct device ID by viewing IPADDRESS/cgi-bin/solarmonweb/devices/ in your browser.

And voila, solar generation and power usage statistics!

The Aproneer

So my friend Sam recently started a new recipe blog, and I felt compelled to share it with you. It’s called ‘The Aproneer‘ (very unsurprisingly given the title of the blog post).

A few of the recipes I’ve tried and liked so far:

And yes, I realize this is a shameless plug. But the recipes are genuinely tasty, and well-written to boot. I recommend a follow (via RSS or social media)!

My New Workstation Build

In the past couple of weeks, I’ve built and tested my new workstation PC. My previous workstation was a Dell Precision T5600 (built circa 2012) with a 6-core Xeon, 24GB of RAM, AMD V5900 GPU, and 120GB SSD. The performance was still fine despite it being nearly a decade old, but it had two issues: It was looooooouuuud, and very power-hungry (200w at idle). So, it was time to be replaced.

Many moons ago I used to work in a computer store, so I’m used to building my own machines. Why didn’t I last time? Because I needed something in a hurry, and somebody had their old workstation for sale on Gumtree, and it seemed like a good deal (and for the most part, it was).

My requirements for the new build were as follows:

  • Silence at idle is a must. The fans can be audible, but not annoying, under load.
  • 16GB of RAM at least, with the capability of holding at least 32GB in the future.
  • On that note, it should be somewhat future-proof. I should be able to upgrade the motherboard, case, and storage independently of each other (something I couldn’t do with the Dell).
  • It has to look good sitting on my desk (completely subjective, I know).
  • At least 8 threads for compiling software with, but the option of replacing the CPU in the future.
  • Support for three 1920×1080 DisplayPort monitors.

And the parts I have chosen to make all this happen?

  • Case: Fractal Design Era ITX
  • PSU: Corsair SF450
  • Motherboard: ASUS ROG Strix B460-I
  • CPU: Intel Core i3 10100
  • RAM: G.Skill Ripjaws V 16GB (1x16GB) 3200MHz
  • SSD: Western Digital Black SN750 500GB

All up, the cost of the parts was around $1000 AUD.

One thing I found quite annoying picking the parts for this machine was that the vast majority of available performance parts were gaming-oriented. RGB lights plastered on everything and designed to look like something that has fallen off an army truck (which ironically does everything they can to avoid having RGB lights). In addition, most of the reviews online, both written and YouTube videos, were written from the stance of a gamer.

Take for example the Fractal Design Era case. Gamers hate this case as it has terrible cooling for the GPU. It’s a legitimate issue sure, but one only faced by gamers. If you don’t have a discrete graphics card in the system, then you don’t have this issue and the case is thermally fine. But the positive trade-off from that thermal design in the GPU area is that it’s an ITX case that looks like it belongs in a modern art museum. Look at it. It’s beautiful!

My other part choices are pretty standard. An i3 is more than enough (it’s got as much power as my old Xeon), 16GB of RAM is plenty (8GB would have been fine if not for Microsoft Teams), and 500GB of SSD boot drive (plus a re-used 4TB drive for storage) is fantastic and surprisingly cheap.

Did I meet my requirements? Yes. It’s silent. It only consumes around 25w at idle and around 150w under full load. I consider that a huge win. The new machine would pay for itself in 3 years with power savings alone. All the fans are zero-RPM enabled and will turn off under idle conditions.

It’s also future-proof. I’ve learned the hard way in my last two computer purchases (the Precision workstation mentioned above, and a Dell XPS 9350 laptop) that a lot of damage comes from tightly integrated components. If one thing breaks or is no longer up to the task, the whole thing has to go. The reason I bought the Precision was that the XPS only had 8GB of RAM, and I needed more so I could run SQL Server and Microsoft Teams at the same time (madness, I know). To mitigate the environmental impact, I bought the Precision second-hand, which raises a different set of issues. Now I had a powerful computer, but I also had a loud, power-hungry, and (yet again) non-modifiable system. This is one tiny peek into the world of throw-it-away consumable technology products.

In my mind, the best way to minimise the environmental damage of our computer use is to make sure everything we buy follows the established standards. They last the longest and can be re-used by interchanging with other things. Take for example the ATX standard. You could buy an ATX case from 1998 and build a modern system in it. In fact, people do that. It has changed that little.

My goal is to have this case and power supply for the next 10 years, and this motherboard for the next 5. I can see a CPU, RAM, and SSD upgrade in the future, but the core platform should last a good long while.