import requests import json import threading import websocket import time data = "username=1202283%40uad.ac.uk&password=24e76d8e4&grant_type=password" url = "https://api-tevolve.termoweb.net/client/token" headers = {'content-type': 'application/x-www-form-urlencoded', 'authorization': 'Basic NWM0OWRjZTk3NzUxMDM1MTUwNmM0MmRiOnRldm9sdmU='} dev_id = "082e858131ff012c51" class Tevolve: setmode = "" setTemperature = "" token = None sid = "" websocket_url = "" mode = "" set_point = "" websocket_message = "" hallway_mode = "" hallway_current_temp = "" hallway_set_temp = "" hallway_active = "" livingroom_mode = "" livingroom_current_temp = "" livingroom_set_temp = "" livingroom_active = "" @staticmethod def token_manager(): while Tevolve.token is None: x = requests.post(url, headers=headers, data=data) print(x) if x.status_code == 200: Tevolve.token = x.json()["access_token"] else: time.sleep(30) @staticmethod def get_sid(): time.sleep(5) url = "https://api-tevolve.termoweb.net/socket.io/?token=" + Tevolve.token + "&dev_id=082e858131ff012c51&EIO" \ "=3&transport=polling" payload = {} response = requests.request("GET", url, data=payload) if response.status_code == 200: temp = response.text[5:] temp = json.loads(temp) Tevolve.sid = temp['sid'] else: Tevolve.token = None Tevolve.token_manager() @staticmethod def post_websocket(): Tevolve.token_manager() Tevolve.get_sid() url = "https://api-tevolve.termoweb.net/socket.io/?token=" + Tevolve.token + "&dev_id=082e858131ff012c51&EIO" \ "=3&transport=polling&t=Ntb6xXn" \ "&sid=" + Tevolve.sid payload = "401:40/api/v2/socket_io?token=" + Tevolve.token + "&dev_id=082e858131ff012c51" headers = { 'Cookie': "io=" + Tevolve.sid, 'Content-Type': 'text/plain', 'Connection': 'keep-alive' } requests.request("POST", url, headers=headers, data=payload) @staticmethod def create_websocket(): time.sleep(5) websocket_url = "wss://api-tevolve.termoweb.net/socket.io/?token=" + Tevolve.token + "&dev_id=082e858131ff012c51&EIO=3&transport=websocket&sid=" + Tevolve.sid + "" def on_message(ws, message): Tevolve.websocket_message = message def on_open(ws): def run(): print("websocket (run)") counter = 0 ws.send("2probe") time.sleep(2) ws.send(str("5")) while 1: ws.send("2") counter = counter + 1 if counter >= 360: break time.sleep(10) r = threading.Thread(target=run, daemon=True) r.start() def on_close(ws, close_status_code, close_msg): print("WEB SOCKET ClOSED") Tevolve.post_websocket() Tevolve.create_websocket() def on_error(ws, err): print("WEB SOCKET ERROR") Tevolve.post_websocket() Tevolve.create_websocket() ws = websocket.WebSocketApp(websocket_url) websocket.enableTrace(False) ws.on_message = on_message ws.on_open = on_open ws.on_close = on_close ws.on_error = on_error ws.run_forever(ping_interval=10, ping_payload='42/api/v2/socket_io,["message","ping"]') @staticmethod def set_mode(heater_id): heater_id = heater_id mode = Tevolve.setmode headers = { 'host': 'api-tevolve.termoweb.net', 'origin': 'https://tevolve.termoweb.net', 'content-type': 'application/json', 'accept': 'application/json, text/plain, */*', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) ' 'Version/15.4 Safari/605.1.15', 'authorization': 'Bearer ' + Tevolve.token, 'referer': 'https://tevolve.termoweb.net/' } url = "https://api-tevolve.termoweb.net/api/v2/devs/082e858131ff012c51/htr/" + heater_id + "/status" if mode == "heat": mode = "manual" payload = json.dumps({ "mode": mode }) response = requests.post(url, headers=headers, data=payload) if response.status_code == 201 or response.status_code == 200: pass @staticmethod def get_mode(heater_id): headers = { 'host': 'api-tevolve.termoweb.net', 'origin': 'https://tevolve.termoweb.net', 'content-type': 'application/json', 'accept': 'application/json, text/plain, */*', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) ' 'Version/15.4 Safari/605.1.15', 'authorization': 'Bearer ' + Tevolve.token, 'referer': 'https://tevolve.termoweb.net/', } url = "https://api-tevolve.termoweb.net/api/v2/devs/082e858131ff012c51/htr/" + heater_id + "/status" response = requests.get(url, headers=headers) if response.status_code == 201 or response.status_code == 200: mode = response.json()["mode"] if mode == "manual": return "heat" @staticmethod def get_status(heater_id): headers = { 'host': 'api-tevolve.termoweb.net', 'origin': 'https://tevolve.termoweb.net', 'content-type': 'application/json', 'accept': 'application/json, text/plain, */*', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) ' 'Version/15.4 Safari/605.1.15', 'authorization': 'Bearer ' + Tevolve.token, 'referer': 'https://tevolve.termoweb.net/', } url = "https://api-tevolve.termoweb.net/api/v2/devs/082e858131ff012c51/htr/" + heater_id + "/status" response = requests.get(url, headers=headers) if response.status_code == 201 or response.status_code == 200: return response.json() @staticmethod def set_temperature(heater_id, set_temperature): headers = { 'host': 'api-tevolve.termoweb.net', 'origin': 'https://tevolve.termoweb.net', 'content-type': 'application/json', 'accept': 'application/json, text/plain, */*', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) ' 'Version/15.4 Safari/605.1.15', 'authorization': 'Bearer ' + Tevolve.token, 'referer': 'https://tevolve.termoweb.net/' } url = "https://api-tevolve.termoweb.net/api/v2/devs/082e858131ff012c51/htr/" + heater_id + "/status" payload = json.dumps({ "stemp": str(float(set_temperature)), "units": "C", "mode": "manual" }) response = requests.post(url, headers=headers, data=payload) if response.status_code == 201 or response.status_code == 200: pass