<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>William Reading</title>
    <description>20+ years of lazy internet blogging.
</description>
    <link>https://www.williamreading.com/</link>
    <atom:link href="https://www.williamreading.com/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Wed, 05 Aug 2026 16:32:04 +0000</pubDate>
    <lastBuildDate>Wed, 05 Aug 2026 16:32:04 +0000</lastBuildDate>
    <generator>Jekyll v4.4.1</generator>
    
      <item>
        <title>Travel: Water Filtering</title>
        <description>&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;Despite the introduction of filtered water fill stations, it’s still annoying to get filtered water in a lot of hotels or at an airport. There’s existing solutions for outdoors use, but they often don’t have carbon filtration. There’s also existing solutions for travel use, but they’re usually only carbon, and don’t have ion-exchange resin for improved taste. You can buy pitcher filters that do this, but packing a water pitcher takes up a lot of space and you can’t as easily have it in a backpack. Hotels usually do have bottled water, but even if it’s free, it’s hard to get as much as you might want, and there’s a lot of waste.&lt;/p&gt;

&lt;p&gt;Before we get started, note that this is only for filtering biologically safe water. If the water is unsafe, then I’d suggest a &lt;a href=&quot;https://www.ebay.com/sch/i.html?_nkw=steripen&quot;&gt;SteriPen&lt;/a&gt; to sanitize it. If the water is cloudy, this isn’t going to work so well, so you’ll need to add a flocculant such as &lt;a href=&quot;https://www.google.com/search?q=P%26G%20Purifier%20of%20Water&amp;amp;udm=28&quot;&gt;P&amp;amp;G Purifier of Water&lt;/a&gt; first before further treating it.&lt;/p&gt;

&lt;h2 id=&quot;experimenting-with-zerowater&quot;&gt;Experimenting with ZeroWater&lt;/h2&gt;

&lt;p&gt;I’d originally started off with a ZeroWater because it deionizes water and you get to pick what minerals you want to add to it. And for places that might have questionable water treatment, it’s hard to beat it for removing heavy metals from the water. For this, I 3D printed a &lt;a href=&quot;https://www.thingiverse.com/thing:6921031&quot;&gt;Zero Water Travel Filter&lt;/a&gt;. But there’s a few problems. One, it’s huge, and has gotten my bag sidelined for extra screening. Second, if you want the water to taste better, you’ll need to add your own minerals to it, so that’s more to carry. It works great for things like humidifiers to avoid mineral deposits, but I think for daily drinking water, it’s kind of overkill and annoying. Plus, the filters are expensive and there aren’t generic ones you can easily buy.&lt;/p&gt;

&lt;h2 id=&quot;trying-other-filters&quot;&gt;Trying other filters&lt;/h2&gt;

&lt;p&gt;I went to a Target and looked to see what they carried, since it’s easier to get more supplies at a big national store than it is to order them online. That doesn’t help me when I’m traveling abroad, but that’s not the majority of my trips. I’d wanted the ion-exchange resin in there because it tends to improve flavor. I landed on the Brita Filter Elite and the Pur Plus. I think on paper the Pur Plus filter does a better job, but in practice, the flow rate is so slow that it’s annoying. Tasting the water out of my faucet, the Brita Filter Elite tasted a little bit better too, so it won on flow rate and flavor. It’s true that it filters less, but I don’t need it to filter everything. Plus, there’s multiple brands of compatible filters. So I decided to build a design around that one.&lt;/p&gt;

&lt;h2 id=&quot;designing-around-the-brita-filter-elite&quot;&gt;Designing Around the Brita Filter Elite&lt;/h2&gt;

&lt;p&gt;I got this idea the day before going out of town and I didn’t have a lot of time to do a design. I’d started by taking the dimensions of the bottom of a &lt;a href=&quot;https://makerworld.com/en/models/1312540-brita-filter-funnel&quot;&gt;brita filter funnel&lt;/a&gt; and making it just a tube with the filter on the bottom. That design was really compact and worked fine for wider bottles, but didn’t do the trick for the ~500mL Nalgene bottles that I like to bring with me. So I needed something a bit different. For the ZeroWater, I’d just balanced the filter on top of the water bottle and the drip out of the bottom of it didn’t really make a mess. For this one, I needed to redirect the water downward into the bottle.&lt;/p&gt;

&lt;p&gt;I tried designing this one using gpt-5.6-sol in OpenSCAD with a source sketch, a bunch of dimensions with my calipers and some test models. I got a lot of the way very quickly, including the tapered design, bottle adapter, and rough filter snap, but I ended up having to do a lot of test prints to get the fit just right. I wanted to print it from the top on the build plate up, and the more complex parts were a little tricky.&lt;/p&gt;

&lt;p&gt;But I did finally get it to work. The result is over here on MakerWorld: &lt;a href=&quot;https://makerworld.com/en/models/3097761-16oz-nalgene-brita-filter-cup&quot;&gt;16oz Nalgene Brita Filter Cup&lt;/a&gt;, and the corresponding caps for it &lt;a href=&quot;https://makerworld.com/en/models/3136792-caps-for-16oz-nalgene-brita-filter-cup&quot;&gt;Caps for 16oz Nalgene Brita Filter Cup&lt;/a&gt;. It holds around 175mL on the top, and travels pretty well. The tapered base means that you can stick it on the top of a lot of different wider bottles, and it can sit nicely on my Nalgene bottle.&lt;/p&gt;

&lt;h2 id=&quot;a-note-on-safety&quot;&gt;A Note on Safety&lt;/h2&gt;

&lt;p&gt;I used transparent PETG for this design because PET is generally safe and used in a lot of things. Transparent PETG doesn’t have non-food-safe colors. There’s going to be microplastics, but it’s not much different than bottled water in many cases. That all said, now that I’ve found that this design works, I’d like to cast it in food-safe silicone. That will prevent bacteria from getting stuck in the inner parts of not perfectly watertight prints, and while silicone can suck up some smells, it’s easy to fix by baking in the oven, which also helps sanitize it.&lt;/p&gt;
</description>
        <pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate>
        <link>https://www.williamreading.com/posts/2026-08-05-travel-water-filtering.html</link>
        <guid isPermaLink="true">https://www.williamreading.com/posts/2026-08-05-travel-water-filtering.html</guid>
        
        
      </item>
    
      <item>
        <title>Website and Traveling Party Housekeeping</title>
        <description>&lt;p&gt;Back in 2016, I started a traveling blog. I got a good deal on a .party domain, due to a funny mismatch between domain squatters using a British dictionary and not reserving the American spelling. The thing is that it never really made sense to do just the travel stuff on a separate domain, so I’ve merged the articles over to my primary williamreading.com domain, 301 redirected the stuff from the old site to the new site, and let archive.org know for folks that have old links. The content has mostly been updated to have correct titles, but there’s probably something that’s wrong somewhere.&lt;/p&gt;

&lt;p&gt;The photo gallery has also gotten some TLC. It was completely broken before and now it’s been migrated over to build on Jekyll. The photos are still pretty old, but maybe one day more stuff will go up there.&lt;/p&gt;

&lt;p&gt;I’ve also fixed a lot of stale links and provided a few in-line updates for stuff that’s pretty old. Let me know if something is broken there too.&lt;/p&gt;
</description>
        <pubDate>Tue, 04 Aug 2026 00:00:00 +0000</pubDate>
        <link>https://www.williamreading.com/2026/08/04/website-and-traveling-party-housekeeping.html</link>
        <guid isPermaLink="true">https://www.williamreading.com/2026/08/04/website-and-traveling-party-housekeeping.html</guid>
        
        
      </item>
    
      <item>
        <title>Travel: Coffee, Part 3</title>
        <description>&lt;h3 id=&quot;introduction&quot;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;It’s been about seven years since I &lt;a href=&quot;/posts/2017-08-20-traveling-with-coffee.html&quot;&gt;first wrote about traveling with coffee&lt;/a&gt;, and five years since the &lt;a href=&quot;/posts/2019-08-18-traveling-with-coffee-2.html&quot;&gt;second update&lt;/a&gt;. I’ve also &lt;a href=&quot;/posts/2019-09-03-room-coffee.html&quot;&gt;written about improving US hotel room coffee&lt;/a&gt; in the meantime.&lt;/p&gt;

&lt;p&gt;After all that experimenting, I’ve mostly converged on a setup that works for me, so this post is less of a survey and more of a summary of where I’ve landed.&lt;/p&gt;

&lt;h3 id=&quot;the-kit&quot;&gt;The Kit&lt;/h3&gt;
&lt;p&gt;My current setup (pun intended) boils down to a few things: A UL-listed immersion heater, an OXO mini-squeeze measuring cup, a Nanopresso, a few Nespresso pods in a carrying case, a small espresso cup, and a small scale.&lt;/p&gt;

&lt;h4 id=&quot;oxo-mini-squeeze-measuring-cup&quot;&gt;OXO Mini Squeeze Measuring Cup&lt;/h4&gt;
&lt;p&gt;The biggest change is that I’ve replaced the dedicated travel kettle with an &lt;a href=&quot;https://www.google.com/search?ibp=oshop&amp;amp;q=Norpro+16+oz+Black+Instant+Immersion+Heater&amp;amp;prds=catalogid:10908424450859538610,gpcid:8401097489295588430&quot;&gt;Norpro immersion heater&lt;/a&gt; and an &lt;a href=&quot;https://www.google.com/search?ibp=oshop&amp;amp;q=Mini+Squeeze+%26+Pour+Silicone+Measuring+Cup&amp;amp;prds=catalogid:9552863037344386107,gpcid:9818539476146680289&quot;&gt;OXO mini squeeze measuring cup&lt;/a&gt;. It’s made of silicone and plastic that can handle boiling water, the squeeze design makes it easy to pour precisely, and it doubles as a measuring cup, which I’d been carrying separately anyway for pour-over ratios. The immersion heater fits inside the measuring cup and looks sketchy but is safe in practice because it has a non-replaceable fuse that will render it inoperable before it starts a fire.&lt;/p&gt;

&lt;p&gt;The big advantage is that both pieces pack down smaller than any dedicated travel kettle I’ve used. I just boil water with the immersion heater dropped into the measuring cup, then use the cup to pour.&lt;/p&gt;

&lt;h4 id=&quot;in-room-pour-over&quot;&gt;In-room Pour-over&lt;/h4&gt;
&lt;p&gt;When I don’t feel like dealing with pods, I’ll do a pour-over using whatever coffee is in the room. I covered the specifics of this in &lt;a href=&quot;/posts/2019-09-03-room-coffee.html&quot;&gt;my post on improving room coffee&lt;/a&gt;, but the short version is that I use a 1:15 ratio of coffee to water by weight, and the results are usually better than what the in-room machine produces on its own.&lt;/p&gt;

&lt;p&gt;If you don’t travel with a scale, a reasonable rule of thumb is that a lot of the hotel packs are around 8g of coffee, and so that’s around 120mL (4 fl oz) of water to extract them at a 1:15 ratio, and since usually the cups are around 240mL (8 fl oz), about half the cup will get you in the right ballpark. This usually means you’ll need to use two of the packs in the room to get to a full cup, but it’s so much better that way.&lt;/p&gt;

&lt;h4 id=&quot;nanopresso&quot;&gt;Nanopresso&lt;/h4&gt;
&lt;p&gt;In the &lt;a href=&quot;/posts/2019-08-18-traveling-with-coffee-2.html&quot;&gt;last update&lt;/a&gt;, I was lukewarm on the &lt;a href=&quot;https://www.wacaco.com/products/nanopresso-plus-ns-adapter&quot;&gt;Nanopresso&lt;/a&gt;. After using it more, I’ve come around on it.&lt;/p&gt;

&lt;p&gt;I think something I didn’t initially appreciate is that while both the Nanopresso and Nespresso rely upon pressurized extraction, the Nespresso machine seems to mostly rely upon small holes in the brew group, while the Nanopresso uses larger holes and a spring to achieve the right level of pressurization. I think the spring-based approach results in a better extraction than the Nespresso, despite it being third party.&lt;/p&gt;

&lt;h4 id=&quot;on-your-own-pods&quot;&gt;On Your Own Pods&lt;/h4&gt;

&lt;p&gt;The other thing that is interesting about nespresso is that it looks like there are modifications that were made to Nespresso machines at some point to make it less likely that they will seal with the capsule properly, meaning that everything without those changes (the Nanopresso included) will work better with third party pods, including those that you’ve filled yourselves. I’ve done a little bit of experimenting here, and I’ve found that around 6-8g of coffee seems to work pretty well (though you’ll need to play with the grind to get it just right), and the little papers are really important to put at the bottom of the capsule so that it stays together when it’s been punctured.&lt;/p&gt;

</description>
        <pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate>
        <link>https://www.williamreading.com/posts/2026-06-22-traveling-with-coffee-3.html</link>
        <guid isPermaLink="true">https://www.williamreading.com/posts/2026-06-22-traveling-with-coffee-3.html</guid>
        
        
      </item>
    
      <item>
        <title>Travel: Toll Tags in the US</title>
        <description>&lt;p&gt;Depending on where you’re visiting in the US, toll tags might be an unavoidable part of driving. Furthermore, it can be tricky to know which toll tag you need for what part of the country.&lt;/p&gt;

&lt;p&gt;Back in 2012, Congress passed the &lt;a href=&quot;https://www.fhwa.dot.gov/map21/&quot;&gt;MAP-21 Act&lt;/a&gt;, which required that by the end of October 2016, it be possible to have a single toll tag and account for all federally-funded toll roads in the US. There was no penalty for non-compliance, and no funding was provided, so it’s been slow moving.&lt;/p&gt;

&lt;p&gt;Technically, this mostly happened in the form of &lt;a href=&quot;https://www.nationalpass.net&quot;&gt;NATIONALPASS&lt;/a&gt; for CA, DE, FL, IL, IN, KS, KY, MA, ME, MD, NH, NJ, NC, NY, OH, PA, RI, TX, VA, and WV. Unfortunately, NATIONALPASS has a monthly fee starting at $16/mo, with $3.50/tag. Note that this crazy thing doesn’t even work on all the toll roads. Washington and Oregon aren’t covered, for example.&lt;/p&gt;

&lt;p&gt;Practically speaking, you can get a lot of the country with a couple of toll tags: E-Z Pass, and the North Texas Tollway Authority hub.&lt;/p&gt;

&lt;p&gt;For the E-ZPass network on the East coast, you can get one from any of the states or authorities that issue them and they all work together. Someone has helpfully built a comparison matrix here: &lt;a href=&quot;http://www.jd4x4.net/EZPass/&quot;&gt;E-Z Pass System Comparison&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’d suggest the &lt;a href=&quot;https://www.ezdrivema.com/ezpassma&quot;&gt;Massachusetts&lt;/a&gt; E-ZPass because the tag doesn’t require a deposit and there are no annual fees or non-usage fees. You’ll need a holder to be able to be able to move this tag between vehicles, so I suggest the &lt;a href=&quot;https://www.google.com/search?q=JL%20Safety%20EZ%20Pass-Mate&amp;amp;udm=28&quot;&gt;JL Safety&lt;/a&gt; one, which lasts around five years for me.&lt;/p&gt;

&lt;p&gt;If you happen to live somewhere near NYC, I’d suggest getting the &lt;a href=&quot;https://www.thruway.ny.gov/ezpass/&quot;&gt;NY Thruway&lt;/a&gt; tag. Unlike the Port Authority and New Jersey passes, you don’t get charged a monthly fee, but you still get some local discounts. The tricky part is getting one. By default, if you don’t live in the Thruway area, you’ll get assigned to the PANYNJ pass, which might not be the one you want. You can have them manually make you an account, or buy one in person and activate that one. I used the AAA in Nanuet, but I’m sure there are other places that sell them.&lt;/p&gt;

&lt;p&gt;For the North Texas system, I recommend the &lt;a href=&quot;https://www.myktag.com&quot;&gt;K-Tag&lt;/a&gt; that comes with suction cups. There is a sticker version, but it’s difficult to move between vehicles. Like the Massachusetts E-ZPass, you don’t pay anything for it when you’re not using it, though you’ll have to pay $25 for them to send you the movable one.&lt;/p&gt;

&lt;p&gt;If you’re looking to get a toll tag for one of these areas that aren’t in one of the big networks, hopefully it’ll become easier soon. I’d suggest going for a movable transponder if you can get one versus the sticker. While NationalPass used to run only $8/mo, it’s now up to $12.50/mo per account, plus $3.50/mo per transponder. This maybe isn’t the worst pricing if you have a fleet, but it’s still free to just get individual tags.&lt;/p&gt;
</description>
        <pubDate>Mon, 13 Oct 2025 00:00:00 +0000</pubDate>
        <link>https://www.williamreading.com/posts/2025-10-13-toll-tags-in-the-us-updated.html</link>
        <guid isPermaLink="true">https://www.williamreading.com/posts/2025-10-13-toll-tags-in-the-us-updated.html</guid>
        
        
      </item>
    
      <item>
        <title>Travel: Finding Wired Ethernet</title>
        <description>&lt;p&gt;In &lt;a href=&quot;/posts/2018-12-26-travel-routers.html&quot;&gt;2018&lt;/a&gt;, I talked a bit about travel routers in general. I still use a newish version of the &lt;a href=&quot;https://www.gl-inet.com&quot;&gt;gl.inet&lt;/a&gt; brand, since they just work as a client for most wifi, can plug into ethernet, and run just fine off a battery for hours.&lt;/p&gt;

&lt;h3 id=&quot;where-to-find-wired-ethernet-in-hotels&quot;&gt;Where to find wired ethernet in hotels?&lt;/h3&gt;
&lt;p&gt;It used to be more common to find wired ethernet on the wall itself, but many hotels have stopped explicitly offering it as a service.&lt;/p&gt;

&lt;p&gt;That said, there sometimes are ethernet ports hiding in the room, but they’re not necessarily marked. And even when there is something on the other side, they might not give out IP addresses to random mac addresses.&lt;/p&gt;

&lt;p&gt;Weird places I’ve found ethernet ports:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;On the phone, in the back&lt;/li&gt;
  &lt;li&gt;On a wireless bridge on the wall (often two ports)&lt;/li&gt;
  &lt;li&gt;On a media converter for the tv’s network on the back of a TV&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Often if I can get one of these ports to work, it’s usually several times faster than what I’d get from wifi bridging, so it’s usually worth a look. Most of the time they’re dead though.&lt;/p&gt;
</description>
        <pubDate>Mon, 13 Oct 2025 00:00:00 +0000</pubDate>
        <link>https://www.williamreading.com/posts/2025-10-13-finding-wired-ethernet.html</link>
        <guid isPermaLink="true">https://www.williamreading.com/posts/2025-10-13-finding-wired-ethernet.html</guid>
        
        
      </item>
    
      <item>
        <title>Making a Neopixel on an Adafruit ESP32-C6 work with ESPHome</title>
        <description>&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I’m using ESPHome as my preferred choice for a lot of work on sensor microcontrollers around the house because it works really well with Home Assistant, and it’s more or less config and wireless OTA for updating, which is really convenient.&lt;/p&gt;

&lt;p&gt;I recently picked up the &lt;a href=&quot;https://www.adafruit.com/product/5933&quot;&gt;Adafruit ESP32-C6 Feather&lt;/a&gt; at the local microcenter so that I could use the Neopixel to display a color tied to my calendar, and hang it off a door handle powered off the battery. Out of the box, it took enough finagling that I figured I’d write it up because I couldn’t find what I needed online.&lt;/p&gt;

&lt;p&gt;So a few things about this board:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;It uses the WS2812 LED, which can be driven from the &lt;a href=&quot;https://esphome.io/components/light/esp32_rmt_led_strip/&quot;&gt;esp32_rmt_led_strip&lt;/a&gt; light platform.&lt;/li&gt;
  &lt;li&gt;The RGB order is GRB on this LED, which I’ve found to be the same for my Adafruit metro boards as well&lt;/li&gt;
  &lt;li&gt;The LED is sitting on what adafruit says is pin IO9, or GPIO9 in ESPHome&lt;/li&gt;
  &lt;li&gt;It’s off by default, and needs GPIO20 (what adafruit calls &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NEOPIXEL_I2C_POWER&lt;/code&gt; on this board) to be pulled high in order to turn it on, assuming you’re using the esp-idf anyway, which is all that seems supported on this board&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Putting that all together, you need some configuration blocks like this:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;esphome&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;status-light&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;friendly_name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;status-list&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Enable neopixel on boot&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;on_boot&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;priority&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;90&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;output.turn_on&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;neopixel_i2c_power&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;esp32&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;board&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;esp32-c6-devkitc-1&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;framework&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;esp-idf&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;light&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;platform&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;esp32_rmt_led_strip&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;neopixel&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;rgb_order&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;GRB&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;pin&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;GPIO9&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;num_leds&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;chipset&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ws2812&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;neopixel&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;effects&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;pulse&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;transition_length&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;550ms&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;update_interval&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;550ms&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Hopefully if you’re stuck getting this board to work, this will get you started.&lt;/p&gt;
</description>
        <pubDate>Fri, 10 Oct 2025 00:00:00 +0000</pubDate>
        <link>https://www.williamreading.com/2025/10/10/esphome-neopixel-adafruit-esp32-c6.html</link>
        <guid isPermaLink="true">https://www.williamreading.com/2025/10/10/esphome-neopixel-adafruit-esp32-c6.html</guid>
        
        
      </item>
    
      <item>
        <title>Weather Station MK2</title>
        <description>&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Back in &lt;a href=&quot;/2021/07/25/weather-station.html&quot;&gt;2021&lt;/a&gt;, I put together a weather station using WeeWX and &lt;a href=&quot;https://github.com/matthewwall/weewx-sdr&quot;&gt;weewx-sdr&lt;/a&gt;. This worked pretty well, but it meant dedicated hardware for just weather and also meant that the  driver needed to know about every piece of hardware that you want to use in order to map it into WeeWX.&lt;/p&gt;

&lt;p&gt;When I moved, I wanted to take a different approach, where I have one SDR with &lt;a href=&quot;https://github.com/merbanan/rtl_433&quot;&gt;rtl_433&lt;/a&gt; and have that send messages over MQTT. I don’t love MQTT, but it works well enough as a message bus, and with a little bit of configuration, I can have both &lt;a href=&quot;https://www.home-assistant.io/&quot;&gt;Home Assistant&lt;/a&gt; and WeeWX consume the data without having to build bridges from things like InfluxDB.&lt;/p&gt;

&lt;h2 id=&quot;the-listener&quot;&gt;The listener&lt;/h2&gt;
&lt;p&gt;While I could have run this on the same host that I run home assistant, it’s located near the networking hardware, and this isn’t a great place to listen for transmissions. For that, the attic makes a lot more sense. I reused the same Raspberry Pi that I had used for the weather station, but now it publishes anything it can decode over MQTT. I’m also still using an &lt;a href=&quot;https://www.rtl-sdr.com/buy-rtl-sdr-dvb-t-dongles/&quot;&gt;RTL-SDR.com&lt;/a&gt; dongle because they are high quality.&lt;/p&gt;

&lt;p&gt;For ease of moving stuff around as well as having to worry less about the OS software, I’m doing all of this stuff with docker this time around, and that includes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rtl_433&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;After plugging it in, I looked for the USB device to map it into the docker container:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ lsusb
Bus 001 Device 004: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T
Bus 001 Device 005: ID 0424:7800 Microchip Technology, Inc. (formerly SMSC) 
Bus 001 Device 003: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;On my Raspberry Pi 3B, it showed up on Bus 001 as Device 004.&lt;/p&gt;

&lt;p&gt;I use this &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker-compose.yml&lt;/code&gt; file to set it up:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;rtl433&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;hertzg/rtl_433:latest&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;devices&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/dev/bus/usb/001/004&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;restart&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;unless-stopped&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;-Mutc&quot;&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;-Fmqtt://&amp;lt;broker-hostname&amp;gt;:1883,retain=0,events=rtl_433[/model][/id]&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A quick &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker compose up -d&lt;/code&gt; later and I was getting messages such as these in mosquitto:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;rtl_&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;433&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;/Acurite-Atlas/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;905&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;time&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2025-01-02 16:56:29&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Acurite-Atlas&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;905&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;channel&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;C&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;sequence_num&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;battery_ok&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;message_type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;39&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;wind_avg_mi_h&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;4.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;uv&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;lux&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10250&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;strike_count&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;strike_distance&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;31&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;exception&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;raw_msg&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;0389e782818881009f1e&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;rtl_&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;433&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;/Acurite-Atlas/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;905&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;time&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2025-01-02 16:56:29&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Acurite-Atlas&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;905&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;channel&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;C&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;sequence_num&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;battery_ok&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;message_type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;39&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;wind_avg_mi_h&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;4.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;uv&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;lux&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10250&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;strike_count&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;strike_distance&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;31&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;exception&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;raw_msg&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;0789e782818881009f22&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;rtl_&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;433&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;/Acurite-Atlas/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;905&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;time&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2025-01-02 16:56:29&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Acurite-Atlas&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;905&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;channel&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;C&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;sequence_num&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;battery_ok&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;message_type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;39&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;wind_avg_mi_h&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;4.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;uv&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;lux&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10250&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;strike_count&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;strike_distance&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;31&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;exception&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;raw_msg&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;0b89e782818881009f26&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Mosquitto was straightforward to set up on the host that I had running home assistant with this docker compose file:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;mosquitto&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;eclipse-mosquitto&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;container_name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;mosquitto&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;restart&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;unless-stopped&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/home/&amp;lt;user&amp;gt;/docker/mosquitto/config:/mosquitto&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;1883:1883&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;9001:9001&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;home-assistant-aside&quot;&gt;Home Assistant Aside&lt;/h2&gt;
&lt;p&gt;I found that setting up the listener to emit messages in that format works well with home assistant, since you can set up entities like this:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Weather&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Station&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Temperature&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;state_topic&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;rtl_433/Acurite-Atlas/905/msg37&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;unit_of_measurement&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;°F&apos;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;device_class&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;temperature&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;value_template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;value_json.temperature_F&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&apos;&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Weather&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Station&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Humidity&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;state_topic&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;rtl_433/Acurite-Atlas/905/msg37&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;device_class&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;humidity&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;unit_of_measurement&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;%&apos;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;value_template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;value_json.humidity&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&apos;&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Weather&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Station&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Wind&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Speed&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Average&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;state_topic&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;rtl_433/Acurite-Atlas/905/msg38&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;device_class&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;wind_speed&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;unit_of_measurement&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;mph&apos;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;value_template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;value_json.wind_avg_mi_h&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&apos;&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Weather&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Station&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Wind&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Direction&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;state_topic&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;rtl_433/Acurite-Atlas/905/msg38&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;unit_of_measurement&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;°&apos;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;value_template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;value_json.wind_dir_deg}}&apos;&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Weather&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Station&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Cumulative&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Rain&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;state_topic&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;rtl_433/Acurite-Atlas/905/msg38&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;device_class&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;precipitation&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;unit_of_measurement&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;in&apos;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;value_template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;value_json.rain_in&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&apos;&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Weather&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Station&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;UV&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Index&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;state_topic&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;rtl_433/Acurite-Atlas/905/msg39&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;value_template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;value_json.uv&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&apos;&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Weather&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Station&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Illuminance&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;state_topic&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;rtl_433/Acurite-Atlas/905/msg39&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;device_class&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;illuminance&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;unit_of_measurement&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;lx&apos;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;value_template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;value_json.lux&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&apos;&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Weather&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Station&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Cumulative&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Lightning&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Strikes&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;state_topic&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;rtl_433/Acurite-Atlas/905/msg39&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;value_template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;value_json.strike_count&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&apos;&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;# See https://www.wxforum.net/index.php?topic=34293.0&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Weather&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Station&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Last&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Lightning&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Raw&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Strike&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Distance&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;state_topic&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;rtl_433/Acurite-Atlas/905/msg39&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;value_template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;value_json.strike_distance&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&apos;&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Weather&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Station&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Pressure&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;device_class&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;atmospheric_pressure&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;state_topic&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;rtl_433/Oregon-BTHR918/206&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;unit_of_measurement&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;hPa&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that there are those messages split out there. For home assistant, since the Atlas weather station sends messages in three chunks, home assistant will do weird things if they aren’t broken out by message type. If this isn’t needed, such as for my pressure sensor listed, then there is no need to refer to it by message type.&lt;/p&gt;

&lt;p&gt;An automation such as this one will break it out into message topics for home assistant to use, but we won’t use these messages with WeeWX:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;1730688156106&apos;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;alias&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;RTL433 MQTT message_type Demuxer&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Split rtl_433/# signals into msg topics, if message_type exists&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;trigger&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;platform&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;mqtt&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;topic&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;rtl_433/+/+&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;condition&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;condition&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;template&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;value_template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;trigger.payload_json.message_type&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;!=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;}}&apos;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;{{trigger.payload}}&apos;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;topic&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;rtl_433/{{trigger.payload_json.model or &quot;UnknownModel&quot;}}/{{trigger.payload_json.id&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;or &quot;UnknownId&quot;}}/msg{{trigger.payload_json.message_type}}&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;mqtt.publish&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;single&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This ends up looking something like this:&lt;/p&gt;
&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;rtl_&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;433&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;/Acurite-Atlas/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;905&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;/msg&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;39&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;time&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2025-01-02 16:56:29&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Acurite-Atlas&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;905&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;channel&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;C&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;sequence_num&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;battery_ok&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;message_type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;39&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;wind_avg_mi_h&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;4.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;uv&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;lux&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10250&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;strike_count&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;strike_distance&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;31&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;exception&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;raw_msg&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;0389e782818881009f1e&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;weewx-setup&quot;&gt;WeeWX Setup&lt;/h2&gt;
&lt;p&gt;For this, I used the &lt;a href=&quot;https://github.com/felddy/weewx-docker&quot;&gt;weewx-docker&lt;/a&gt; and &lt;a href=&quot;https://github.com/bellrichm/WeeWX-MQTTSubscribe&quot;&gt;WeeWX-MQTTSubscribe&lt;/a&gt;. I’m running this as a driver instead of just to supplement readings from another weather station, so I’m using it in that configuration.&lt;/p&gt;

&lt;p&gt;I’m using this docker compose file for it here:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;weewx&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;felddy/weewx:latest&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bind&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;./data&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/data&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;restart&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;unless-stopped&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You’ll need to install &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;paho-mqtt&lt;/code&gt;, like so:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker compose run &lt;span class=&quot;nt&quot;&gt;--rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--entrypoint&lt;/span&gt; pip weewx &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;paho-mqtt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And you’ll also need to install the extension, like so:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker compose run &lt;span class=&quot;nt&quot;&gt;--rm&lt;/span&gt; weewx &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  extension &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--yes&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  https://github.com/bellrichm/WeeWX-MQTTSubscribe/archive/refs/tags/v3.0.0.zip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;With that out of the way, I then configured it. Some relevant portions of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;weewx.conf&lt;/code&gt; configuration:&lt;/p&gt;

&lt;div class=&quot;language-ini highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;[Station]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Description of the station location, such as your town.
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;WeeWX station&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Drop a pin in a location and use the URL in google maps to get this
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Latitude in decimal degrees. Negative for southern hemisphere.
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;latitude&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;0.0&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Longitude in decimal degrees. Negative for western hemisphere.
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;longitude&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;0.0&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Altitude of the station, with the unit it is in. This is used only
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# if the hardware cannot supply a value.
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;altitude&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;0, meter    # Choose &apos;foot&apos; or &apos;meter&apos; for unit&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Set to type of station hardware. There must be a corresponding stanza
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# in this file, which includes a value for the &apos;driver&apos; option.
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;station_type&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;MQTTSubscribeDriver&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# If you have a website, you may specify an URL. The URL is required if you
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# intend to register your station. The URL must include the scheme, for
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# example, &quot;http://&quot; or &quot;https://&quot;
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#station_url = https://www.example.com
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# The start of the rain year (1=January; 10=October, etc.). This is
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# downloaded from the station if the hardware supports it.
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;rain_year_start&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Start of week (0=Monday, 6=Sunday)
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;week_start&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;6&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;[MQTTSubscribeDriver]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# This section is for the MQTTSubscribe driver.
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# The driver to use.
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Only used by the driver.
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;driver&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;user.MQTTSubscribe&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Controls if validation errors raise an exception (stopping WeeWX from starting) or only logged.
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Default is false
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;stop_on_validation_errors&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;mqtt.example.com&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Controls the MQTT logging.
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Default is false.
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;[[topics]&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# The WeeWX unit_system of the incoming data.
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;unit_system&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;METRIC&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Adjust this to account for the window that the multiple payloads get received
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;adjust_start_time&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;30&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Barometer
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;[[[rtl_433/Oregon-BTHR918/206]&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;ignore&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;True&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;[[[[message]&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;]]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;json&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;[[[[pressure_hPa]&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;]]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;ignore&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;False&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;pressure&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;units&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;hPa&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;[[[[temperature_C]&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;]]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;ignore&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;False&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;inTemp&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;units&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;degree_C&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;[[[[humidity]&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;]]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;ignore&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;False&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;inHumidity&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Weather station
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;[[[rtl_433/Acurite-Atlas/905]&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Explicitly select fields
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;ignore&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;True&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# We&apos;re doing json
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;[[[[message]&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;]]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;json&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# See https://www.weewx.com/docs/latest/reference/units/?h=measurement
&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;[[[[temperature_F]&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;]]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;ignore&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;False&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;outTemp&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;units&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;degree_F&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;[[[[humidity]&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;]]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;ignore&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;False&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;outHumidity&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;[[[[lux]&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;]]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;ignore&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;False&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;illuminance&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;[[[[rain_in]&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;]]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;ignore&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;False&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;rain&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;units&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;inch&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;contains_total&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;[[[[wind_avg_mi_h]&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;]]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;ignore&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;False&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;windSpeed&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;units&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;mile_per_hour&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;[[[[wind_dir_deg]&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;]]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;ignore&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;False&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;windDir&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;[[[[uv]&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;]]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;ignore&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;False&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;py&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;UV&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You should validate that the data services section does not have the service version of the MQTT subscriber because then it will have weird behavior if you don’t configure it twice.&lt;/p&gt;

&lt;p&gt;You might also find that changing the log level to DEBUG at the bottom of the file from INFO is helpful while debugging. Note that there are a couple of things going on above, but essentially you have to say that you’re ignoring all the fields and only cherry picking some of them.&lt;/p&gt;

&lt;p&gt;And with that, everything seems to work.&lt;/p&gt;
</description>
        <pubDate>Thu, 02 Jan 2025 00:00:00 +0000</pubDate>
        <link>https://www.williamreading.com/2025/01/02/weather-station-mk2.html</link>
        <guid isPermaLink="true">https://www.williamreading.com/2025/01/02/weather-station-mk2.html</guid>
        
        
      </item>
    
      <item>
        <title>Using Amateur Radios for Public Service</title>
        <description>&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I recently volunteered doing Amateur Radio support at the Boston Marathon, and was trying to figure out what gear I should bring given that it was going to be my first time and I wanted it to work well. My considerations before the race were mostly around water resistance (or low enough cost where I can take the risk), battery life (ideally charging via USB-C), and fatigue from loud audio in my ear. I also bought a radio harness that was helpful for carrying stuff around all day.&lt;/p&gt;

&lt;h3 id=&quot;radio-harnesses&quot;&gt;Radio Harnesses&lt;/h3&gt;
&lt;p&gt;I was a bit skeptical about this one. There’s a survival guide that recommended the “abcGoodefg” one on Amazon, but it was too small. I ultimately ended up getting a used &lt;a href=&quot;https://www.truenorthgear.com/catalog/category/category/radio-harnesses/dual-universal-radio-harness&quot;&gt;True North Dual Universal Radio Hardness&lt;/a&gt;, which was comfortable and had plenty of space.&lt;/p&gt;

&lt;p&gt;If I wanted something less expensive and more lightweight I think that a fire radio strap, such as the one made by &lt;a href=&quot;https://x-fire.com/products/x-fire%C2%AE-radio-strap-washable-firefighter-ems-emt-shoulder-and-duty-belt-holder-combo-with-anti-sway-strap-for-portable-tactical-apx-two-way-ham-walkie-talkie-radios-scanner-fire-le-tactical-rescue&quot;&gt;X-FIRE&lt;/a&gt; would work just fine, and I saw a few folks sporting fancier versions of these.&lt;/p&gt;

&lt;h3 id=&quot;headsets-microphones-and-earpieces&quot;&gt;Headsets, Microphones, and Earpieces&lt;/h3&gt;
&lt;p&gt;I originally thought that I’d probably end up spending most of the time using a Heil &lt;a href=&quot;https://heilhamradio.com/product/handie-talkie-headset-hth-2/&quot;&gt;Handie Talkie Headset (HTH)&lt;/a&gt;, but the microphone stopped working about an hour into volunteering. My BTech QHM22 speaker mic saved the day as a microphone, and I used a cheap RLN4941A-type earpiece to be able to hear. It did get loud at times as advertised.&lt;/p&gt;

&lt;h3 id=&quot;powering-radios&quot;&gt;Powering Radios&lt;/h3&gt;
&lt;p&gt;It was mentioned at the symposium a few weeks before the race that it’s a good idea to make sure you have plenty of battery power on hand. These days, you can get a cheap Baofeng radio and an inexpensive 28Wh battery that you can power via USB-C. That alone is a nice reason to bring one as a backup radio.&lt;/p&gt;

&lt;h3 id=&quot;baofeng-gt-5r-squelch--pop&quot;&gt;Baofeng GT-5R squelch &amp;amp; pop&lt;/h3&gt;
&lt;p&gt;Next I focused a bit on loud audio. The cheapest radios, such as the Baofeng GT-5R (the compliant version of the UV-5R) don’t protect against surge current when their power amplifiers turn on and off (See &lt;a href=&quot;https://softsolder.com/2018/08/09/baofeng-uv-5-squelch-pop-suppression/&quot;&gt;Baofeng UV-5: Squelch Pop Suppression&lt;/a&gt;), which is annoying at the end of a transmission with a headset, particularly a loud one. I built a cable with some inexpensive diodes to suppress the pop, but it still had an open squelch at the end that was loud.&lt;/p&gt;

&lt;h3 id=&quot;squelch-tail-elimination&quot;&gt;Squelch Tail Elimination&lt;/h3&gt;
&lt;p&gt;There are a number of standard ways that you can eliminate squelch tail on an analog transition, with common ones being to use DCS (possibly the best option), CTCSS (PL tone) with reverse burst, and the Chinese radio 55 Hz (or less commonly, such as Anytone, 259.1 Hz) tone. Some amateur radios will turn off the PL tones before they end the transmission as well. There’s some history of CTCSS and some other methods over at &lt;a href=&quot;https://www.repeater-builder.com/tech-info/ctcss/ctcss-overview.html&quot;&gt;Repeater Builder&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I noticed that the repeater for my radio assignment emitted a -180° reverse-burst tone, and this seemed like a good place to start.&lt;/p&gt;

&lt;p&gt;Unfortunately, working with reverse burst CTCSS tones isn’t exactly a standard amateur radio feature. My Wouxun radio apparently does honor one at 120°, but doesn’t document this, and I needed -180°. This does seem to be a feature in some DMR radios, including my &lt;a href=&quot;https://jhart99.com/co01d-programming/&quot;&gt;COTRE CO01D&lt;/a&gt;, but I certainly wasn’t going to use a $10 2W toy radio with a fixed antenna and 5.5W battery. My BTech 6X2 and Baofeng GT-5R only work with the fixed tones at the end.&lt;/p&gt;

&lt;p&gt;Lucky for me, my TYT MD-390 does work with the right reverse burst, and I was also able to get a large 23Wh battery that charged via USB-C. I used perhaps a third of that battery on race day, and was told I had clear transmissions. But I still had an issue where some transmissions were much louder than others, and I was fiddling with the volume potentiometer a lot of the time. I think what I really wanted was automatic gain control for the audio.&lt;/p&gt;

&lt;h3 id=&quot;maybe-i-should-have-just-bought-a-motorola&quot;&gt;Maybe I should have just bought a Motorola?&lt;/h3&gt;
&lt;p&gt;Something I did notice was that pretty much every radio in use that wasn’t used by an Amateur, including those that the B.A.A. rented, and the one used by the segment coordinator were made by Motorola. Looking on eBay, the older MotoTRBO radios such as the XPR6550 can be found for pretty reasonable prices, some of them less than $100. I’ve never used Motorola radios before, but figured it would be worth a try for the next time around.&lt;/p&gt;

&lt;p&gt;I’ve since bought some, but the process is kind of involved compared to any other radio I’ve had in the past. I talk about it over at &lt;a href=&quot;/2023/05/02/motorola-radios-for-ham.html&quot;&gt;Using Motorola TRBO Radios for Amateur Radio&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Tue, 02 May 2023 00:00:00 +0000</pubDate>
        <link>https://www.williamreading.com/2023/05/02/using-radios-for-public-service.html</link>
        <guid isPermaLink="true">https://www.williamreading.com/2023/05/02/using-radios-for-public-service.html</guid>
        
        
      </item>
    
      <item>
        <title>Using Motorola TRBO Radios for Amateur Radio</title>
        <description>&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Over in &lt;a href=&quot;/2023/05/02/using-radios-for-public-service.html&quot;&gt;Using Amateur Radios for Public Service&lt;/a&gt;, I mentioned that I got some Motorola radios and programmed them, but that it was a bit of a task. I talk a bit more about why I picked the XPR6550 and what I had to do to program it.&lt;/p&gt;

&lt;h3 id=&quot;why-the-xpr6550&quot;&gt;Why the XPR6550?&lt;/h3&gt;
&lt;p&gt;It looks like the main options for handhelds are the XPR6550 and the XPR7550, at least for DMR. You can buy other Motorola radios that will happily do analog, but one of the benefits to buying a DMR radio vs say, an P25 radio, is that they typically cost less than the latter and there’s more ham adoption of them.&lt;/p&gt;

&lt;p&gt;I opted for the XPR6550 over the XPR7550 because it takes standard antenna connectors and costs less online, particularly for a VHF Model. I went with the VHF model (AAH55JDH9LA1AN), because I have enough dedicated UHF radios, and I can use this model with some of the analog repeaters in my area.&lt;/p&gt;

&lt;h3 id=&quot;gotchas&quot;&gt;Gotchas&lt;/h3&gt;
&lt;p&gt;Something to note about buying these inexpensively (mine was ~$100) on eBay is that most of the folks selling them are likely going to send you a radio that has not been factory reset, even if they have some basic validation of it. I think in part this is because the software is such a pain to obtain and you can’t factory reset it from the front panel. And this means that you’ll have to jump through some hoops if the codeplug cannot be downloaded to reset and change it because that is password protected. More on that below. I spent a bit of time writing this up because the information for this is strewn a number of places online.&lt;/p&gt;

&lt;p&gt;They also probably will come with zero accessories, so if you’re getting started, you’ll probably want to order at least a programming cable, battery, and charging cradle. At the time of this writing, I went with the &lt;a href=&quot;https://www.google.com/search?q=PMKN4012%20PMKN4012B&amp;amp;udm=28&quot;&gt;Aimtobest&lt;/a&gt; programming cable sold by “Aimtobest Radio Partner” on Amazon for around $29. For the battery, I got a cheap $23 one that stated it was compatibile with the radio, but doesn’t have any of the features that an official battery would have. I found a charging cradle on Aliexpress for around $10, and I can reuse antennas I already have for Baofeng radios.&lt;/p&gt;

&lt;h2 id=&quot;getting-radio-software-and-firmware&quot;&gt;Getting radio software and firmware&lt;/h2&gt;
&lt;p&gt;While Motorola used to charge for the software and firmware updates, they no longer do so for the TRBO line. This is nice if you’re buying one radio as an amateur radio operator, but because it’s Motorola, they don’t simply post it on their website, you have to jump through a bunch of hoops.&lt;/p&gt;

&lt;h4 id=&quot;quick-aside&quot;&gt;Quick Aside&lt;/h4&gt;
&lt;p&gt;If for some reason, you already happen to have “MOTOTRBO CPS 16.0 Build 828 (Standalone)”, you can open this sample codeplug and clone it over to your radio to get started: &lt;a href=&quot;/assets/Sample-xpr6550-vhf.ctb&quot;&gt;XPR6550 VHF Default Codeplug&lt;/a&gt;. There’s a sample codeplug that comes with CPS 16, but you’ll find that it is UHF and not compatible with the VHF version of the XPR6550. Conversely, if you have the UHF version of this radio, you should use the sample codeplug versus this one.&lt;/p&gt;

&lt;p&gt;In a pinch, if you don’t have the 25 KHz entitlement, per this &lt;a href=&quot;https://www.reddit.com/r/MotorolaSolutions/comments/17fbw4q/wideband_entitlement/&quot;&gt;reddit comment&lt;/a&gt;, you can hex edit the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sfccomb.dll&lt;/code&gt; file, and at memory address &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0000200E&lt;/code&gt;, change the hex value of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;06&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;17&lt;/code&gt;. This is equivalent to just having old firmware and an old CPS.&lt;/p&gt;

&lt;p&gt;You should still jump through the hoops if you can, particularly if you ever end up with a newer radio and want to be able to easily get the software for it, or if you need to run recovery, because that requires the firmware. The firmware packages tend to be pretty big, so it’s less likely that you’ll find a friend that happens to have them.&lt;/p&gt;

&lt;h3 id=&quot;the-hoops&quot;&gt;The Hoops&lt;/h3&gt;
&lt;p&gt;If you’d prefer to watch a 37 minute video on how to do this (particularly if you’re new to codeplug programming), VA3HDL has a YouTube tutorial &lt;a href=&quot;https://www.youtube.com/watch?v=fMAMil3omHc&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Otherwise, you’ll want to follow the steps documented on Motorola’s website under the &lt;a href=&quot;https://knowledgehub.motorolasolutions.com/articledetails/s/view-article?state=hbafDVMrbwsUZuVI74nGoysvcexeWSOkJRFfGQ%2FCw%2F8pelwuBiufR9pBXnlaOIGn%2FY5K%205LAd3me8Ll%2Fn4u6vhVLupUwxQJCdyZ4apAScGNsnq%20fv%20JnZiS8VjLNd2N4&quot;&gt;How to Download CPS Software for Astro and MOTOTRBO&lt;/a&gt; support article. (Yes, that URL 100% is going to break at some point)&lt;/p&gt;

&lt;p&gt;Otherwise, here’s the steps in summary:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Sign up for a consumer account &lt;a href=&quot;https://www.motorolasolutions.com/self-service/registration/create/consumer-account/country-selection?msiLocale=en_us&amp;amp;app=OCC&amp;amp;short=true&amp;amp;path=%2F&amp;amp;_gl=1*12xjfps*_ga*OTE4ODk4MjU4LjE2OTgyNDUzNzQ.*_ga_23THW5EV9N*MTY5ODY5NDAzMy4xLjEuMTY5ODY5NTAwNC41My4wLjA.&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Call the phone number on the website and explain that you’re an amateur radio operator and trying to get to convert it to a business account so that you can get programming software and firmware.&lt;/li&gt;
  &lt;li&gt;Wait up to 72 hours or possibly more&lt;/li&gt;
  &lt;li&gt;After you get a customer number, you can now access &lt;a href=&quot;https://myview.motorolasolutions.com&quot;&gt;https://myview.motorolasolutions.com&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Go to Software, Subscribe, and then tick the box for “MOTOTRBO NA Professional Devices (Legacy)” to request firmware (it will take a while to show up)&lt;/li&gt;
  &lt;li&gt;See if you can get to &lt;a href=&quot;https://shop-business.motorolasolutions.com&quot;&gt;https://shop-business.motorolasolutions.com&lt;/a&gt;. If not, you might have to wait another day.&lt;/li&gt;
  &lt;li&gt;Buy the part number of “HKVN4362A” to get the CPS Software (free).&lt;/li&gt;
  &lt;li&gt;(optional) Buy the wideband entitlement if you want to use it with amateur radio, part number “HKVN4046A”. ($5)&lt;/li&gt;
  &lt;li&gt;Wait a while for the orders to be fulfilled.&lt;/li&gt;
  &lt;li&gt;You can now download “MOTOTRBO Legacy XPR 6000 portable series Release R01.12.17” firmware and “MOTOTRBO CPS 16.0 Build 828 (Standalone)”.&lt;/li&gt;
  &lt;li&gt;You can also get the CPS 2.0 software, but my understanding is that you can’t use older software once you’ve programmed the radio with the newer one.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now at this point, you should have everything you need to run a “recovery” from the CPS. Doing a recovery will reset it to factory settings. Note the warning message that says it might need to be retuned. It looks like Motorola has some other software that dealers have access to use called “Tuner”, but this isn’t something available to customers. So in theory you should find a (dealer) friend that has this software and save the tuning parameters before running a recovery.&lt;/p&gt;

&lt;p&gt;Also note that if you did a “clone” and for some reason the radio still doesn’t want to transmit properly, you may end up having to still do the recovery anyway.&lt;/p&gt;

&lt;p&gt;But now you can program your radio, just like any other radio that requires a codeplug. I’d recommend enabling “expert mode” if you’re using CPS 16 to see all the settings. CPS 2.0 seems to show all the settings by default.&lt;/p&gt;
</description>
        <pubDate>Tue, 02 May 2023 00:00:00 +0000</pubDate>
        <link>https://www.williamreading.com/2023/05/02/motorola-radios-for-ham.html</link>
        <guid isPermaLink="true">https://www.williamreading.com/2023/05/02/motorola-radios-for-ham.html</guid>
        
        
      </item>
    
      <item>
        <title>Making Jitsi Meet work with TURN on Docker</title>
        <description>&lt;p&gt;If you’ve ever set up your own self-hosted instance of Jitsi Meet, you might find that some of the folks using it aren’t able to connect. The root issue for this tends to be because one or more people are behind NAT and despite using STUN to try to figure out their public addresses and do NAT traversal, there’s not a path to pass media between everyone.&lt;/p&gt;

&lt;p&gt;So how do you get this magic on your own version of Jitsi Meet? After all, this doesn’t seem to be a problem on the instance at &lt;a href=&quot;https://meet.jit.si/&quot;&gt;meet.jit.si&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let’s start by setting up your own &lt;a href=&quot;https://github.com/coturn/coturn&quot;&gt;Coturn&lt;/a&gt; server. Coturn is an open-source implementation of STUN and TURN and it’s conveniently dockerized. While you probably do want to set it up with TLS, for the sake of just getting it started, you can run it with some configuration like this:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker run &lt;span class=&quot;nt&quot;&gt;--network&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;host coturn/coturn &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
           &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--log-file&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;stdout &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
           &lt;span class=&quot;nt&quot;&gt;--min-port&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;49160 &lt;span class=&quot;nt&quot;&gt;--max-port&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;49200 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
           &lt;span class=&quot;nt&quot;&gt;--lt-cred-mech&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--fingerprint&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
           &lt;span class=&quot;nt&quot;&gt;--no-multicast-peers&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--no-cli&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
           &lt;span class=&quot;nt&quot;&gt;--no-tlsv1&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--no-tlsv1_1&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
           &lt;span class=&quot;nt&quot;&gt;--external-ip&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;192.0.2.1 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
           &lt;span class=&quot;nt&quot;&gt;--static-auth-secret&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;changeme &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
           &lt;span class=&quot;nt&quot;&gt;--realm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;meet.example.org
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In the above example, a static auth secret of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;changeme&lt;/code&gt; is set up for use with Jitsi. The external IP (the example one where this server is running) is set to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;192.0.2.1&lt;/code&gt;, though this can vary based upon the host. The &lt;a href=&quot;https://hub.docker.com/r/coturn/coturn#!&quot;&gt;coturn documentation&lt;/a&gt; does provide a way to get this dynamically by specifying it as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;$(detect-external-ip)&apos;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ideally you should have this on a host that allows you to have port 443 exposed over TLS, since this will work around most restrictive firewall rules as well versus just NAT (it’s using UDP port 3478 without TLS).&lt;/p&gt;

&lt;p&gt;With this configured, you can set it up in Jitsi Meet. For the dockerized version, you’ll need this &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env&lt;/code&gt; configuration:&lt;/p&gt;

&lt;div class=&quot;language-ini highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Specify Coturn for use in getting the external IP
&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;JVB_STUN_SERVERS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;meet.example.org:3478&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Use a turn server running locally
&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;TURN_CREDENTIALS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;changeme&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;TURN_HOST&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;meet.example.org&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;TURN_PORT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;3478&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Specify the external IP
&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;JVB_ADVERTISE_IPS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;192.0.2.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you do set up coturn up with TLS, just note that all the above is the same, but replace &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TURN&lt;/code&gt; with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TURNS&lt;/code&gt;, and the port to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;443&lt;/code&gt;. This does mean you’ll need a reverse proxy to ship requests to the right hostname for a single IP address or multiple IP addresses.&lt;/p&gt;

&lt;p&gt;And that’s it. Not all of this configuration and how to use it is well documented, so here’s how I got it to work.&lt;/p&gt;
</description>
        <pubDate>Fri, 13 Jan 2023 00:00:00 +0000</pubDate>
        <link>https://www.williamreading.com/2023/01/13/making-jitsi-meet-work-with-turn.html</link>
        <guid isPermaLink="true">https://www.williamreading.com/2023/01/13/making-jitsi-meet-work-with-turn.html</guid>
        
        
      </item>
    
  </channel>
</rss>
