I bought the Nest thermostat for fun. I purchased it couple months ago to go with the new furnace and air conditioner. I could have gone with a thermostat provided by the contractor, or any number of cheaper options, but I wanted something with which to play. Even though I don’t consider myself a “gadget person”, I wanted this gadget. I wanted to play with it’s API and see what I could make it do.
With summer ending and school starting, there was a lot going on in the household. Also, we went for about a month when neither air conditioning nor heating were required, so internal climate control was not often on my mind. Now the heat is coming on for a few minutes in the morning and I’ve started playing with the Nest Rest API.
The Nest developer website has documentation that helped get me up and running. As usual, the trickiest part in getting started is figuring out how to authenticate, but that actually went smoothly (I’m not sure whether I’m getting better at doing that sort of thing, or if the Nest process and/or instructions are better). I was then able to read information about my Nest thermostat. It was when I tried to write data that I ran into problems.
I had many failures in trying to perform a write. At first I tried various incarnations of Java code to perform a REST PUT, but I had a variety of problems and errors. I simplified things. I tried a simpler use case. I removed Java from the picture and just used curl. Eventually I resorted to the instructions I found to change the target temperature on a thermostat:
curl -X PUT -H "Content-Type: application/json" -H "Authorization: Bearer c.lPg4Z..." -d "{"target_temperature_f": 72}" 'https://developer-api.nest.com/devices/thermostats/DEVICE_ID'
I plugged in my own authorization token and device ID, but still it wouldn’t work. After a lot of kicking and swearing and reading various websites and forums, I came up with:
curl -L -X PUT -H "Content-Type: application/json" -H "Authorization: Bearer c.lPg4Z..." -d '72' https://developer-api.nest.com/devices/thermostats/DEVICE_ID/target_temperature_f
The key differences are: 1) The “-L” flag tells curl to follow the 307 redirect that is returned, 2) Passing just the desired value instead of a JSON snippet, and 3) Specifying the variable name as part of the URL.
When I plugged in my authorization token and device id, things worked–by the time I had taken the seven steps from my disheveled desk to the thermostat, the new value had taken affect and the Nest was turning on the heat.
Although there was some frustration along the way, I had fun playing with the Nest Rest API and am glad I was able to get some basic use cases to work. Now that I know how to read and write data, I can make make something interesting.