Making the Eyes of an Image Follow The Mouse

Following a discussion on Fedi, I ended up looking up some javascript that I previously wrote to have webpage objects "follow" the mouse - the idea being to repurpose it so that the eyes in an image could look at wherever the mouse pointer is (or, on mobile, where the user last tapped).

That code turned out to be something of a hurriedly written car-crash, so I decided to ignore it.

This post talks through the process of having the eyes of an image look at the mouse's cursor (as well as some other ways that we can have images react to mouse position).

Read more…

Saab 93: Alternator Replacement (1.9 TTiD)

I recently noticed that my Saab was making a whining sound when running.

Pressing the clutch down and freewheeling led to the noise dropping, showing that it was matched to engine and not road speed.

On a Saab 9-3 TTiD that generally means looking at the aux belt tensioner, the alternator or (gulp) the air-con pump. Using a mechanics stethoscope didn't really help to narrow it down.

Tensioners are cheap and (relatively) easy to replace, so I'd originally planned to start there. Once it and a new belt arrived I put them in the boot ahead of being able to make the change.

However, I never got chance - driving back one night, the instrument panel threw a warning

Battery not charging. Make a safe stop.

Alternator it is then.

This post describes the process of replacing an alternator on a 2010 Saab 93 1.9 TTiD (with a Z19DTR engine). It should apply to model years before, as well as the Z19DTH engine and equivalent Vectras.

Warning: it's not a fun process.

Read more…

Using OPNsense with a 1Gbps FTTP Connection and PPPoE

Openreach finally started offering fiber to the premises (FTTP) connections in my area, so I placed an order with Andrews & Arnold and started the arduous task of waiting days for the install.

Last Tuesday, an engineer arrived, drilled a hole in the house, poked some fiber through and installed an ONT on the wall to terminate it.

As a quick test, I plugged in the supplied router (a Technicolor DGA0122) and ran a speed-test from my phone - things looked good, so the engineer packed up and left.

Unfortunately, my day went downhill from there.

This post talks about the process of getting OPNsense up, running and able to use a 1Gbps link with PPPoE.

Read more…

Building a Scheduled Toots System

I'm far from the first to do this, but over the weekend I built a system to allow me to schedule the sending of Toots on Mastodon.

The underlying aim is quite simple: rather than starting the day by spamming the fediverse with my thoughts, I can spread them throughout the day.

In theory, this will allow me to interact with and "meet" a broader range of people: Because Mastodon's timeline is chronological, I find that I sometimes miss when people are online. Some of the best fedi conversations I've had have started with people replying to toots, so I'd quite like to broaden my exposure to that.

There are pre-made solutions available (for example, Tusky, supports scheduled send) but building something myself satisfied a couple of additional needs.

Firstly, I wanted a cross-device solution - something that let me schedule toots in the same way whether I'm using my phone or at a workstation.

Secondly, I was in need of an easy win. For various reasons, the past couple of months have been quite challenging so I really wanted something that I could "just do". Low hanging fruit FTW!

This post talks about my solution as well as an issue that I ran into pursuing the cross-device aspirations.

Read more…

Counting Home Assistant Automation Triggers For My Fingerbot

About six months ago, I attached a fingerbot to our dishwasher so that I could use Home Assistant to help control when it starts, enabling me to target periods of cheaper electricity overnight.

However, the bot's battery has gone flat already.

I was a little surprised by this, because most Zigbee devices are quite battery friendly. The bot uses a CR2 battery which is a fairly sizeable cell (although, admittedly, it was the battery that came with the bot - IoT suppliers aren't exactly known for bundling high end supplies).

I was curious to see how many times the bot had actually been triggered, but it turns out that HomeAssistant doesn't maintain a counter.

On the Home Assistant forums, there's a solution which maintains a persistent incrementing counter in MQTT. However, although I already have Mosquitto running, it's only currently carrying ephemeral data and I didn't want to have to think about implementing backups etc.

I already have Home Assistant hooked up to InfluxDB so decided that, rather than creating a new dependency on MQTT, it would be better to use the information that was already available.

Read more…

Matt Mullenweg's Crusade Undermines Open Source

Over the last few weeks, the web has watched in horror as Matt Mullenweg has "gone nuclear" after starting his own personal crusade against WP Engine.

At this point, it doesn't really matter whether Matt had a valid point or not, because in the process he's executed a supply chain attack, thrown WordPress users under a bus and then proceeded to lock core contributors out.

This week, he unilaterally seized ownership of a popular plugin in a fairly transparent attempt to deprive WP Engine of revenue.

Mullenweg has a concerning tolerance for collateral damage (read: he's perfectly happy for innocent bystanders to suffer consequences). Even that fecklessness, though, doesn't really explain the abject levels of pettiness that he's been stooping to.

Unfortunately, whilst this is all playing out within the realm of WordPress, Matt's actions threaten to affect a wider range of people as a result of damaging trust in a number of opensource norms.

I hadn't actually intended to write anything about Wordpress vs WP Engine, but it's grown to the point that it now seems almost impossible that I won't want to refer back to it at some point in future.

Read more…

Trying Out A Far Infrared Heated Poster

Back in March, I wrote a little about the heater in our living room and how I'd probably replace it before the next winter.

Inevitably, though, I got distracted doing other things and so only recently got around to properly thinking about it.

A bit of online browsing led me to far infrared heaters, with an inevitable sojourn into those made with Graphene. For those who aren't familiar, Graphene is a certified wonder material which could one day change the world if the horrendous cost of manufacturing it can somehow be addressed (fusion's just a decade away etc etc).

Far Infrared heaters come in various shapes and sizes, but do tend to be a large panel which may or may not fit in with the "feel" of the room. However, such heaters can usually be painted - with the result that some suppliers sell pre-made infra-red wall art (a picture that heats you, neat).

I decided that an Infrared heater might be quite well suited to our needs. However, I didn't want to start by spending out on a large panel (and also had some unhappy noises directed my way about "big ugly panels"). So I decided to start with a hanging heater not unlike the one linked to above.

This post talks about how we've got on with using it as a secondary source of heat in our living room.

Read more…

Using JSONFeed Support To Drive An On This Day Module

I've been a bit un-anchored this weekend: although it's felt like I should do something, I've not really known what to do with myself.

After a bit of aimless wandering online, I decided to build an "On this day" module for my site: something which automatically displays and links to old posts published on the same day of the year (which, at time of writing, is 6 Oct).

It came as much from idle curiosity as anything. Whilst I'm not the most prolific blogger out there, there are nearly 20 years of posts, so surely any given day should have a reasonable chance of matching at least one older post.

This post talks about building a small module which consumes a generic JSONFeed format listing.

Read more…

Creating Recurring Gitlab Issues

I've long used project management software to track and manage tasks and chores at home. Although this has not always been a popular choice, I spend a chunk of my working day staring at issue trackers, so it's never really made sense to track things any differently at home.

I was using JIRA when this habit first formed, but I migrated to Gitlab after Atlassian decided to effectively end their on-prem offering (at the time, they priced themselves out of the market, ahead of dropping Server completely).

Although I'm generally happy with Gitlab, one feature that it lacks is the ability to create recurring issues in order to track tasks which need repeating periodically (for example, updating the base image used when building new container images).

Home has it's own set of examples, with "check water softener salt" being a good use-case: it's a task that generally only needs doing every now and then and so can easily be forgotten. Or, of course, there's also the annual oiling of the hinges.

I had been relying on calendar entries to track recurring needs, but it was a little jarring to have to track those in a different application.

A few weeks ago, I got around to addressing this by building a small container image which can parse a configuration file and raise tickets in Gitlab. This post details how to use that solution, in case others find it useful before Gitlab too thoroughly ruin their product (and the planet) with AI (snark, moi?).

Read more…

I'm a Pylontech Recommended Technician... Wait, Wut?

Monday started most unexpectedly... with an out-and-out GDPR breach landing in my inbox.

To set some context: About 4 hours drive away, there's a premises which has six Pylontech US5000 batteries. One of those batteries is faulty, so the solar installer contacted Pylontech to request that a replacement unit be sent out, providing details of the troubleshooting that they'd undertaken to prove that the battery was faulty.

Pylontech asked the installer to make a debugging cable and then revisit site to export logs from the battery. The installer objected to this on the basis that the site's quite distant and that another visit would then be required in order to repair or replace the battery.

At this point, you might be wondering how it is that I know so much about a random solar install that's located hundreds of miles away.

I know this because Pylontech responded to the installer's question by CCing me in an email claiming that I'm a part of their local maintenance service

Screenshot of email in which Pylontech claim that I'm part of their UK local maintenance service

For those who don't know me: I'm an engineering manager at a database company, I am not (and have never been) a battery technician. Yet, here was Pylontech passing my contact details onto a random solar installer.

Pylontech included the full mail thread, which also contained the solar customer's name and address, so it wasn't just my details that were being bandied about.

Read more…