Review: Woodmark Hotel – Kirkland, WA

This past summer, my family visited Seattle. I have a cousin that lives in Kirkland and offered to help us find a place to stay. She found a deal on Groupon for a local hotel that is highly rated, the Woodmark Hotel. The Groupon deal was decent and the hotel looked a step up from the normal places we stay, so I booked a garden view room for 4 nights.

When we arrived, they upgraded us to a lake view room which I thought was great. I was also told that there would be a wedding that evening (at the outdoor venue), but would be coming inside around 8 and then promptly ending at 10 or 11 (I can’t remember the time). I didn’t think that was a problem and they offered us ear plugs if we needed them. They promptly sent me a text saying that if I needed anything, I could text them back which was a neat feature as I don’t like having to talk on the phone or go down to the front desk.

Turns out that our second floor lake view room (which was very nice) was directly overlooking the venue for the wedding which meant we had noise until they went inside. When they did go inside, we could still hear all the noise. The second night was a repeat of the first with another wedding. On the third day, I was done with the noise as I had trouble sleeping the prior 2 nights. I texted the front desk and the person who answered found another room on the 4th floor and asked if I wanted to see it before we moved. My son and I took a look at the room and it was still a lake view room, but further from the wedding venue, so we took it and moved our stuff. The person that helped us was very nice and apologized. He also said it was “wedding season”.

That night we still heard the wedding, but when they went inside we couldn’t hear them anymore. As we were going out that day, I looked on the schedule and only saw someone’s birthday party with nothing in the evening which was a huge relief.

Upon checkout, the person at the desk asked how our stay was. I said not great or something similar and she said “OK” without asking why or what they could have done to make it better. For a relatively small hotel, I expected better.

While I’m sure that the hotel is great for weddings, the layout of the hotel basically gives every lake view room a front row seat to wedding even if you aren’t an invited guest! We’ve stayed in a number of hotels over the years and I’ve never written a review of one in the past; this absolutely poor experience caused me to write this and warn others to not stay at this hotel during “wedding season”. Also, with the exception of the man that moved us to a different room, I didn’t find the staff to be all that friendly. Even with the Groupon rate, the room was not cheap.

I reached out to Groupon and they gave me a 30% credit which was pretty generous in my opinion as they didn’t have to do anything.

Bottom line is to stay elsewhere when visiting Seattle or Kirkland.

Fixing the Vizio SB36512-F6 Soundbar

For a number of years, I’ve had a Vizio 5.1 soundbar which worked reasonably well. It was connected to my TV via an optical cable. The only real issue I had with it was that I had to use an IR remote to control the volume. Luckily the Apple TV remote has the ability to send IR commands to control the volume. This worked OK, but always required me to aim the remote at the soundbar and press multiple times if I wasn’t aligned with it. Last year when Apple said it was adding Dolby Atmos to the Apple TV 4K, I was intrigued. While the room my TV is in isn’t ideal with Atmos, I wanted to give it a try. My current soundbar, of course, wouldn’t handle Atmos. I saw the Vizio SB36512-F6 on sale at Costco and picked it up.

Setup of the soundbar was simple; plug the HDMI cable from the Apple TV into the soundbar and then the soundbar into the TV via ARC. This would allow the soundbar to handle Atmos. In addition, since it was connected via HDMI, I could use HDMI-CEC to control the volume without the need for setting up IR on the remote (I could also use the Apple TV remote control center widget on my iPhone or iPad to control the sound which is kind of neat). For the most part, this setup worked and when Atmos support came to the Apple TV and Netflix, I was able to use it; I couldn’t tell much of a difference as there is still not a lot of content that supports it. However, we kept having problems where no audio would come out of the soundbar and it required us to power cycle everything or quit an app and start over. It was annoying to say the least. I went through a number of firmware upgrades and patiently waited for Vizio to fix the issue, but it never happened.

I reached out to Vizio support and they gave me some suggestions, but all of them would result in not having the ability to use Atmos (which was one of the reasons for the soundbar). After dismissing their suggestions for awhile, I finally decided to try one of the options. In the Apple TV’s audio settings, instead of automatic, I chose Change Format to Dolby Digital 5.1. Ever since I did that, audio has worked perfectly. While I lost Dolby Atmos, I also lost the frustration of not having audio. What I suspect is happening is that when change format is selected, the Apple TV is always outputting the same audio stream type and the soundbar doesn’t have to figure out how to decode the audio; with automatic, the soundbar is sometimes unable to properly decode the stream when a show or movie starts. It then gets confused and just doesn’t play anything.

If you have an Apple TV 4K and are having audio problems with a soundbar, I’d suggest trying the Change Format setting. It is really too bad that Vizio can’t figure out how to fix this issue as I’d like to sometimes play Atmos content without having to switch the setting.

Review: Motorola Talkabout T460

Many years ago I purchased FRS (Family Radio Service) radios commonly called walkie talkies. I chose the Motorola T5000 because it came with 4 radios and the price was right; I know I didn’t spend much time researching them. The radios have served me well over the years. The radios operated on both FRS and GMRS (General Mobile Radio Service) frequencies. Certain frequencies (the radios have specific channels that correspond with frequencies) are FRS only, some are GMRS only and some are available on both. FRS is unlicensed whereas GMRS requires a license. Since I don’t have a GMRS license, I’ve always stuck to the FRS channels. I suspect that many people just picked a channel and used it not realizing that they were violating FCC regulations.

In 2017 the FCC adopted changes to FRS and GMRS which increased the maximum output for FRS radios (from 0.5 W to 2.0 W) and made available certain channels that were GMRS only to FRS users. They basically acknowledged that people were using the FRS/GMRS radios with no regard to which channels were being used.

The rechargeable batteries on the Motorola T5000 radios I owned had long died and with my push to have all my devices rechargeable via USB, I decided this past spring to replace the radios. The radios also had a maximum output of 0.48 W on the GMRS channels (now available for FRS) which meant that the range of the radios was quite limited.

I liked the styling of the newer Motorola Talkabout radios, so I picked up a pair of Talkabout T260 radios. I used the radios on a Scout trip and they worked quite well, but there was a place that I lost contact with another leader that was at the front of the hiking group. We also used the radios on a cruise ship and they worked pretty well across several decks even with all the steel that blocks signals. Even though the radios performed decently, I decided to do some more research on the radios. The radios are advertised with a 22 mile range; that, of course, is in ideal conditions and never happens. The manual has a chart of channels and shows the maximum output power on the different frequencies. This is quite misleading as I soon discovered. All FCC registered devices have information available on the FCC’s website including test reports showing the actual power output. Doing a search of the FCC ID AZ489FT4929, I discovered that the maximum output of the radio was 0.8 W which is far lower than the legal maximum.

After more research, I found the older manual for the radio and it appears that Motorola changed a few pieces when the new FCC regulations took effect including the chart; the old chart showed which channels were FRS and which were GMRS. The new chart was basically a waste because all the channels could be used by all users; some of the channels would have higher output. Motorola did respond to my claim that the manual was misleading by saying that the chart in the manual wasn’t there to indicate how much power the radios actually put out, but to show that it complied with the FCC maximum.

This newfound knowledge kind of bummed me out, so I went back to the drawing board and went through all the Motorola Talkabout radios (I like the design of the radios over other brands) and looked up the FCC ID of each one looking for the radios that had the highest output power (up to the legal limit). If my information is correct, the Motorola Talkabout T460 which has an FCC ID of AZ489FT4924 has a maximum output power twice that of the T260 (1.7 W). While I don’t expect to ever get the 35 mile range advertised with these radios, I at least could have radios with the highest power available.

I purchased a pair of the T460 radios and have now used the radios on a couple of trips and they are far superior to the T260 (and the old T5000 ones I had before). (While I did purchase these radios, Motorola generously sent me another pair of the T460 radios in response to my letter to them about the T260 manual). Specifically the T460 has an analog control for the volume making it easier to turn the units on/off and control the volume. They also have a feature called VibraCall which vibrates the radio the first time it receives a transmission if it hasn’t received a transmission in a certain period of time; this is handy if the volume is turned down or you happen to not be paying attention. Once the radio vibrates, you can ask the other end to repeat the message. The radios also have a weather radio, different call tones, and a few other features that are generally not of much use to me.

Pros

  • Highest power output of Motorola Talkabout radios
  • Water/splash resistant (IP54)
  • VibraCall
  • Analog volume control
  • Acceptable voice quality
  • Standby time allows for all day usage in my testing

Cons

  • Doesn’t come anywhere close to the advertised range

Summary

If you’re looking for relatively low-cost, unlicensed FRS radios, I think the Motorola Talkabout T460 are hard to beat. They have a decent range and a number of features that make them easy to use. Time, of course, will tell how durable they are and how good the range is in a variety of environments.

Monthly Battery Checks

Every month I have a routine where I make sure batteries and devices that I don’t use regularly are charged. Some may think that I’m a “prepper” getting ready for a major disaster, but I’m definitely not that extreme (I don’t have a bunker and am not off the grid!). You never know when some of this will come in handy; a few months ago the power went out at dinner time due to an emergency transformer replacement. I pulled out the LED lanterns I have (the orange pucks in the picture) and we had light. It wasn’t a big deal.

I know that I still have a lot of work to do to be fully prepared for an emergency, but having light, some power, and cooking equipment (my camping stove is in the garage and we have a gas grill outside) goes a long way. The good news is that much of my gear is used for camping so it isn’t just sitting around collecting dust (some emergency meals I have need to be checked as I have no idea how old they are!).

I highly recommend that people regularly charge devices, check flashlights, and have some portable battery packs lying around.

Also, just about all my devices can be charged via USB which makes it easier to charge everything.

In case people are curious, here’s what is in the picture.

Fighting back against rebates

The other day I was filling out a rebate form and it got me thinking. Rebates are a great way for companies to make people believe that they are getting a deal on a product. The reality from what I’ve read, is that most people don’t bother filling out rebate forms or fill them out incorrectly and don’t receive the rebate thereby making rebates just a marketing gimmick. Years ago, the minority of people that received rebates got checks that they could deposit.

At some point, companies decided to switch to prepaid gift cards that are more difficult to redeem. The gift cards expire within a few months and it is hard to use up the last few dollars of the cards since many vendors don’t do split payments across multiple payment types. After thinking about this for awhile (yes, I think about strange things), I came up with what I consider a brilliant solution. As a frequent Amazon shopper, I figured that I could just buy an Amazon gift card and apply it to my account. Amazon lets you purchase a gift card in any amount (not sure if it is whole dollars only) and then have it sent to yourself. Apply it to your account, it doesn’t expire, and there is no need to worry about spending the last bit of the card.

Next time you get one of those prepaid gift cards, go ahead and buy an Amazon gift card and either send it to me or apply it to your account! You’ll thank me for not having to deal with that piece of plastic for more than a few minutes.

Dealing with the influx of scooters

I try to get out and run 3-4 times a week down by Mission Bay as there is a nice path and I don’t have to be afraid of vehicle traffic. I used to run on the sidewalk where there was one and on dirt when there wasn’t; however with traffic whizzing by at 55 mph (speed limit is 45 mph), I got smart and decided that I’d just drive to a nice place and run. Last year on one of my runs, I noticed electric scooters parked in groups along the path. Over the course of the next few months, the scooters started appearing just about everywhere I went in the city.

The scooters are an interesting solution to the last mile problem and appear to be useful for a lot of people. However, the companies that are running the scooters have taken the approach that they’ll just “disrupt” transportation and simply do what they want and deal with the fallout and laws later. This has been a big topic on the news with injuries happening all the time, lawsuits (currently San Diego is facing a lawsuit about disabled access on the sidewalks), and some riders disobeying laws.

The San Diego mayor and city council have been working on ways to handle these scooters so that they can co-exist with everyone in the city. While this may seem like the right thing to do, I’d argue that instead of spending time trying to handle these scooters, how about taking a look at the problems they are causing and what laws already exist to handle them.

In my view, there are a number of issues that I’ve seen:

  1. Scooters are parked on the sidewalk either by the companies (or their contractors) or the riders.
  2. Scooters are being ridden on the sidewalk and the riders are getting into accidents with innocent pedestrians.
  3. Scooter riders are riding in the street in the wrong direction and not stopping at traffic lights and/or stop signs.
  4. Parent and child riding on a scooter.
  5. Kids riding the scooters.

The scooters, themselves, aren’t the problem in my opinion. It is the riders (mostly) that don’t know what they are supposed to do or frankly don’t care.

Let’s take a closer look at my list.

Scooters parked on sidewalks

This is already illegal under California Vehicle Code 21235:

(i) Leave a motorized scooter lying on its side on any sidewalk, or park a motorized scooter on a sidewalk in any other position, so that there is not an adequate path for pedestrian traffic.

While people may argue what is an adequate path, unless the sidewalk is really wide, a scooter on the sidewalk won’t allow 2 people to pass one another comfortably.

Scooters ridden on the sidewalk

This is already illegal under CVC 21235:

(g) Operate a motorized scooter upon a sidewalk, except as may be necessary to enter or leave adjacent property.

If we consider the path around Mission Bay a bike path and not a sidewalk (scooters can be ridden on bike paths), San Diego Municipal Code §63.20.7 states:

Driving Vehicles On Beach Prohibited; Exceptions; Speed Limit On Beach
(a) Except as permitted by the Director and except as specifically permitted on Fiesta Island in Mission Bay, no person may drive or cause to be driven any motor vehicle as defined in the California Vehicle Code on any beach, any sidewalk or turf adjacent thereto; provided, however, that motor vehicles which are being actively used for the launching or beaching of a boat may be operated across a beach area designated as a boat launch zone. Original

A scooter is defined as a motor vehicle under California Vehicle Code and the path around Mission Bay is adjacent to a beach thereby making it illegal to ride a scooter on the path.

CVC 21230 states:

Notwithstanding any other provision of law, a motorized scooter may be operated on a bicycle path or trail or bikeway, unless the local authority or the governing body of a local agency having jurisdiction over that path, trail, or bikeway prohibits that operation by ordinance.

Meaning that San Diego (as they have done) can regulate scooters on bike paths.

Scooters ridden recklessly

As scooter riders must have a driver’s license (or permit) and scooter are classified as motor vehicles, the riders must follow all the rules of the road including which direction they ride on the street, stopping at stop signs or traffic lights, yielding, etc. This is already covered under California Vehicle Code.

Parent and child riding on a scooter

Again, illegal under CVC 21235:

(e) Operate a motorized scooter with any passengers in addition to the operator.

(c) Operate a motorized scooter without wearing a properly fitted and fastened bicycle helmet that meets the standards described in Section 21212, if the operator is under 18 years of age.

Kids riding the scooters

Illegal under CVC 21235:

(d) Operate a motorized scooter without a valid driver’s license or instruction permit.

As I wrote in the beginning, I don’t have a problem with the scooters if they are operated in a safe and respectful manner (just like driving). I do, however, have a major problem with scooters blocking the sidewalk when parked and riders zipping by me when I’m walking on the sidewalk. In addition, driving is already dangerous enough without having to take into account a scooter rider on the road not obeying the law.

Instead of trying to add more regulations for scooters, how about the city enforce the current laws on the books? This would go a long way at solving the problems. The companies that operate the scooters could possibly do more to make their riders understand how to properly operate them. As much as I’d like to blame these companies, it is the riders that are causing the problems. The companies, however, need to stage their scooters in appropriate locations to not block sidewalks and need to pick them up in a reasonable amount of time as they look like trash scattered all over.

I am not a lawyer and this is not legal advice. This article is based on my interpretation of the laws.

Automating my TV

One of the lazy things that I’ve tried to do was have the Amazon Echo turn my TV on and off. When I had Home Assistant running on my Raspberry Pi, I used a component that controlled the TV and Apple TV via HDMI CEC. Unfortunately it wasn’t quite reliable and I lost the ability to use it when I migrated to a VM for Home Assistant.

In a recent release of Home Assistant, support was added for Roku and since I have a TCL Roku TV, I decided to give it a try. The component itself works, but has a few major limitations for me. First off it initializes on Home Assistant startup. In order to conserve a little energy, I have my TV, Apple TV, and sound bar on a Z-Wave controlled outlet. The outlet doesn’t turn on until the afternoon, so most of the time when Home Assistant restarts (I have it restart at 6 am so that my audio distribution units initialize as they also turn off at night), the TV isn’t turned on. The second issue has to do with the TV going to sleep. It has a deep sleep and a fast start mode; fast start uses more energy, so I leave it off. The Roku component uses HTTP commands to control the device or TV; when the TV is in deep sleep, it doesn’t respond to HTTP commands. This, of course, makes it impossible to turn on the TV with the component.

After thinking about this problem for awhile, I came up with some Node-RED flows to turn on the TV and handle status updates. The TV, it turns out, responds to a Wake-On-LAN packet as I have it connected via Ethernet and Home Assistant has a WOL component that lets me send the packet.

My flow to check on the TV state is a bit complicated.

  1. First it pings the TV. The ping is done every 10 seconds.
  2. If the TV responds, it sends an HTTP request to the TV.
  3. When the response comes back, it is parsed, the current application running is checked. This also lets me know what Roku channel is currently active. I have noticed that my TV reports that the Davinci Channel is active when I turn the TV off, so I special case that.
  4. If the channel is not null and not the Davinci Channel, I then send a command to check to see if the display is off.
  5. After I figure out the app and if the display is off, I craft a new payload with the current channel in it.
  6. The payload is then sent in an HTTP request back to Home Assistant’s HTTP Sensor API
  7. If the TV doesn’t respond to the ping, I set the payload to off and then send the state to the Home Assistant API.

Tv state flow

Turning on the TV is a bit less complicated.

  1. Send WOL packet to TV.
  2. Pause.
  3. Send HTTP command to turn on TV.
  4. Send HTTP command to set input to HDMI3 (my Apple TV).

Turning off the TV is even easier.

  1. Send HTTP command to turn off TV.

Tv on off flow
When I turn on the TV outlet, the state of the TV gets updated pretty quickly as the ping command from above is running every 10 seconds.

I’ve posted the Node-RED flows below that can be imported and modified for your situation.

Download Node-RED flow to turn Roku TV on/off

Download Node-RED flow to get current TV state

Adding Energy Monitoring to Home Assistant

Now that I have Home Assistant running pretty well, I’ve started seeing what else I can add to it. There are several components for monitoring energy usage, but sadly none for my Rain Forest Automation Eagle Energy device. After a quick search, I found a Node-RED flow that looked promising. It would query the local API of the device (or the Cloud one) and give me an answer. The next step was seeing how to get that into Home Assistant. I found the HTTP Sensor which would let me dynamically create sensors. (There is so much to explore in Home Assistant, it will keep me entertained for awhile.)

With all the pieces in place, I set the Node-RED flow to repeat every 15 seconds and then use the Home Assistant API to add the usage. This worked well for a few hours, but then I stopped receiving updates only to discover that the Eagle device had stopped responding. When I checked the developer documentation, it indicated that the local API was not supported for my older device. However, an Uploader API was available that would push the data to me. That sounded interesting, so I created a flow in Node-RED that listened for a connection and then parsed the data using the flow I found before. The only problem was how do I get the device to push me the data. The Eagle device has options for cloud providers, but something I missed before is that there is the ability to add a new one. I added my Node-RED install using: http://10.0.3.100:1880/eagleenergy and the data starting flowing!

So far this new method has been working for almost 24 hours, so I have a lot more confidence that this will keep working.

The Node-RED flow is below:

Eagle energy flow

    [{"id":"b7dc8932.f85388","type":"xml","z":"15825822.ae8e1","name":"Convert to
    Object","property":"payload","attr":"","chr":"","x":310,"y":1440,"wires":[["21269998.3f97e6"]]},{"id
    ":"c85cb9e0.0ba818","type":"http request","z":"15825822.ae8e1","name":"Query Active
    App","method":"GET","ret":"txt","url":"http://10.0.3.41:8060/query/active-app","tls":"","x":310,"y":
    1380,"wires":[["b7dc8932.f85388"]]},{"id":"b35dc59a.083738","type":"ping","z":"15825822.ae8e1","name
    ":"Ping
    TV","host":"10.0.3.41","timer":"10","x":90,"y":1300,"wires":[["e2decb33.dc36e8"]]},{"id":"e2decb33.
    dc36e8","type":"switch","z":"15825822.ae8e1","name":"Is TV
    responding?","property":"payload","propertyType":"msg","rules":[{"t":"false"},{"t":"else"}],"
    checkall":"true","repair":false,"outputs":2,"x":290,"y":1300,"wires":[["6b2354bd.8306ec"],["c85cb9e0
    .0ba818"]],"outputLabels":["","Is awake?"]},{"id":"a59cc790.158f68","type":"http
    request","z":"15825822.ae8e1","name":"Update TV
    State","method":"POST","ret":"txt","url":"https://homeassistant.com:8123/api/states/sensor.tv_state"
    ,"tls":"","x":1140,"y":1440,"wires":[[]]},{"id":"208bd98e.9ed806","type":"change","z":"15825822.
    ae8e1","name":"Set API
    Authorization","rules":[{"t":"set","p":"headers","pt":"msg","to":"{\"Authorization\":\"Bearer
    INSERT_BEARER\"}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":920,"y"
    :1440,"wires":[["a59cc790.158f68"]]},{"id":"21269998.3f97e6","type":"change","z":"15825822.ae8e1","
    name":"Set Payload to Active
    App","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.active-app.app[0]._","tot":"msg"}],"
    action":"","property":"","from":"","to":"","reg":false,"x":330,"y":1500,"wires":[["6d6fdcd0.004714"]
    ]},{"id":"71eea783.5158f8","type":"function","z":"15825822.ae8e1","name":"Set new
    payload","func":"var channel = msg.payload\nif (channel == \"Davinci Channel\") {\n    channel =
    \"Idle\"\n}\nvar newPayload = {\"state\":channel,\"attributes\":{\"icon\":\"mdi:television\",
    \"friendly_name\":\"TV\"}}\nmsg.payload = newPayload\n\nreturn
    msg;","outputs":1,"noerr":0,"x":650,"y":1400,"wires":[["208bd98e.9ed806"]]},{"id":"6b2354bd.8306ec",
    "type":"change","z":"15825822.ae8e1","name":"Set Channel to
    off","rules":[{"t":"set","p":"payload","pt":"msg","to":"off","tot":"str"}],"action":"","property":""
    ,"from":"","to":"","reg":false,"x":870,"y":1300,"wires":[["71eea783.5158f8"]]},{"id":"ee5484a0.
    bf69c8","type":"http request","z":"15825822.ae8e1","name":"Get Device
    Info","method":"GET","ret":"txt","url":"http://10.0.3.41:8060/query/device-info","tls":"","x":300,"y
    ":1580,"wires":[["dfba9256.d0175"]]},{"id":"6d6fdcd0.004714","type":"switch","z":"15825822.ae8e1","
    name":"Check active app","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"Davinci
    Channel","vt":"str"},{"t":"null"},{"t":"else"}],"checkall":"true","repair":false,"outputs":3,"x":610
    ,"y":1500,"wires":[["ee5484a0.bf69c8"],["ee5484a0.bf69c8"],["71eea783.5158f8"]],"outputLabels":["
    Davinci
    Channel","Null",""]},{"id":"dfba9256.d0175","type":"xml","z":"15825822.ae8e1","name":"Convert to
    Object","property":"payload","attr":"","chr":"","x":510,"y":1580,"wires":[["37ef8802.728648"]]},{"id
    ":"37ef8802.728648","type":"change","z":"15825822.ae8e1","name":"Check Display
    State","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.device-info.power-mode[0]","tot":"
    msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":560,"y":1660,"wires":[["adaad7e0.
    489ba8"]]},{"id":"adaad7e0.489ba8","type":"switch","z":"15825822.ae8e1","name":"Is Display
    Off?","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"DisplayOff","vt":"str"}],"
    checkall":"true","repair":false,"outputs":1,"x":760,"y":1660,"wires":[["6b2354bd.8306ec"]]}]

All In with Home Assistant

I’ve spent parts of the last 9 months playing with Home Assistant and have written about some of my adventures. A few weeks ago, I finally decided to go all in with Home Assistant and ditch my Vera. I bought an Aeotec Z-Stick Gen5 Z-Wave dongle and starting moving all my devices over to it. Within a few days, I had all my devices moved over and unplugged my Vera. Everything was running great on my Raspberry Pi B, but I noticed that the History and Logbook features were slow. I like looking at the history to look at temperature fluctuations in the house.

History graph

I had read that switching from the SQLite database to a MySQL database would speed things up. So I installed MariaDB (a fork of MySQL) on my Raspberry Pi and saw a slight increase in speed, but not much. Next was to move MariaDB to a separate server using Docker. Again, a slight increase in speed, but it still lagged. At this point everything I read pointed to running Home Assistant on an Intel NUC or another computer. I didn’t want to invest that kind of money in this, so I took a look at what I had and started down the path of installing Ubuntu on my old Mac mini which was completely overkill for it (Intel Quad Core i7, 16 GB RAM, 1 TB SSD). Then I remembered that I had read about a virtual machine image for Hass.io and decided to give that a try.

After some experimenting, I managed to get Home Assistant installed on a virtual machine running in VMWare on my Mac Pro. (A few days after I did this, I saw that someone posted an article documenting this.) I gave the VM 8 GB of RAM, 2 cores (the Mac Pro has 12) and 50 GB of storage. Wow, the speed improvement was significant and history now shows up almost instantly (the database is running in a separate VM)! I was so pleased with this, I decided to unplug the Raspberry Pi and make the virtual machine my home automation hub. There were a few tricks, however. The virtual machine’s main disk had to be setup as a SATA drive (the default SCSI wouldn’t boot), suspending the VM confused it, and the Z-Wave stick wouldn’t reconnect upon restart. After much digging, I found the changes I needed to make to the .vmx file in the virtual machine:

    suspend.disabled = "TRUE"
    usb.autoConnect.device0 = "name:Sigma\ Designs\ Modem"

(The USB auto connect is documented deep down on VMWare’s site.)

I’ve rebooted the Mac Pro a few times and everything comes up without a problem very quickly, so I’m now good to go with this setup. Z-Wave takes about 2.5 minutes to finish startup vs. 5 or 6 on the Pi. A friend asked if I was OK with running a “mission critical” component on a VM. I said that I was because the Mac Pro has been rock solid for a long time and my virtual machines have been performing well. I could change my mind later on, but I see no reason to spin up another machine when I have a perfectly overpowered machine that is idle 95% of the time.

What next? Now that I have more power for my automation, I may look at more pretty graphs and statistics. I may also just cool it for awhile as I’ve poured a lot of time into this lately to get things working to my satisfaction. This has definitely been an adventure and am glad that I embarked on it.

Dipping my toe in the world of Docker

A former co-worker of mine has talked about Docker for years and I’ve taken a look at it a few times, but have generally been uninterested in it. Recently with my interest in Home Assistant, I’ve decided to take another look as many of the installs of Home Assistant as well as Hass.io are based on Docker.

I’ve used virtual machines running on VMware Fusion for years with some Windows installs and some Linux installs. I’m very comfortable with Linux, but kind of dislike maintaining different packages. There are package managers that handle much of it for me, but then there are other packages that have special installations.

I had a few goals in mind for seeing if Docker could replace the current virtual machines I had running for Pi-hole and Observium. The goals were pretty simple that I wanted easy updates and be able to easily backup the data. In the Docker world, updates are dead simple and in many docker containers, the data is stored outside of the container making it easy to backup. As another goal, I wanted to be able to experiment with other containers to see what else I could add to my network.

With all this in mind, I started looking at how to setup Docker. Pretty quickly, I realized that Docker for the Mac was virtually useless for me as it didn’t handle all the networking that Docker running on Linux could. So that meant installing Docker on a Linux VM; that almost negated my goal of easy updates as I’d still have to update the virtual machine running Ubuntu. I could live with that if the rest of the setup was straight forward and didn’t have to remember how to update each container individually.

In order to make backups easy, I wanted to store the data on my Mac and not inside of the virtual machine. I’ve not had great luck with the VMWare tools for mounting volumes, so I decided to use CIFS (SMB) to mount a volume in Linux which works well except for the MariaDB (MySQL fork) Docker container. Not a big deal, I’d just add a cron job to dump the databases every few hours and store the dumps on the mounted volume. I added the following to /etc/fstab

    //myserver/account/Documents/Ubuntu /mnt/mediacenter cifs username=account,domain=WORKGROUP,password=password,rw,hard,uid=1000,gid=1000 0 0

I also had to turn on Windows File Sharing options on the Mac.

Windows File Sharing

The crontab is:

    30 */2 * * * /usr/local/bin/backup_mysql

with the backup_mysql file being

    #!/bin/sh
    /usr/bin/mysqldump -h 127.0.0.1 -u root -ppassword --lock-all-tables --all-databases | gzip > /mnt/mediacenter/backups/mysql/mysql_backup_$(date +"%m-%d-%Y-%H_%M_%S").gz
    find /mnt/mediacenter/backups/mysql/* -mtime +3 -exec rm {} \;

The next hurdle was dealing with IPv6; most people don’t care about it, but I’m not most people! IPv6 is quite complicated (at least to me), so that took a bit of experimenting to get it to work in Docker. For future reference, ndppd lets the virtual machine tell the world that it handles IPv6 for the Docker containers (basically).

So where was I? After getting the Linux VM setup, it was on to setting up my containers. With docker-compose, I could setup one file that was the configuration for all my containers. Now this was great as I could modify it and test out different containers. After a few days of work, this is the core of my docker-compose file. There are a few other containers I’ve added including LibreNMS, but this is basically what I have. The nginx-proxy is great as I just add DNS entries for each service and it handles SSL and lets me run multiple web services on the same machine.

version: "2.3"
services:
  nginx-proxy:
   image: jwilder/nginx-proxy
   environment:
      - DEFAULT_HOST=pihole.exmple.com
   ports:
     - "80:80"
     - "443:443"
     - "::1:8080:80"
   dns:
     - 10.0.1.1
   volumes:
     - /var/run/docker.sock:/tmp/docker.sock:ro
     - '/mnt/mediacenter/docker/certs:/etc/nginx/certs'
   restart: always
   networks:
      default:
        ipv6_address: XXXX:XXXX:XXXX:XXXX:1::2

  pihole:
    image: pihole/pihole:latest
    ports:
      - "53:53/tcp"
      - "53:53/udp"
    environment:
      # enter your docker host IP here
      ServerIP: 10.0.1.200
      WEBPASSWORD: ''
      DNS1: 127.0.0.1
      DNS2: 10.0.1.1
      DNS3: XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX
      # IPv6 Address if your network supports it
      ServerIPv6: XXXX:XXXX:XXXX:XXXX:1::3
      VIRTUAL_HOST: pihole.example.com
    volumes:
      - '/mnt/mediacenter/docker/pihole/pihole/:/etc/pihole/'
      - '/mnt/mediacenter/docker/pihole/dnsmasq.d/:/etc/dnsmasq.d/'
      - '/mnt/mediacenter/docker/pihole/pihole.log:/var/log/pihole.log'
      # WARNING: if this log don't exist as a file on the host already
      # docker will try to create a directory in it's place making for lots of errors
      # - '/var/log/pihole.log:/var/log/pihole.log'
    restart: always
    cap_add:
        - NET_ADMIN
    networks:
      default:
        ipv6_address: XXXX:XXXX:XXXX:XXXX:1::3

  mariadb:
     image: mariadb
     ports:
       - 3306:3306
     volumes:
       - '/mariadb/data/:/var/lib/mysql/'
     environment:
       MYSQL_ROOT_PASSWORD: password
     restart: always
     user: "1000"
     networks:
       default:
        ipv6_address: XXXX:XXXX:XXXX:XXXX:1::4

networks:
  default:
      driver: bridge
      enable_ipv6: true
      ipam:            
        driver: default            
        config:                
            - subnet: 192.168.0.0/24                
            - subnet: "XXXX:XXXX:XXXX:XXXX:1::/120"                

Phew, that was a lot of work to get things running. However, I’m pretty pleased with how things are working. I now have the ability to experiment with other containers and can restore my data easily if things go awry. Is Docker the answer to everything? Probably not, but it appears to handle this job well.