diff --git a/resources/tydomd/tydom/MessageHandler.py b/resources/tydomd/tydom/MessageHandler.py index 95dc745..5d24549 100755 --- a/resources/tydomd/tydom/MessageHandler.py +++ b/resources/tydomd/tydom/MessageHandler.py @@ -97,15 +97,11 @@ async def parse_response(self, incoming): msg_type = 'msg_info' if msg_type is None: - logger.error('Unknown message type received', data) + logger.warning('Unknown message type received (%s)', data) else: logger.debug('Message received detected as (%s)', msg_type) try: - if msg_type == 'msg_info': - parsed = json.loads(data) - self.jeedom_com.send_change_immediate({'msg_type': msg_type, 'data': parsed}) - - elif msg_type == 'msg_config': + if msg_type == 'msg_config': parsed = json.loads(data) self.jeedom_com.send_change_immediate({'msg_type': msg_type, 'data': parsed}) @@ -129,9 +125,14 @@ async def parse_response(self, incoming): elif msg_type == 'msg_html': pass + elif msg_type == 'msg_info': + parsed = json.loads(data) + self.jeedom_com.send_change_immediate({'msg_type': msg_type, 'data': parsed}) + logger.debug('Incoming data parsed with success') except Exception as e: logger.error('Error on parsing tydom response (%s)', e) + logger.error('Incoming data (%s)', data) async def parse_cmeta_data(self, parsed): for i in parsed: @@ -145,24 +146,28 @@ async def parse_cmeta_data(self, parsed): for params in elem["parameters"]: if params["name"] == "dest": for dest in params["enum_values"]: - url = "/devices/" + str(i["id"]) + "/endpoints/" + str(endpoint["id"]) + "/cdata?name=" + elem["name"] + "&dest=" + dest + "&reset=false" + url = "/devices/" + str(i["id"]) + "/endpoints/" + str( + endpoint["id"]) + "/cdata?name=" + elem["name"] + "&dest=" + dest + "&reset=false" await self.tydom_client.get_poll_device_data(url) elif elem["name"] == "energyInstant": for params in elem["parameters"]: if params["name"] == "unit": for unit in params["enum_values"]: - url = "/devices/" + str(i["id"]) + "/endpoints/" + str(endpoint["id"]) + "/cdata?name=" + elem["name"] + "&unit=" + unit + "&reset=false" + url = "/devices/" + str(i["id"]) + "/endpoints/" + str( + endpoint["id"]) + "/cdata?name=" + elem["name"] + "&unit=" + unit + "&reset=false" await self.tydom_client.get_poll_device_data(url) elif elem["name"] == "energyDistrib": for params in elem["parameters"]: if params["name"] == "src": for src in params["enum_values"]: - url = "/devices/" + str(i["id"]) + "/endpoints/" + str(endpoint["id"]) + "/cdata?name=" + elem["name"] + "&period=YEAR&periodOffset=0&src=" + src + url = "/devices/" + str(i["id"]) + "/endpoints/" + str( + endpoint["id"]) + "/cdata?name=" + elem["name"] + "&period=YEAR&periodOffset=0&src=" + src await self.tydom_client.get_poll_device_data(url) - url = "/devices/" + str(i["id"]) + "/endpoints/" + str(endpoint["id"]) + "/cdata?name=" + elem["name"] + "&period=MONTH&periodOffset=0&src=" + src + url = "/devices/" + str(i["id"]) + "/endpoints/" + str( + endpoint["id"]) + "/cdata?name=" + elem["name"] + "&period=MONTH&periodOffset=0&src=" + src await self.tydom_client.get_poll_device_data(url) elif elem["name"] == "energyHisto": @@ -175,6 +180,8 @@ async def parse_cmeta_data(self, parsed): url = "/devices/" + str(i["id"]) + "/endpoints/" + str(endpoint["id"]) + "/cdata?name=" + elem["name"] + "&period=YEARS&dest=" + dest await self.tydom_client.get_poll_device_data(url) + logger.debug('Metadata configuration updated') + # PUT response DIRTY parsing def parse_put_response(self, bytes_str, start=6): # TODO : Find a cooler way to parse nicely the PUT HTTP response diff --git a/resources/tydomd/tydom/TydomClient.py b/resources/tydomd/tydom/TydomClient.py index d36027e..4371601 100755 --- a/resources/tydomd/tydom/TydomClient.py +++ b/resources/tydomd/tydom/TydomClient.py @@ -5,10 +5,10 @@ import base64 import http.client +import json import logging import os import ssl -import json import websockets from requests.auth import HTTPDigestAuth @@ -196,7 +196,8 @@ async def put_devices_data(self, device_id, endpoint_id, name, value): body + "\r\n\r\n") a_bytes = bytes(str_request, "ascii") - logger.debug("Sending message to tydom (%s %s)", "PUT data", body) + logger.debug("Sending message to tydom (%s %s)", + "PUT devices data", body) await self.connection.send(a_bytes) return 0 diff --git a/resources/tydomd/tydomd.py b/resources/tydomd/tydomd.py index 5e0e03b..d9b1401 100755 --- a/resources/tydomd/tydomd.py +++ b/resources/tydomd/tydomd.py @@ -52,29 +52,38 @@ async def read_socket(): return async def listen_tydom(): - try: - await tydom_client.connect() - await tydom_client.setup() - while 1: - try: - incoming_bytes_str = await tydom_client.connection.recv() - message_handler = MessageHandler( - incoming_bytes=incoming_bytes_str, - tydom_client=tydom_client, - jeedom_com=jeedom_com - ) - await message_handler.incoming_triage() - except Exception as e: - logging.warning("Unable to handle message: %s", e) - except socket.gaierror as e: - logging.error("Socket error: %s", e) - sys.exit(1) - except ConnectionRefusedError as e: - logging.error("Connection refused: %s", e) - sys.exit(1) - except Exception as e: - logging.error("Error: %s", e) - sys.exit(1) + while True: + try: + await tydom_client.connect() + await tydom_client.setup() + while True: + try: + incoming_bytes_str = await tydom_client.connection.recv() + message_handler = MessageHandler( + incoming_bytes=incoming_bytes_str, + tydom_client=tydom_client, + jeedom_com=jeedom_com + ) + await message_handler.incoming_triage() + except websockets.ConnectionClosed as e: + logging.error("Websocket connection closed: %s", e) + await tydom_client.disconnect() + break + except websockets.ConnectionClosedError as e: + logging.error("Websocket connection closed with an error: %s", e) + await tydom_client.disconnect() + break + except Exception as e: + logging.warning("Unable to handle message: %s", e) + except socket.gaierror as e: + logging.error("Socket error: %s", e) + sys.exit(1) + except ConnectionRefusedError as e: + logging.error("Connection refused: %s", e) + sys.exit(1) + except Exception as e: + logging.error("Error: %s", e) + sys.exit(1) async def listen_socket(): jeedom_socket.open()