Skip to content

Blog

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.

What I'm Watching - Q4 2025

Wrapping up the year, here's everything I watched in October, November, and December, excluding sports. Because there is a lot of football that isn't accounted for, which is why my total watchlist is down. Well, that and a bit of gaming took out a chunk in November and I was traveling half of December.

I plan on continuing to track my watchlist monthly, though I'm unsure if I'll keep blogging it. A small part of me is tempted to do what Steven Soderbergh does, and track everything. But I probably really don't want to know how much time I spend watching baseball and football.

Highlights include K-Pop Demon Hunters, Peacemaker S2, Task, Wake Up Dead Man, One Battle After Another, and Pluribus. I was disappointed with A House of Dynamite, The Roses, Relay, and Good Fortune.

Legend:

  • The Criterion Channel = *

  • 4K UHD = +

  • AppleTV+ = ^

  • Netflix = ~

October

  • Peacemaker S2
  • K-Pop Demon Hunters~
  • Task
  • The Parallax View (1974)*
  • Punch Drunk Love (2002)*
  • Mission: Impossible (1996)+
  • A House of Dynamite (2025)~
  • Platonic S2
  • The Roses (2025)

November

  • The Toxic Avenger (2025)
  • Chad Powers S1
  • Panic Room (2002)*

December

  • Tron: Ares (2025)
  • A Man on the Inside (2024) S1~
  • Parish (2024)~
  • Fatman (2020)~
  • Good Fortune (2025)
  • One Battle After Another (2025)
  • Relay (2024)
  • Mayor of Kingstown S1
  • The Running Man (2025)
  • Wake Up, Dead Man (2025)~
  • F1
  • Pluribus (S1)
  • The Copenhagen Test S1
  • Dogma (2000)+

Favorite Albums of 2025

Favorite Albums of 2025

Like 2022, 2023, and last year, here’s my favorite albums and releases of 2025 in no particular order:

  • Album of the year: Haim, I Quit: This album was released at the perfect time and became my go to album of the summer. Fantastic from start to finish.
  • Best reissue: Mother Love Bone's Shine and Apple. Not only are they newly remastered, they sounded great streaming and then the records came out and sounded just as good. If you don't know the history of Pearl Jam, look up Mother Love Bone and give them a listen.
  • Best Soundtrack: Nine Inch Nails, Tron: Ares. It was like peanut butter and chocolate - NIN and Tron go perfectly together and they nailed (no pun intended) the soundtrack.
  • Favorite Surprise: Craig Finn, Always Been. As much as I love, love, love The Hold Steady, I've never been able to get into Craig Finn's solo work. But this album - Craig's stories combined with The War on Drugs as his backing band was really something special.
  • Favorite throwback: Momma, Welcome To My Blue Sky. Every review you read of Momma's first album or this follow-up mentions their throwback sound to the 90s indie scene. And they're right - and it works.
  • Favorite local release: Poliça, Dreams Go. The band's seventh record, and final album with bassist Chris Bierden, who is unable to play with his brain cancer diagnosis, did not disappoint.

That's just a few of my favorite albums and releases of 2025. Here's to 2026.

My Own Steam Machine

My Own Steam Machine running on my 75" TV

Valve announced the Steam Machine earlier this month, a sqaure console-like PC that’s meant to hook up to your TV to play all your games in your Steam Library. My gaming PC is a loaner from my best friend, whose hand me downs were still better than what I had at the time. He’s upgraded again, and I have his latest hand me down. So my youngest gets his gaming PC upgraded with my old PC and now I have his old PC as an extra PC. Still with me?

So I decided to make my own Steam Machine and hook it up to my home theater with this older, extra computer. SteamOS is Arch Linux based and is really meant for Valve’s hardware, not for everyday PC use.

But Bazzite is. Bazzite was co-create by Jorge Castro, whom I met many years ago at a conference and still follow on Mastodon. It’s been fun watching him build a Linux distro and the community around it.

Bazzite is a spinoff of Project Bluefin a next generation Linux desktop based on cloud native principles, with tools to run everything as a container. Both Bazzite and Project Bluefin are spins of Fedora, which just happens to be my favorite Linux distro. But it’s actually an atomic desktop. Atomic desktops remove a lot of the friction and pain of the Linux desktop you may think you know, and Bazzite and Bluefin take that to the next level. They utilize Homebrew and Flatpack for installing command line and graphical apps respectively - no more dealing with your distro’s package manager. (I'm over simplifying and I won't pretend I understand all of it myself, but I've been using Linux for over 20 years, and this is the best experience yet).

Bazzite is meant to run on handhelds, desktops or laptops, and home theater PCs.

But you don’t care how it works under the hood - you want to know does it work?

To install Bazzite, you must answer three questions:

  • What version of Bazzite? (Handheld, PC, or Home Theater PC)
  • What GPU? (AMD, Nvidia, etc.)
  • GNOME or KDE (GNOME is always the correct choice)

This older gaming PC is running an AMD 5700XT and after successfully installing Bazzite, SteamOS would error out with an obscure error about user namespaces needing to be enabled and would drop me to the GNOME desktop (which I forgot how much I’ve missed). It looks like this is related to having two SSDs in the box. So I did what you should never do and typed in a command I found on the internet and it worked! On my next reboot, I was presented with Steam running in Big Picture Mode.

When I was first researching doing this, Steam has a page that shows you which of your games should work in SteamOS. I thought I had about 20 games that were compatible as I missed the “Show More” button on that page. So imagine my surprise when I booted up Bazzite and saw that I had 127 out of 177 games available to be installed on SteamOS. A lot of these are indie platformers I used to buy on Humble Bundles, but I’ve got some good platformers in there to play like Hollow Knight, Braid, and more.

Kudos to the Bazzite developers - it was a breeze to install and even easier to use, all with a Bluetooth Xbox controller.

Next up is to carve out some time to play the games and see how performance is. And, of course, how comfortable it is playing from the couch.

The Zoom Podtrak P4Next

Zoom Podtrak P4Next

This falls into the category of a want, definitely not a need, but I picked up a new audio interface for podcasting. I've been using a MOTU M2 audio interface since I started podcasting a few years ago. It features two MIDI inputs that also work as an XLR input, which higher quality microphones that aren't USB use. I've been keeping an eye out for a new audio interface as I've been slightly disappointed with the gain level of the MOTU M2 - when recording, I would often have to apologize for the low volume.

I had been keeping an eye out on Rode interfaces, but there was no way I'm paying that much for a hobby. Then I saw someone on Reddit share the Zoom Podtrak P4Next as it was up for pre-order. After some research, I decided to give it a try, especially as it was only $179 and I think I can re-sell my MOTU M2 for about $150, less eBay fees, so it's not a super expensive upgrade.

The Zoom Podtrak P4Next features four XLR inputs, four USB inputs, and four headphone outputs. Additionally, it includes a built-in preamp and phantom power, so it's compatible with both dynamic and condenser microphones. What really got me interested was that it has a built in EQ and compressor, as well as a new "AI" feature to help remove background noise. Last, but not least, it features a microSD card and can be powered off batteries for recording on the go without a computer. This will be perfect for my unrealized dream of someday recording an episode of The Bootloader in person with Todbot - I even have a second XLR microphone to use!

Zoom's site still shows an expected date of December 5th before it's available. I pre-ordered mine from B&H Photo, which says coming soon, and I was shocked when it showed up on November 6th. I'm guessing I'm one of the first people to have one and I hope there wasn't an embargo to get B&H in trouble!

Of course I haven't been recording many podcast episodes since I got it, but I did use it for some of my intros and outros for some upcoming episodes and next week's recording of The Bootloader will use it as well. My early opinion - to my untrained ears, my voice sounds slightly warmer. I have a lot more testing to do, especially with the AI noise reduction feature.

Overall I like it - it's slightly smaller than a current gen Mac Mini and feels well constructed. The menu system is intuitive and it includes some nice accessibility features. It has better gain as well, as I noticed I barely had to adjust my volume in my DAW after recording. I'm looking forward to playing with it some more.

I've re-opened the podcast sponsorship page on GitHub and PayPal. The Sponsors page includes a list of current and past sponsors and the cost breakdown for running the podcast.

If you're curious, it costs about $400 / year for the podcast. From the Sponsors page:

Cost breakdowns - annual fees

  • Podcast hosting (Castopod.com): $120 / year
  • Video recording (Boomcaster.com): $240 / year (Referral link)
  • Calendar and scheduling for guests (Fantastical): $60 / year

Miscellaneous costs (one-time):

  • Reaper digital audio workstation: $60
  • Hush audio app: $90

Thanks for your support - and stay positive!

What I'm Watching - Q3 2025

Continuing on my journey to catalog everything I'm watching, here's what I watched in the third quarter of 2025. Highlights included the first six James Bond movies on 4K UHD, Tron and its sequel Tron: Legacy in 4K UHD, and some great movies on Netflix including some Alfred Hitchcock films I had never seen, and on The Criterion Channel, 90s movies featuring great soundtracks including Pump Up The Volume (1990) and Grosse Point Blank (1997). I was disappointed in Materialists and 28 Years Later.

Legend:

  • The Criterion Channel = *

  • 4K UHD = +

  • AppleTV+ = ^

  • Netflix = ~

July

  • Wild Things (1998)*
  • The Bear S4
  • Your Friends and Neighbors S1^
  • Heads of State (2025)
  • Thunderbolts* (2025)
  • Murderbot S1^
  • Ironheart
  • Georgie and Mandy’s First Marriage S1
  • Duster
  • The Man Who Knew Too Much (1956)~
  • The Old Guard (2020)~
  • The Old Guard 2 (2025)~
  • Goldfinger (1964)+
  • Psycho (1960)~
  • Miami Vice (2006)*
  • Poker Face S2
  • The Long Goodbye (1973)*
  • Out of Sight (1998)*
  • Rear Window (1954)~
  • Copycat (1995)*~
  • Insomnia (2002)*
  • The Birds (1963)~
  • Black Doves S1~

August

  • Thunderball (1965)+
  • Freaky Tales (2025)
  • Pump Up the Volume (1990)*
  • Platonic S1^
  • Red-eye (2005)
  • You Only Live Twice (1967)+
  • Gross Pointe Blank (1997)*
  • Superman (2025)
  • Peacemaker S1
  • Diamonds are Forever (1971)+
  • Rick and Morty S8
  • Fringe S4
  • Mission Impossible: Dead Reckoning Part 1 (2023)+
  • Mission Impossible: The Final Reckoning (2025)
  • Materialists (2025)
  • The Graduate (1967)*
  • Inglourious Basterds (2009)
  • The Long Kiss Goodnight (1995)+

September

  • Nobody (2021)
  • Nobody 2 (2025)
  • Ballerina (2025)+
  • Weapons (2025)
  • Fringe S5
  • 28 Years Later (2025)~
  • Tron (1982)+
  • Tron: Legacy (2010)+
  • Star Trek: Strange New Worlds S3
  • Alien: Earth S1
  • The Naked Gun (2025)
  • Miami Blues (1990)*

Updating SongMatrix

One of my favorite CircuitPython projects I've done is SongMatrix. Using a microphone on a Raspberry Pi, it records the song playing in the background, uploads a sample to shazamio, uploads the song and artist to AdafruitIO via MQTT, and an S3 MatrixPortal listens for the MQTT update and displays it on an LED matrix.

I don't run it all the time, but I do like to use it when I'm listening to a new album to learn the song names. I know a lot of music and can sometimes tell you the name of the artist or the album within seconds of a song starting, but not so much the song title.

I'm using a 2.5mm pitch LED Matrix and I have not found a lot of 3D printed cases for either one or two LED matrices. That is, until a few months ago when I came across the Transit Tracker project from EastsideUrbanism.

It uses two LED matrices in a beautiful 3D printed cases that hold both of them and the S3 MatrixPortal and screws together. I printed it out months ago but couldn't get SongMatrix to work with 2 matrices.

In theory, I should be able to update the MatrixPortal library by changing: matrix = Matrix(width=64, height=32, bit_depth=3) to matrix = Matrix(width=128, height=32, bit_depth=3) But no joy. I started over with some simple test programs, and I could get a 128x32 matrix to work without a problem, but as soon as I tried in my original program it did not work.

Next I tried to replace the MatrixPortal library by using the pins directly. Success! But now it doesn't scroll across the matrix, it's just a static display. It turns out that using ScrollingLabel only scrolls when the character count is larger than the max_character when setting the text:

title_scroll = ScrollingLabel(
    terminalio.FONT,
    text=song_title_scroll,
    max_characters=20,
    color=0xff0000,
    animate_time=0.3
)

To get it scrolling, I just did a len on the string returned from AdafruitIO and added a string of spaces to get over the 20 character limit to scroll it.

But the weirdest part? The original program scrolled the text with less than 10 characters. I tried to recreate it with a basic ScrollingLabel example, and of course I couldn't get it to work. Don't believe me? You can see the original scrolling the band Metric which shouldn't be scrolling on the project's GitHub page.

What I'm Watching - Q2 2025

Continuing on my journey to catalog everything I'm watching, here's what I watched in the second quarter of 2025. Highlights included kicking off April getting ready for Andor S2 by re-watching the Star Wars Prequels, Obi-Wan Kenobi, and Andor S1. I celebrated the life of Gene Hackman with Night Moves, The Royal Tenenbaums, and Runaway Jury. Other movies I enjoyed included The Long Good Friday, Tombstone, and starting to watch the classic Sean Connery Bond films on 4K UHD.

Legend:

  • The Criterion Channel = *
  • 4K UHD = +
  • AppleTV+ = ^
  • Netflix = ~

April

  • Star Wars Episode 1: The Phantom Menace (1999)+
  • Star Wars Episode 2: Attack of the Clones (2002)+
  • Star Wars Episode 3: Revenge of the Sith (2005)+
  • White Lotus S3
  • The Cleaner (2024)
  • Obi-Wan Kenobi+
  • Vanilla Sky (2001)*
  • Fringe S2
  • Mickey 17 (2025)
  • Andor S1+
  • Sneakers (1992)+
  • SportsNight S1

May

  • A Working Man (2025)
  • Showgirls (1995)*
  • Tombstone (1993)+
  • Strange Days (1995)*
  • The Long Good Friday (1980)*
  • Shutter Island (2010)*
  • Rosemary’s Baby (1968)*
  • The Insider (1999)*
  • Blue Steel (1990)*+
  • Andor S2
  • Rogue One (2016)+
  • Fountain of Youth (2025)^
  • The Handmaid’s Tale S6
  • Shampoo (1975)*

June

  • The Righteous Gemstones S4
  • Fringe S3
  • Sinners (2025)
  • The Taking of Pelham 123 (1974)*
  • The Accountant 2 (2025)
  • Coogan’s Bluff (1968)*
  • L.A. Confidential (1997)*
  • Night Moves (1975)*
  • Runaway Jury (2003)~
  • Predator: Killer of Killers (2025)
  • The Last of Us S2
  • Dr. No (1962)+
  • Heathers (1988)*
  • Havoc (2025)~
  • The Studio S1^
  • The Fog (1980)*
  • Sports Night S2
  • Lethal Weapon (1987)+
  • Deep Cover (2025)
  • From Russia With Love (1963)+
  • Shrinking S2^
  • The Royal Tenenbaums (2001)
  • Paper Moon (1973)*