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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-swidget
3
- Version: 1.4.9
3
+ Version: 1.4.11
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.4.9"
3
+ version = "1.4.11"
4
4
  description = "Python API for Swidget smart devices"
5
5
  license = "GPL-3.0-or-later"
6
6
  authors = ["Swidget"]
@@ -17,7 +17,7 @@ from .swidgetswitch import SwidgetSwitch
17
17
  from .swidgettimerswitch import SwidgetTimerSwitch
18
18
 
19
19
  RESPONSE_SEC = 5
20
- SWIDGET_ST = "urn:swidget:pico:1"
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"] == SWIDGET_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
- # Send out an M-SEARCH request, requesting Swidget service types.
120
- search_request = ssdp.SSDPRequest(
121
- "M-SEARCH",
122
- headers={
123
- "HOST": "239.255.255.250:1900",
124
- "MAN": '"ssdp:discover"',
125
- "MX": timeout,
126
- "ST": SWIDGET_ST,
127
- },
128
- )
129
- search_request.sendto(transport, (SwidgetProtocol.MULTICAST_ADDRESS, 1900))
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
- THM = "TEMP HUMI MOTION"
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
- VIDEO = "video" # This is not a mistake.
55
- USBC = "USBC"
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