From c88f88acaa8bd29d8c09586e60db4977de0f764e Mon Sep 17 00:00:00 2001 From: shbatm Date: Sat, 23 May 2020 09:09:55 +0000 Subject: [PATCH] Prevent duplicate websockets --- pyisy/events.py | 8 +++++++- pyisy/nodes/group.py | 6 ++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/pyisy/events.py b/pyisy/events.py index eb34cfc0..0d4ae1c7 100644 --- a/pyisy/events.py +++ b/pyisy/events.py @@ -337,6 +337,7 @@ def __init__( self._lasthb = None self._sid = None self._program_key = None + self.websocket_task = None if websession is None: websession = get_new_client_session(use_https, tls_ver) @@ -358,12 +359,15 @@ def start(self): def stop(self): """Close websocket connection.""" self.status = ES_STOP_UPDATES - self.websocket_task.cancel() + if self.websocket_task is not None and not self.websocket_task.done(): + self.websocket_task.cancel() async def reconnect(self, delay=RECONNECT_DELAY, retries=0): """Reconnect to a disconnected websocket.""" if self.status == ES_CONNECTED: return + if self.websocket_task is not None and not self.websocket_task.done(): + self.websocket_task.cancel() self.status = ES_RECONNECTING _LOGGER.info("PyISY attempting stream reconnect in %ss.", delay) await asyncio.sleep(delay) @@ -490,6 +494,8 @@ async def websocket(self, retries=0): _LOGGER.error("Websocket Client Connector Error.") self.status = ES_LOST_STREAM_CONNECTION await self.reconnect(RECONNECT_DELAY) + except asyncio.CancelledError: + self.status = ES_DISCONNECTED except Exception as err: if self.status != ES_STOP_UPDATES: _LOGGER.exception("Unexpected error %s", err) diff --git a/pyisy/nodes/group.py b/pyisy/nodes/group.py index 75aa0e06..58930b90 100755 --- a/pyisy/nodes/group.py +++ b/pyisy/nodes/group.py @@ -1,4 +1,6 @@ """Representation of groups (scenes) from an ISY.""" +import asyncio + from ..constants import ISY_VALUE_UNKNOWN, PROTO_GROUP from ..helpers import now from .nodebase import NodeBase @@ -46,7 +48,7 @@ def __init__( ] # get and update the status - self.isy.loop.create_task(self.update()) + asyncio.create_task(self.update()) def __del__(self): """Cleanup event handlers before deleting.""" @@ -105,4 +107,4 @@ async def update(self, event=None, wait_time=0, hint=None, xmldoc=None): def update_callback(self, event=None): """Handle synchronous callbacks for subscriber events.""" - self.isy.loop.create_task(self.update(event)) + asyncio.create_task(self.update(event))