2015-12-14 12 views
11

Sto provando a cambiare la temperatura del mio Nest programmaticamente (Android), senza alcuna fortuna. Le richieste funzionano forse 1 su 30-50 tentativi.Temperatura del termostato Nest non aggiornata

Ho provato a farlo tramite l'SDK di Firebase Nest e NestAPI.CompletionListener non viene richiamato affatto. Vedendo come non funziona, l'ho provato con l'API REST, dove ha funzionato due volte, e poi ancora 1 su 30 tentativi. L'ho provato anche con curl dalla riga di comando, con gli stessi risultati, fino a quando non sono stato "bloccato" a causa della limitazione della velocità. Prima di essere bloccati, le richieste restituivano l'intero oggetto termostato, proprio come fare una richiesta GET invece di PUT.

Quando la temperatura in realtà ha fatto si aggiorna, la risposta conteneva solo la nuova target_temperature_high_c e target_temperature_high_c valori.

Qualcun altro ha visto un comportamento simile?

Edit: aggiunto un po 'di codice qui sotto

Ecco il mio codice utilizzando l'API di Android Nest (sulla base di Firebase):

NestAPI.CompletionListener completionListener = new NestAPI.CompletionListener() { 
    public void onComplete() { 
     Debug.d("NEST", "request complete"); 
    } 
    public void onError(int errorCode) { 
     Debug.e("NEST", "error: "+errorCode); 
    } 
}; 
NestAPI.getInstance().setTargetTemperatureHighC(myNest.getDeviceID(), 25, completionListener); 

Questo funziona solo se faccio quella chiamata una volta ogni ora. Se provo anche a farlo due volte, il secondo tentativo non funziona.

Avanti, ho provato con l'interfaccia REST. Questo sembra funzionare più spesso (5-6 volte lavorato, dopo di che l'API iniziato a recitare come stavo facendo richieste GET invece di PUT

JSONObject dataToSend = new JSONObject(); 
dataToSend.put("target_temperature_low_c", 23); 
dataToSend.put("target_temperature_high_c", 26); 

HttpPut httpost = new HttpPut("https://developer-api.nest.com/devices/thermostats/"+myNest.getDeviceID()+"?auth="+myAuthToken); 
httpost.setHeader("Content-type", "application/json"); 

httpost.setEntity(new StringEntity(dataToSend.toString())); 
HttpResponse response = defaultHttpClient.execute(httpost); 
HttpEntity entity = response.getEntity(); 

String response = convertStreamToString(entity.getContent()); 

Edit 2:. appena testato questo con il nido casa Simulator, e funziona perfettamente bene. Il vero hardware è problematico se

+0

Puoi pubblicare esattamente quale chiamata stavi creando? L'URL più il carico utile? Presumo che queste erano tutte richieste PUT? – urman

+0

aggiunti i miei campioni di codice.Ancora: questi funzionano un paio di volte, dopo di che .. non lo fanno – zrgiu

risposta

4

Dalle javadocs per setTargetTemperatureHighC si dice https://github.com/nestlabs/android-NestDK/blob/master/NestLib/src/main/java/com/nestapi/lib/API/NestAPI.java#L111

Questo valore è rilevante solo quando in "Heat e cool" modalità. In caso contrario, vedere {@link #setTargetTemperatureC (String, Long, com.nestapi.lib.API.NestAPI.CompletionListener)}

È possibile controllare il modo utilizzando Thermostat.getHVACMode()

e se non è in Heat and Cool modalità si dovrebbe usare:

NestAPI.setTargetTemperatureC

cioè se si dove raccontare il dispositivo nido per andare ad una temperatura di 50deg, quando si tratta di temperatura corrente era 30deg ed era in modalità "cool" - sarebbe ignorarti.

(Questo forse perché ha funzionato una volta, come l'hai chiesto di riscaldare, quando era in modalità riscaldamento - una volta che ha colpito questa temperatura potrebbe andare in modalità di raffreddamento e chiedendo di riscaldare di più sarà ignorato.)

+0

Scusate, avrei dovuto essere più chiaro. Il termostato ** è ** in modalità Caldo e Freddo. – zrgiu

+0

non è simile al tuo esempio, usi 'NestAPI.getInstance()' esplicitamente senza un controllo per la modalità? – Blundell

+0

Se dovessi inserire l'attività completa avrei riempito alcune pagine. – zrgiu