offset \ˈȯf-ˌset\ noun

a force or influence that makes an opposing force ineffective or less effective

Home Assistant Icecast Radio Alarm and Syncthing

Usually when you listen to a radio online, chances are that the stream is coming from the Icecast server. Icecast is an open source project and I've set it up to run on our Raspberry PI in a Docker container.

To generate the music for the Icecast, I use Liquidsoap (also in a separate Docker container like Icecast) and it takes files from a certain folder on the external drive (passing it in the container as a volume via host folder).

The inspiration partially came from Silent Protest talk and then their repo containing Docker images.

Some music is not available on Spotify so I resort to this method as well. Just like the Spotify alarm was set up, the automation for this is done in the Home Assistant in a similar way, but much simpler. You need to call media_player.play_media service and give it the target of the speakers with the source being that music stream from Icecast. It's bound to the local network as well because I am not comfortable exposing the service to the world.

Now here's the kicker. That same folder that is the music source for the Icecast stream is synced among other PCs in the household using Syncthing (also in a separate Docker container). This means we can update the folder with new files and Liquidsoap's configuration periodically scans the changes in the folder and updates the streaming playlist. This is the reload parameter from the Liquidsoap cookbook. I am really happy with how it's all brought together.

Syncthing pierces the local network. It also creates a mesh from the connected instances. I use it to back-up my database on the external server and replicate the file among other synced devices. It involves some terminal commands and an edit of the crontab, as well as having a .pgpass file ready to execute the pg_dump command without a prompt. Remember to have that file owned by the user executing the commands and that the permissions are 600.

# have this in the crontab, for instance as a daily job
# this dumps Postgres database to a certain file with
# a timestamp as a part of the filename, Windows compatible
pg_dump -U {db-user} {db-name} -f /folder/for/syncthing/Sync/{project-name}_`date +\%Y-\%m-\%d_\%H-\%M-\%S`.sql
# to restore, use: $ psql -U {db-user} {db-name} < {dump-filename-from-above}.sql

# to remove backups, also a daily cron job
# this lists all the files in the folder, then
# filters out first 13 entries and
# removes them from the system
ls -t /folder/for/syncthing/Sync/*.sql | sed -e '1,13d' | xargs -d '\n' rm

Because I have an external drive locally and a big enough one on the network, I can sync between devices, cheaply backing-up photos and videos. When I take photos with the GoPro, I move them from the device to the cell phone app and then to the phone system. It ends up in the same folder ready for syncing, courtesy of Syncthing for Android. For now it only backs up the photos of the local parks and scenic spots. It can be sunny here. It's summer after all. We'll make use of this functionality even more once the pandemic passes.

Aside from the alarm radio in the Home Assistant, I also added a Syncthing card in it, using REST integration to say what the usage of it is. That works well, too, and it expands my Home Assistant dashboard with a new functionality. I shamelessly copied the instructions from the community forums.

We Don't Have a Rudder But We Have a Sail

There's still some momentum. In relation to the previous post, I'm continuing the foray into the apartment becoming a proper livable/workable place. I had fun again although we're still at the mercy of the great context we're in. That context has improved somewhat, though. Now the country allows us to move around it, but nothing's working and we still haven't gotten our jabs. Nevertheless, we're biding our time and doing things at home.

The curtain annoyed me for a time. It's a vertical blind that you have to pull two strings to get open. One is changing the angle of the vertical strips that make it up, the other is moving the strips to the side. I think it's a fairly standard one when it comes to vertical blinds. The blinds reach all the way to the floor.


/media/images/vertical-blinds.jpg

I spent some time researching the options to make it automated so I didn't need to pull the strings. Unfortunately, there's no one device for automating it. The most frequent is Aqara curtain controller usually coming from Xiaomi, but that one doesn't fit my use-case. The only option I could find that would do it was two devices, one for each string, coming from Zemismart. I opted for only one at this time to see if it would work. It took some weeks to arrive.

The problem is that during some of the weekday mornings, the robotic vacuum goes around the apartment and it needs to have the space cleared so it can do its thing. We do a little dance. The apartment comes to life and while the vacuum is going around the rooms, we're opening the curtains and moving chairs around. I thought that it would be great if the curtain could unroll in the morning before the robotic vacuum started its routine. I cannot do anything about the chairs except leave them as they are, but at least some of the manual work would be eliminated.

So on to the Zemismart. Assembling it was not a pain, but setting it up to join the Zigbee mesh was. Especially since the instructions are weird. Fortunately, it can (and does) work with an unbeaded cord and is strong enough to pull the curtains we have. The only trick is the tension of the string so I played with it a bit to get it right. I used double sided tape to stick it to the window frame, but it kept falling off as the tension of the string needed to be adjusted. Nevertheless, it enabled me to figure out where I needed to screw in the device's plate to maintain the right tension. Picking the right cog, charging and installing it in place turned out to be the easy part.

Getting the motor to turn on, to have it spin in the right direction, to set the limits for where the start, middle and end are, as well as connect it to the Zigbee mesh can bring about some trouble. It took some research to figure out what each thing was supposed to do. Motor off and on is mostly for safety reasons. Direction is for which way you want the mechanism to spin and it should work at the default, but you can override it. Think what up and down buttons mean to set the direction right. Limits are self-explanatory, but they're both using the same button to set (except the middle). Having it in pair mode is not difficult to engage, but the software support is patchy at best.

I have a Conbee 2 gateway for Zigbee coming from Phoscon. It usually comes with the computer app, but the app couldn't find the motor. What furter complicates things, over there everything is treated like a light instead of a device. In the end I didn't need the app and decided to remove it. After all, Conbee 2 is a Zigbee radio and can work with any library that is willing to support it. This proved great because Home Assistant has an integration with the Conbee 2 stick via zigpy library which is more up to date than the official app. I needed to expose the device path on Linux to the Docker instance of the Home Assistant.

This enabled me to have the device join the mesh with the controls and all, but the way this thing was made, there are hacks set up in place just to make it work. Luckily, they're setting it up in the library so I will avail of the new functionality. For now I can say that the device is at least connected to the mesh and it can be triggered by remote controller buttons, but rudimentary controls from the Home Assistant also work, like calling the services directly instead of using the controls in the card and instead of "close" or "open", it goes to the next limit. That's why my automation is doing "set_cover_position" instead.

I am tempted to get another one to control the angles of the blinds. I know it will be a pain to control two motors to get the natural light, but it's better than running to the living room to open the curtains.

Now, if only I could figure out what to do with the one in the bedroom...

Idle Hands are the Devil's Workshop

It's already April, we're still at home and still not traveling so in the past few months we've been ordering stuff online to get the apartment fully equipped. We've been procrastinating with finalizing some things and we're still missing some functional items in the apartment before we start decorating, or at least put in some effort to amend the current naked-wall aesthetic. We deliberately went for a smaller loan, but that didn't leave us with a lot of spending money so we've been catching up. In our minds, every little bit matters.

By the end of April the restrictions did loosen up a bit so we managed to move around the city. The outskirts can be beautiful in the right places.


/media/images/dalkey_hill.jpg

This month I was busy assembling flatpack furniture, screwing things in place, moving things and bringing everything together. Hopefully, in a few months' time, it will all be done. I keep saying that and we keep ordering new things, but progress can really be seen as the time passes. Our makeshift workroom (and the rest of the apartment) is starting to look like something.

This time we ordered some shelves and a motorized desk from Ikea (and it took them a month and a half to get the delivery ready because of the pandemic) and then some trinkets from various places online. We still had to do a quick run in the nearby hardware store to get whatever we missed.

We installed shelves in the storeroom and the workroom, which was long overdue. The new shelves let us use more vertical space to store the things that have just been lying about. We put several on top of our wall bed and it looks great. We're still missing some of the inserts for them, but they didn't have them available online so we'll have to wait again. One of them was also slightly bumped, but it's not noticeable. It's not really ideal when new purchases already have signs of wear and tear, but we really didn't want to go through the hassle of exchanging things.

Working from home is becoming a new normal and organizing the space can be challenging. We used the opportunity to move things about to economize the space, got a new extension cord and some fixings to deal with the cable chaos. My powered USB hub finally got a free dedicated outlet so I can use it for plugging in even more things.

The desk is from Ikea's Idåsen line, a motorized standing workdesk that is quite heavy as I soon found out. We managed to get it inside and assemble it and for three days everything hurt, but it was worth it. When it goes up, my posture changes so I can feel the effects almost immediately. My spine will reap the benefits and my future self will thank me later. The desk also has the bluetooth connection. I saw it the first time in one of Armin's tweets about automating his desk. I figured that it wouldn't hurt for me to automate it with the Home Assistant as well so I'm working on it. For now it only works while holding down the physical switch or the virtual one in the Android app.

The desk I had before was really a kids' desk and it would be an understatement to say that it wasn't really suitable for someone of my height. I had some 15 cm to move the mouse around and barely the space to place the keyboard. My desktop computer languished in this state for years. But now, with a bigger desk depth and no back on the desk it meant that I could install the monitor arm I had bought a year ago. This freed so much surface so I am looking forward into finally getting back to drawing again. My drawing equipment and the hardware now fits properly and the mouse sensitivity was adjusted accordingly.

Regarding the other trinkets that got delivered, one of them is a Broadlink RM4 pro S universal remote. It can replace all the remotes we have in the apartment so there's less space and batteries used. It also tracks temperature and humidity (although I don't need the temperature tracked because the thermostat takes care of that) and it can be connected to the local network. This means that I can also add it to the Home Assistant and write up some scripts to turn on multiple devices at the same time or automate the dehumidifier that we have in the apartment to turn on only when it needs to. It's useful because there are some devices that are not smart, but get smart when this is in play.

We also got some gardening equipment so I fully expect to write about it some time in the future when I get all the hardware assembled for it.

After well deserved rest and recovery, and getting into the daily routine with the new setup, I tackled the software side, which was easier, at least physically speaking, but there are still kinks to be ironed out.

I was playing a bit with Home Assistant, concretely the Spotify integration detailed in the previous post. I expanded that one with Spotify turning off after a few minutes just before the morning exercise. I've also supercharged the morning routine with four more things:

  1. a notification to do the exercise via Telegram, 15 minutes before
  2. sending Wake on LAN signal to the PC so I don't need to press the button in the morning
  3. a browser shortcut in the start-up folder to start the browser with the computer
  4. opening the tab in the browser with the YouTube video (with autoplay enabled for it) on doing the exercise

First two things are done with Home Assistant, the third is a straight-forward thing to do and the last one uses Push2Run which receives a command through Google Assistant routine functionality. It all works perfectly. If you want your Windows PC to do things on the Google Assistant voice command, I recommend that you explore Push2Run.

I also did the script in the Home Assistant for turning on all the hardware for when we want to watch our streaming services. For some reason, CEC is not working for me. I need to investigate it further. I had to go through Home Assistant for that because Broadlink cannot cover all of it. Namely, the gaming console had to be triggered separately with another service call where the console is set up as a media player device in the Home Assistant.

I mentioned the extension cord and the powered USB hub. This is connected to the brain of the whole thing, the Raspberry PI. I cannot thank my friend enough for giving it to me. It is an amazing moving in gift that I have so much fun with. There's Docker on it and I install services through it. Home Assistant is one of them. Others, well, for the next time.

Home Assistant Spotify Radio Alarm

I have a Home Assistant instance running in a Docker container on the Raspberry PI. The configuration is exposed on the Docker volume so I can access the file and change it. I followed the instructions to get the Spotify integration running in the Assistant and quickly turn this into an alarm radio.

Since I already own a Spotify account, it was not difficult to set this up:

  1. follow the links in the instructions and create an app on the developer side of Spotify
  2. edit the settings for the application and add a redirect URI and save
  3. copy the credentials for the configuration.yml of the Home Assistant
  4. edit the configuration.yml per the instructions and restart the Home Assistant server
  5. go to Home Assistant integrations section and add Spotify integration

Make a note of the integration name. You'll need it later. It's "Spotify MyUsername" on my end.

It pretty much gets added to the Home Assistant dashboard automatically. I went a step further and added an automation for this. My speaker system is connected to the Home Assistant from before so this turned out to be a perfect opportunity to go down this route. I wanted to have the "Liked Songs" as a playlist to run, but Spotify is not making it a playlist. Here's the entrance to the rabbit hole if you want to see how the "Liked Songs" was requested to be a playlist. For now, I opened it in a dedicated application on the computer, selected all songs with Ctrl+A and added them to a new custom playlist that I can work with.

In the automations section of the Home Assistant I did the following:

  1. added an automation and started with an empty automation
  2. added the name for the automation (I used "Spotify Alarm") and left the other options as they were
  3. for the trigger I used "Time" type and a fixed time, which can be whenever you want the automation to run (08:00 for example)
  4. conditions I didn't touch
  5. the next was the action subsection where I added several, starting with turning on the speakers, which means I set this action's type to "Call service", the service to "media_player.turn_on" and my speaker-set and the Spotify player as the targets
  6. there's an "add action" button bellow that lets you add more actions and my next one was "Delay" of 10 seconds as a quick and dirty way to give the speakers some time to turn on
  7. added new action: "Call service", "media_player.volume_set" as the service, with my speakers as the target and the volume percentage at 0.2 (this is 20% of the maximum volume of the speaker set)
  8. added new action: "Call service", "media_player.play_media" under service, but this time the target is the Spotify player, "Content type" is set to "playlist" and "Content ID" is the URL to the custom playlist
  9. added new action: "Call service", "media_player.shuffle_set" under service, the Spotify player as the target, and shuffling toggled
  10. added new action: "Call service", "media_player.media_next_track" under service, the Spotify player as the target
  11. added new action: "Call service", "media_player.select_source" under service, the speakers as the target and as the source I put the name of the device ("Spotify MyUsername")

/media/images/spotify_alarm_actions.png

Save and exit the automation. Run it to try if it works. There might be some tweaking involved from your end for the action "Delay" if it takes a long time to power on the system. I'm wondering if "Wait" would be appropriate. There's also a question of the Spotify integration with the speaker system. I didn't figure out where the source will end up, but I'm not complaining. It works.

I perceive home automation as a hobby at best. I'm still poking around that. The results of tinkering can be seen here. I'll probably need to publish the automation scripts in some public repo eventually.

Vaccine Hesitancy

To start off, I understand some communities have historically had bad experiences with being subject to institutionally approved medicine that proved harmful and that this can lead to skepticism that is justifiably hard to root out. However, I don't understand why people would doubt science, let alone vaccines, in societies where people have reliably been protected by vaccines for decades. Even more, when our elders can still remember the deaths that had occurred before those vaccines were widely available.

Sure, corruption is a widespread phenomenon, but there's still peer review and, among the huge number of people involved, the information can no longer remain hidden for a long time. It's very trendy to debate about COVID-19 vaccines at the moment, and I'll say a few about them as well. I've no qualms about getting the COVID-19 vaccine when it's available to my cohort, even though I had received a flu jab recently and it was not an ideal experience. The form asked to give my consensus to a general statement that I was not allergic to the vaccine's ingredients without disclosing those ingredients. And then it specifically asked: "Are you allergic to eggs?". The entire process lacked transparency and did not instill much confidence.

To make matters more complicated, there's a synthetic vs natural aspect to the debate in vaccine production. While I'd prefer a vegan friendly vaccine, it's on everybody to make a choice for themselves between the very limited options there are. I opt to protect lives and if that means getting vaccinated and improving the herd immunity, that's what I'm doing. After all, I'd still go for another one. Why? Because I trust the vaccination process and that the vaccine has been tested and allowed to be produced, no matter how clumsy the disclosure of information at the individual level can be. Being vegan is trying to do the least harm and it would be irresponsible of me to cause more damage in the long run.


/media/images/vaccination.jpg

Vaccines prevent serious disease consequences including premature death and they could save more lives if vaccination efforts had more penetration than they currently have. A vaccine tells the body how to fight a disease without the process of contracting and surviving it (or being inconvenienced by it). When enough individuals are immune to a disease, this triggers herd immunity, meaning that, if enough people among the population are immune, the risk of spreading the disease to other individuals (who cannot get the vaccine due to various reasons, e.g. allergies) becomes unlikely.

Historically, vaccines saved a lot of lives since their introduction. There's a nice infographic about how they helped in the US.

The perceived reasons why vaccines are unnecessary are various. From simple fear of needles to discounting the dangers of a disease or having safety concerns about the vaccine in question. It turns out vaccines remain pretty safe and efficient, and overall, most side-effects are due to the immune system being agitated into a response to become fight-ready against possible oncoming exposure.

The disruption of herd immunity usually stems from the sociological phenomenon called free-riding. People can benefit from overall herd immunity even though they're not vaccinated, which is built-in by design - to protect those who cannot take the vaccine. Some of those who are eligible, but refuse and still free-ride the herd immunity promote the idea that there is no need to take vaccines as nobody is getting ill in the first place. If such influence spreads in the community and people start refusing to vaccinate, herd immunity weakens, which may in turn lead to disease resurgence and stifle the ability of the community to keep healthy in total as more individuals take sick than before.

This is a very dangerous and anti-scientific behavior. A disease is usually not eradicated and its effects can still be observed in individuals who contract it. It is still among us, it's just that we have reduced its access to viable hosts.

We can see examples of free-riding everywhere around us in people who use the resources available to a community, but refuse to uphold them, and we are often much more sensitive and disapproving of those examples. For instance, people at work who cruise on other people's efforts, people not paying for public transport tickets, people who litter counting on it being cleaned up by somebody else. You'll definitely see tempers melt when the topic of social benefits comes up in the context of people receiving them while dodging legal employment and contributing to the same system that has come to their aid. My pet peeve are people who are disinclined to sacrifice anything to offset climate change, but will enjoy the benefits if the problem is solved by others. The examples are numerous.

This type of behavior can lead to serious consequences when it comes to opting out of vaccination. Disease recurrences have happened in recent years, for example, with measles just some years ago in Croatia and Ukraine and even here in Dublin, in 2000. People need to learn from history. Not ignore it. People need to learn in general.

The lack of personal experience makes people insensitive. Out of sight, out of mind. It also brings about other conspiratorial ideas because of the trap of solipsism. The scientific method counters this with peer review. Of course, the experiment can be replicated. Very often people are not equipped to replicate it or can't be bothered to do it and see for themselves so instead of trusting the method, sometimes they opt to spread false (and debunked) claims. It's easier.

I want to point out that the vaccines are held to a higher degree of safety, especially COVID-19 because they are primarily to be applied to healthy individuals and the imperative goal is to keep them out of the health system and avoid stressing it further. True, side-effects are possible, but very rare and the consequences of the disease that the vaccination is against are much more severe and frequent, and might overwhelm the heath system altogether.

Growing up as a kid, there was mandatory vaccination that was usually done in schools. Aside from a few tears and fear of the needle, nobody I know had a related issue later in life, and it was commonly understood that it was for our benefit. Vesna, however, remembers having a nasty case of chickenpox for which we weren't vaccinated. This vaccine is today available and it would've spared her some misery at the time. Vaccination runs were a regular occurrence. It's how it was for the whole country and it was considered perfectly normal. No outbreaks of diseases and everyone healthy and alive. I believe they still are regular, but I notice the push-back in the general public has become more vocal.

So back to COVID-19 vaccines, which are mostly focused on dealing with the Sars-CoV-2 spike protein. There is a hesitancy stemming from the safety issues. No longitudinal study has been done and it couldn't have been. The disease is about a year old, it has turned the society upside-down and its dangers are not abating. The solutions were bound to be on the radical side.

There are several approaches to the vaccine and a lot of them are authorized and proven to be very effective. One of the approaches to the COVID-19 vaccine is the mRNA technology. Even though it was not licensed for use in humans until now, the research on it is nearly 30 years old.

There are some hurdles with mRNA vaccines, though. The delivery mechanism is coating it in lipid particles because it's very unstable and has to be kept very, very cold making it difficult for logistics of the vaccination programs. However, quick adaption of the vaccine for the variants makes this a technology that we'll rely on in the long run. Not just for the present pandemic.

For the explanation on how the mRNA vaccines work, a good one was done by Bert Hubert on a BioNTech/Pfizer example of the vaccine mechanism.

It's time for the civilization to step up. A truckload of money has been thrown at the issue greatly accelerating the results, and the mRNA vaccines have became a second coming in the fight against the disease. While the process was expedited, no corners were cut. They must not be, otherwise we face more problems than we currently have. We're in the pandemic together and in the unexplored waters. Humanity has never faced a challenge like this before and vaccine research is doing the best it can with the amount of time at disposal.