Wednesday, July 27, 2016

Sonos Control with the Amazon Echo - How I did it

I've had my Amazon Echo for a year or so and one thing that I've wanted ever since I purchased it, is to be able to use voice commands to control my Sonos speakers.  I waited patiently (OK  not patiently) for Sonos skill to appear on the Echo but it still hasn't come.  I was encouraged when Sonos announced it was going to focus more on voice but still nothing.  Isn't there any way to control my Sonos with my Echo?

Yes - sort of.

WARNING: This post is not for the faint of heart because the solution is not trivial.

So, I found a project on github that uses another project on github combined with a custom skill on
the Echo via a web service hosted by AWS Lambda.  OK, that was the easy part.  I knew that going in.  That's why, initially, I waited.  There must be an elegant solution out there.  I searched and waited and searched again and waited again.  Finally I decided to give it a try.  If it worked it would be really cool.  If it didn't, well I'm no worse off than before.

Now that it was decided, I sat down and went through the instructions provided by Ryan Graciano.  Here are the instructions with my extra notes.

Get jishi's node-sonos-http-api working


  1. Install node.js on a server on the same network as your Sonos.
    • Oddly enough, I didn't see this step which may have been a good thing because I may have done it wrong.  
  2. Grab https://github.com/jishi/node-sonos-http-api and run it on that server. On Mac, it's "npm install https://github.com/jishi/node-sonos-http-api", then go to the directory created and "npm start".
    • So I tried the command and, not unexpectedly, it failed miserably.  OK now I have to find out what "npm" is and how to install it.  Here's what I did.
      • I found the npm website and created an account (not sure if I really needed to do that)
      • Downloaded the program from https://nodejs.org/download/release/latest/ 
        • This was hard to find because there are a lot of options and it took a bit to find the right one (it was the node-v6.3.1-x86.msi for my 32 bit Windows machine) 
      • Installed the program 
    • Then I had to grab the node-sonos-http-api - the instructions say use the following command "npm install https://github.com/jishi/node-sonos-http-api"  
      • Tried it and it failed spectacularly (tons of error and warning messages) 
      • One of the first errors was "Error: not found: git" - I guess I need git as well 
        • Download git from https://git-scm.com/download/win 
        • Install git 
        • I chose to use the windows cmd.exe and the rest were the defaults 
        • Tried it again - it errored off 
        • Remembered that I just installed git so my DOS window that was already open wouldn't have the new environment variables.  I closed the window and opened an new one 
        • Tried it again - SUCCESS 
          • There were some warnings but it worked!
  3. Take the node-sonos-http-api/presets.json that I have here and drop it into your node-sonos-http-api root directory. Modify it to use your speaker names and your favorite stations. Don't worry about the "uri" field - it's unused. Make sure the preset names are lowercase (like "test" and "rock" in my example). NOTE: You can skip this step if you only want to use Playlists and Favorites, which require no configuration.
    • OK - I found the directory on the website that referenced the presets.json file but, instead of downloading the file, it brought up the file text.
      • Fine - I copied the file text (control c is my friend)
    • Found the node-sonos-http-api root directory and created the presets.json file with the data I copied from the web page.
  4. Test it by hitting http://yourserverip:5005/zones
    • I opened up Internet Explorer and tested it out - it worked!!
  5. If you get a response, great! Now try playing something: http://yourserverip:5005/preset/[your_preset_name]. Or, play a Playlist or Favorite (example: http://yourserverip:5005/kitchen/playlist/myplaylist). To stop, use /pauseall.
    • Also worked!
  6. If you have problems, make sure you are on the same network as your Sonos AND make sure you don't have a Sonos client running on the same machine. The client can interfere with the node.js server.

Expose your server to the outside world


  1. You need some way for Lambda to contact your server consistently. Services like DynDns and yDNS.eu will give you a consistent hostname for the outside world to use. If you have an Asus router like I do, then dynamic DNS is actually a built-in / free feature.
    • I have an ASUS router so this should be easy - yay!
  2. On your local router, find the "Port Forwarding" configuration. Forward all inbound requests to 5005 (or configure some other port) to your node server.
    • Logged into router settings 
    • Set up a dns name for my connection (.asuscomm.com) 
    • WAN -> DDNS 
    • Set up port forwarding  
    • WAN -> VIRTUAL SERVER/PORT FORWARDING 
    • Tested it: http://.asuscomm.com:5005/kitchen/pauseall 
    • It worked!!
  3. Make sure your server has a locally static IP, so port forwarding doesn't lose track of it.
    • Did that.
  4. Setup your server to auto-start or daemonize the node-sonos-http-api server.
    • I did not do this as I don't intend for my desktop to be a server.  I am aware I will need to manually restart the application if I ever log out or reboot my desktop.
  5. Test it by hitting http://yourdyndnsaddress:5005/zones.
    • It worked!

Create the Alexa Skill that will send events to AWS Lambda


  1. Create a new Skill in the Alexa Skills control panel on Amazon. You need a developer account to do this. The account must be the same as bound to your Echo, and make sure you are logged into that account on amazon.com. You will get access denied if the two accounts are different.
    • I went to developer.amazon.com and signed up for a new account.
  2. Name can be whatever you want. "Invocation" is what you say (I used "Sonos").
    • I used Sonos as well - it's my Sonos after all
  3. Check Custom Interaction Model if it is not already checked. Click Next
  4. Click Next, taking you to Interaction Model. Create a Custom Slot Type ("Add Slot Type"). Add a new type for PRESETS, another for ROOMS, and a final one for TOGGLES. Into each, copy/paste the contents of echo/custom_slots/PRESETS.slot.txt, echo/custom_slots/ROOMS.slot.txt and echo/custom_slots/TOGGLES.slot.txt.
    • Here once again I copied the text of the files from the github site and pasted them into the appropriate boxes.
  5. Still in Interaction Model, copy this repo's echo/intents.json into the "Intent Schema" field, and echo/utterances.txt into "Sample Utterances".
    • More cutting and pasting.
  6. Don't test yet, just save. Click back to "Skill Information" and copy the "Application ID". You'll need this for Lambda.

Configure the AWS Lambda service that will trigger your node-sonos-http-api server


  1. Create an AWS Lambda account if you don't have one already. It's free!
    • It free! but Amazon still requires a credit card number so they can charge you for any non-free services.  That almost did it for me but I had come this far and I wanted to finish it.
  2. In the Lambda console, look to the upper right. Make sure "N. Virginia" is selected, because not every zone supports Alexa yet.
    • He's not kidding here.  I picked one in the western US and it didn't work at all, I had to recreate my whole service in the N. Virginia zone.
  3. Create a new Lambda function. Skip the blueprint.
  4. Pick any name you want, and choose runtime Node.js.
  5. Go into this repo's lambda/src directory and copy options.example.js to options.js. Edit options.js to have your DynDNS hostname, your port, and the Alexa App ID you just copied.
    • Created a directory on my desktop and copied the text into the options.js file.
    • Made the updates as directed.
  6. In lambda/src, zip up everything. On Mac/Linux, cd src; chmod a+r *.js; zip src.zip *.js. Make sure you don't capture the folder, just the files.
    • Once again, I cut and pasted the text from the github source into the files on my desktop.
  7. Choose to upload the zip file for src.zip.
  8. The default handler is fine. Create a new role of type Basic Execution Role. Pick smallest possible memory and so on.
    • The role options have changed.  I just picked custom role and named it something.  I don't know if that was right or not but it let me continue.
  9. Click Next to proceed. Once created, click "Event Sources".
    • This has been changed to triggers.  It took me a while to figure that out.  I actually tried skipping it at first but the thing wouldn't work.
  10. Add a source. Choose "Alexa Skills Kit".
  11. Test it out. I included a test blueprint in this repo. Click "Test" and copy/paste this repo's lambda/play_intent_testreq.json to test. It will trigger the "test" preset in your presets.json file on your Sonos server. Don't forget to replace the Alexa App Id again.

Connect Alexa Skill to AWS Lambda


  1. In the Lambda console, copy the long "ARN" string in the upper right.
  2. Go back into the Alexa Skill console, open your skill, click "Skill Information", choose Lambda ARN and paste that ARN string in.
  3. Now you're ready to put it all together. Try "Alexa, use Sonos to play test"
And we're done!!  It's going to be so awesome!!  I try it out: "Alexa, tell Sonos to pause all" - It work's!!  "Alexa, tell Sonos to play playlist My Favorites in the Kitchen" - nothing.  "Alexa, tell Sonos to play favorite My Favorites in the Kitchen" - nothing.

OK - I can play and pause but I can't play playlists or favorites.  Not cool.

I do some research and dig through forums.  OK - it looks like it doesn't work right on node.js versions higher than 4.x and I have version 6.3.1. 

So I uninstall node.js 6.3.1 and install version 4.4.7 and restart the server.

Now it works!  Well, mostly.  It has a hard time with multi-word playlists and almost all of my playlists are multi-word.  Well, apart from that, it works.

I'm going to play around with it for a while and, if I can get it working like I want, I'll get a raspberry pi computer and run the whole thing from there.  More to come...

Thursday, July 21, 2016

My Smart Home - SensorPush

I am an efficiency nerd.  I love to use technology to make my life easier, better, or to save money.  I live in the Phoenix area of Arizona so it gets REALLY hot here.  Well, I had noticed that my garage would always seem to be hotter in the summer than outside.  I didn't think much of it the first couple years in my current house but this year it hit me.  The garage is always super hot.  The master bedroom - my bedroom - is right over the garage.  The master bedroom gets pretty warm as well - especially in the summer.  Is there a correlation?  How would I find out?

Well, I had a temperature sensor that I was using to measure outside temperature.  One of those Accurite indoor/outdoor temperature monitors.  Actually, I have two of those.  So I took the outdoor sensor from the one in the master bedroom and put it in the garage.  Now I could see what the temperature was in the garage and compare it to the outside temperature.  I found that my suspicions were correct.  It would often be hotter in the garage than outside.  In fact, I was seeing temperatures above 110 F and it was often significantly hotter than outside.

One of the outside walls of my garage has two vents in it.  One close to the ceiling and one close to
the floor.  In order to cool my garage, I bought a fan and placed it at the vent near the ceiling so that it would blow the hot air out of the garage.  After leaving it on for a couple of days, it seemed like the garage was staying cooler.  It would still get hotter than outside but it seemed better.  However, all my data was based on spot checking the temperatures.  How hot is it in the garage now?  I didn't have any trending data or long term data so I didn't know if my solution was actually helping.

Home Screen
What I needed is a temperature sensor that recorded data from outside and in the garage and let me see the correlation.  I started looking for something I could use.  I found some Internet connected sensors from Accurite but reviews said the user interface was really bad.  I found some really nice sensors from NetAtmo but, as cool as they were, they were expensive and overkill for what I was trying to do (though I will be keeping my eye on it).  Then I stumbled upon a little startup called SensorPush.

The SensorPush sensor was simple.  It recorded temperature and humidity and synced with your phone via bluetooth.  It had a nice looking app and would record your data so you could see trends and spikes, etc.  Plus, since it does not rely on a web service, it wouldn't be rendered useless if the company went out of business.  I decided to give it a try.

I purchased a sensor and set it up in my garage.  The setup was amazingly easy.  I installed the Android app on my Nexus 5x, tapped the plus sign to add a new sensor, and placed the sensor on the phone.  Boom! Done!  The hardest part was coming up with a name for the sensor.  I cleverly named it "Garage Sensor".

Then I sat back and let the data roll in.  After a couple of days, I started to notice something.  I would get these spikes and dips in the temperature.  I wasn't sure what it was until I noticed the timestamp on a Sunday.  The temperature dipped when we left for church (we park our minivan in the garage) and it spiked when we got home.  It seems obvious but that's when I realized that the biggest heat issue in the garage is the car.

It Only Graphs Data from One Sensor
I really liked the data rolling in but it was still difficult to compare it with outside temperatures because I didn't have anything to record them with.  Well, the SensorPush was working so well, I decided to get a second one.  This one I put outside (in the shade) to measure outdoor temperatures.  It helped correlate when the temperature is hotter in the garage than outside so I can better set up my fan.  It wasn't as easy as I'd hoped because the app can't show you temperatures from two sensors on the the same graph (I contacted the company and they said it's something they'd like to add).  However, I was still able to get some good data.

So, with this new data I made some modifications.  I am using an Insteon plug in module to schedule my fan which turns on at 5pm every evening and turns off at 9am.  This, on average, is when the air is cooler outside than in the garage.  I also try to turn the fan on whenever the minivan comes home because it is always hot.

Is it making a huge difference?  I'm not sure.  I probably need to go for a few days without turning on the fan and see if the temperature gets significantly higher in the garage.  I'll do that soon.

Now, as much as I like these sensors, there are (for me) two downsides.  First, as I mentioned previously, they don't display your graphs for multiple sensors on the same chart.  The second is that you can only get your data when your phone is in bluetooth range.  This means I can't check it at work or when I'm away from home.  This is more of an inconvenience than a problem and by not having a connection to a web service, the sensors don't depend on a web service to function and you don't have to have an Internet connection to run them.  So it's good and bad.

All in all, I really like the simplicity and the convenience and the data supplied by the sensors.  I'm quite happy with them and I'm thinking about getting a third one to put in my attic to see if I would benefit from a couple of attic fans...

Friday, July 15, 2016

My Smart Home - Insteon

There are a lot of smarthome devices and suppliers out there.  They all do things differently and have different devices that they're compatible with.  With all those choices out there, how do you pick a good one?

For me it came down to one question, "How many work with Windows Phone?"  At the time I started, the answer was pretty simple - Samsung Smartthings or Insteon.  Samsung was pretty new with Windows Phone support and with smarthome tech in general and Insteon was well established and even sold their stuff in the Microsoft Store.  They also had one more big advantage, they have a controller for ceiling fans.  With the way my house is set up, that actually is a big plus for me.  So, about a year ago, I ordered my starter kit:  an Insteon Hub that came with 2 plug in on/off switches, a leak sensor, an a motion sensor.  I also ordered a wall dimmer switch.

Installing it was an adventure.

Hooking up the Hub was a bit of a pain since they recommend plugging it right into the wall (Insteon uses both WiFi and house wiring to transmit its signals) so I had to rearrange things a bit to get that done.  That was the hard part.  After that I plugged it in, set up an account and I was good to go.

Installing the wall switch was where things got complicated.  I'm a bit nervous about electrical work (I know enough to be dangerous) but I got a simple volt meter and a youtube video and went to work.  My plan was the following:

  1. Turn off breaker
  2. Pull out the switch (but don't disconnect the wiring)
  3. Turn on the breaker
  4. Determine line and load with the volt meter
  5. Turn off the breaker
  6. Disconnect the switch
  7. Find the neutral wire 
  8. Connect the Insteon dimmer switch
  9. Turn on the breaker
  10. Pair the switch with the Insteon Hub
It was a great plan.  Here's what really happened:

  1. Turn off breaker
  2. Pull out the switch (but don't disconnect the wiring)
  3. Turn on the breaker
  4. Determine line and load with the volt meter
  5. Turn off the breaker
  6. Disconnect the switch
  7. Find the neutral wire (not connected to the original switch but shoved into the back of the housing)
  8. Connect the Insteon dimmer switch
  9. Blow half of the ground wire off of the Insteon switch because I didn't realize the switch next to the one I was replacing (in the same housing) was hot and the ground wire touch hot.  However, that popped the breaker so, apart from scaring me to death, it all worked out.
  10. Cram the switch into the housing (really tight fit).
  11. Turn on the breaker
  12. Find that nothing works and figure out that I had switched line and load (line is hot, not load).
  13. Turn off the breaker
  14. Switch the wiring to the proper placement
  15. Hope my adventure didn't fry the switch
  16. Turn on the breaker
  17. Pair the switch with the Insteon Hub
So, apart from almost electrocuting myself and popping a breaker and getting the initial wiring wrong, it went in pretty smoothly :-)

A nice perk for me was that I could control my new Insteon Wall switch (and my plug in switches) via my Amazon Echo.  Once I added my devices via the smarthome section of the Alexa controller, I could say "Alexa, turn off the dining room light." and it would turn off.

The kids thought that was amazing.  I have not seen lights turn off an on so much since my kids were 3 and discovered how to use a light switch - only it was way worse because I have 6 kids and they all wanted to try it.  Over and over and over again.  It was a little frustrating but, at the same time, fun because they were enjoying it so much.

In fact, after a few months of use, I realized that the center of my smart home was not my Insteon Hub but my Amazon Echo.  The Insteon app allowed me to set up schedules and remotely control my switches but the true game changer was voice commands.  It's so convenient and actually useful to control lights with voice commands.

There were other cool things I could do.  At Christmas time I programmed one of the plug in switches to turn on my Christmas lights at sunset and to turn them off at 10:30 PM after everybody had gone to bed.  Later I put a fan in my garage to blow the hot air out the garage to help it stay cool as it gets really hot in the summer (significantly hotter than outside due to the sun shining on it).

All in all, this has been a great investment.  The response time from the Amazon Echo is less than two seconds and the same from the app.  The app does crash on occasion and I had issues with setting a scene with sunset/sunrise times on Windows but I was able to fix the problem by redoing it on Android.  Mostly, it just works and I don't have to think about it and really, that's the best part of all.

Wednesday, July 13, 2016

Moving to the Rachio Sprinkler Controller

I am horrible with plants.  I've decided that I have a reverse green thumb - any plant I touch dies.  I don't know what it is but I have a past littered with the corpses of plants that had the misfortune of depending on me to take care of them.  My lawn is no different.  I have a good quality sprinkler controller and have scheduled watering but my lawn looked like was barely hanging on.  Obviously, I need help.  That's where Rachio came in.

A while ago a couple of the circuits in my sprinkler controller stopped working.  The result was that my front yard and a spot in my back yard stopped getting any water whatsoever.  I had to water them manually.  I tried to make it work for a long time but, as I stated above, my talents do not lie in that area.

I was on the web and I stumbled upon Rachio.  I don't remember if I found it on Amazon or read an article on a tech web site but I was intrigued.  Here was a controller that you could control from your phone, would adjust your schedule based on weather (it won't water if it's raining), and I could control it from my Amazon Echo.  This looked really cool but was it worth it?  Was it affordable?  Would it last?

I read the reviews and they were overwhelmingly positive.  This looked like the real deal.  Then I looked up what it cost vs what a replacement of my current controller would cost.  I found that they were about the same price except that Amazon was running a special that included a $50 Amazon gift card with the purchase of the Rachio controller.  I was still worried about installation and how to wire it up but my lawn was really not doing well and, after opening up my current controller and finding that the wiring was really pretty simple, I decided to try it out.  I ordered the Rachio controller for 8 zones and an outdoor enclosure.

Controller Wiring
Wiring from the original controller
Well, I guess my trepidation about wiring it up was well founded because that turned out to be the hardest part.  Power for my original controller was wired right to the electrical system so I couldn't just unplug it and plug the new one in.  No, I had to find the circuit breaker on my unlabeled panel and cross my fingers that I got the right one (fortunately I was right and was able to avoid any trips to the hospital).  Then I had to mount the controller to the wall.  This involved drilling pilot holes in the stucco mounting it very nicely and then finding the wires didn't reach all the way so I had to pull it out and mount it again but lower down the wall.  Not fun.  The wiring itself was really simple and it fact, I think I spent an hour getting the enclosure mounted properly and about 10 minutes wiring it up.

Wiring on the Rachio Controller
After that it was easy.  I plugged it in, turned on the power, and it started right up.  I downloaded the app to my phone and connected it to the controller.  The Rachio then tested all of the zones to ensure that they worked and then asked me about each one - is it a drip or sprinkler?  what kind of soil?  how much sun does it get?  Once it was all set up it gave me the option of setting the watering times, setting what days to water, or just letting Rachio set the whole thing.  I chose to water every other day and Rachio pulled the weather reports for Mesa and suggested the length of time each zone should run.  That was really cool!  Once that was set, I was done.  Well, almost.

I have an Amazon Echo and it's fun to give it voice commands for my connected home.  I wanted to add Rachio to that so I sat down at my PC and added the Rachio program to my Echo.  A quick test of "Alexa, ask Rachio to water zone 2 for 2 minutes" turned on my zone 2 sprinklers for two minutes.  Now that's fun!

The real test, of course, is how a machine does at watering my lawn.  The answer is great!  My front lawn is now green and thick instead of greenish brown and sickly.  My back yard is nice and green as well and the grass is coming back but it was a lot worse off.

It was also really cool to get an alert that due to rain (we had some good rain one weekend), the Rachio was skipping the regularly scheduled watering.  So it's bringing my lawn back to life, not watering when it doesn't happen and, at the beginning of the month, it automatically altered my watering schedule based on weather predictions for the next month.

Over all, I'm really impressed with the quality and usability.  I can set it and forget it or I can go in an manually tweak it.  All based on what I want to do.  Best of all, my lawn looks great!

Monday, July 11, 2016

Creating a Smart Home - Starting with the Amazon Echo

A little more than a year ago, my smart home began.  It sounds odd to say it that way - especially because I had no idea that I was actually beginning something.  I was buying a neato, techy thing and that was it.  I had no idea that it would grow into the beginnings of a "Smart Home."  Now the question is how far will it go.  I really don't have an answer for that.

But let's rewind a bit. A couple of years ago, Amazon announced the Echo.  I was intrigued.  It looked fun - not useful but fun.  I liked the idea of a personal assistant you can talk to.  I liked the idea of it telling jokes or the news or weather.  I liked the possibility of it expanding to other things.  I really like that it was half off for Amazon Prime customers.  However, I still thought that $99 was a bit steep for a toy so I held off.  I held off for a few months.  Then other people started getting theirs and the reviews started coming in.  Most were positive.  It was cool, it was fun.  I don't even remember what specifically pushed me over the edge, but I succumbed and placed an order in January 2015.

Then I waited.  And waited. And waited and waited and waited and...  It took a long time but I finally got mine at the end of May 2015.  Whew!  In this day and age of instant gratification, 4 months is a LOT of waiting.  So it finally came and it was a toy.  The weather reports were useful and the traffic reports were fine but, to me, it wasn't much more than a novelty device.  The kids, on the other hand, were entranced.

"Alexa, what time is it?", "Alexa, tell me a joke.", "Alexa, what's 1+1+1+1?"

It actually got so bad that we had to make a rule that you had to ask permission to talk to the Echo.  That calmed things down for a while.  However, the kids still get quite a kick asking it questions and having it tell jokes.  They also use it to set timers because their parents only give them limited time to play video games.

One of the most intriguing aspects of the Echo for me was the ability for it to play music.  "Alexa, play Jeff's Music" brings up the Jeff's Music playlist on Amazon Music.  So much easier than playing a CD, plugging in an MP3 player, or fiddling with an app.  The voice control is so effortless, it's truly amazing.  If only I could have that through my whole house...

So, here's the problem, the voice control is amazing but the speaker on the Echo is only pretty good (this is my personal opinion).  Further, I have already invested in Sonos speakers and have them spread throughout the house.  Sonos speakers sound amazing and having your music all through the house is, for me, a truly wonderful experience.  So when I saw how well voice control worked with the Echo, my first thought was - "I want to control my Sonos speakers with this!!"  Sadly, this functionality still has not come to the Echo.  I continue to wait.

So that's how it started.  The Echo now sits quietly in the kitchen, sometimes ignored and sometimes quite popular but never, in my opinion, living up to it's full potential.  That is, until I started installing automated light switches but that's a post for another time.