Skip to content

Blog

HyperHDR Part 4 - Space Constraints

One of the goals of the project is not to take my TV off the wall. It's a 75" Sony, and you can see from the photo there is some space to work with:

Space behind the TV and the wall

I need to find a way to mount:

  • HDMI Splitter
  • Ugreen USB Video Capture device
  • Raspberry Pi 5
  • 300w power supply
  • Adafruit rp2040 Scorpio

..all without taking the TV down and hidden behind the TV. The power supply is the one giving me the most anxiety - I'm concerned about heat and I'm not quite sure how to mount it to the wall. There are DIN rails, but I have a feeling that's not what I want. I've found 3D printed clips that screw into the wall / studs, or I'm wondering if command velcro strips will work. I'm also worried about getting the placement just right since I need two electrical runs to the SK6812 LEDs.

I am planning on using the command velcro strips on everything else, including the Pi, the Ugreen, etc. I've printed a 3D case for the Scorpio, but I need to take another look at how it's wired and if it will work in that case.

Lastly, I need to mount a power strip behind the TV. If you look really close you can see there is apower outlet behind the TV next to a conduit run. Right now the TV and the plain white LED strip are plugged in. I'll have to figure out a way to wriggle my hands behind it to swap out what's plugged in. (More than likely it will be my wife's hands.)

Close-up of the space behind the TV and the wall

Next up: LEDs

HyperHDR Part 3 - The HDMI Splitter

One of the keys to the HyperHDR setup is the splitting the video source, usually HDMI, so it goes to both the display and to the USB video capture device which is plugged into a Raspberry Pi. The Raspberry Pi analyzes the colors and it runs HyperHDR to match those colors on the screen to the LEDs.

If you still haven't watched this 30 second video, it's a great example, especially with the flashlight:

The key to splitting the HDMI signal is the abilty to bypass HDCP, high definition copy protection. Most game consoles come with HDCP off for streaming, but devices like a 4K Blu-Ray Players and the AppleTV require it.

HBAVLink HB-S102B 2x1 HDMI Splitter

Luckily, they make HDMI splitters with HDCP bypass, but the trick is finding one that works with your system. The first one I ordered, the HBAVLink HB-S102B looked like it would work, and it split the HDMI signal successfully, but there was no HDR output when playing a 4K Blu-Ray. HDR is high dynamic range, and it's more important than the amount of pixels (4k) - it's what makes the colors pop, and the lights bright, and the color black a deep black. Luckily, I noticed that the colors looked washed out and, sure enough, there was no HDR.

CORSAHD 2x1 HDMI Splitter

That led to me swapping out HDMI cables, eventually buying 2 new 3' cables just to make sure I had compatible ones. I emailed the company and while I waited to hear back from them, I bought the CORSAHD 4K@60Hz HDMI Splitter 1x2. That worked like a champ - HDR came right through.

HBAVLink HB-S102H 2x1 HDMI Splitter

But then I heard back from HBAVLink right away and they shipped me an upgraded model - and shipped it overnight! Now that's customer service, kudos to them for the quick responses via email and fast shipping. Plugged that one in and I'm good to go. If you look at the Amazon page, you'll notice it doesn't explicitly say HDCP bypass, but it worked right away.

Next up: Space requirements

HyperHDR Part 2 - Bill of Materials

Have you ever looked at a project in the Adafruit Learn Guide system and thought, "That's way too expensive for a project, but it looks cool". This is one of those projects. Though 2 items make up almost a third of the cost, it does add up. And I'm not including the Raspberry Pi 5 I just happened to have laying around not doing anything. But I was lucky and got an unexpected bonus at work, so here we go.

I've spent the better part of the week researching all of these parts. When I decide to do a project like this, I go down the rabbit hole and try to learn as much as I can. I'll have more on that when it comes time to talk about the LEDs.

The total cost, excluding the Raspberry Pi, comes in at around $350. (Gulp). The USB capture card ($100) and 2 strips of LEDs ($88) make up the bulk of the cost.

Item Price Notes
Pi5 power supply $15 I've had a Pi 5 for a couple years, but just powered it off USB-C. Need to fix that.
USB capture card - UGREEN 4K@60Hz Video Capture Card $100 Recommended by the HyperHDR team, this makes up almost a third of the cost
LEDs - 60 LED 5v - BTF-LIGHTING RGB+Cool White SK6812 $88 (2 Ɨ $44) Of course I need roughly 6 meters and they come in 5 meter strips, so I'll need two. Again, almost a third of the total project cost. The RGBWs are recommended for the extra white channel, so choosing the Sk6812s over WS2812 Neopixels.
300w BTF-Lighting Power supply $33 Beefy, should be more than enough. I'm worried about heat, but I'll mount it on the DIN rails below.
Pinfox 6ft 16 Gauge 3 Prong Power Supply Cord Cable $11
Adhesive Cable Clips - 60 PCS XHF 5/8" Clear Clips $7 Going to go with these instead of sticking the LEDs right onto the back of the TV.
3' HDMI cables $18 (2 Ɨ $9) Already bought, had to test the HDMI splitter.
Power supply mount / DIN rails $10
2 USB-C to USB-A cables - Hrbzo USB-C Cable 3-Pack $7 Can't believe I don't have a couple of these laying around.
CORSAHD 4K@60Hz HDMI Splitter 1x2 $30 More on this in the next blog post.
Adafruit rp2040 Scorpio $15 Again, recommended by the HyperHDR team.

Next: The HDMI splitter

HyperHDR Part 1 - An Introduction

I was recently reminded of HyperHDR when they popped up in my GitHub feed after releasing version 22 last week. I had starred the project late last year when Liz Clark of Adafruit wrote up a Learn Guide for installing HyperHDR using a Raspberry Pi 5 and a Trinkey.

HyperHDR is an ambient lighting system you install behind your TV and it uses a video capture device to match the LED colors to the colors playing on your television.

Check out this 30 second video which does a great job of showing HyperHDR in action:

To contrast that, today I just have some white LEDs behind my television, this is what it looks like with the lights off:

Trinity and Neo from the Matrix

I only have LEDs on the sides and the top, nothing along the bottom, which is something I’m looking to fix.

Over the next weeks I’ll be blogging my progress in installing HyperHDR behind my television.

Next up: Bill of Materials

100 episodes!

With the release of today's episodes of The CircuitPython Show and The Bootloader, it marks my 100th episode between the two shows. If you ever look into starting a podcast, most of the articles out there mention that the average podcaster doesn't make it past episode 7, and here we are four and a half years later.

I've had the opportunity to interview a lot of great people, I've made some friends, and made a good friend in my co-host Tod Kurt. I'm grateful to everyone who has been a guest on an episode, listened to the show, or shared it with a friend.

Here's to many more episodes!

ListenBrainz All the Things

In the last two episodes of The Bootloader, I've covered Parachord, the cross-platform music player, and Achordion, it's accompanying music commuity. Achordion is built on top of ListenBrainz, which, per its website, keeps track of the music you listen to and provides insights into your listening habits. Looking at various ListenBrainz tools, I ended up creating (or re-creating) my own, with some help from Claude.

ListenBrainz Widget

For the last few years, I've maintained a Now Spinning page, which I update monthly with the records that are on the turntable. ListenBrainz offers a widget you can embed in a web page, but I wanted something a little more stylish to add to my Now Spinning page. That led me to create listenbrainz-widget. It includes two widgets, the first being a "Now Playing" widget that I've embedded on my Now Spinning page that looks like this:

Now Playing widget featuring Metric

Using GitHub Pages, you host the HTML there and then you can embed it on any web page.

The second widget is a "Top 5 Albums" image generator that you can then share on social media. It creates a 1200x1200 PNG of the top five albums you listened to based on the data range you choose.

I even created a cool landing page for the widgets. The README in the repository has all the details on how to install and run it.

Top 5 albums of the week

listenbrainz-autoposter

Inspired by the scrobble-blue project, listenbrainz-autoposter posts your top 5 album listens from the previous week to Bluesky and / or Mastodon. This uses GitHub Actions to automate the widget above instead of Cloudflare, like the original project.

I have it set to share my top every Tuesday, giving ListenBrainz enough time to process the previous week.

listenbrainz-to-bluesky

Another project inspired by someone else, this time it is again scrobble-blue by Will Manduffy. listenbrainz-to-bluesky adds one line to your Bluesky profile with a "Listening to" and the name of the song and the artist of your most recent scrobble. This one is self-hosted and runs via a cron job every few minutes.

Paul's Bluesky Profile showing Listening to: Alright Hear This by Beastie Boys

Too much oversharing? Probably, but I know a few folks have liked some of the music recommendations, so I'm going to share for now.

Moviebuff

Moviebuff is a Django application originally written by retiolus that was released last August. I’m not sure how I originally came across it, but I remember it being demonstrated on Mastodon. Moviebuff allows you to track and rate the movies you watch and share them on the Fediverse.

I already have a music site and I’ve been tracking what I watch manually, so I was kind of excited for Moviebuff. I forked it right away, but there wasn’t any installation instructions and I’ve never used Django. I was able to reverse the first few things needed in the .env file, such as the Django secret key, an API key from The Movie Database, but I couldn’t figure out how to get Federation working. The code to add Federation didn’t appear to be in the original repository or any of its branches.

So there it sat. I debated a few times about opening an issue in the Moviebuff repository asking for help, but I didn’t want to bug the maintainer and I was just grateful that anything had been shared and open sourced.

After successfully using Claude Code to help create the circuitpython-bambulabs library, I pointed Claude at Moviebuff and away it went. It surprised me again when it was able to add Federation to the project based on the scaffolding that was already there, no database changes needed.

I’ve done a few projects in Pyramid and FastAPI, so Python based web frameworks weren’t totally new to me. Partnered with Claude, I went to work.

Things I’ve updated and changed:

  • Added dark mode and made it the default with a toggle to change light or dark mode on the home page
  • Added working Federation based on the buiding blocks present in the app
  • Changed Federation to only post when a movie is rated. Also added a Share to Fediverse button using HTMX that appears when a movie is added to the Watched Movies list
  • Added an environment variable and code to enable or disable registration (to avoid spammers)
  • Disabled the registration pages if the user is unauthenticated and registration is disabled
  • Updated the home page to show a legend, the five most recent movies rated, movie posters for the four most recent movies rated, and HTMX to page through the rated movies
  • In the Dashboard, added HTMX to page through all the Watched Movies
  • In each movie card, added the star ratings for the movie
  • Updated the datetime fields to be MON/DAY/YEAR and added commas to the movie's budget
  • Added a Font Awesome film icon in the upper left and made it and Moviebuff clickable to return to the home page
  • Added a custom footer that matches silversaucer.com
  • Added a CONTRIBUTING.md and CODE_OF_CONDUCT.md
  • Added installation instructions in the README

You can see it in action at https://moviebuff.silversaucer.com. I’ve added most of the movies I watched in Feburary and March and I’m still debating about adding earlier movies.

The code lives at Codeberg and I’ve made a synchronized mirror on GitHub. If you like it, give it a star! And if you really want to know what I’ve watched, you can follow me on Mastodon at @prcutler@moviebuff.silversaucer.com.

I’m so grateful to retiolus for creating the app and releasing it under an open source license. I’m looking forward to rating, cataloging, and sharing the movies I watch.

Moviebuff homepage screenshot

What I'm Watching - Q1 2026

It's a new year and I'm still tracking what I'm watching. I have a number of television shows still in progress. I don't write them down until the season I'm watching has finished.

Highlights include finally getting around to For All Mankind season 4 with season five having just started. I highly recommend this show if you haven't seen it. I also enjoyed Predator: Badlands, Have Fun, Don't Die, Good Luck, and The Rip. Whatever you do, don't watch Mercy. I still need to catch up on some of the Oscar nominees.

Legend

  • The Criterion Channel = *

  • 4K UHD = +

  • AppleTV+ = ^

  • Netflix = ~

January

  • Predator: Badlands (2025)
  • Boogie Nights+ (1997)
  • The Rip~ (2026)
  • Dust Bunny (2025)
  • Landman S2
  • What Lies Beneath~ (2000)
  • For All Mankind S4^
  • If I Had Legs, I’d Kick You (2025)

February

  • Loot S3^
  • The Wrecking Crew (2026)
  • The Ballad of Wallis Island (2025)
  • The Assessment (2025)
  • The Lazarus Project S2
  • Is This Thing On? (2026)
  • Mercy (2026)
  • The Housemaid (2025)
  • Eternity (2026)^
  • Industry S1
  • Honey Don’t (2025)~

March

  • Crazy Stupid Love (2011)~
  • Mission: Impossible 2 (2001)+
  • Dracula (2027)
  • A Man on the Inside S2~
  • Good Luck, Have Fun, Don’t Die (2027)
  • Pacific Rim (2013)+
  • Firefly (2001)
  • Serenity (2005)+
  • Send Help (2026)
  • How to Make a Killing (2026)

circuitpython-bambulabs Published!

Following up on my blog post from yesterday, I spent Sunday preparing the circuitpython-bambulabs library to be published.

Unfortunately, I ran into an issue with the CI where it was failing to build. Thanks to some pointers from todbot, I was able to refactor the library and move the MQTT setup into the BambuPrinter class. This makes me happy as the user doesn't have to set up MQTT, assuming they've entered their printer settings in settings.toml, the library handles connecting for you.

I also heard from Brent Rubell at Adafruit who confirmed that the MQTT library for CircuitPython uses MQTT 3.1.1 - which is odd, because while MQTTX would connect locally using 3.1.1 (and not 5.0), CircuitPython would not connect locally. I'll investigate this more as I'm guessing some people would rather connect locally instead of through Bambu Cloud.

Other things I learned:

  • The Creating and sharing a CircuitPython library Learn Guide needs some updates. The process to create docs on ReadtheDocs has changed, libraries use ruff now for linting instead of Pylint and black, and sharing in the Library bundle needs some updates.
  • The Learn Guide doesn't cover publishing to PyPi, though the cookiecutter template does include the GitHub Actions to publish the library. It took me longer than it probably shoudl to figure out how to enter the secrets in GitHub to allow it to build and upload. This would be helpful to add to the Learn Guide.
  • The section in the Learn Guide on Sharing in a Bundle also needs an update. The section on verifying didn't work for me, though Updating the Library list did.

Lastly, a big thank you to Foamyguy who merged my pull request to add the library to the Community Libraries right away! You can find more about the library by:

  • Install via circup: circup install bambulabs to install on your microcontroller. (Just tested it and it's so cool to see that work!)
  • PyPi
  • ReadtheDocs
  • GitHub repository (And if you like it, give it a ā­ļø)

Bambu Labs CircuitPython Library

I follow a number of people on GitHub and one of them is my good friend todbot. I noticed in my feed he he had starred an Arduino program called Bambu Helper that displays information and statistics from your Bambu Labs printer, such as the percentage progress of the current print, nozzle temperature, fan speed, and more.

That got me thinking - if it can be done in Arduino, it can be done in CircuitPython. It's been a couple years since I had a good CircuitPython project, so away I went. I started researching the Bambu API and more GitHub repositories than I can count, mostly Python projects that connect to a Bambu Printer using MQTT.

I then used MQTTX to connect to my printer and test the various MQTT methods. I was able to successfully connect to my P1P printer both through Bambu Cloud and locally over my network.

And then I cheated - I used Claude to bootstrap the project by pointing it at the API Docs and the BambuHelper Arduino app to create a proof of concept in CircuitPython. (I know, I know... the AI skeptic just used AI) It got pretty close - it did get the MQTT command to request a full status update wrong, but that was an easy fix.

I had the proof of concept working on my S3 Qualia board and 4" display:

Bambu Labs info displayed on a 4" screen

One thing I learned, though I'm waiting to confirm, is that CircuitPython only uses MQTT 5.0, and not 3.1.1. Connecting via Bambu Cloud will connect on both MQTT standards, but the local connection only will connect using 3.1.1, which CircuitPython doesn't appear to use that I could figure out. That means you have a few extra hoops to jump through to get a token and user ID, but it wasn't that hard and I've documented the process.

Unfortunately I appear to have fried both my S3 and S2 Reverse TFTs (thanks macOS) which I wanted to prototype with. Using a $50 worth of equipment is a bit much for a project like this. But that got me thinking - what if I could create a library so people could just get the info from the printer and then build their own UI on top of it to match their choice of microcontroller and screen?

So that's what I did next, by creating the CircuitPython_bambulabs library. This is the first time I've ever created a library and I'm following along with both the Learn Guide and the design reference. Parts of the Learn Guide are outdate (hello Ruff), but overall it hasn't been bad, though I loathe writing reStructured Text and much prefer Markdown. At least the cookiecutter setup makes it easy to edit.

Assuming you've got all the settings correct in settings.toml, the library handles the MQTT setup and querying the printer to get the JSON response and breaking down that response into individual methods.

It is also possible to send commands to your printer, for example to set the bed temperature or turn the light on or off. I purposefully did not include commands, this library is only for viewing the various status messages available from the printer.

I created a simpletest that connects to the printer and prints to serial a nicely formatted list of all the information returned from the printer and a raw dump of the JSON.

The GitHub Actions for the library are currently failing as it doesn't import the bambulabs library or the wifi module. I'm not sure why yet and have asked for some help. If you want to test it out, you can clone the repo and copy the bambulabs.py file to your /lib directory or the root directory of your CircuitPython microcontroller.

When the library is finally published and is available via circup, I'll post an update to the blog. And if you have any feedback, please let me know by dropping me an email or leaving an issue or comment in the repository.