2014-10-28 36 views
1

我無法將嵌套數據像ambient_temperature_f放入https://developer-api.nest.com或重定向的Firebase URL。我懷疑Nest的某些特定內容需要在我正在使用的Firebase模塊中進行調整(https://ozgur.github.io/python-firebase/)。無法放入嵌套

firebase.py

@http_connection(60) 
def make_put_request(url, data, params, headers, connection): 
    """ 
    Helper function that makes an HTTP PUT request to the given firebase 
    endpoint. Timeout is 60 seconds. 
    `url`: The full URL of the firebase endpoint (DSN appended.) 
    `data`: JSON serializable dict that will be stored in the remote storage. 
    `params`: Python dict that is appended to the URL like a querystring. 
    `headers`: Python dict. HTTP request headers. 
    `connection`: Predefined HTTP connection instance. If not given, it 
    is supplied by the `decorators.http_connection` function. 

    The returning value is a Python dict deserialized by the JSON decoder. However, 
    if the status code is not 2x or 403, an requests.HTTPError is raised. 

    connection = connection_pool.get_available_connection() 
    response = make_put_request('http://firebase.localhost/users', 
           '{"1": "Ozgur Vatansever"}', 
           {'X_FIREBASE_SOMETHING': 'Hi'}, connection) 
    response => {'1': 'Ozgur Vatansever'} or {'error': 'Permission denied.'} 
    """ 
    timeout = getattr(connection, 'timeout') 
    response = connection.put(url, data=data, params=params, headers=headers, timeout=timeout) 

    print('[make_put_request]: [%s][%s][%s][%s]\n' %(url, data, params, headers)) 

    if response.ok or response.status_code == 403: 
     return response.json() if response.content else None 
    else: 
     response.raise_for_status() 

打印出:

[make_put_request]: [https://developer-api.nest.com/devices/thermostats/DEVICE_ID/ambient_temperature_f.json?auth=VALID_AUTH_TOKEN][71][{}][{}] 

返回錯誤:

Traceback (most recent call last): 
    File "C:\py\nest_auth.py", line 90, in <module> 
    put_result = firebase.put(data_url, field_name, 71) 
    File "C:\Python34\lib\site-packages\firebase\decorators.py", line 19, in wrapped 
    return f(*args, **kwargs) 
    File "C:\Python34\lib\site-packages\firebase\firebase.py", line 312, in put 
    connection=connection) 
    File "C:\Python34\lib\site-packages\firebase\decorators.py", line 19, in wrapped 
    return f(*args, **kwargs) 
    File "C:\Python34\lib\site-packages\firebase\firebase.py", line 77, in make_put_request 
    response.raise_for_status() 
    File "C:\Python34\lib\site-packages\requests\models.py", line 808, in raise_for_status 
    raise HTTPError(http_error_msg, response=self) 
requests.exceptions.HTTPError: 400 Client Error: Bad Request 

這可是曾使用firebaseio.com目標時不worki納克巢:

put_result = firebase.put('/devices/thermostats/DEVICE_ID/', 'ambient_temperature', 71) 

回答

2

按照documentationambient_temperature_f爲代表的從恆溫報告的環境溫度的只讀域。因爲它是傳感器讀數,所以忽略它是沒有意義的。

我想你想寫target_temperature_f,這是恆溫器應該加熱或冷卻的溫度。

+0

我最近注意到,但不幸的是我仍然得到相同的錯誤。使用Nest開發工具,我實際上可以將顯示的值更改爲報告的溫度。 Nest在一段時間後將其設置回實際的恆溫器值。 – Enigma 2014-10-28 18:27:03

+0

有沒有辦法將期望的值附加到url,就像access_token一樣?例如附加'?value = 71'。 – Enigma 2014-10-28 18:31:05

+0

不,REST API只接受JSON有效內容,而不接受查詢參數,並且Firebase API僅說明Firebase語法。 – 2014-10-30 18:03:13