python-swidget 1.0.0__tar.gz → 1.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-swidget
3
- Version: 1.0.0
3
+ Version: 1.0.1
4
4
  Summary: Python API for Swidget smart devices
5
5
  Home-page: https://github.com/swidget/python-swidget
6
6
  License: GPL-3.0-or-later
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "python-swidget"
3
- version = "1.0.0"
3
+ version = "1.0.1"
4
4
  description = "Python API for Swidget smart devices"
5
5
  license = "GPL-3.0-or-later"
6
6
  authors = ["Swidget"]
@@ -127,7 +127,7 @@ def join(ssid, network_password, secret_key, friendly_name):
127
127
 
128
128
 
129
129
  @cli.command()
130
- @click.option("--timeout", default=5, required=False)
130
+ @click.option("--timeout", default=10, required=False)
131
131
  @click.pass_context
132
132
  async def discover(ctx, timeout):
133
133
  """Discover devices in the network."""
@@ -39,10 +39,7 @@ class SwidgetProtocol(ssdp.SimpleServiceDiscoveryProtocol):
39
39
  insert_type = headers["SERVER"].split(" ")[1].split("+")[1].split("/")[0]
40
40
  friendly_name = headers["SERVER"].split("/")[2].strip('"')
41
41
  devices[mac_address] = SwidgetDiscoveredDevice(mac_address, ip_address, friendly_name)
42
- <<<<<<< HEAD
43
- =======
44
42
  _LOGGER.debug(f"Swidget device '{friendly_name}' at {ip_address}")
45
- >>>>>>> 690a0c560a8b2ff39245d1a8354ced968d79e5de
46
43
 
47
44
 
48
45
  async def discover_devices(timeout=RESPONSE_SEC):
@@ -34,6 +34,7 @@ class SwidgetDevice:
34
34
  self.use_websockets = use_websockets
35
35
  self.device_type = DeviceType.Unknown
36
36
  self._friendly_name = "Unknown Swidget Device"
37
+ self.assemblies = {}
37
38
  headers = {self.token_name: self.secret_key,
38
39
  'Connection': 'keep-alive'}
39
40
  connector = TCPConnector(verify_ssl=False, force_close=True)
@@ -64,8 +65,8 @@ class SwidgetDevice:
64
65
  if self.use_websockets:
65
66
  _LOGGER.debug("Calling self._websocket.connect()")
66
67
  await self._websocket.connect()
67
- _LOGGER.debug("Calling self._websocket.listen() ")
68
- asyncio.create_task(self._websocket.listen())
68
+ _LOGGER.debug("Calling self.update() ")
69
+ await self.update()
69
70
 
70
71
  async def stop(self):
71
72
  """Stop the websocket."""
@@ -74,6 +75,9 @@ class SwidgetDevice:
74
75
  await self._websocket.close()
75
76
  await self._session.close()
76
77
 
78
+ async def close(self):
79
+ await self.stop()
80
+
77
81
  async def message_callback(self, message):
78
82
  """Entrypoint for a websocket callback"""
79
83
  _LOGGER.debug("SwidgetDevice.message_callback() called")
@@ -1,9 +1,23 @@
1
+ import asyncio
1
2
  import aiohttp
3
+ from aiohttp import ClientWebSocketResponse, WSMsgType
2
4
  import logging
3
5
  import socket
4
6
 
5
7
  _LOGGER = logging.getLogger(__name__)
6
8
 
9
+
10
+ async def cancel_task(*tasks: asyncio.Task | None) -> None:
11
+ """Cancel task(s)."""
12
+ for task in tasks:
13
+ if task is not None and not task.done():
14
+ task.cancel()
15
+ try:
16
+ await task
17
+ except asyncio.CancelledError:
18
+ pass
19
+
20
+
7
21
  class SwidgetWebsocket:
8
22
  """A websocket connection to a Swidget Device"""
9
23
 
@@ -29,11 +43,17 @@ class SwidgetWebsocket:
29
43
  self.failed_attempts = 0
30
44
  self._error_reason = None
31
45
  self.headers = {'Connection': 'Upgrade'}
46
+ self._receiver_task: asyncio.Task | None = None
32
47
 
33
48
  @property
34
49
  def connected(self) -> bool:
35
50
  return self._client is not None and not self._client.closed
36
51
 
52
+ @property
53
+ def websocket(self) -> ClientWebSocketResponse | None:
54
+ """Return the web socket."""
55
+ return self._ws
56
+
37
57
  def get_uri(self, host, token_name, secret_key):
38
58
  """Generate the websocket URI"""
39
59
  if self.use_security:
@@ -43,7 +63,10 @@ class SwidgetWebsocket:
43
63
 
44
64
  async def connect(self) -> None:
45
65
  _LOGGER.debug("websocket.connect() called")
66
+ """Create a new connection and, optionally, start the monitor."""
67
+ await cancel_task(self._receiver_task)
46
68
  if self.connected:
69
+ _LOGGER.debug("Websocket already connected")
47
70
  return
48
71
 
49
72
  if not self.session:
@@ -51,6 +74,7 @@ class SwidgetWebsocket:
51
74
 
52
75
  try:
53
76
  self._client = await self.session.ws_connect(url=self.uri, headers=self.headers, verify_ssl=self._verify_ssl, heartbeat=30)
77
+ _LOGGER.debug("Websocket now connected")
54
78
  except (
55
79
  aiohttp.WSServerHandshakeError,
56
80
  aiohttp.ClientConnectionError,
@@ -60,7 +84,8 @@ class SwidgetWebsocket:
60
84
  "Error occurred while communicating with WLED device"
61
85
  f" on WebSocket at {self.host}"
62
86
  )
63
- raise
87
+ raise(msg)
88
+ self._receiver_task = asyncio.ensure_future(self.listen())
64
89
 
65
90
  async def close(self) -> None:
66
91
  _LOGGER.debug("websocket.close() called")
@@ -88,7 +113,6 @@ class SwidgetWebsocket:
88
113
 
89
114
  if message.type == aiohttp.WSMsgType.TEXT:
90
115
  message_data = message.json()
91
- _LOGGER.debug(f"Data received from websocket: {message_data}")
92
116
  await self.callback(message_data)
93
117
 
94
118
  if message.type in (
File without changes