From 54eda1250223415c2cb316983f2c363b59b65ecc Mon Sep 17 00:00:00 2001 From: Monster1025 Date: Sun, 5 Mar 2017 20:14:42 +0300 Subject: [PATCH] Missing packets fix! --- src/main.py | 12 ++++++++---- src/xiaomihub.py | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/main.py b/src/main.py index 46d33fe..a63abaa 100644 --- a/src/main.py +++ b/src/main.py @@ -9,7 +9,7 @@ import mqtt import yamlparser from xiaomihub import XiaomiHub -logging.basicConfig(level=logging.INFO) +logging.basicConfig(level=logging.DEBUG) _LOGGER = logging.getLogger(__name__) def process_gateway_messages(gateway, client): @@ -40,14 +40,18 @@ def read_motion_data(gateway, client, polling_interval, polling_models): if (model not in polling_models): continue sid = device['sid'] - _LOGGER.debug("Polling " + str(model) + " with sid: " + str(sid)) sensor_resp = gateway.get_from_hub(sid) + if (sensor_resp['sid'] != sid): + print("Error: Response sid(" + sensor_resp['sid'] + ") differs from requested(" + sid + "). Skipping.") + continue; + data = json.loads(sensor_resp['data']) state = data.get("status", None) short_id = sensor_resp['short_id'] - if (device['data'] != data or first): + if ( device['data'] != data or first): device['data'] = data + _LOGGER.debug("Polling result differs for " + str(model) + " with sid(First: " + str(first) + "): " + str(sid) + "; " + str(data)) client.publish(model, sid, data) first = False except Exception as e: @@ -97,4 +101,4 @@ if __name__ == "__main__": t3.start() while True: - time.sleep(10) \ No newline at end of file + time.sleep(10) diff --git a/src/xiaomihub.py b/src/xiaomihub.py index 352fac8..f0a4f71 100644 --- a/src/xiaomihub.py +++ b/src/xiaomihub.py @@ -2,6 +2,8 @@ import socket import struct import json import logging +import sys +import select from collections import defaultdict from queue import Queue from threading import Thread @@ -111,9 +113,23 @@ class XiaomiHub: def _send_cmd(self, cmd, rtnCmd): return self._send_socket(cmd, rtnCmd, self.GATEWAY_IP, self.GATEWAY_PORT) + def _read_unwanted_data(self): + try: + socket = self._socket + socket_list = [sys.stdin, socket] + read_sockets, write_sockets, error_sockets = select.select(socket_list , [], []) + for sock in read_sockets: + if sock == socket: + data = sock.recv(4096) + print("Not recieved data: " + str(data)) + except Exception as e: + _LOGGER.error("Cannot read unwanted data: " + str(e)) + def _send_socket(self, cmd, rtnCmd, ip, port): socket = self._socket try: + self._read_unwanted_data() + socket.settimeout(30.0) socket.sendto(cmd.encode(), (ip, port)) socket.settimeout(30.0)