Friday, August 19, 2016

Wii U - For an "Unpopular" Console, It's Really Fun!

We acquired our Wii U for Christmas last year in spite of all the doom and gloom that the press has been putting out.  Why?  We wanted a console that focused on family and kid friendly games (my kids range from 14 to 6) and the Wii U fit the bill.  Plus we loved our Wii and were excited to get the next generation console.

It does not disappoint.  We don't buy games prodigiously but the ones we have are a lot of fun.  Super Mario 3D, Mario Cart 8, and Splatoon have all been big hits in our house.  Plus the ability to play our old Wii games has been awesome.  My kids will play as much as their parents will let them.

We recently purchased Minecraft and the kids love the Mario skins and themes that are included in it.  They love playing multi-player and creating their own worlds.  Granted this is nothing new to them as we already own Minecraft for the PC and for the XBox 360.  However, they liked it enough to save up their own money to purchase it.

So, it's a fun console that focuses on family friendly games, but it's a distant 3rd in sales behind XBox and Playstation and isn't getting the new, hi res games that are front and center in the press and that kids seem to be clamoring for.  Why buy console that's not "cutting edge" and/or the be all/end all of consoles?

So here's the deal (in my humble opinion): If you want a console whose primary purpose is to entertain kids and families, get a Wii U.  If you want first person shooters, zombies, blood and guts, etc. get an Xbox or Playstation.  Can you find family friendly games on the XBox?  Sure but that's not their primary market.  Can you find shooter games on the Wii U?  Yes but, once again, that's not their primary market.  Nintendo makes and markets games that are fun to play, kid friendly, and all around enjoyable.  If you're a family with younger kids and you want a console for them, get a Wii U.

The Wii U also has a great online, multi-player service.  First of all it's free - no subscription required.  Second it has amazing parental controls.  I found this out when we purchased Splatoon.  After the purchase, we found that most of the gameplay was online.  Well, I was really nervous about giving my kids unfettered online access - especially knowing how other people talk and act online.  My kids are young, they don't need to deal with that kind of garbage just to play a game.  Well I was impressed to find out that the parental controls on the Wii U are excellent.  I can control just about everything the kids do online.  Whether or not they can browse the internet, chat, buy games, etc.  It's all there.  I was able to set my kids up so they can enjoy playing online without having to worry that they would get themselves into trouble online.  Now they're splatoon fanatics and I can let them enjoy their game without worry.

So there it is.  If you want your kids to have fun, stay safe, and enjoy their video games - get a Wii U.  It's fun!

Monday, August 15, 2016

Sonos Control with the Amazon Echo - Part 2: Raspberry Pi

So, a little while ago I posted how I set up my Amazon Echo to control my Sonos speakers (the article is here).  However, there was a major drawback:  If the computer ever went to sleep, got rebooted or if my user got logged out everything would stop working.  Compound this with the fact that my PC is shared by my kids and you can see that I had a lot of service interruptions.  The obvious solution is to have a permanent computer just to run this service.  I needed something I could leave on 24x7 and that was really inexpensive.  Enter the Raspberry Pi.

The Raspberry Pi computer is cheap, low power consumption, and small.  It seemed like the perfect fit.  So I found a kit (on Amazon of course) and ordered it.  Now to find out if it's as good as it seems.

First, I had to put it together.  That was really easy - I just had to stick the heat sinks on, put the Raspberry Pi board into the case, and put in the SD card.  Then I plugged in a keyboard, mouse, and monitor and I was on my way.

I chose to install the Raspbian OS (Linux for the Raspberry Pi) and in a few minutes it was up and running.  OK - now all I have to do is install node.js, the node-sonos-http-api program and I'm all set.  So I run an internet search on my new Raspberry Pi for instructions (by the way, the computer was set to use duckduckgo.com as the default search engine instead of google or bing or whatever - it worked fine), found some directions and I was off!

NOTE: This is not the full instructions on how to install the Echo control of Sonos, just how to move it from a Windows PC to a Raspberry Pi PC.  The full install instructions are here.

Install Node.js

Based on the instructions I found, I was first directed to update the OS.  That sounded like a good
My Little Raspberry Pi PC
idea so that's what I did:
  • Open up a command line terminal and run the following commands:
    • sudo apt-get update
    • sudo apt-get upgrade
Next it had me install the correct repository to get node.js.  I'm not including the instructions because, after doing this I found that it only got me node.js version 0.10 and I needed version 4.4.x - not even close!  OK, back to the internet.  After a bit more searching I found some better instructions so I did the following:
  • Open up a command line terminal and run the following commands:
    • curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash - 
    • sudo apt-get install -y nodejs 
    • npm -version
Success!  I now have node.js (the correct version) on my Raspberry Pi PC.  

Install node-sonos-http-api

Fortunately, the Raspberry Pi comes with git installed so I didn't have to figure out how to install that in order to install the node-sonos-http-api.  Here's all I had to do:
  • Open up a command line terminal and type:
    • npm install https://github.com/jishi/node-sonos-http-api 
  • Test it by going to the web browser and using the test url:
    • http://localhost:5005/zones 
It worked!  OK - now I have the server set up.  I also copied my presets.json file from my Windows PC to my Raspberry Pi PC so that I would have all of custom presets I've been setting up over the last couple of weeks.

Allow for Remote Connections

At this point, I decided I'd rather be running the whole thing remotely because my kids wanted the keyboard, mouse, and monitor back so they could use the Windows PC.  Fair enough.  Here's how I enabled it:
  • Menu -> Preferences -> Raspberry Pi Configuration 
  • Change password to one I actually know
  • Note that the local user is pi 
  • Find the IP address - this was a challenge since I couldn't remember how to echo your IP address on linux so I looked it up in my router.
  • Go back to my Windows PC
    • Download putty
    • log in to Raspberry Pi PC using the IP address for host, pi for the user and my password for the password
Now I don't need my Raspberry Pi hooked up to anything but power.

Redirect Incoming Connections

So, in order to really test it, I need to redirect the incoming connections from my Alexa Skill from my Windows PC to my Raspberry Pi PC.  To do this I went into my router settings and simply changed my redirect from the IP address of my Windows PC to the IP address of my Raspberry Pi PC.

Oh, and I also made sure my Raspberry Pi PC had a static IP address.  It would be a real pain if it ever got assigned a different IP address.

Test It Out

Now it was time to test it out:
  • "Alexa, tell Sonos to play country"
    • It worked!
  • "Alexa, tell Sonos to pause all"
    • Success!
  • "Alexa, tell Sonos to resume all"
    • Yay!
OK - so now my new little PC is running the show.  Awesome!  However, I wasn't quite done for the day...

Run node-sonos-http-api as a Service

Running node-sonos-http-api from a putty terminal worked great until the computer went to sleep or I was timed out or logged out, etc.  OK - kind of the same problem I was trying to avoid.  So how to I make it run in the background?

After some internet searches and some experimenting, I found something that worked:
  • cd to the node-sonos-http-api home
  • Run the following command:
    • nohup npm start &
This starts it as a service (meaning it runs in the background as long as the PC is running).

I tested it by closing my putty session and logging out of my Windows PC.  Everything still worked.

So now I have a Raspberry Pi PC controlling my Sonos speakers via a custom Alexa Skill routed through an Amazon Lambda service.

Whew!  No wonder I put off doing this!

However, having Alexa controlling my Sonos speakers is REALLY cool!

Alexa, tell Sonos to play celebration music!

Tuesday, August 02, 2016

Awair Air Quality Monitor Review

Awair Air Quality Monitor
This post is a bit tricky for me to write.  My Awair air quality monitor is one of the most expensive gadgets I've purchased but it's impact has been the most subtle.  Usually when I buy a gadget, it's impact is much more dramatic like smart switches from Insteon, endless jokes and device control from Echo, temperature/humidity readings from Sensorpush, or automated sprinkler control with Rachio.  With Awair, however, the impact was more subtle.

One of the main reasons the impact was subtle was that my air quality was actually pretty good.  CO2 levels were good, humidity was mostly good, dust wasn't too bad.  Only VOCs (volatile organic compounds) were consistently high.  Not too high, they're usually at 2 but sometimes spike to 3.  What does the VOC measurement mean?  I don't know except that Awair puts a 2 or a 3 at not good orange (not horrible - that would be red).  So what do I do?

So, here's the thing.  I'd been thinking about air quality for a while.  Over the last few years my allergies seem to be getting worse.  Congestion, itchy eyes, sneezing, etc.  Living in Arizona, we tend to get ozone pollution come over from the west (thank you very much California).  So how do I clean the air I breathe?  Do I even need to?  These are the questions that got me to purchase the Awair in the first place.

I also purchased it for the advice it gives.  Of course one of the first bits of advice it gave was to open the windows to clear out the VOCs.  Well, I live in Arizona and when it's 112 degrees outside, I am NOT going to open my windows.  So what are my other options?  Well, the Awair suggested that I get a peace lily and/or a snake plant absorb VOCs.  That sounded good so I bought a couple of those.  They're not big but I have to start somewhere.  I've had them for a couple of weeks and they're not dead (if you know me and my reverse green thumb, you'll know that's an accomplishment) but they haven't reduced the VOC counter either.  So I keep looking.  Maybe in October when the weather cools down I'll try opening my windows.  Until then, I'll keep watering my plants and keep an eye on things.

So, my verdict on my Awair is mixed.

It lets me know my air quality which is good.  It let me know that I don't have terrible air quality - also good.  It's cool to be able to check it at any time and see how my air is doing.  It's great that it's portable and I may try it out in my office or in other rooms of the house to see how they are doing.  The display on it is very cool and gives me the information I need at a glance (no need to pull out my phone to see how my air is).  It gives me advice and help on how to improve my air quality.  It actually got me to buy plants for my house.  Life changing?  No.  Pretty cool?  Definitely.  Has it prodded me to make a few subtle changes and to pay more attention to my air quality? Yes.  Is it worth it?  Yes, I think it is.

Is it perfect? No.  There are a couple issues that I have.  First, the Android app crashes occasionally on startup.  It's not a big deal, I just start it again and it's fine.  What bothers me more are the stats.  The stats screen is great and shows everything but it only shows it for that day.  What if I want to see yesterday?  Last week?  What if I want to see trends over time?  Nope, not there.

So, overall I like it.  It gives me good, accurate (I hope) information about my air quality.  It's given me the extra push to actually get some plants in my house.  It's been a subtle nudge to improve things.

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...