2

コードで目標温度を設定できません (Android の場合)。以下に示すコードは、ペイロードとして現在の温度とともに OK ステータス (200) を受け取ります。私が書いた新しい温度 (65°F) を受け取っているはずです。私はURLを使用しています:

https://developer-api.nest.com/devices/thermostats/THERMOSTAT-ID/target_temperature_f?auth=AUTH CODE

サーモスタット ID と認証コードを配置します。また、クライアントの読み取りと書き込みのアクセス許可も持っています。私が持っている Chrome 拡張機能で同様のリクエストを実行すると、サーモスタットで温度が正しく設定されます。ここで私が見逃しているものを誰か特定できますか? コメントアウトされたコードは、私が試したことのいくつかを示しています。

ありがとう。

    InputStream is = null;
    String result = "";

    try{

        HttpClient httpclient = new DefaultHttpClient();
        HttpPut httpPut = new HttpPut(url);
        httpPut.addHeader("Content-Type", "application/json");
        httpPut.addHeader("Accept", "application/json");
        //httpPut.addHeader("Connection", "keep-alive");
        httpclient.getParams().setBooleanParameter("http.protocol.expect-continue",false);
        //value.setContentType("application/json");
        httpPut.setEntity(new StringEntity("65");
        HttpResponse response = httpclient.execute(httpPut);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();
        int statusCode = response.getStatusLine().getStatusCode();
        Log.d("StatusCode",Integer.toString(statusCode));

    }catch(Exception e){
        Log.e("log_tag", "Error in http connection "+e.toString());
    }

    // Convert response to string
    try{
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        result=sb.toString();
        Log.d("Result",result);
    }catch(Exception e){
        Log.e("log_tag", "Error converting result "+e.toString());
    }
4

4 に答える 4

0

返された応答/コードを教えてください。

更新: Android でこれを使用しているようです。Android では HttpsURLConnection を使用することをお勧めします。これは HttpsURLConnection の例です

    public static int setThermostatTemperatureF(int temperatureF, String apiUrl) {
      HttpsURLConnection.setFollowRedirects(true);
      BufferedReader reader = null;
      try {
        URL url = new URL(apiUrl);
        HttpsURLConnection ucon = (HttpsURLConnection) url.openConnection();
        ucon.setRequestProperty("Content-Type", "application/json");
        ucon.setRequestMethod("PUT");
        ucon.setDoOutput(true);
        // Write the PUT body
        OutputStreamWriter writer = new OutputStreamWriter(ucon.getOutputStream());
        writer.append(Integer.toString(temperatureF));
        writer.flush();

        return ucon.getResponseCode();
      } catch (MalformedURLException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
      return -1;
    }

前の回答: コードから見ると、developer-api.nest.com によって返されるリダイレクトに従っていない可能性があります。HttpClient 4.2 以降では、次のリダイレクト戦略を使用して、一時的なリダイレクトが確実に行われるようにすることができます。

        httpClient.setRedirectStrategy(new DefaultRedirectStrategy() {
          @Override
          protected boolean isRedirectable(String method) {
            return HttpGet.METHOD_NAME.equals(method) ||
                    HttpPut.METHOD_NAME.equals(method);
          }
        });

古いバージョンを使用している場合は、リダイレクト ハンドラーを実装する必要があります。そのバージョンが必要な場合はお知らせください。提供できます。

于 2014-07-11T06:18:23.177 に答える
0

これは、温度を変更するために実行するものです。

curl -v -L -X PUT "https://developer-api.nest.com/devices/thermostats/<THERMOSTAT ID>/target_temperature_f?auth=<AUTH CODE>" -H "Content-Type: application/json" -d "65"

ヘッダーを変更して、私が実行したものと同じように見えるようにしていただけますか? 私の唯一の他の推測は、target_temperature_f が整数であり、int として渡されていないということです。

于 2014-07-10T19:31:48.733 に答える
0

特定の条件下では、目標温度を書き込むことができません。 ルールについては、 https://www.developer.nest.com/documentation/error-codes#targettempページを参照してください。

同様に、次の場合は目標温度を保存できません。

  • 家は「不在」モードです。
  • 非常用暖房が使用されています。
  • hvac は「オフ」モードです。
  • 煙感知器が安全シャットオフを作動させました。
于 2014-08-01T17:00:55.417 に答える