Using Mastodon as a RSS Feed Reader

There are a number of blogs and serials that I really enjoy reading and (where available), I've tended to subscribe to their RSS feeds using Nextcloud News.

What I've noticed though, is that, amongst everything else I do on my phone, the new article notifications do tend to get lost. The result is that I quite often don't notice that a new post has been published unless I happen to see someone else toot it into the fediverse (for example, the prompt for this post is that I very nearly missed out on this great post).

Just under a year ago, I wrote a simple RSS to Mastodon bot to automatically toot links to my own posts.

Given that fediverse notifications are one of the things that I do look at fairly frequently, it occurred to me that it might be an idea to re-use my existing code base to stand up a "private" bot: it could monitor the RSS feeds that I care about most and publish a followers-only toot when something new appears. I'd then also be able to set Mastodon to always notify me when the bot tooted.

In this post, I talk about building a configuration to use my existing bot code to push new posts into my Mastodon notifications so that I (hopefully) never miss another great post.

Read more…

Injecting Audio Sidetone using Pipewire or PulseAudio

My Razer headset has a built in microphone which started to fail recently: people started to note that they couldn't really hear me (a particular highlight being "We're having a hard time understanding you because your voice is so feeble").

Whilst it's possible to replace the headset's mic, they do get knocked a lot and I didn't really want to replace it with something that was just going to fail again, so I decided to get a boom mic instead.

It's not a particularly expensive one, but is a nice bit of kit. The only issue is that I'm never quite sure how I'm coming across on it. Am I too loud, am I too quiet? Am I disturbing the rest of the house?

So, I decided I wanted to enable Mic Monitoring (also known as sidetone or audible feedback): having the microphone's input play in my headphones, so that I can hear and moderate my own voice when I speak.

This post talks about enabling sidetone on a Linux box running Pipewire or PulseAudio (the commands are backwards compatible).

Read more…

Wall mounting and Wifi controlling an Oil Radiator

It's that time of year again: the clocks have changed and the evenings are getting colder and darker.

Each year, when the heating first starts to kick in, I take a little bit of time to review whether there's anything that we can do better this year than last.

For the last few years, our attic room has used a smart-socket controlled portable Oil radiator as an additional heat source (I wrote about setting it up here).

However, I've never been massively comfortable with that radiator: Because the oil radiator is free-standing, it could get knocked over leading to $badness when it next automatically switches on. It could also thoughtlessly be unplugged in order to free up a socket for something else, leaving the room without the benefit it was intended to convey.

To top it off, it's also quite bulky, if it's put anywhere useful, it does tend to feel like it's getting in the way.

So, one of the things that I decided I wanted to do this year was to replace it with a wall-mounted oil radiator.

In this post, I'm going to talk about taking a new floor-standing/portable oil radiator and wall mounting it, before wiring it via a Shelly V1 Smart Relay so that it can be controlled by HomeAssistant just as the existing radiator was.

Read more…

Reviewing our Solar Battery Savings

A couple of weeks ago, I realised I'd made a horrendous reporting mistake which negatively skewed our view of solar battery performance whenever the battery was charged from the grid.

Aside from there being a bit of egg on my face, this also meant that I needed to re-assess various charging approaches, including whether shaving the morning pricing peak is worthwhile.

I've now had a couple of weeks of watching closely whilst double checking the calculations that my reporting system performs each day.

By happenstance, we've also had very few Octopus Power-ups during that period. Obviously, not getting free electricity is disappointing, but removing their impact from amortisation stats does make it a little easier to assess the benefits that the battery is bringing.

In this post, I'll talk a little about what I've been doing, look at the savings our battery has yielded over the last 14 days and look at why some days report lower stats (or go negative).

Read more…

Deploying Grafana into a Kubernetes Cluster

I recently needed to set up a new Grafana instance. Previously I've run Grafana using Docker, but this time, I decided to run it in my K8S cluster instead.

There was no particular reason for choosing to run it in Kubernetes other than that I had the cluster sat there, with spare resources and it avoided needing to make other arrangements.

Grafana have some documentation on deploying into Kubernetes, but it skips over things like provisioning storage and customising configuration (to do things such as enabling SMTP so that alert emails can be sent).

This documentation details how to deploy and configure Grafana in a Kubernetes cluster, with some guidance on how to provision some persistent storage so that changes made in Grafana survive pod restart and replacement.

Read more…

Correcting My Grid Charge Calculations

I've been looking for ways to improve our (somewhat dire) solar battery savings ever since I calculated the daily savings that we were achieving.

One of the approaches that I identified and tried was scheduling grid charging in order to increase the level of use that the battery saw - the idea being that the battery would see use even on cloudy days, with more use generally equating to greater savings.

When I reviewed this change recently, I was quite disappointed to find that it had had quite a mixed effect, with negative savings occurring much more frequently than before. This wasn't entirely unexpected, as an inability to dynamically schedule charging means that we buy power in at the same time each day, regardless of price or consumption expectations.

Today, however, I found that these negative savings were actually the result of a (stupid) reporting bug in the grid-charging calculations and that grid-charges deliver better savings than previously reported.

In this post I talk a little about the bug itself as well as looking at the re-calculated figures.

Read more…

Shaving the Morning Peaks

As part of my quest to drive up the savings that our solar battery is able to generate, I recently adjusted schedules to allow for a small overnight charge.

This was done in order to try and ensure the battery had a charge so that it could shave the morning pricing peak.

It's... uh... not gone particularly well, so as I'd mentioned it previously, I thought I'd follow up with a relatively short post detailing the impact that it had.

Read more…

Improving our Solar Battery Savings

Last month, I analysed the performance of our solar install and found that, whilst our Solar battery was generating daily savings, it would very likely never save enough to offset its purchase cost.

There were a number of factors involved, but one of the bigger ones was the battery wasn't always being sufficiently charged, with our average max daily charge level being 72%. On sunny days, the battery gets a full charge but, British weather being what it is, there are plenty of days dragging that average down.

As I noted at the time, Solar isn't the only source from which the battery can be charged: there's also the option of charging from the grid (ideally when prices are low).

So, in the month since, that's exactly what I've done.

In this post, I'm going to describe how I've configured things, analyse the impact of the change and also talk about some changes that my electricity supplier (Octopus) has recently made.

Read more…

Collecting data from a Bip 3 Smartwatch with Gadgetbridge, Nextcloud and InfluxDB

A few weeks ago, I wrote about how I was fetching health data from Zepp's API in order write data collected by my Amazfit Bip3 Pro Smartwatch into InfluxDB.

It hadn't originally been my intention to interact with Zepp's API, my first choice had been to pair the watch with Gadgetbridge. This would have allowed me to almost entirely avoid using the manufacturer's app. Unfortunately, I found that the Bip3 wasn't supported by Gadgetbridge and so I had to abandon that approach in favour of identifying and polling the various API endpoints called by Zepp's app.

By sheer coincidence, though, a day after I published my post, someone else ran into the same lack of support and found time to raise issue #3249 in Gadgetbridge's tracker. Within a couple of weeks, support for the Bip3 had been added.

About a week ago, people started contacting me to tell me that Gadgetbridge were in the process of adding support for the Bip, so I installed the latest nightly build and started testing.

Thanks to the work and patience of the Gadgetbridge contributors, the data that my Bip3 collects is now available to me without first needing to be sent to Zepp's servers.

In this post, I'll talk about how my new workflow automatically takes data from the Gadgetbridge database and writes it into InfluxDB for visualisation in Grafana.

Read more…

Looking at the Instagram Account Review Process

Less than a week ago, I set up a system to automatically announce new blog posts on Threads, however, it is no longer active.

Despite my account having only posted about 4 times (with only one of those being an automatic post by the script above), it got suspended because they felt it wasn't in line with their "Account integrity and authentic identity" rule.

In particular:

We don't allow people on Instagram to create fake accounts.

Initially, I assumed that this was caused by my publishing bot periodically logging in, but a search on the net suggested that others have had similar experiences. Update: they've since issued a cease-and-desist to the library I was using.

When an account is suspended, the user is given the option to appeal. However, my appeal was rejected and the account is now set to be permanently deleted:

Screen shot of page telling me my account is disabled and will be deleted. It notes that I cannot request another review

I'm not overly concerned about the loss of my Threads account: in the brief time that I had access, the platform didn't really engage me (and it seems that the same is true for others too), not least because I struggled to find accounts that I actually wanted to follow amongst the noise (in the fediverse, I tend to follow certain hashtags - something that Threads doesn't support at all).

Having now been through the Threads appeal process, I wanted to write down some of my observations about the detection and appeal process that Instagram/Threads follow, because (IMO) it's overly invasive and potentially quite deeply flawed.

Read more…