As of this writing I have two Heltec V3 Meshtastic nodes that I use to gain access to the greater Meshtastic network in my area. One is installed at a static location, the attic of my house, while the other one is either in my office or I take it with me. I interact with it using the Meshtastic software on my phone or on my desktop computer. One of the features of Meshtastic is to advertise some node metadata including location. My more mobile node gets my current coordinates from the Meshtastic client connected to the node over Bluetooth, but the static node has no way to know its location so I must tell it. In this post, I will walk through how I advertise a static location for the node installed in my attic as it wasn’t as straightforward as I initially thought it would be.

While it isn’t necessary to advertise the location of your node, it is useful because it helps provide some indication as to how your messages are traveling. You also don’t need to advertise a perfectly precise location though you shouldn’t advertise it as being somewhere on the other side of the planet. I am making some heavy assumptions, primarily that you already know how to install the Meshtastic command line client. If not, take a look at the directions available at https://meshtastic.org/docs/software/python/cli/installation/. It is possible to configure the node without using the command line client but I don’t cover that here. I use the command line client because my static node is connected to a raspberry pi via USB which powers it and allows me to manage it that way.

Getting and setting your coordinates

Before you can set the coordinates for a Meshtastic node, you need to know what they are expressed as a latitude longitude pair. I found that the simplest way is to use google.com/maps, look for the location you want to advertise and get the latitude and longitude values from. To do so, search for the location, right click where you want to advertise and click the top pair of values which will copy them to your clip board. Next, modify the following script to suite your needs to set the values on your Meshtastic node:

#!/bin/bash

meshtastic --port /dev/ttyUSB1 --set position.fixed_position True
meshtastic --port /dev/ttyUSB1 --set position.gps_mode 2
meshtastic --port /dev/ttyUSB1 --set position.gps_enabled False
meshtastic --port /dev/ttyUSB1 --set position.gps_update_interval 300
meshtastic --port /dev/ttyUSB1 --setlat 45.126 --setlon -93.488 --setalt 1

Google will provide very precise coordinates but keeping 3 to 4 places of precision is plenty. One key thing to remember is that, despite what the command line help will tell you, you should set the altitude to something other than nothing or 0. You can provide a proper altitude in meters above sea level or simply setting it to 1 will suffice. Depending on your setup, you may not need to specify the port. I show my port for reference as the Pi the node is connected to has other USB devices attached.

After configuration, your node will begin to advertise its position as often as you configured it to using the gps_update_interval value. You can modify this to suit your network.

Bonus content

Keeping with our scripted methods of managing a Meshtastic node, here is a bit of bonus content. I also set a name for my static node so it is easier to identify consistently on the network. If you ever need to factory reset your node and want to set the name again (if you don’t have the config saved or whatever) then this simple script will help:

#!/bin/bash

meshtastic --port /dev/ttyUSB1 --set-owner "MOONBASE" --set-owner-short "R2D2"

This will set the name of your node easily. You can combine these steps into a larger script to help maintain your node more easily.

Flux, or FluxCD, is a “set of continuous and progressive delivery solutions for Kubernetes that are open and extensible” and is my preferred way to do “GitOps” in my Kubernetes clusters. I like Flux because it handles Helm extremely well (I’m a big fan of Helm) and allows me to have a simple fallback if something goes wrong. In this post, I will go through the process of installing flux, k3s that can be used for testing and then creating a Flux project that adopts Flux’s documented monorepo design. I have also published a copy of the work detailed here to Github so you can use as a working starter for your own project.

Continue reading

I previously touched on how I use CarPlay and I promised to provide some details on how I configure and use Home Assistant with CarPlay. For this to work, you must have the Home Assistant companion app installed from the App Store. Also, although I will not directly discuss the Android based app and Android Auto, it is my understanding that all of this is the same or very similar on that platform. Once the companion app is installed, Home Assistant will be shown as an icon on your car display. Opening the app will show you some (configurable) options include one for Quick Access. The Quick Access is where I am concentrating today.

My personal use case for how to use Home Assistant through CarPlay is, while limited, a huge quality of life improvement. I have also previously discussed the Rage Against the Garage Door Opener (RATGDO) device which allows me to tie my Chamberlain based garage door openers into Home Assistant. The CarPlay integration is huge because it allows me to control the garage doors extremely reliably unlike when I use the official remote. My house is wrapped in foil lined insulation as well as metal siding which greatly attenuates the RF signal from the remote leading to some very frustrating moments trying to get doors to open or close. As long as my phone has an internet connect, I can see the status of and control both garage doors on the house without issue.

Out of the box, you will see four icons across the top of the screen when you start Home Assistant. Personally, I find the default setup to be cumbersome and confusing but that would be more about how I have my Home Assistant configured than anything.

Let’s setup a Quick Action. To get started, first open the companion app and find settings. Then open CarPlay (or Android Auto)

screenshot of the CarPlay screen editor for home assistant

You can use the Tabs fly out to configure what tabs appear on your car display and in what order. To add an item to Quick Actions tap on Add item.

Here is where you can add specific entities, scripts, scenes or iOS Actions. iOS Actions is a deprecated way of adding items to CarPlay and unless you specifically need to have actions for your iOS device, I would avoid setting them up as it requires a lot of extra steps. For my use case, I simply want to have quick access to my garage doors so I am adding those entities directly by searching for the name of the entity.

a search field filled in with garage showing some results that match

This is where it can be tricky because a number of entities can have the same name but be different resources in Home Assistant. In fact, it took me a bit of trial and error to find that I wanted to add “Dustin’s Garage Door” that had the “curtain” icon. This entity, with the oddly chosen icon, is the correct one to control the door. On this screen, you can also customize what the icon color will be as well is if you want to require confirmation before performing the action.

screenshot of iOS companion app showing the name of the item being added. The name of the item is dustin's garage door

After making your selections tap on add. Once added, save your settings and the next time you connect to CarPlay you will have access to your chosen entities. Below is a screenshot showing that I can see the status of my door as well as control it by simply tapping on it.

screenshot of CarPlay showing 3 items, two garage doors and one garage light

You can add any entity, script or scene to quick actions and as many as you are willing to scroll the screen through. Having Home Assistant available like this in my car has been a big quality of life improvement and I imagine anyone that has remote locks or other automations will appreciate being able to check on the status of and control those items right there on the radio.

In a previous post, I detailed the audio upgrade I did on my 2015 Mazda 6, where I replaced the stock radio with a new Sony unit that featured CarPlay and Android Auto. Today I am talking about the ways that I am getting the most out of CarPlay.

There were several reasons I wanted to upgrade the stock radio in my car to something that had CarPlay, and while I knew that CarPlay would provide a better experience, CarPlay has been far better than I imagined. The stock radio in my model-year Mazda did not have maps and had a call/texting experience that was basically unusable. The Bluetooth system was, while usable, also slow and just overall poorly executed. CarPlay, on the other hand, continues to impress me with how low-friction the experience really is. Text messages arrive and are read immediately while perfectly ducking or pausing the audio of whatever is playing. Voice commands work extremely well and are very rarely misinterpreted. Phone calls also flow into the system very well, pausing the music as expected and resuming music again when the call is over. I simply cannot explain adequately enough how good the experience is; it is something you must experience. On the surface, this sounds like what basically any stock radio does in a modern car (sans CarPlay), but it is so much smoother than I have seen before. And, based on input from a friend of mine, Android Auto is nearly identical in (as a baseline) to CarPlay in its ability to provide a seamless and well-executed experience.

Outside of the core CarPlay experience, there are two apps I want to specifically bring to light. They are Plexamp and Home Assistant. These two apps are definitely niche, as not everyone collects music and stores it on Plex. Most people are probably using a streaming service, and not everyone is running Home Assistant. However, both apps have proven indispensable.

Plexamp

First, Plexamp. Plexamp, which I have written about in the past, is software that connects to a Plex Server instance with a focus on music playback. This means Plexamp offers a more streamlined music handling experience, including easier navigation, larger cover art display, gapless playback and a lot more. These features alone make Plexamp a great music player, but what really makes it special is the inclusion of an in-car experience through CarPlay (or Android Auto). With Plexamp, I am able to rip my CD collection and make it available wherever I have an Internet connection. Alternatively, I can download albums locally to my phone and play music offline. While other streaming services exist, and I am in fact a Spotify subscriber, I prefer Plexamp in my car because I have found it is generally better at remembering what I was listening to and resuming playback whenever I get into my car. Spotify remains my preferred way to discover new music, and I do sometimes use it in the car. I just find Plexamp to be a better experience overall.

Unlike the main Plex application, Plexamp requires a Plex Pass, which is an added cost on top of the hardware and storage required to run Plex and store your music.

Home Assistant

Home Assistant is open source home automation software that I have used for years. Home Assistant is definitely a “you get what you put into it” type of platform. While it can tie together a lot of different home automation tools, and a lot of progress has been made in making it more user-friendly, some aspects of it can be a bit cumbersome. Case in point, using Home Assistant via CarPlay leans a bit more on the cumbersome side of the equation, but with a bit of effort, there is some great stuff to be done here. How I am leveraging Home Assistant in CarPlay is by creating actions that allow me to control my garage doors. In a previous post I covered Rage Against the Garage Door Opener and this takes it a step further by allowing me to control the door using a soft button on my screen. This completely solved the range issues I was having with the original controller, and it allows me to double-check the status of the door easily. Below is a screenshot of the “Quick access” interface of Home Assistant. In the app, this is called “Actions.” In a future post, I will go into detail on how these are done as it is not immediately obvious.

Screenshot of Home Assistant’s CarPlay interface

I hope you find how I use CarPlay interesting and I will expand on this more in the future, particularly how Home Assistant can be used from within the car.

Computer professionals all know that secrets like API keys and passwords for services must be kept safe, but it isn’t always clear how to do so in a way that isn’t overly cumbersome. In this post, I am going to go through how I achieve this on macOS using GnuPG. I’m using GnuPG because I use both macOS and Linux on a regular basis. I also share my dot files across systems and GnuPG is the most cross platform option available that I am aware of. Although the solution I am using is cross platform, I am describing how to set this up using a Mac.

For this solution, I am leveraging a number of tools, which I’ve listed below. I assume that if you are the sort of person that has need for API tokens in your shell, you are likely also using brew. Here is what you want:

  • GPG Suite – This is optional but highly recommended. It provides a nice GUI for interacting with GPG and, more importantly it provides a way to tie your GPG passphrase to your Apple Key Chain to unlock it. This makes everything much smoother.
  • GPG – brew install gpg provides the command line tools you will need to manage your passwords or API tokens
  • pass – brew install pass provides the command line password tool.

Initial Setup

If you have not used GPG before then there are a few steps you need to take to get things setup.

IMPORTANT: If you are going to use GPG Suite then you will want to start the initial setup using GPG Keychain. Doing so will ensure the gpg command line tool can also see the key(s) you create. If you start with GPG on the command line, or were already using it, you will want to delete all of the .conf files in ~/.gnupg so that the command line client and GPG Keychain are working together.

Using GPG Keychain is an added bonus because it allows you to store your GPG credentials in the Apple Keychain. The Apple Keychain is unlocked whenever you log into your Mac. It isn’t necessary, but it is convenient.

Once you have created your GPG key you can initialize your pass database. First, get the ID of your GPG key. You can use gpg --list-private-keys and get a list. The value you are looking for will be a set of random characters. Then, initialize your pass database with the command below, replacing the ID with your key’s ID:

pass init 21D62AA0B018951161C3CC46E94469CDDCA62DF0

You will get a message that your password store has been initialized. There are other ways to initialize your pass database like storing it in git. You can read more at https://www.passwordstore.org

Adding a secret value to pass

Adding a value to your pass database is simple. Run:

pass insert key

key is the name of the secret you want to store. Press enter and then put in the value. You can organize your keys however you want by separating them using / like a directory separator.

Using the secret value

Using the secret value is equally simple. Since your KeyChain is unlocked when you sign into your computer you should have no issues retrieving the value in a similar way as adding it. Simply use the following command to get the value, adjust the command for your use case:

pass show key

Again, key is the secret you want to retrieve.

Putting it all together

This is great but we can make this more convenient by adding this to our shell startup scripts. On my system, .bash_profile and .bashrc are both processed. In my .base_profile I have added the following to get secret values from pass and assign them environment variables that various programs I use use in order to connect to services. Continuing my example of working against Proxmox, I have entered this into my .base_profile:

export PROXMOX_PASSWORD=$(pass show proxmox_password)

Since I am using GPG Suite, my GPG passphrase is loaded from my Mac’s Key Chain system once I have saved the pass phrase to it (you are asked the first time you decrypt a value). This way, my start up scripts do not contain any sensitive information and my environment is built from securely stored values.

Either around the time I got my brakes replaced, or while I had the battery disconnected to install the new radio, my transmission seemed to pick up a bad habit. Under 35 mph, pressing the brakes would often result in an aggressive downshift making it feel like you pressed the brake pedal even harder. For the most part, this is expected behavior for Mazda’s Skyactiv transmission, but it shouldn’t be so jarring. The video embedded here describes a procedure to tell the car to initiate a relearning or calibration process for the transmission that can help in some cases. I was able to get my car to run the calibration without issue, and while I can say it definitely caused a change in behavior, I can’t say it fixed the harsh downshift 100% of the time. It still happens but much more rarely now.

If you have even a passing concern about the way your Skyactiv Mazda transmission is behaving, this is a very easy step you can try first. The channel is filled with a lot of information and is also worth watching.

breville barista express machine

For about a year I have been making espresso based drinks at home. Coffee, and coffee based drinks, is not something I got interested in until after Covid but my appreciation of it has grown over the years to the point where I found it was better financially to make it at home than buy it daily from a local shop. In this post I am going to discuss the equipment and accessories I have found success with and why you may or may not want to do the same at home. I am not going to get into how to use this equipment as there is a lot of content on YouTube to choose from. One of the best is James Hoffman.

The drinks I make are mostly mochas and occasional lattes, both hot and iced.

Major Equipment

Cutting right to the chase, I went with a Breville Barista Express. I did a lot of research at the time and I wanted to be sure that if I didn’t like making espresso at home, it wasn’t because I selected bad equipment. The Breville seemed to be well regarded for a home machine that had a built in grinder. It is the right size, I liked the look of it and it is capable of making excellent espresso based drinks. Having the built in grinder was a plus for me because I have limited space available.

Pros of this model include:

  • built in grinder works well
  • easy to fill hopper and water tank
  • easy to empty water tray
  • brew head and steam system heat up quickly
  • programmable volumetric controls
  • double and single shot baskets as well as pressurized baskets for pre-ground coffee (though I don’t recommend using pre-ground)
  • includes accessories like tamper and milk jug

Cons of this model include:

  • the steam wand is not cool touch
  • being a single boiler means the steam is slow

Bottom line, this is a great machine for a beginner or at home barista that wants to get everything covered with a single purchase. You can technically get just this, your choice of beans and get started. That said, if I were to start over I would consider a dual boiler machine, even if that means an external grinder, just so that steam performance is better.

Accessories

While the Breville includes everything you really need to get started, I wanted to further improve my enjoyment of the process. Here I’ll go through the accessories I use.

Milk Pitcher

Having a milk pitcher that includes measurements right inside the pitcher is very helpful. The pitcher included with the Breville is unmarked so you are left guessing how much milk to use. There are many copy cat pitchers on Amazon, but I am using this “Adorever” one.

Thermometer

Getting a consistent milk temperature is hard to do without a thermometer. This one with a clip and little zones telling you the ideal temperatures is easy to use and works perfectly. Clip it to the side of the milk pitcher while frothing the milk.

Funnel

I find using a funnel an absolute must if you want to keep your area clean. Even without the funnel you’re going to make a small mess but the funnel makes it much easier to keep the grounds in the basket. I selected this funnel because it fits the Breville portafilter and the grinder spout perfect. While I am linking to the stainless steel version it is no longer the only version available. The aluminum one will work just as well and costs less, the important part is the funnel makes it much easier to get the grounds from the grinder and into the basket.

Puck Screen

Venturing into “less necessary” territory we have a puck screen. The linked to item is designed to fit the size of portafilter the Breville uses, at 54mm. A puck screen goes on top of the tamped coffee grounds and primarily works to keep the water screen of the group head clean longer. In my opinion, it has rather debatable benefits beyond that.

WDT Tool

The Weiss Distribution Technique tool is another item that has debatable benefits but I do find it makes it a lot easier to tamp the grounds so that they are more even. I use the tool to help ensure the grounds are spread more evenly in the basket though you may find a leveling distribution tool works better.

Basket Removal Tool

I have found that removing the basket in the Breville portafilter to be a bit on the difficult side. This little tool makes it much easier to remove the basket for cleaning.

Scale

Having a scale is a must for getting your espresso shot setup properly. Without a scale you are really flying blind and hoping for the best. Each brand and type of bean will require you to setup the machine just a bit differently to ensure you are getting the right flavor from the coffee. Using a scale helps ensure all your ratios are correct. This link is for the scale I have but any scale that has a fast response time and a built in timer will work just as well.

Bottle Pourers

If you don’t want to use a pump for flavors you might consider some pourers to make it all easier. This pack includes a good number of pourers that work well with most syrup bottles. For syrups and sauces, I use mostly Monin but Torani can be easier to find in stores.

Measuring Shot Glass

I use two different, small measuring cups during my brew process. The first one is a 3oz shot glass with measuring lines. This shot glass allows me to measure out syrups and sauces with ease to ensure I get just the right ratios. For the espresso shot I use a small cup that includes measuring lines that is still wide enough to catch the output from the portafilter spout. This helps me see what the liquid output is.

Finishing Up

Ok, that was actually more than I thought it would be. Again, not everything here is necessary but I find these products help make the process of brewing espresso easier and more enjoyable!

Disclaimer: This post contains Amazon Affiliate links. If you purchase something from Amazon using a link I provided I will likely receive a commission for that sale. This helps support the site!

One of the more frustrating changes in the past year was the Chamberlain group removing access to their APIs for third parties. This meant I could no longer see the status of my garage door openers or control them using Home Assistant, which is my preferred method for doing home automation. In this post, I am going to discuss how I got around this using a device called “ratgdo.”

Ratgdo is a micro-controller based device created by Paul Wieland to control “virtually any residential Chamberlain or Liftmaster manufactured garage door opener and also offers basic support for other brands which use dry contacts to control the door.” The device is a custom made PCB that connects to the terminals on the garage door opener and, using various protocols like esphome, Apple Homekit, MQTT and more, allow you to see the status of the door and control it.

Setting up the device was quite simple. I started by connecting it to my computer using the included USB cable and visited the firmware installation page. Since I am using Home Assistant I opted for the esphome method. After selecting my board I clicked the connect button and it flashed the device with the proper firmware. After that, Home Assistant saw the new esphome device and offered to set it up. From there I setup the buttons and integrations I wanted and I was done.

If you are looking for a way to add some smarts to your garage door opener the ratgdo device is a fantastic way to do it and I highly recommend it. The prebuilt PCB costs about $45 (as of this writing) but is a quick and easy way to get going without a lot of fuss.

After installing a Sony XAV-AX6000 head unit and getting everything setup I decided I want to go the next step and add a subwoofer. Not because the Sony ruined the sound by any means, it just gave me the itch to get even better bass. I don’t really want to give up trunk space so I decide to try the JBL BassPro Hub since it fits in the spare tire but still offers a very respectable 11″ woofer. Unfortunately, I didn’t measure everything before I ordered it and I found that it doesn’t not fit properly in the space where my spare tire is on my 2015 Mazda 6 Touring. Hopefully owners of this car looking into this option don’t make the same mistake I did.

Disclaimer: This post contains Amazon Affiliate links. If you purchase something from Amazon using a link I provided I will likely receive a commission for that sale. This helps support the site!

Photo of the stock Mazda radio

I have driven a 2015 Mazda 6 Touring with the non-Bose stereo since it was new and the number one complaint I have had is the stock radio. Mazda only offered this style of deck in the 2014 and 2015 model year 6 and then replaced it with a better, more capable unit in 2016. To say this deck is bad is an understatement. The only redeeming quality of this deck is that it is a double din sized unit that can be replaced at all. Even at the time of release this deck was a bit behind on technology including support for Pandora, iPod and USB sticks with music. Everything other than the CD player and FM/AM radio was very poorly implemented. iPods were already almost entirely replaced by smart phones at time of release yet it could rarely actually load music from an iPod or an iPhone running Music.app. Reading music from a USB took ages and browsing the music cumbersome, not to mention who wants to manage music on a USB stick? Pandora? I don’t know anyone who uses it. The CD player did work but showed the bare minimum information on the screen. Contrast this to my wife’s Toyota van which could often show cover art and just looked much more slick overall.

It would have been ok if the bluetooth implementation wasn’t riddled with bugs and annoyances. Starting the car and waiting for bluetooth to connect to your phone took minutes, sometimes several. Once it did connect, it would often fail to play music properly by either refusing to do anything or acting like it was playing but lacking any audio. If you were on a call when you started the car you would be presented with a crash/boot loop where the car would take over the call, crash sending the call back to your phone only to steal it away again when it started. This would loop forever until you ended the call. Once it was playing music it couldn’t tell you what track number you were on or the amount of time spent playing. The track number was something random and the timer always sat at 0:00. Moving between tracks was glacial with at least a second spent waiting for the song to change, including the title shown on the display. Overall the experience was subpar in every way.

All that said, I felt trapped into keeping the deck because it was responsible for controlling some configuration settings of the car including daytime running lights, door locking behavior and more. I had basically given up all hope of replacing it because I didn’t want to create new issues or lose steering wheel controls.

It wasn’t until 2024 that I learned there are devices that allow you to better integrate aftermarket decks with modern cars allowing you to keep your steering wheel controls and continue to access vehicle settings. I decided it was time to finally replace the stock deck. In this post I will detail what products I used to replace the stock radio in my 2015 Mazda 6 and what I learned throughout the installation process.

Continue reading