2014-12-17 7 views
7

Ich habe einen Nest Lernthermostat. Ich denke, dass es versucht, "automatisch zu erkennen", wenn ich unterwegs bin, Bewegungssensoren oder etwas ähnliches verwendend. In jedem Fall ist es nicht sehr genau, und noch wichtiger, sein Algorithmus ist nicht transparent.Kann mein Nest auf das Vorhandensein eines lokalen Geräts testen, um festzustellen, ob ich zu Hause bin oder nicht?

Vielmehr denke ich, gibt es eine viel bessere Möglichkeit, zu sagen, wenn ich im Hause bin oder nicht ...

Das Nest zieht eine IP-Adresse im gleichen Subnetz wie mein Telefon.

möchte ich mag:

  • Nest sagen die IP-Adresse (n) meines Telefons (und Telefon meiner Frau)
  • bitten Nest in regelmäßigen Abständen (vielleicht alle 10 oder 15 Minuten) ping diejenigen IP-Adressen für einen Anwesenheitstest
  • haben Nest Update seiner eigenen Haus/weg Bilanzierungsmechanismus auf der Grundlage dieser objektiven Tests

Ist dies möglich durch die Nest API?

Verstößt dies gegen eines der Nest API Prohibitions?

Existiert ein solcher Client bereits?

+1

Ich erinnere mich vage daran, jemand etwas Ähnliches zu tun, basierend auf den ARP-Anfragen am Router. IFTT ist auch hier eine Option, da Sie vom Standort generierte Verhaltensweisen an den Client senden können. Es ist alles ziemlich machbar und es ist auf meiner langfristigen Liste zu tun ... – jfudgeelder

Antwort

3

Eigentlich habe ich herausgefunden, wie man das genau macht, mit der Nest API. Es funktioniert perfekt!

Ich habe ein Paar Python-Skripte erstellt, /usr/bin/nest-home und /usr/bin/nest-away, die Teil des uhome Pakets sind, das ich auf Ubuntu hochgeladen habe. Es gibt auch das Skript /usr/bin/uhome, das den ersten Teil meiner Frage behandelt - eine Eingangsliste von IP/MAC-Adressen liest, sie durchläuft, um zu sehen, ob irgendwelche pingbar sind, und basierend auf den Ergebnissen, uns zu Hause oder weg zu markieren.

Die wirkliche Magie zum Nest im Gespräch ist in drei nachfolgenden API-Aufrufe:

  1. Anmeldung und Einrichtung einer Auth-Token
  2. die Struktur ID abrufen
  3. Aktualisieren der Struktur entfernt boolean

Komplettes Skript unten, oder Sie können es in Launchpad und Github finden.

#!/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 
+0

Schöne Lösung! Ich versuche das Gleiche zu tun wie das OP. Fehlt für mich auf Python 2.7.9 (OS X). Ich erhalte 'urlopen Fehler [Errno 8] _ssl.c: 507: EOF trat in Verletzung des Protokolls auf Zeile 40 auf. – richardtallent

0

IFTTT kann dies für eine einzelne Person mit einem Android-Gerät tun. Du kannst ein Rezept erstellen, mit dem dein Nest auf "Zuhause" oder "Weg" geschaltet wird, wenn dein Telefon eine Verbindung zu deinem WLAN-Heimnetzwerk herstellt oder die Verbindung trennt.

+0

Danke, aber nicht ganz das, was ich gesucht habe. Ich möchte lieber direkt mit der Nest-API sprechen als mit IFTTT als Drittanbieter. –

0

nein.

Zuhause und Abwesend werden über die Benutzerinteraktion in der Nest App oder auf dem Nest Thermostat eingestellt. Clients, die "Zuhause" oder "Abwesend" festlegen, müssen eine Bestätigung für jeden Heim-/Abwesenheitsübergang anfordern und eine Benutzerbestätigung anfordern.

+0

Ich habe das in den ziemlich lächerlichen API- und Marketing-Richtlinien von Nest gelesen. Während das ist, was einige Juristen sagen, gibt es tatsächlich eine sehr einfache technische Lösung, die ich gerade als Antwort geschrieben habe. Vielen Dank. –

Verwandte Themen