diff --git a/pyrisco/__init__.py b/pyrisco/__init__.py index 0587c40..2c9c1df 100644 --- a/pyrisco/__init__.py +++ b/pyrisco/__init__.py @@ -1,3 +1,3 @@ from pyrisco.local import RiscoLocal from pyrisco.cloud import RiscoCloud -from .common import CannotConnectError, OperationError, UnauthorizedError +from .common import CannotConnectError, ConnectionError, OperationError, UnauthorizedError diff --git a/pyrisco/common.py b/pyrisco/common.py index a0e46dc..f887a7c 100644 --- a/pyrisco/common.py +++ b/pyrisco/common.py @@ -140,6 +140,8 @@ class UnauthorizedError(Exception): class CannotConnectError(Exception): """Exception to indicate an error in authorization.""" +class ConnectionError(Exception): + """Exception to indicate an error with the connection.""" class OperationError(Exception): """Exception to indicate an error in operation.""" diff --git a/pyrisco/local/risco_local.py b/pyrisco/local/risco_local.py index 00f740d..66566ff 100644 --- a/pyrisco/local/risco_local.py +++ b/pyrisco/local/risco_local.py @@ -6,7 +6,7 @@ from .zone import Zone from .system import System from .risco_socket import RiscoSocket -from pyrisco.common import OperationError, GROUP_ID_TO_NAME +from pyrisco.common import OperationError, ConnectionError, GROUP_ID_TO_NAME class RiscoLocal: @@ -204,7 +204,7 @@ async def _listen(self, queue): item = await queue.get() if isinstance(item, Exception): self._error(item) - if isinstance(item, ConnectionResetError): + if isinstance(item, ConnectionError): await self.disconnect() break continue diff --git a/pyrisco/local/risco_socket.py b/pyrisco/local/risco_socket.py index 30f7d28..59f0771 100644 --- a/pyrisco/local/risco_socket.py +++ b/pyrisco/local/risco_socket.py @@ -1,6 +1,6 @@ import asyncio from .risco_crypt import RiscoCrypt, ESCAPED_END, END -from pyrisco.common import UnauthorizedError, CannotConnectError, OperationError +from pyrisco.common import UnauthorizedError, CannotConnectError, ConnectionError, OperationError MIN_CMD_ID = 1 MAX_CMD_ID = 49 @@ -12,7 +12,8 @@ def __init__(self, host, port, code, **kwargs): self._code = code self._encoding = kwargs.get('encoding', 'utf-8') self._max_concurrency = kwargs.get('concurrency', 4) - self._communication_delay = kwargs.get('communication_delay', 0) + self._communication_delay = kwargs.get('communication_delay', 1) + self._max_timeout_keep_alive_subseq = kwargs.get('max_timeout_subseq', 3) self._reader = None self._writer = None self._crypt = None @@ -77,9 +78,6 @@ async def _listen(self): future.set_result(command) else: await self._handle_incoming(cmd_id, command, crc) - except ConnectionResetError as error: - await self._queue.put(error) - break except Exception as error: await self._queue.put(error) @@ -89,8 +87,19 @@ async def _keep_alive(self): try: await self.send_result_command("CLOCK") except OperationError as error: - await self._queue.put(error) - + timeout_keep_alive_subseq += 1 + try: + if self._max_timeout_keep_alive_subseq > 0: + if timeout_keep_alive_subseq >= self._max_timeout_keep_alive_subseq: + raise ConnectionError + except Exception as error: + await self._queue.put(error) + break + else: + await self._queue.put(error) + else: + timeout_keep_alive_subseq = 0 + await asyncio.sleep(5) async def send_ack_command(self, command): diff --git a/setup.py b/setup.py index b48d83c..bc79e64 100644 --- a/setup.py +++ b/setup.py @@ -18,7 +18,7 @@ EMAIL = 'onfreund@gmail.com' AUTHOR = 'On Freund' REQUIRES_PYTHON = '>=3.7.0' -VERSION = '0.6.4' +VERSION = '0.6.5' REQUIRED = ['aiohttp']