In an earlier post, Controlling Sonos from a Particle Photon, we created a small app to do just that. The app itself contained some C++ code to interact with a Sonos player on your network. Although the code works, it does not provide you with full control over your Sonos player and it’s tedious to work with.
Wouldn’t it be great if you had an API at your disposal that is both easy to use and powerful? And even better, has Sonos discovery built-in so that there is no need to target Sonos players by their IP? Well, look no further as something like that exists: https://github.com/jishi/node-sonos-http-api. The Sonos HTTP API is written in Node.js which makes it easy to run anywhere!
And I do mean ANYWHERE!!! I wanted to run the API as a Docker container on my Raspberry Pi 3, which is very easy to do. Here are the basic steps I took to configure the Raspberry Pi:
- Installed the latest version of Raspbian from https://www.raspberrypi.org/downloads/raspbian/: I took Raspbian Jessie with Pixel just because I also wanted to play with Pixel a bit
- Installed Docker with curl -sSL https://get.docker.com | sh
- To get some more info and to configure Docker to run at startup, checkout http://blog.alexellis.io/getting-started-with-docker-on-raspberry-pi/
With Docker up and running, I created a Dockerfile and built the image. Here is the Dockerfile:
FROM hypriot/rpi-node
RUN git clone -q https://github.com/jishi/node-sonos-http-api.git
WORKDIR node-sonos-http-api
RUN npm install > /dev/null
EXPOSE 5005
CMD [“npm”,”start”]
Note: a Raspberry Pi uses an ARM architecture which means you need to use ARM compatible images; above I used hypriot/rpi-node (see https://hub.docker.com/r/hypriot/rpi-node/)
Note 2: I’m sure there already is a Docker image for this Sonos API; I just decided to build it myself
After building the image, I tagged it sonosctrl (using docker tag). You will see the tag of this image coming back later when we run the container.
Because the API server needs to discover the Sonos devices on the network, you should not use the Docker bridge network. The command to run the container from the sonosctrl image:
docker run –net=host –restart=always -d –name SonosController sonosctrl
Now you should have a container called SonosController up and running that accepts API requests to control your Sonos:
Note: you also see Portainer running above; I use that to get an easy GUI for Docker on this Pi
To actually test the API, use Postman or cURL. From Postman:
Above, you see a request to load the Sonos playlist called “car” on players in “Living Room”. The request was successful as can be seen in the response. This command will also start playing songs from the playlist right away. If you want to pause playing:
Great! We have a Sonos API running on a Raspberry Pi as a Docker container with a few simple steps. We can now more easily send commands to Sonos from devices like the Particle Photon or an Arduino. I will show you how to do that from a Particle Photon using the HttpClient library in a later article.