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.
- {python_swidget-1.0.0 → python_swidget-1.0.1}/PKG-INFO +1 -1
- {python_swidget-1.0.0 → python_swidget-1.0.1}/pyproject.toml +1 -1
- {python_swidget-1.0.0 → python_swidget-1.0.1}/swidget/cli.py +1 -1
- {python_swidget-1.0.0 → python_swidget-1.0.1}/swidget/discovery.py +0 -3
- {python_swidget-1.0.0 → python_swidget-1.0.1}/swidget/swidgetdevice.py +6 -2
- {python_swidget-1.0.0 → python_swidget-1.0.1}/swidget/websocket.py +26 -2
- {python_swidget-1.0.0 → python_swidget-1.0.1}/README.md +0 -0
- {python_swidget-1.0.0 → python_swidget-1.0.1}/swidget/__init__.py +0 -0
- {python_swidget-1.0.0 → python_swidget-1.0.1}/swidget/exceptions.py +0 -0
- {python_swidget-1.0.0 → python_swidget-1.0.1}/swidget/provision.py +0 -0
- {python_swidget-1.0.0 → python_swidget-1.0.1}/swidget/py.typed +0 -0
- {python_swidget-1.0.0 → python_swidget-1.0.1}/swidget/swidgetdimmer.py +0 -0
- {python_swidget-1.0.0 → python_swidget-1.0.1}/swidget/swidgetoutlet.py +0 -0
- {python_swidget-1.0.0 → python_swidget-1.0.1}/swidget/swidgetswitch.py +0 -0
- {python_swidget-1.0.0 → python_swidget-1.0.1}/swidget/swidgettimerswitch.py +0 -0
|
@@ -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=
|
|
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
|
-
|
|
68
|
-
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|