python-swidget 1.4.9__tar.gz → 1.4.11__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.4.9 → python_swidget-1.4.11}/PKG-INFO +1 -1
- {python_swidget-1.4.9 → python_swidget-1.4.11}/pyproject.toml +1 -1
- {python_swidget-1.4.9 → python_swidget-1.4.11}/swidget/discovery.py +15 -13
- {python_swidget-1.4.9 → python_swidget-1.4.11}/swidget/swidgetdevice.py +49 -7
- {python_swidget-1.4.9 → python_swidget-1.4.11}/README.md +0 -0
- {python_swidget-1.4.9 → python_swidget-1.4.11}/swidget/__init__.py +0 -0
- {python_swidget-1.4.9 → python_swidget-1.4.11}/swidget/cli.py +0 -0
- {python_swidget-1.4.9 → python_swidget-1.4.11}/swidget/exceptions.py +0 -0
- {python_swidget-1.4.9 → python_swidget-1.4.11}/swidget/provision.py +0 -0
- {python_swidget-1.4.9 → python_swidget-1.4.11}/swidget/py.typed +0 -0
- {python_swidget-1.4.9 → python_swidget-1.4.11}/swidget/swidgetdimmer.py +0 -0
- {python_swidget-1.4.9 → python_swidget-1.4.11}/swidget/swidgetoutlet.py +0 -0
- {python_swidget-1.4.9 → python_swidget-1.4.11}/swidget/swidgetswitch.py +0 -0
- {python_swidget-1.4.9 → python_swidget-1.4.11}/swidget/swidgettimerswitch.py +0 -0
- {python_swidget-1.4.9 → python_swidget-1.4.11}/swidget/websocket.py +0 -0
|
@@ -17,7 +17,7 @@ from .swidgetswitch import SwidgetSwitch
|
|
|
17
17
|
from .swidgettimerswitch import SwidgetTimerSwitch
|
|
18
18
|
|
|
19
19
|
RESPONSE_SEC = 5
|
|
20
|
-
|
|
20
|
+
SWIDGET_STS = ("urn:swidget:pico:1", "urn:swidget:video:1")
|
|
21
21
|
# Generous timeout: TLS handshakes on the device's MCU can take several
|
|
22
22
|
# seconds on first connection.
|
|
23
23
|
DETECT_TIMEOUT_SEC = 10
|
|
@@ -91,7 +91,7 @@ class SwidgetProtocol(ssdp.SimpleServiceDiscoveryProtocol):
|
|
|
91
91
|
headers = {h[0]: h[1] for h in response.headers}
|
|
92
92
|
mac_address = headers["USN"].split("-")[-1]
|
|
93
93
|
ip_address = urlparse(headers["LOCATION"]).hostname
|
|
94
|
-
if headers["ST"]
|
|
94
|
+
if headers["ST"] in SWIDGET_STS:
|
|
95
95
|
device_type = headers["SERVER"].split(" ")[1].split("+")[0]
|
|
96
96
|
insert_type = headers["SERVER"].split(" ")[1].split("+")[1].split("/")[0]
|
|
97
97
|
friendly_name = headers["SERVER"].split("/")[2].strip('"')
|
|
@@ -116,17 +116,19 @@ async def discover_devices(timeout=RESPONSE_SEC):
|
|
|
116
116
|
SwidgetProtocol, family=socket.AF_INET
|
|
117
117
|
)
|
|
118
118
|
|
|
119
|
-
#
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
"
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
119
|
+
# SSDP M-SEARCH matches one ST per request, so emit one packet per
|
|
120
|
+
# supported service type. Devices reply only to their matching ST.
|
|
121
|
+
for st in SWIDGET_STS:
|
|
122
|
+
search_request = ssdp.SSDPRequest(
|
|
123
|
+
"M-SEARCH",
|
|
124
|
+
headers={
|
|
125
|
+
"HOST": "239.255.255.250:1900",
|
|
126
|
+
"MAN": '"ssdp:discover"',
|
|
127
|
+
"MX": timeout,
|
|
128
|
+
"ST": st,
|
|
129
|
+
},
|
|
130
|
+
)
|
|
131
|
+
search_request.sendto(transport, (SwidgetProtocol.MULTICAST_ADDRESS, 1900))
|
|
130
132
|
await asyncio.sleep(timeout)
|
|
131
133
|
return devices
|
|
132
134
|
|
|
@@ -22,14 +22,34 @@ _LOGGER = logging.getLogger(__name__)
|
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
class DeviceType(Enum):
|
|
25
|
-
"""Device type enum.
|
|
25
|
+
"""Device type enum.
|
|
26
|
+
|
|
27
|
+
Values mirror the host ``type`` strings documented in
|
|
28
|
+
``swidget-sdk/docs/summary_description.md``. Add new entries here
|
|
29
|
+
when firmware introduces a new host type rather than letting it
|
|
30
|
+
silently resolve to ``Unknown``.
|
|
31
|
+
"""
|
|
26
32
|
|
|
27
33
|
Dimmer = "dimmer"
|
|
34
|
+
MultiDimmer = "multi_dimmer"
|
|
28
35
|
Outlet = "outlet"
|
|
29
36
|
Outlet20A = "outlet_20a"
|
|
30
37
|
Switch = "switch"
|
|
31
38
|
TimerSwitch = "pana_switch"
|
|
32
39
|
RelaySwitch = "relay_switch"
|
|
40
|
+
PesnaFV05 = "pesna_fv05"
|
|
41
|
+
PesnaFV15 = "pesna_fv15"
|
|
42
|
+
PesnaFV20 = "pesna_fv20"
|
|
43
|
+
PesnaIB150 = "pesna_IB150"
|
|
44
|
+
PesnaIB160 = "pesna_IB160"
|
|
45
|
+
PesnaFV05G5 = "pesna_fv05_G5"
|
|
46
|
+
PesnaFV05WrongSlot = "pesna_fv05_wrong_slot"
|
|
47
|
+
PesnaUnrecognized = "pesna_unrecognized"
|
|
48
|
+
PesnaError = "pesna_error"
|
|
49
|
+
Alarm = "alarm"
|
|
50
|
+
XE300 = "xe300"
|
|
51
|
+
MalmosetBarrel = "malmoset_barrel"
|
|
52
|
+
Invalid = "invalid"
|
|
33
53
|
Unknown = -1
|
|
34
54
|
|
|
35
55
|
@classmethod
|
|
@@ -43,17 +63,39 @@ class DeviceType(Enum):
|
|
|
43
63
|
|
|
44
64
|
|
|
45
65
|
class InsertType(Enum):
|
|
46
|
-
"""Insert type enum.
|
|
66
|
+
"""Insert type enum.
|
|
67
|
+
|
|
68
|
+
Values mirror the insert ``type`` strings documented in
|
|
69
|
+
``swidget-sdk/docs/summary_description.md``. Add new entries here
|
|
70
|
+
when firmware introduces a new insert type rather than letting it
|
|
71
|
+
silently resolve to ``Unknown``.
|
|
72
|
+
"""
|
|
47
73
|
|
|
74
|
+
CONTROL = "control"
|
|
48
75
|
USB = "USB"
|
|
49
|
-
|
|
50
|
-
TH = "TEMP HUMI"
|
|
51
|
-
AQ = "AIR QUALITY"
|
|
76
|
+
USB_C = "USB C"
|
|
52
77
|
GL = "GUIDE LIGHT"
|
|
78
|
+
ADV_GUIDE = "ADV GUIDE"
|
|
53
79
|
PO = "POWER OUT"
|
|
54
|
-
|
|
55
|
-
|
|
80
|
+
MOTION = "MOTION"
|
|
81
|
+
AQ = "AIR QUALITY"
|
|
82
|
+
TH = "TEMP HUMI"
|
|
83
|
+
THM = "TEMP HUMI MOTION"
|
|
84
|
+
ENVIRONMENTAL = "ENVIRONMENTAL"
|
|
85
|
+
SECURITY = "SECURITY"
|
|
86
|
+
CO2 = "CO2"
|
|
87
|
+
PM = "PM"
|
|
88
|
+
PM_CO2 = "PM CO2"
|
|
56
89
|
WD = "WATER DETECTOR"
|
|
90
|
+
LIGHT_SENSOR = "LIGHT SENSOR"
|
|
91
|
+
DISTANCE = "DISTANCE"
|
|
92
|
+
DIRECT_LIGHTS = "DIRECT LIGHTS"
|
|
93
|
+
DUAL_LV_RELAY = "DUAL LV RELAY"
|
|
94
|
+
SINGLE_LV_RELAY = "SINGLE LV RELAY"
|
|
95
|
+
SAS = "SAS"
|
|
96
|
+
SPEAKER = "SPEAKER"
|
|
97
|
+
VIDEO = "video" # This is not a mistake.
|
|
98
|
+
INVALID = "invalid"
|
|
57
99
|
Unknown = -1
|
|
58
100
|
|
|
59
101
|
@classmethod
|
|
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
|
|
File without changes
|
|
File without changes
|