Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can my Nest test for presence of a local device, to determine if I'm home or not?

I have a Nest learning thermostat. I think that it tries to "autodetect" when I'm away using motion sensors, or some such. In any case, it's not very accurate, and more importantly, its algorithm is not transparent.

Rather, I think there's a much better way to tell if I'm in the house or not...

The Nest draws an IP address on the same subnet as my phone.

I'd like to:

  • tell Nest the IP address(es) of my phone (and my wife's phone)
  • ask Nest to periodically (maybe every 10 or 15 minutes) ping those IP addresses for a presence test
  • have Nest update it's own home/away accounting mechanism based on those objective tests

Is this possible through the Nest API?

Does this violate any of the Nest API Prohibitions?

Does a client like this already exist?

like image 586
Dustin Kirkland Avatar asked Dec 17 '14 14:12

Dustin Kirkland


People also ask

Can the nest mini detect when you’re nearby?

A key feature of this year’s Nest Mini speakers and Nest Wifi points is their ability to use ultrasound to detect your presence and light up in response. Starting today, the Google Nest Hub and Nest Hub Max will be able to detect when you’re nearby in the same way, with a few extra benefits.

Should you test after installing a Google Nest Thermostat?

You should test after you install a Google Nest thermostat to make sure it’s connected and controlling your system as it should. You can also run a system test if you need to diagnose a problem. It can also help you catch incorrect wiring, blown fuses and other problems. This article applies to all Google Nest thermostat models.

How do I use my phone as a location on nest?

Tap on “Use phone location”. Tap on the toggle switch that appears. A new screen will pop up. Tap on “OK” at the bottom. When a smaller pop-up appears, tap on “Use phone”. You might get another pop-up asking permission for the Nest app to access your location.

What is nest and how does it work?

nest is a simple blood test that screens for the most common chromosomal conditions that can affect your baby’s health. nest offers parents-to-be a new choice to obtain important information about the health of their developing baby, simply, accurately and in the first trimester (at 10 weeks), with little or no risk to their pregnancy.


1 Answers

Actually, I figured out how to do this exactly, using the Nest API. It works perfectly!

I've created a pair of Python scripts, /usr/bin/nest-home and /usr/bin/nest-away which are part of the uhome package that I've uploaded to Ubuntu. There's also the /usr/bin/uhome script, which handles the first piece of my question -- reading an input list of IP/MAC addresses, iterating through them to see if any are pingable, and based on the results, marking us home or away.

The real magic in talking to the Nest is in 3 subsequent API calls:

  1. Login and establish an auth token
  2. Retrieve the Structure ID
  3. Update the structure's away boolean

Complete script below, or you can find it in Launchpad and Github.

#!/usr/bin/python
#
# nest-home, nest-away
#
# Copyright 2014 Dustin Kirkland <[email protected]>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import os
import requests
import time
import urllib
import urllib2
import sys
import json
import yaml

# login
with open(os.path.expanduser("~") + "/.uhome/nest.yaml", "r") as stream:
    credentials = yaml.load(stream)
#headers = {"user-agent": "Nest/1.1.0.10 CFNetwork/548.0.4", "X-nl-protocol-version": "1"}
headers = {"X-nl-protocol-version": "1"}
response = requests.post("https://home.nest.com/user/login", credentials)
response = json.loads(response.content)
transport_url = response["urls"]["transport_url"]
userid = response["userid"]
headers["Authorization"] = "Basic " + response["access_token"]
headers["X-nl-user-id"] = userid
# get structure id
request = urllib2.Request(transport_url + "/v3/mobile/user." + userid, headers=headers)
response = urllib2.urlopen(request).read()
response = json.loads(response)
structure_id = response["structure"].keys()[0]
# set away, if necessary
currently_away = response["structure"][structure_id]["away"]
if "away" in sys.argv[0] and not currently_away:
    data = '{"away_timestamp":' + str(time.time()) + ',"away":true,"away_setter":0}'
    new_away = "True"
elif not "away" in sys.argv[0] and currently_away:
    data = '{"away_timestamp":' + str(time.time()) + ',"away":false,"away_setter":0}'
    new_away = "False"
else:
    data = ""
    new_away = str(currently_away)
if data:
    structure_url = transport_url + "/v2/put/structure" "." + structure_id
    request = urllib2.Request(structure_url, data, headers)
    try:
        urllib2.urlopen(request).read()
    except urllib2.URLError:
        print "Put operation failed"
    print "Nest updated -->  away=" + new_away
else:
    print "No need to update Nest --> away=" + new_away
like image 157
Dustin Kirkland Avatar answered Oct 14 '22 07:10

Dustin Kirkland