Allowing IP ranges for a reverse proxy

A screenshot of an access list in nginx Proxy Manager

I run a few services on my Raspberry Pi, such as Mealie and Calibre-Web, which I want to be able to access when I’m away from home. I therefore use Nginx Proxy Manager to act as a reverse proxy, to make them available outside of my home network. However, in doing so, I’m also exposing them to the whole world wide web, including potential bad actors. So, as a security measure, I’m using an access list in Nginx Proxy Manager to restrict access to certain IP ranges.

The screenshot above shows what I’ve set up. Essentially, I’ve put in the IP ranges that I am likely to use on an ‘allow list’, and then all other IP ranges are blocked. These IP ranges include:

  • My current ISP
  • My mobile provider
  • My workplace
  • 192.168.x.x for local connections

Any other IP address will just receive a 403 error from Nginx when they try to connect, and the requests won’t be forwarded on to the underlying app (e.g. Mealie). In other words, Nginx acts like a web application firewall. This builds on Nginx Proxy Manager’s ‘block common exploits’ feature to protect the web services you have running on your system. It’s also much safer that simply opening a port on your router directly to the underlying app.

By using IP ranges, it means that I don’t have to manually specify lots of individual IP addresses, should the one I use change.

CIDR notation

You may have noticed the /16 on the end of each IP address. This is ‘Classless Inter-Domain Routing‘ notation, or CIDR, which is apparently pronounced ‘cider’. Take for example 192.168.x.x/24 – this means that I’m allowing anything from 192.168.0.0 to 192.168.255.255.

If I wanted to, I could narrow this down to 192.168.0.x by using 192.168.0.0/24. Using ‘/24’ rather than ‘/16’ specifies a narrower range of IP addresses. Getting my head around CIDR notation was probably the hardest part of this; I ended up asking ChatGPT to explain it to me as I couldn’t find an actual web site that explained it in simple enough terms. Annoyingly, we didn’t cover this sort of thing in my Computer Science degree.

How to set up an Access List in NPM

In Nginx Proxy Manager, go to the ‘Access Lists’ tab at the top, and click ‘Add Access List’. You’ll then be asked to give it a name – I’ve just called mine ‘Standard list’ but you do you. On the next tab, you can optionally set a username and password; this will mean users will have to authenticate using HTTP Basic access authentication in addition to any required login for your chosen web service.

The ‘Access’ tab is where you specify the IP addresses or ranges. As per the screenshot above, you need to list the IP addresses that you want to allow first, and then have the last line as ‘deny’ and ‘all’ to block all other IP address. Once you’re done adding, save the list.

Go back to your Proxy Hosts page, and edit each one in turn (if you have set up more than one proxy host). On the first tab, at the bottom, you should now be able to select your newly created access list. You can apply the same access list to multiple proxy hosts, if you want to apply the same restrictions to all of them.

Hopefully now, with huge swathes of the Internet blocked by nginx, I’ll be less at risk should someone find an exploitable vulnerability in Mealie or Calibre-web.

Moving my email to Fastmail

Screenshot of the Fastmail interface

I’m now using Fastmail (referral link) for my email. My email address remains the same, but all email sent to it will go to Fastmail’s servers.

Fastmail isn’t a new company; as per Wikipedia, it’s been around since 1999. That makes it older than Gmail, which was founded in April 2004.

Moving away from Gmail

I’ve had a Gmail account since June 2004, back when it was invite-only, and, for the past ten years, I’ve been re-routing all my email through Gmail. Having all my email in one place makes things easier, and Gmail’s spam and management tools are better than the standard ones that you get from a generic IMAP server.

So what’s changed? Well, some time in the very near future, Gmail will no longer pull email from other accounts. Until now, email sent to any email address on this domain would be periodically picked up by Gmail using POP3, and would then appear alongside any messages sent directly to my Gmail address. There was a short lag time, which was annoying, but it made things easier overall. That POP3 email pickup is what is going away.

The Gmail apps for mobile devices will still support connections third-party email accounts using IMAP, instead of POP3, but the emails would remain on the original email server. This isn’t really what I want, as I’d then have to use my email server’s storage space and spam tools. Plus, those emails wouldn’t show in Gmail’s web interface.

Switching to Fastmail

A couple of weeks ago, Anil Dash kindly shared a referral link for Fastmail as an alternative. The key factors that I like about Fastmail are:

  • You can use your own domain relatively easily
  • You can easily import all your old emails from other major platforms

So, once I’d signed up, I amended the DNS records for this domain to point to Fastmail’s servers, and then imported 22 years of emails from Gmail. It also brings across your contacts, and has a Calendar which can maintain bi-directional synchronisation with Google Calendar. The import took just a few minutes overall, and although it did mean I had over 12,000 unread messages, it was easy to bulk-mark these as read.

Using Fastmail

Fastmail’s web app works well – it’s fast, clean, and offers a three-pane mode as pictured in the screenshot. Since I use Outlook for work, this feels the most comfortable for me. There are official apps for mobile devices, and there are setup guides for most common desktop and mobile email apps, if you want to use IMAP. There’s a lot of configuration options, including customisable gestures on the mobile apps.

You can also continue to have email from other accounts, like Gmail and Outlook.com, forwarded to Fastmail, and be able to send messages using these other addresses.

Something that is important to note is that Fastmail does not offer a free tier. If you sign up, you can get 30 days for free – and Fastmail won’t demand any card details upfront if you do. After that, an individual plan is normally £4.50 per month, or £54 if you pay for a year upfront. If you use my referral link, then you can get 10% off in your first year.

Moving away from American Big Tech

Fastmail isn’t an American company – it’s headquartered in Australia. That being said, many of its servers are still US-based. Recent events in the USA have meant that I have been reconsidering how much I rely on American companies – especially those that provide services to the US government. Moving my email away from Gmail is one way that I can take back control of my personal data.

Another option to consider is ProtonMail, which is based in Switzerland. ProtonMail offers a free tier, and you can also bring your existing domain over. Its cheapest paid plan is cheaper than Fastmail, at £3.19 per month, but only offers 15 GB of storage instead of Fastmail’s 50 GB. ProtonMail has a greater focus on privacy and encryption, but I’ve seen others comment that it’s not as easy to use.

Yet another feature killed by Google

13 years ago, Google killed off Google Reader, and over the years around 300 products and services have been killed off by Google. I shouldn’t be surprised that yet another feature has gone. There’s a summary post from jwz.org about other options, but this is what I’ve gone with.

Whilst I doubt Google would ever kill off Gmail as a whole, having my own domain means I can port my email to a new provider without changing my email address. Especially as I’ve had my primary email address for 23 years now. In the UK at least, we can port our mobile phone numbers between operators; having your own domain means you get the same flexibility for email too.

Just the Browser

Screenshot of the Just the Browser web site

Do you sometimes feel like AI features are now just foisted upon us, whether we want them or not? It feels like almost every app now has some kind of AI feature added – even Notepad on Windows 11 isn’t immune, with Microsoft adding its Copilot to it.

Most web browsers have some AI features now. Edge, being a Microsoft product, includes a quite number of AI features, as does Google Chrome. Even Mozilla Firefox isn’t immune, and there has been some pushback against this. Some people have been choosing alternatives such as Waterfox – a Firefox fork with these features removed. That being said, Firefox will have an AI ‘kill switch’ in future versions.

The good news is that most of these features can be disabled in these core browsers, and this is where Just the Browser comes in. You can download a script that will automatically disable these features in Edge, Chrome and Firefox for you. It works on Windows, Mac OS and Linux, and it’s open source. If the script doesn’t work, there are other options available for each individual browser. It’s also worth noting that, at least under Windows, your user account needs to be a system administrator to run these scripts.

If you’re curious, you can see which exact features are disabled by Just the Browser in each browser. The list is longest for Edge, and shortest for Firefox, which does at least attempt to care for its users’ privacy. It isn’t just AI features that get disabled; it includes any kind of sponsored content or telemetry. But it means that you can carry on using your preferred browser and not need to switch.

How to: multiply two entities in Home Assistant

A screenshot of a YAML Template Sensor in Home Assistant that multiplies the values of two other sensors.

Suppose you have two entities in Home Assistant, and you want to multiply them together to produce a third entity that always shows the product of these two entities. Here’s how I went about it.

One of Home Assistant’s built-in integrations is Template. These Template entities derive their status from other entities in Home Assistant, and appear in the Home Assistant web interface as Helpers. You can do some fancy things with these, but all I want to do is multiply the value of one by the other.

Calculating export income

In my case, I wanted an entity that shows how much I’m earning from exporting excess energy generated by my solar panels, once our home battery is full. The amount exported is available as an entity in the SolaX Modbus integration that I use, expressed as a value in kWh. I also use the Octopus Energy integration with Home Assistant, and this has an entity showing my current export rate in £ per kWh. So, multiplying these together will show how much I should be making when I export.

This should be possible to set up as a Helper in the Home Assistant interface, but I personally found it easier to do so in YAML. Also, this is where I was able to ask ChatGPT to help write the YAML code. After tweaking its output to fit my needs, here’s what I’m using:

template:
  - sensor:
      - name: "Export income"
        unit_of_measurement: "£"
        state: >
          {{
           (
            states('sensor.solax_today_s_export_energy') | float(0) *
            states('sensor.octopus_energy_electricity_[mymeter]_export_current_rate') | float(0)
            ) | round(2)
          }}

The name is a human-readable name that I have given to the entity. The unit of measurement is optional – Home Assistant will accept just about anything you type in here, but as the amount will be currency I’ve put in the £ sign.

The ‘state’ bit is where I needed help from ChatPGT, as this isn’t really standard YAML here. We specify the first entity, and add '| float(0)'. The ‘float’ is necessary to provide a floating point number. The * character represents multiplication, and then we repeat the same notation for the second entity. Finally, we specify ‘| round(2)‘ so that the resulting entity rounds to two decimal places. Which, when dealing with an amount of money, makes sense as 0.3333 of one pence isn’t really worth knowing about.

As with any changes to Home Assistant’s YAML configuration, you’ll need to restart Home Assistant after setting this up. You’ll then have a nice new helper, in my case ‘sensor.export_income‘ to plop somewhere on your dashboard. Personally, I have it as a badge which appears once the value is higher than 0. Which, at this time of year, isn’t very often, but we did have a nice enough day a couple of weeks ago to be able to export some electricity.

GeekMagic SmallTV Pro & Home Assistant

A photo of my GeekMagic SmallTV Pro showing a Home Assistant dashboard

I recently bought a GeekMagic SmallTV Pro (sponsored link), which is a small, always-on desktop screen that runs on USB power. Out of the box, it can display the weather, a small range of photos, share prices and cryptocurrency prices. However, I’ve connected it up to Home Assistant to display a dashboard.

There are two varieties of the GeekMagic SmallTV – the ‘Ultra’ and the ‘Pro’. The ‘Ultra’ is actually the more basic model, and isn’t available to buy on Amazon. Both types are available on AliExpress, however. Inside, the ‘Ultra’ model has an older ESP8266 chip, whereas the ‘Pro’ has the newer and more powerful ESP32 chip. Both offer a roughly one inch square screen and connect using USB-C.

Setting up the GeekMagic SmallTV

Like many ESP-based devices, when you first plug the GeekMagic SmallTV in, it’ll create its own Wi-Fi access point. Connect to this on your smartphone, and it’ll pop up a captive portal where you can select your home Wi-Fi network and provide the password.

It’ll then reboot and connect to your home network, and will flash its new IP address whilst booting. You can then go to http://[IP Address]/ in your web browser to configure settings. Note that the cheaper ‘Ultra’ model doesn’t support stocks or cryptocurrency tracking.

Screenshot of the GeekMagic SmallTV dashboard editor in Home Assistant

Integration with Home Assistant: Method 1

There are two ways that you can integrate your GeekMagic SmallTV with Home Assistant. Method 1 is the method that I have used, as it’s less invasive and leaves the stock firmware intact.

Inside Home Assistant, open HACS, and add the above-linked GitHub page as a repository. You can then install the GeekMagic integration – once done, reboot, and then add your device on the Integrations panel.

How this integration works is by generating an image of several dashboard entities, which it then pushes to your device. You should notice a new ‘GeekMagic’ section on the main sidebar that allows you to open the dashboard editor – click this, and you’ll be able to create a new dashboard.

There are multiple layouts available, allowing you to display between one and nine entities. Theoretically, any entity in Home Assistant can be added. Personally, I’ve added the date and time, my solar battery status, the weather, my car’s charge status, how much energy is being generated by my solar panels, and my dishwasher’s progress through a cycle. Most of these are ‘gauge’ displays in the ‘ring’ style, so as well as showing the percentage, the ring gives a clearer visual indication of progress. This is good on such a small screen.

Once set up, the integration pushes a new image to the GeekMagic SmallTV device on a regular basis. I found that I had to remove all of the other images, and set it to change every 10 seconds, to keep the dashboard showing and updated.

Integration with Home Assistant: Method 2

If you clocked that these devices have ESP chips earlier, then it won’t surprise you that people have installed ESPHome on them. This involves replacing the stock firmware with ESPHome, which is easy to do – the web interface on the stock firmware has a firmware upload tool that should accept an ESPhome binary. I say should because I haven’t tried it personally.

If not, then the good news is that this device is easily dismantled – there are a couple of standard screws on the bottom. Inside, the printed circuit board includes GPIO pin holes for its UART interface. That may also help if you accidentally brick the device and need to replace the firmware manually.

I haven’t gone down this route as yet, as it takes more work. You would have to specify what to display on the screen in the ESPHome YAML configuration, and you’ll lose all the other functionality provided by the stock firmware. Also, be aware of various copycat devices with slightly different chips; they’ll almost certainly still run ESPHome but you may need to amend the configuration slightly.

I quite like my GeekMagic SmallTV Pro – it’s handy to be able to track key entities in Home Assistant without having to open my phone or look at the full dashboard. And it’s sufficiently low power that it can run all the time.

Comparing ESPHome and Tasmota

A photo of a Coosa smart plug, originally running Tuya firmware, and a USB to UART converter. This now runs ESPHome firmware.

If you’re looking for custom firmware for your devices with an Espressif ESP chip, then two of your options are ESPHome and Tasmota. I’ve used both – first Tasmota and later ESPHome – on some smart plugs that used to run Tuya firmware.

I’m going to share my experience with both and highlight the strengths of each. Other ESP firmwares are available, but for this I’m just going to focus on comparing ESPHome and Tasmota.

Tasmota is easier to install

If you’re new to installing custom firmware, then Tasmota is the easiest to install. This is because you first install Tasmota on the device, and then configure it using a web interface on the device after installation.

With ESPHome, the configuration is done first, using a YAML file. You then have to compile a binary and install this on the device. This can mean some trial and error with getting the configuration right.

Tasmota has more device templates

This directory has Tasmota templates for almost 3000 devices. If you can find your device there, then you can install Tasmota, copy and paste the template, and off you go. Meanwhile, the ESPHome Device Database only has 650 devices with pre-made configurations.

ESPHome may be easier to update

If you’re running Tasmota on an older ESP8266 device, then it can be a pain to update. This is because of the limited storage space on ESP8266 devices and the size of the Tasmota binaries – there isn’t enough space to store the current and new firmware side-by-side. Instead, you have to install a ‘minimal’ version of Tasmota, and then install the new full version as a two step process.

Because the ESPHome Device Builder compiles the firmware specifically for each device, it’s smaller and so can be updated over-the-air more easily.

This shouldn’t be an issue with newer ESP32 chips, as these have more storage and so updating Tasmota should be easier.

ESPHome is updated more regularly

It’s a good thing that ESPHome updates more easily, because updates are also more regular. Normally there’s a big update every other month, and smaller bugfix updates most weeks. It also has a much larger developer community.

Tasmota receives updates less often, and its development is largely led by just one lead person.

ESPHome supports more DIY devices

Whilst Tasmota is generally used to convert existing devices with ESP chips, ESPHome is more suited to DIY projects that you can make yourself. For example, you could build your own thermostat, a miniature weather station or control your blinds. With the right boards and cables, you can build and automate lots of things using ESPHome that Tasmota may not support.

ESPHome integrates better with Home Assistant

Being both projects of the Open Home Foundation, ESPHome has better integration with Home Assistant. You can run the ESPHome Device Builder as a Home Assistant add-on, and devices should show up without much additional configuration.

Tasmota works over MQTT, so you have to set up an MQTT Broker like Mosquitto in Home Assistant first, and then configure your Tasmota devices to use it. You also have to enable an option using the device’s command line to allow Home Assistant to discover the devices.

In summary

Whether you want to use Tasmota or ESPHome will depend on your use case:

  • If you’re relatively new to all this, or are replacing the firmware on an existing device, Tasmota may be best for you as it’ll be easier to install and configure.
  • If you’re a more advance user, or have built a DIY device that requires functionality not normally supported by Tasmota, then you should use ESPHome.

How to: Connect a Rolec EVO car charger to Home Assistant

Screenshot of the Monta HACS integration in Home Assistant showing a Rolec EVO charger

Back in May, ahead of buying our electric car, we had a Rolec EVO electric car charger installed outside our house. Since then, we’ve been using the standard Rolec EVO app that comes with it, but recently I’ve switched it to using the Monta app and its Home Assistant integration. Here’s how,and why I did it.

Why I needed to change to Monta

As I write this, there doesn’t appear to be a public API for Rolec’s charge point back office system. The Rolec EVO charger in particular is relatively new to the market, and so I’m not aware that anyone has found a way to integrate this with Home Assistant through other means.

However, like many chargers, the Rolec EVO charger supports OCPP. This means that you can change which back office system your charger talks to, and I’ve specifically chosen Monta because it offers a public API. And, because someone has developed a custom Home Assistant integration that can be installed from HACS.

Aside from this, the Monta Charge app is better, in my opinion – it supports Live Activities on iOS, so you can monitor your car’s charging progress on your phone’s lock screen. You can also make your charger public and allow people to pay to use it, if you wish.

Changing the OCPP provider

Part of the reason why it’s taken me until now to do this, was because I couldn’t work out how to change the OCPP provider. There’s no option to do so on the standard Rolec EVO app, and I tried setting it up using the app in the Monta integration guide, but that didn’t work either.

However, I came across a thread on the SpeakEV forums that made me aware of a third Rolec app. Confusingly, this is called ‘Rolec Connect’ (with a black icon) rather than the ‘Rolec EV Connect’ app (with a green icon) that I was using previously.

Once you’ve installed the Rolec Connect app, it’ll ask for your name and email address. This needs to be a valid email address, as you’ll be sent a link that you need to click on, but you might be able to get away with using Sharklasers.

You then choose the type of charger, and then need to place yourself within Bluetooth range of it. I apologise in advance if you’ve got this far and it turns out to be cold, dark and raining when you read this, but you can’t do this over Wi-Fi. You’ll be asked for a PIN code; mine was printed in the manual.

Once connected, on the second tab, you can change the provider. The good news is that you can simply select ‘Monta’ from the drop-down list, and continue. Leave every other field blank, but make a note of your charger’s serial number – mine was in the format of Rolec_XXX12345. You’ll need this later.

Add your Rolec EVO to Monta

Your charger should now be talking to Monta’s servers, rather than Rolec’s. Next, you’ll need to create a Monta account; I already had one, as Monta has a network of public chargers including the one we used at Portmeirion in Wales.

The guide to follow is here; I found that I had to enter the serial number manually, but hopefully it’ll read the QR code on the outside. If all goes well, the app will be able to connect to your Rolec EVO charger, and you’re done. From now on, you’ll need to use the Monta Charge app to manage your charger; the Rolec EVO app will now only work via Bluetooth as you’ve severed its internet connection to Rolec’s OCPP server.

Install the Home Assistant integration

Finally, you need to install the Monta integration from HACS. Whilst it’s not an official integration, it is linked from the Monta API documentation, and it’s regularly updated with a major new release just a few weeks ago. As with all new integrations from HACS, you’ll need to restart Home Assistant before you can add your charger.

Once you have restarted, add the Monta integration as you would any other. It’ll ask for a Client ID and Client Secret, which you can get from this page. I would leave the rest of the values as is, and that should be it. Your Rolec EVO charger now appears in Home Assistant!

This means you can use Home Assistant to start and stop charges, view the charging status, and have the energy usage appear on your Energy Dashboard. That also means you can build in automations; for example, if you’re able to access your car’s charge status, you could stop charging at, say 80%. I use the Nissan Connect integration from HACS for this.

Going fully local

The great thing about OCPP is that it’s an open standard, and so it’s supported by a range of back office suppliers with Monta being just one. Should Rolec or Monta go bust, then I can easily switch my charger to a different OCPP server and carry on using it. That’s not an unfounded fear: another EV charger manufacturer, Simpson & Partners, were in administration last year, although they seem to be running again.

If I wanted, I could self-host my own OCPP server and have everything running locally at home, with no dependencies on third-party cloud services. Again in HACS, there’s a OCPP Server for Home Assistant, and it supports the Rolec EVO charger amongst a range of others from other manufacturers. I’m not quite at that stage yet, as it would mean I would have to manage charging solely through the Home Assistant app. Although I did come across this ESPHome project for a hardware control using an m5stack Dial (looks a bit like a Nest thermostat) which could be something to consider.

A bigger project would be to build a new integration that allows communication between Home Assistant and the Rolec EVO charger via Bluetooth. That would require me learning Python, and another Bluetooth proxy, but it would at least work without needing to change the OCPP server.

2025, quantified

For the third year running, I’m summarising all those end of year reviews that apps like Spotify and Goodreads offer you. You can take a look at 2024 and 2023 if you want.

Countries and counties visited

Unlike last year, I did manage to leave England a couple of times – Athens in June, and Wales in July. I also spent some time at Amsterdam Schipol Airport in the Netherlands, but as I was airside the whole time, I’m not really counting it.

Over the course of the year, I have spent at least some time in the following English counties:

  • West Yorkshire
  • North Yorkshire
  • South Yorkshire
  • East Yorkshire
  • Lincolnshire
  • Greater Manchester
  • Lancashire
  • Cheshire
  • Norfolk
  • County Durham
  • Merseyside
  • West Midlands
  • Oxfordshire
  • Northamptonshire
  • Staffordshire
  • Tyne & Wear

That’s a few more than last year – East Yorkshire, Oxfordshire, Northamptonshire, Staffordshire and Tyne & Wear weren’t on last year’s list.

Most distant points

The furthest compass points I have been to are:

  • Furthest North: Gateshead, Tyne & Wear (May)
  • Furthest South: Athens, Greece (June)
  • Furthest East: Athens, Greece (June)
  • Furthest West: Anglesey Sea Zoo (July)

My trip to Athens was something of an outlier, but we also went further west than last year. Not so far north this time, though.

Methods of transport used

For the first time since doing this, I can include planes in this (Athens again). There was also a lot of driving, in our old and new cars, and I continued to mostly take the train to work. No trips to London last year, but I did travel by train to and from Manchester Airport, when heading to Athens, and to Leeds. Apart from those Manchester trips, which included time on Transpennine Express, all my journeys were with Northern. Speaking of which, I had 8 successful Delay Repay claims, totalling £6.25 (78p on average).

I’ve been on a few buses and trams as well. No ferries last year, but I did spend some time on a boat in Oxfordshire.

Music listened to

A screenshot of my most popular bands and songs from 2025 from Spotify Wrapped

Over the year, I scrobbled 15,063 tracks on last.fm, which is more than the past few years. That’s a little over 41 songs per day, so on average I listened to six additional songs per day in 2025 compared to 2024. Assuming an average song is around three minutes, I listened to slightly over two hours of music every day on average. My ‘listening age’ was 42 – only out by a year, which is nice.

Whilst I don’t exclusively listen to music on Spotify, on there, trance was my top genre this year (it was pop last year), according to my Spotify Wrapped. My most-listened to song was Lady Gaga’s Abracadabra – look, a song that was released in 2025 – as it’s one of our (now) ten-year-old’s favourites. Similarly zeitgeisty was my top album – the soundtrack to K-Pop Demon Hunters.

My top artist was Alex Christensen, which is a weird outlier; he released several albums of classical cover versions of dance music which I marathon-listened to one day. Last year’s top, Armin van Buuren, was second.

A screenshot of my Goodreads Year in Books

Books read and listened to

According to My Goodreads Year in Books for 2025, I read 76 books this year, which is one less than last year (and 17 fewer than 2023). Unfortunately, I set my 2025 reading challenge at 80 books, so didn’t achieve it. Also, books ‘read’ include those that I have listened to as audiobooks.

The shortest book I read, at 64 pages long, was ‘Our Super Japanese Adventure‘ by Sarah Graley and Stef Purenins (not available on Amazon), who we met at Thought Bubble. Meanwhile, the longest book was ‘Rule of Cool‘ (sponsored link) by Matthew Siege at 479 pages, although I listened to the audiobook which was narrated by Felicia Day over 12 and a half hours. The longest audiobook was ‘Neurotribes(sponsored link) by Steve Silberman, which was over 20 hours and probably the longest audiobook I’ve ever listened to, although the print edition is 477 pages (two less than the Rule of Cool)

Overall, the average length of book that I read was 270 pages, which is 39 more than 2024. ‘A Brief History of Time‘ by Prof Stephen Hawking (sponsored link) was the most popular book that I read last year. Although, I found it a struggle in parts and, unsurprisingly, some of the science has changed in the 37 years since it was first published.

Beers and ciders consumed

I log the beers and ciders that I drink using Untappd, and these stats are from my year in beer. Like last year, I drank less than one per month (11 in total) and my main style was ‘non-alcoholic’.

Steps taken

My total steps taken was very similar to 2024 and 2023. Overall I took 3,455,761 steps, which is only slightly less than 2024. My average is 9,468 per day; January was my most sedentary month and July was my most active, but not by much.

Time spent learning French

A screenshot of my Duolingo stats for 2025

I started Duolingo’s French course on the 1st January 2022 (so I have a four year streak now), and in 2025, I spent 3,560 minutes learning – that’s 59 hours in total. Compared to 2024, that’s 11 hours less, but we didn’t go to France again this year.

My Duolingo Score for French is 118, which means that I’m in the medium B2 level (‘vantage’) of the CEFR for French. Currently Duolingo’s maximum score for French is 130, which is high B2 level and should be sufficient to study a university course taught in French. I was expecting to have reached 130 by now, but clearly not.

Still, not much further to go. I’m probably going to switch to German next – I got an A* in GCSE German in 2000, but a quarter of a century has passed since then and I’ve forgotten most of it.

Podcasts listened to

A screenshot of my most listened to podcasts of 2025

I listen to the majority of my podcasts through Overcast (with the remainder in BBC Sounds). My most listened to podcast was, once again, RHLSTP (RHLSTP!) with 40 hours over the year. The Guilty Feminist, The Comedian’s Comedian, The Bugle and a new entrant, Bugle spin-off podcast, Realms Unknown, make up the rest of my top 5.

Photos taken

A new stat that I tracked in 2024 was an estimate of photos taken, although it will also include some screenshots as well. In 2025, I took 1536 photos, so less than 2024 but more than 2023.

So, that’s 2025 quantified, and a useful summary of the statistics from various web services that seem to spend their December telling me data they hold about me but in a nice way.

PowerCalc for Home Assistant

Screenshot of the energy dashboard in Home Assistant with some data provided by PowerCalc

One of the features I like about Home Assistant is its Energy dashboard. It can analyse and display various data about power and energy usage in your home – provided that you have the correct sensors available. As we have solar panels, our inverter provides lots of live data via a local API that we can use.

We also have a number of energy monitoring smart plugs that track energy usage. We have a couple of Meross plugs, and a couple of cheap Tuya Zigbee plugs. Home Assistant can then display the power usage of these devices, and so you can see where your energy is going.

But we can’t fit these onto every device. For example, devices like our oven, hub and dishwasher are all built-in, and don’t use standard 3-pin plug sockets. We could have smart relays fitted, but that would be a paid job for an electrician. So, instead, there’s a potential software solution, in the form of PowerCalc.

PowerCalc is a custom integration that you can install from HACS. Once set up, you can use PowerCalc to estimate the power usage of your devices, or use its extensive library where other users have provided this data already. Indeed, when I installed PowerCalc, it automatically added entries for our various Google Home smart speakers. Once added, these appear as additional entities attached to your existing devices, which is nice – they don’t appear as separate devices.

You can then add these entities to your energy dashboard, to see where your electricity usage goes. Here’s a Sankey graph from last week from our house; it was quite a dull day with little solar generation. There’s a lot that we can’t track, but you can see that a significant amount of our energy usage was spent drying clothes.

PowerCalc gets regular updates, with new devices being added all the time. And, of course, you can add these yourself, if you have the means to record the energy usage. The energy usage data also updates in realtime, so you could add the data to a dashboard and see how changing the brightness of a bulb affects its calculated energy usage.

Fritz! Repeater 3000AX

A photo of our Fritz! Repeater 3000 AX

When we signed up for Zen internet last month, we also signed up for Zen EveryRoom. This is an additional monthly charge to cover the cost of a Wi-Fi repeater device, and, as our new router is a Fritz!Box, we were sent a Fritz! Repeater 3000 AX.

Our house is actually two smaller properties that were knocked through years ago. That means it’s a long, narrow house, and whilst we have our optical network terminal and router in a relatively central position, the Wi-Fi signal doesn’t reach the whole house from the router. Initially we used a little Netgear Wi-Fi Range Extender, and then a few years ago I replaced this with a Google Nest Wi-Fi 5 mesh system. Mesh Wi-Fi works better, as all devices use the same network name (SSID) and so mobile devices can seamlessly move between your router and repeaters without needing to re-connect. It’s how most corporate Wi-Fi systems work, but consumer mesh devices aren’t as common.

Design

Like the Fritz!Box router, I’m not a massive fan of the design of the Fritz! Repeater either. Whilst it looks better, it still feels a bit like a cheap plastic box. Furthermore, unlike the router which is in our spare bedroom, this is in quite a prominent place in our dining room.

On the front, there’s a Wi-Fi Protected Setup (WPS) button, a power light, and a light to show that it’s connected to Wi-Fi. On the back, as well as the connector for the DC adaptor (a non-standard barrel plug), there are also two gigabit Ethernet sockets. I’ll come on to those later.

Setting up the Fritz! Repeater is as simple as plugging it in, and using WPS to establish the connection with your router.

Operating modes

The Fritz! Repeater can operate in different ways, depending on what other hardware you have:

  1. It can work as a simple Wi-Fi repeater with any other brand of router, or an older Fritz!Box.
  2. With a new Fritz!Box like ours, it can form a Wi-Fi Mesh.
  3. You can also use connect it to either a Fritz!Box or other router using an Ethernet cable as a LAN bridge

We’re currently using it in the third way, with our Powerline network acting as a back-haul. Therefore, there’s an Ethernet cable running from the Fritz! Repeater, via our Powerline adaptors, to the Fritz!Box upstairs. I figured this would be more reliable and stable, but it turns out that it’s actually slower. When doing speed tests, I get around 60-70 Mbps using Powerline, but the full 100 Mbps when using Wi-Fi to reach the internet. It’s odd because the Powerline connectors reckon they’re working at 400-500 Mbps. I’ll need to try running the Fritz! Repeater just on Mesh Wi-Fi to see if it’s faster, but it’ll need reconfiguring to do so; simply unplugging the Ethernet cable isn’t enough to get it to switch operating modes.

Range and performance

The range seems pretty good – there’s a reasonably strong signal even in our cellar. Certainly, between the Fritz!Box Router and the Fritz! Repeater, there are no dead zones inside the house.

Both Fritz! devices support Wi-Fi 6, aka 802.11ax, hence the ‘AX’ in their names. This should offer better speeds for those devices that support it. Neither supports Wi-Fi 6E, which offers enhanced speeds using the 6 GHz frequency band.

Compared with our previous Google Nest Wifi mesh system, the coverage seems better. Previously, we were also able to use the Google Nest Wifi Point in our dining room as a Google Assistant smart speaker, and the Fritz! Repeater unsurprisingly doesn’t support this. That’s not a major issue as we had a spare Google Nest Mini to use alongside it.

What is notable is that the Wi-Fi signal from the Fritz! Repeater seems to be strong than the Fritz!Box; devices in range of both seem to connect to the repeater more than the router. That could be to do with where the repeater is placed, but it looks like it could have larger internal antennae.

Mixing and matching Mesh Wi-Fi products

As we’ve moved from one Mesh Wi-Fi system to another, it’s worth noting that mesh products from one manufacturer aren’t compatible with those from another. In other words, we wouldn’t be able to keep our Google Nest Wifi Point, and have it mesh with our Fritz!Box. Whilst there is a standard, 802.11s, only a handful of manufacturers support it; most use a proprietary meshing protocol.

In any case, our previous Google Nest Wifi system used Wi-Fi 5, and this is a Wi-Fi 6 system.

If you have a very large home, then you can buy additional Fritz! Repeater devices to extend the signal even further; all the devices should mesh together.

You can buy a new Fritz! Repeater 3000 AX from Amazon for around £135 (sponsored link). We’re paying an extra £9 per month from Zen, for which there’s a 12 month contract and a £9 upfront charge for postage and packing.