2015-12-14 14 views
11

Próbuję zmienić temperaturę mojego gniazda programowo (Android), bez powodzenia. Żądania mogą mieć wartość 1 na 30-50 prób.Temperatura termostatu Nest nie jest aktualizowana

Próbowałem zrobić to za pomocą pakietu SDK Firebase Nest, a NestAPI.CompletionListener nie jest w ogóle wywoływana. Widząc, jak to nie działa, próbowałem go z interfejsem REST API, gdzie działało dwa razy, a następnie ponownie 1 raz na 30 prób. Próbowałem również z curl z linii poleceń, z tymi samymi wynikami, aż w końcu dostałem "zablokowany" z powodu ograniczenia stawki. Przed zablokowaniem, żądania zwracały cały obiekt termostatu, tak jak wykonanie żądania GET zamiast PUT.

Gdy temperatura faktycznie aktualizowane, odpowiedź zawierała tylko nowej target_temperature_high_c i target_temperature_high_c wartości.

Czy ktoś inny widział podobne zachowanie?

Edit: dodano niektóre kodu poniżej

Oto mój kod używając gnieździe Android API (w oparciu o 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); 

Zadziała tylko jeśli robię to wezwanie raz na godzinę. Jeśli nawet spróbuję zrobić to dwa razy, druga próba nie zadziała.

Następna, próbowałem z interfejsem REST. To wydaje się działać częściej (pracował 5-6 razy, po czym API rozpoczęte zachowuje się jak robiłem żądań GET zamiast 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: tylko przetestowane z gniazdem główna symulatora i działa perfekcyjnie. prawdziwy sprzęt jest problematyczne, choć

+0

Czy możesz wysłać dokładnie to, co zadzwoniłeś? Adres URL plus ładunek? Zakładam, że były to wszystkie żądania PUT? – urman

+0

dodał moje próbki kodu.Znowu: te działają kilka razy, po których .. nie są – zrgiu

Odpowiedz

4

z Javadocs dla setTargetTemperatureHighC mówi https://github.com/nestlabs/android-NestDK/blob/master/NestLib/src/main/java/com/nestapi/lib/API/NestAPI.java#L111

wartość ta ma zastosowanie wyłącznie, gdy w „Heat and cool” tryb. W przeciwnym razie zobacz {@link #setTargetTemperatureC (String, Long, com.nestapi.lib.API.NestAPI.CompletionListener)}

Można sprawdzić tryb używając Thermostat.getHVACMode()

a jeśli nie jest w tryb Heat and Cool należy użyć:

NestAPI.setTargetTemperatureC

czyli jeśli gdzie mówi urządzenia Nest, aby przejść do temperatury 50deg-tych, kiedy to aktualna temperatura była 30deg i to w trybie „cool” - byłoby zignorować.

(Być może dlatego zadziałało, gdy poprosiłeś o rozgrzanie, gdy był w trybie ogrzewania - po osiągnięciu tej temperatury może przejść do trybu chłodzenia i prośba o ogrzewanie więcej zostanie zignorowana.)

+0

Przepraszam, powinienem być bardziej przejrzysty. Termostat ** jest ** w trybie Heat & Cool. – zrgiu

+0

nie wygląda tak z twojego przykładu, jawnie używasz 'NestAPI.getInstance()' bez sprawdzania trybu? – Blundell

+0

Gdybym miał umieścić całą aktywność, wypełniłbym kilka stron. – zrgiu

Powiązane problemy