1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
import logging
import requests
import nuheat.config as config
from nuheat.thermostat import NuHeatThermostat
_LOGGER = logging.getLogger(__name__)
_LOGGER.setLevel(logging.DEBUG)
class NuHeat(object):
def __init__(self, username, password, session_id=None):
"""
Initialize a NuHeat API session
:param username: NuHeat username
:param username: NuHeat password
:param session_id: A Session ID token to re-use to avoid re-authenticating
"""
self.username = username
self.password = password
self._session_id = session_id
def __repr__(self):
return "<NuHeat username='{}'>".format(self.username)
def authenticate(self):
"""
Authenticate against the NuHeat API
"""
if self._session_id:
_LOGGER.debug("Using existing NuHeat session")
return
_LOGGER.debug("Creating NuHeat session")
post_data = {
"Email": self.username,
"Password": self.password,
"application": "0"
}
data = self.request(config.AUTH_URL, method="POST", data=post_data)
session_id = data.get("SessionId")
if not session_id:
raise Exception("Authentication error")
self._session_id = session_id
def get_thermostat(self, serial_number):
"""
Get a thermostat object by serial number
:param serial_number: The serial number / ID of the desired thermostat
"""
return NuHeatThermostat(self, serial_number)
def request(self, url, method="GET", data=None, params=None, retry=True):
"""
Make a request to the NuHeat API
:param url: The URL to request
:param method: The type of request to make (GET, POST)
:param data: Data to be sent along with POST requests
:param params: Querystring parameters
:param retry: Attempt to re-authenticate and retry request if necessary
"""
headers = config.REQUEST_HEADERS
if params and self._session_id:
params['sessionid'] = self._session_id
if method == "GET":
response = requests.get(url, headers=headers, params=params)
elif method == "POST":
response = requests.post(url, headers=headers, params=params, data=data)
# Handle expired sessions
if response.status_code == 401 and retry:
_LOGGER.warning("NuHeat APIrequest unauthorized for [401]. Try to re-authenticate.")
self._session_id = None
self.authenticate()
return self.request(url, method=method, data=data, params=params, retry=False)
response.raise_for_status()
try:
return response.json()
except ValueError:
# No JSON object
return response
|