Blog

Raspberry Pi Whole Home Audio: Preparation and Networking

At the start of the month I announced my plan to try and build my own whole home audio system using a handful of Raspberry Pis to act as the player and audio
receivers. I’ve received
all the stuff I need
now, and I’m ready to get to building!

The first thing I’m doing is preparing the Pis and setting
up networking. Next I’m going to install audio playing software with a
web-interface on Pi number one, and thirdly I’ll adjust the setup so that this
player sends it’s audio to the other two Pis (the receivers) instead of
outputting it directly to its own speakers. You can follow the whole journey by
following the #RPiWHA
Project
hashtag right here.

Installing Raspbian

Raspbian is the Raspberry Pi’s recommended operating system.
There’s plenty of guidance online on how
to install it
, so I won’t reiterate the whole process here. When I ran
through Raspbian’s initial setup options on first boot I set my location,
timezone and keyboard layout (in Internationalisation Options), set the memory
split to 16mb for graphics (in Advanced Options – we can set this low because
we won’t even be connecting a display) and finally expanded the filesystem
(right from the main menu).

Minimizing SD Card Access

The Pi has no power button. If it’s plugged in then it’s on,
and you turn it off by pulling the plug. I’ve read online that if the power is
pulled while the system is in the process of writing to the Pi’s SD card (which
is the only storage the system has) this can cause problems and possible
corruption.

Linux systems do a lot of logging, most commonly to the
folder /var/log. They also write stuff about running process to the folder
/var/run. To minimize writes to the SD card, we’re going to mount these two
folders in memory instead of on the card. Another cause of frequent writes is
that linux systems store the time that a file was last accessed, so even if we’re
just reading a file the system is actually writing back to the disk to update
the time that the file was accessed. We’re going to change that behaviour too.

To make these changes, we’re going to edit the file
/etc/fstab so that it looks like this:

proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults,noatime  0      2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0      1
none            /var/run        tmpfs  size=1M,noatime   0       0
none            /var/log        tmpfs  size=1M,noatime   0       0

The first two lines haven’t changed, but on the third line
we’ve added the flag “noatime” to indicate that we don’t want to store the
timestamp that the file was last accessed. The fourth and fifth lines are
entirely new, and these create 1mb partitions in RAM to house the /var/run and /var/log folders respectively.

Setting Up Networking on Pi #1

The next step was to connect one of the Pis (and only one)
to my existing home WiFi network. To do this I plugged in one of my USB WiFi
adapters and modified the /etc/network/interfaces file to include the
following:

auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
wpa-ssid MyHomeWiFiName
wpa-key-mgmt WPA-PSK
wpa-group CCMP TKIP
wpa-pairwise CCMP TKIP
wpa-psk MyHomeWiFiPassword
address 192.168.1.71
netmask 255.255.255.0
gateway 192.168.1.254
dns-nameservers 192.168.1.53 192.168.1.254

Your setup will probably be slightly different, but
essentially this connects to my home network, gives the pi a static IP address
(192.168.1.71 in my case) and defines my two DNS servers.

You may be wondering why I’m only doing this on one of the
Pis, given that they all need to be connected together. The reason is that this
first pi (the player) is ultimately going to be sending audio out over the
network as multicast packets. In other words, this data goes to every device on
the network whether they want it or not.

The problem is that this is a lot of data flowing around, and
a typical home WiFi network struggles under the load of it all. My solution is
to have two WiFi networks. The one we’ve set up above will connect us to the
internet (for streaming audio services) and other stuff on my network (like the
fileserver where my music collection lives), but we’ll use a second, separate
WiFi network to send the multicast audio to other Pis.

Let’s plug in a second USB WiFi adapter to the first Pi, and
make some more additions to the /etc/network/interfaces file:

auto wlan1
allow-hotplug wlan1
iface wlan1 inet static
address 192.168.5.1
netmask 255.255.255.0

This section is pretty minimal as you can see, but it’s
setting a static IP address on the second wireless interface. The important
part is that this uses a different subnet to the other WiFi network (in my
case, 192.168.1.x is my existing network, 192.168.5.x is the dedicated network
for the Pis).

This section of the /etc/network/interfaces file is so short
because this Pi is going to act as a wireless access point that the others will
connect to. To set this up we need an additional bit of software, called
hostapd. Because I’m using WiFi adapters based on a Realtek 8188 chipset, I had to download and compile this myself – the version found in the debian software repositories wouldn’t work for me:

wget https://github.com/jenssegers/RTL8188-hostapd/archive/v1.1.tar.gz
tar -zxvf v1.1.tar.gz
cd RTL8188-hostapd-1.1/hostapd
make
sudo make install

Then edit the file /etc/hostapd/hostapd.conf to change the following three lines:

interface=wlan1
ssid=PiWHA
wpa_passphrase=mySecurePassword

Finally, start the service and add it to the boot autostart services for future:

sudo /etc/init.d/hostapd start
sudo update-rc.d hostapd enable

Setting Up Networking on the Other Pis

We want the other Pis to connect to the wireless network
hosted by Pi #1. To do so, plug one USB WiFi adapter into each and modify the
/etc/network/interfaces file on each to reflect the following:

auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
wpa-ssid PiWHA
wpa-key-mgmt WPA-PSK
wpa-group CCMP TKIP
wpa-pairwise CCMP TKIP
wpa-psk mySecurePassword
address 192.168.5.2
netmask 255.255.255.0

The important point here is that the IP address for each
must be unique, and must be on the same subnet (192.168.5.x) that we set on the
first Pi.

Setting Up Time Synchronization

The Raspberry Pi has no real-time clock, and instead it gets
the time from internet time servers at boot. Having the time synchronized on
each of our Pis is going to be important to make sure that they play music in
sync. Only the first Pi has a connection to the wider internet though, so we
need to take some additional steps. On Pi #1, edit the file /etc/ntp.conf and
uncomment (or add) the following line:

broadcast 224.0.0.1

This tells the pi to broadcast a time signal out onto the
network using a special multicast IP address that the other Pis will listen
for.

On the other Pis edit the same file, but uncomment (or add)
the following lines:

disable auth
broadcastclient

We don’t need to tell the other Pis which multicast IP
address to listen for – they already know as part of the NTP protocol.

And We’re Done! Or Are We?

That was a lot of setup work, but we should now have our Pis
setup and networked together, with our player device having an additional
connection to the wider internet.

The thing is… I don’t. The setup is all correct, but the
cheap USB WiFi adapters I bought from China don’t properly support access point
mode. Sometimes things work, sometimes they don’t.

I’ve read that I can download driver source-code from the
adapter’s manufacturer and compile the driver myself, so I’m going to try this
before I go further.

Shrapnel

Late Night Links – Sunday January 25, 2015

Blog

If you’re a regular reader you may or may not have already guessed that I typically write these posts in advance and then set them to publish on a schedule. It’s not really a hard and fast rule, but if I have a couple of posts to publish in a week then I’ll usually schedule them on a Tuesday and a Thursday at the start of the workday here in the Mountain timezone so that they catch the end of the workday in Europe.

The reason I mention this is because the post I published yesterday – Voicemail: A Beginner’s Guide – was actually written last Sunday before I left for my business trip. As it turns out it was extremely prophetic because I spent Tuesday and Wednesday with other leaders from my workplace talking about our culture and how we become better at leveraging the values we already hold, ensuring that the work we do for our internal customers (all my customers are internal) translates correctly and has a positive impact on our end-user customers.

The session was excellent and hugely valuable, and I’m not doing it justice in my description.

I mention it mostly because the overuse of email and the underuse of the phone became something of a common theme, as did intentionality and using your own behaviours to drive the right behaviours in others.

Great minds think alike, hey?

Blog

If you’re a regular reader you may or may not have already guessed that I typically write these posts in advance and then set them to publish on a schedule. It’s not really a hard and fast rule, but if I have a couple of posts to publish in a week then I’ll usually schedule them on a Tuesday and a Thursday at the start of the workday here in the Mountain timezone so that they catch the end of the workday in Europe.

The reason I mention this is because the post I published yesterday – Voicemail: A Beginner’s Guide – was actually written last Sunday before I left for my business trip. As it turns out it was extremely prophetic because I spent Tuesday and Wednesday with other leaders from my workplace talking about our culture and how we become better at leveraging the values we already hold, ensuring that the work we do for our internal customers (all my customers are internal) translates correctly and has a positive impact on our end-user customers.

The session was excellent and hugely valuable, and I’m not doing it justice in my description.

I mention it mostly because the overuse of email and the underuse of the phone became something of a common theme, as did intentionality and using your own behaviours to drive the right behaviours in others.

Great minds think alike, hey?

Blog

Voicemail: A Beginner’s Guide

This week I’ve been travelling for work. I left Calgary early Monday morning, and I returned home late last night.

On Sunday night as I was preparing for my trip I briefly considered setting an “out of office” email alert and changing my outgoing voicemail message to advise people of my unavailability. I quickly dismissed this plan though, for the simple reason that I really wasn’t all that unavailable. Sure I was away from my physical desk in Calgary, but I rarely work from there anyway. And sure my calendar was full, but that’s not unusual either. Setting up unavailability alerts would have been a misuse of the tools available to me.

As I was thinking about all this, it put me in mind of a post I wrote about seven months ago titled Weird Workplace Etiquette. In it, I complained about the fact that nobody just picks up the phone and calls me without first sending me a message (or worse, booking some time in my calendar) to ensure that I’m going to pick up the phone and talk to them.

Now that I’ve had some time to think about it, the reason seems obvious to me. We can lay blame firmly on voicemail. Subconsciously or otherwise people hate it, because everybody’s had a bad experience with it. Think about how it normally goes between a couple of busy people – you leave a voicemail for me in which you ask me to call you back, I call you back and get your voicemail, and so it continues ad infinitum.

Happily, this is pretty easy to fix in my opinion, and the ROWE course I took not too long ago teaches us the way: it’s merely a matter of breaking some bad voicemail habits that almost everyone has. Even more happily, you (mostly) don’t need other people to read my advice – you only need concern yourself with what you do. If you do it right, others should fall into line.

Read on to get started!

Everything starts with your outgoing voicemail message. What does it say now? I assume it’s something along the lines of “I’m sorry I’ve missed your call, please leave me a message and I’ll get back to you.” To be blunt, that’s not good enough.

Firstly, you’re not sorry you’ve missed somebody’s call. You were busy doing something more important than picking up the phone, and that’s OK! Apologising for it is a meaningless platitude and everyone knows it, but more importantly it sets the wrong tone for what we’re trying to accomplish. You’re a (wo)man of action, not the kind of person who spews forth wet apologies for failing to be idly sitting around by your phone when somebody somewhere kind of vaguely hoped that’s what you might be doing. If anything, you should apologise when you are available to answer the phone!

Instead, your outgoing voicemail message should reflect that yes, you were too busy to take the call and also yes, you’re too busy to engage an endless game of phone-tag. Instead of asking callers to leave you “a message,” be specific about what you’re looking for from them.

“You’ve reached Jason. Please leave a message detailing how I can help you and by when you need a response, and I’ll get back to you as appropriate.”

The same goes for when you’re leaving a voicemail for somebody. Just because their outgoing message is vague doesn’t mean the message you leave for them should be too. Think about how you want somebody to react when they listen to your message. Do you want them to immediately get to work on what you’re asking of them, or do you want them to have to call you back and speak with you first so they can find out what you needed? Tell them what you want, and tell them to get back to you once they have it!

I’ve been using these tips for a little while now and I have to say they’re working well for me. Voicemail is a vastly improved experience as a result – although it’s still under-utilised, because people still do all they can to avoid using the tool at all if they can at all help it. Most people never even get to hear my outgoing message and come to the realisation that I’m changing their lives for the better.

Regardless, the more I think about it the more I think I may actually kick things up a notch. Long-time readers may recall another post on this blog from the distant past in which I talked about how people (me) can’t possibly hope to read, understand and respond to every email they get in as timely a fashion as they might like. Email, in a typical workplace (certainly in mine) is a vastly overused tool. Voicemail, though? Thanks to everybody shying away from it, a voicemail is out of the ordinary and will get somebody’s attention. If I can do voicemail well, it could become a fantastic method for making my messages to people a higher priority than everyone else’s.

All I’ll have to concentrate on is not using it for evil.

Blog

The Punctuation Guide

About a month ago I posted about The Data Visualisation Catalogue. If you have data to visualise, hit up this website, tell it what you’re trying to show, and it will suggest some appropriate chart/graph types.

Today I’ve come across another single-purpose website that I think is great, and it’s audience is intended to be a little more general than people who want to visualise their datasets.

It’s The Punctuation Guide!

When I discovered it I fully expected not to learn anything new, merely to receive confirmation that my use of punctuation was already top-notch.

I was, of course, incorrect.

Check out the site to see what you’ve been doing incorrectly your whole life! One word of caution: the guide is intended primarily for writers of American English. There’s a page that explains the main differences between that and British English. Here in Canada you should probably be doing something in-between the two, but if you’re looking for specifics I’m the wrong person to ask.

Shrapnel

Late Night Links – Sunday January 18th, 2015

It’s the time of the week again! Even though tumblr briefly shut down my account this week I’m back with another post! Let’s jump in.

And we’re done for another week! Until next time, folks.