PySwitchbot 2.10.0__tar.gz → 3.1.0__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.
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/PKG-INFO +14 -1
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/README.md +13 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/pyproject.toml +1 -1
- pyswitchbot-3.1.0/switchbot/__version__.py +1 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parser.py +18 -18
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/const/__init__.py +11 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/air_purifier.py +27 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/device.py +9 -8
- pyswitchbot-2.10.0/switchbot/__version__.py +0 -1
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/LICENSE +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/__init__.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/__init__.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/_sensor_th.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/air_purifier.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/art_frame.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/blind_tilt.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/bot.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/bulb.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/ceiling_light.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/climate_panel.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/contact.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/curtain.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/fan.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/hub2.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/hub3.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/hubmini_matter.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/humidifier.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/keypad.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/keypad_vision.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/leak.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/light_strip.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/lock.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/meter.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/motion.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/plug.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/presence_sensor.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/relay_switch.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/remote.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/roller_shade.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/smart_thermostat_radiator.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/vacuum.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/adv_parsers/weather_station.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/api_config.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/const/air_purifier.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/const/climate.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/const/evaporative_humidifier.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/const/fan.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/const/hub2.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/const/hub3.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/const/light.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/const/lock.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/const/presence_sensor.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/__init__.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/art_frame.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/base_cover.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/base_light.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/blind_tilt.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/bot.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/bulb.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/ceiling_light.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/contact.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/curtain.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/evaporative_humidifier.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/fan.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/humidifier.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/keypad.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/keypad_vision.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/light_strip.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/lock.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/meter.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/meter_pro.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/motion.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/plug.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/relay_switch.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/roller_shade.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/smart_thermostat_radiator.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/universal_remote.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/devices/vacuum.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/discovery.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/enum.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/helpers.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/models.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/oauth.py +0 -0
- {pyswitchbot-2.10.0 → pyswitchbot-3.1.0}/switchbot/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PySwitchbot
|
|
3
|
-
Version:
|
|
3
|
+
Version: 3.1.0
|
|
4
4
|
Summary: A library to communicate with Switchbot
|
|
5
5
|
License: MIT
|
|
6
6
|
License-File: LICENSE
|
|
@@ -42,6 +42,19 @@ source .venv/bin/activate
|
|
|
42
42
|
pip install .
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
+
## Air purifier filter reset
|
|
46
|
+
|
|
47
|
+
After replacing the filter, call `await purifier.reset_filter_usage()` on a
|
|
48
|
+
configured `SwitchbotAirPurifier` instance. The method uses the device's
|
|
49
|
+
encrypted BLE connection, sends the reset command without automatic retries,
|
|
50
|
+
and reads back the used-hours counter. It returns `True` and refreshes the
|
|
51
|
+
cached `filter element working time` only after the device reports zero.
|
|
52
|
+
|
|
53
|
+
Failed commands or an unconfirmed reset raise `SwitchbotOperationError`. If a
|
|
54
|
+
reply is lost, check the device before retrying: the reset may already have
|
|
55
|
+
been applied. This resets the device counter and does not restore its previous
|
|
56
|
+
value.
|
|
57
|
+
|
|
45
58
|
## OAuth account access
|
|
46
59
|
|
|
47
60
|
pySwitchbot provides helpers for SwitchBot's authorization-code flow. The
|
|
@@ -10,6 +10,19 @@ source .venv/bin/activate
|
|
|
10
10
|
pip install .
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
+
## Air purifier filter reset
|
|
14
|
+
|
|
15
|
+
After replacing the filter, call `await purifier.reset_filter_usage()` on a
|
|
16
|
+
configured `SwitchbotAirPurifier` instance. The method uses the device's
|
|
17
|
+
encrypted BLE connection, sends the reset command without automatic retries,
|
|
18
|
+
and reads back the used-hours counter. It returns `True` and refreshes the
|
|
19
|
+
cached `filter element working time` only after the device reports zero.
|
|
20
|
+
|
|
21
|
+
Failed commands or an unconfirmed reset raise `SwitchbotOperationError`. If a
|
|
22
|
+
reply is lost, check the device before retrying: the reset may already have
|
|
23
|
+
been applied. This resets the device counter and does not restore its previous
|
|
24
|
+
value.
|
|
25
|
+
|
|
13
26
|
## OAuth account access
|
|
14
27
|
|
|
15
28
|
pySwitchbot provides helpers for SwitchBot's authorization-code flow. The
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "3.1.0"
|
|
@@ -129,13 +129,13 @@ SUPPORTED_TYPES: dict[str | bytes, SwitchbotSupportedType] = {
|
|
|
129
129
|
"manufacturer_id": 2409,
|
|
130
130
|
},
|
|
131
131
|
"{": {
|
|
132
|
-
"modelName": SwitchbotModel.
|
|
132
|
+
"modelName": SwitchbotModel.CURTAIN_3,
|
|
133
133
|
"modelFriendlyName": "Curtain 3",
|
|
134
134
|
"func": process_wocurtain,
|
|
135
135
|
"manufacturer_id": 2409,
|
|
136
136
|
},
|
|
137
137
|
"[": {
|
|
138
|
-
"modelName": SwitchbotModel.
|
|
138
|
+
"modelName": SwitchbotModel.CURTAIN_3,
|
|
139
139
|
"modelFriendlyName": "Curtain 3",
|
|
140
140
|
"func": process_wocurtain,
|
|
141
141
|
"manufacturer_id": 2409,
|
|
@@ -153,25 +153,25 @@ SUPPORTED_TYPES: dict[str | bytes, SwitchbotSupportedType] = {
|
|
|
153
153
|
"manufacturer_id": 2409,
|
|
154
154
|
},
|
|
155
155
|
"w": {
|
|
156
|
-
"modelName": SwitchbotModel.
|
|
157
|
-
"modelFriendlyName": "Indoor/Outdoor
|
|
156
|
+
"modelName": SwitchbotModel.INDOOR_OUTDOOR_THERMO_HYGROMETER,
|
|
157
|
+
"modelFriendlyName": "Indoor/Outdoor Thermo-Hygrometer",
|
|
158
158
|
"func": process_wosensorth,
|
|
159
159
|
"manufacturer_id": 2409,
|
|
160
160
|
},
|
|
161
161
|
"W": {
|
|
162
|
-
"modelName": SwitchbotModel.
|
|
163
|
-
"modelFriendlyName": "Indoor/Outdoor
|
|
162
|
+
"modelName": SwitchbotModel.INDOOR_OUTDOOR_THERMO_HYGROMETER,
|
|
163
|
+
"modelFriendlyName": "Indoor/Outdoor Thermo-Hygrometer",
|
|
164
164
|
"func": process_wosensorth,
|
|
165
165
|
"manufacturer_id": 2409,
|
|
166
166
|
},
|
|
167
167
|
"i": {
|
|
168
|
-
"modelName": SwitchbotModel.
|
|
168
|
+
"modelName": SwitchbotModel.METER_PLUS,
|
|
169
169
|
"modelFriendlyName": "Meter Plus",
|
|
170
170
|
"func": process_wosensorth,
|
|
171
171
|
"manufacturer_id": 2409,
|
|
172
172
|
},
|
|
173
173
|
"I": {
|
|
174
|
-
"modelName": SwitchbotModel.
|
|
174
|
+
"modelName": SwitchbotModel.METER_PLUS,
|
|
175
175
|
"modelFriendlyName": "Meter Plus",
|
|
176
176
|
"func": process_wosensorth,
|
|
177
177
|
"manufacturer_id": 2409,
|
|
@@ -201,13 +201,13 @@ SUPPORTED_TYPES: dict[str | bytes, SwitchbotSupportedType] = {
|
|
|
201
201
|
"manufacturer_id": 2409,
|
|
202
202
|
},
|
|
203
203
|
"5": {
|
|
204
|
-
"modelName": SwitchbotModel.
|
|
204
|
+
"modelName": SwitchbotModel.METER_PRO_CO2,
|
|
205
205
|
"modelFriendlyName": "Meter Pro CO2",
|
|
206
206
|
"func": process_wosensorth_c,
|
|
207
207
|
"manufacturer_id": 2409,
|
|
208
208
|
},
|
|
209
209
|
b"\x15": {
|
|
210
|
-
"modelName": SwitchbotModel.
|
|
210
|
+
"modelName": SwitchbotModel.METER_PRO_CO2,
|
|
211
211
|
"modelFriendlyName": "Meter Pro CO2",
|
|
212
212
|
"func": process_wosensorth_c,
|
|
213
213
|
"manufacturer_id": 2409,
|
|
@@ -225,25 +225,25 @@ SUPPORTED_TYPES: dict[str | bytes, SwitchbotSupportedType] = {
|
|
|
225
225
|
"manufacturer_id": 2409,
|
|
226
226
|
},
|
|
227
227
|
"g": {
|
|
228
|
-
"modelName": SwitchbotModel.
|
|
229
|
-
"modelFriendlyName": "Plug Mini",
|
|
228
|
+
"modelName": SwitchbotModel.PLUG_MINI_US,
|
|
229
|
+
"modelFriendlyName": "Plug Mini (US)",
|
|
230
230
|
"func": process_woplugmini,
|
|
231
231
|
"manufacturer_id": 2409,
|
|
232
232
|
},
|
|
233
233
|
"G": {
|
|
234
|
-
"modelName": SwitchbotModel.
|
|
235
|
-
"modelFriendlyName": "Plug Mini",
|
|
234
|
+
"modelName": SwitchbotModel.PLUG_MINI_US,
|
|
235
|
+
"modelFriendlyName": "Plug Mini (US)",
|
|
236
236
|
"func": process_woplugmini,
|
|
237
237
|
"manufacturer_id": 2409,
|
|
238
238
|
},
|
|
239
239
|
"j": {
|
|
240
|
-
"modelName": SwitchbotModel.
|
|
240
|
+
"modelName": SwitchbotModel.PLUG_MINI_JP,
|
|
241
241
|
"modelFriendlyName": "Plug Mini (JP)",
|
|
242
242
|
"func": process_woplugmini,
|
|
243
243
|
"manufacturer_id": 2409,
|
|
244
244
|
},
|
|
245
245
|
"J": {
|
|
246
|
-
"modelName": SwitchbotModel.
|
|
246
|
+
"modelName": SwitchbotModel.PLUG_MINI_JP,
|
|
247
247
|
"modelFriendlyName": "Plug Mini (JP)",
|
|
248
248
|
"func": process_woplugmini,
|
|
249
249
|
"manufacturer_id": 2409,
|
|
@@ -273,13 +273,13 @@ SUPPORTED_TYPES: dict[str | bytes, SwitchbotSupportedType] = {
|
|
|
273
273
|
"manufacturer_id": 2409,
|
|
274
274
|
},
|
|
275
275
|
"n": {
|
|
276
|
-
"modelName": SwitchbotModel.
|
|
276
|
+
"modelName": SwitchbotModel.CEILING_LIGHT_PRO,
|
|
277
277
|
"modelFriendlyName": "Ceiling Light Pro",
|
|
278
278
|
"func": process_woceiling,
|
|
279
279
|
"manufacturer_id": 2409,
|
|
280
280
|
},
|
|
281
281
|
"N": {
|
|
282
|
-
"modelName": SwitchbotModel.
|
|
282
|
+
"modelName": SwitchbotModel.CEILING_LIGHT_PRO,
|
|
283
283
|
"modelFriendlyName": "Ceiling Light Pro",
|
|
284
284
|
"func": process_woceiling,
|
|
285
285
|
"manufacturer_id": 2409,
|
|
@@ -63,17 +63,27 @@ class SwitchbotAccountConnectionError(RuntimeError):
|
|
|
63
63
|
class SwitchbotModel(StrEnum):
|
|
64
64
|
BOT = "WoHand"
|
|
65
65
|
CURTAIN = "WoCurtain"
|
|
66
|
+
CURTAIN_3 = "WoCurtain3"
|
|
66
67
|
HUMIDIFIER = "WoHumi"
|
|
68
|
+
# Deprecated import-only symbol; use PLUG_MINI_US or PLUG_MINI_JP to parse.
|
|
67
69
|
PLUG_MINI = "WoPlug"
|
|
70
|
+
PLUG_MINI_US = "WoPlugUS"
|
|
71
|
+
PLUG_MINI_JP = "WoPlugJP"
|
|
68
72
|
CONTACT_SENSOR = "WoContact"
|
|
69
73
|
LIGHT_STRIP = "WoStrip"
|
|
70
74
|
METER = "WoSensorTH"
|
|
75
|
+
METER_PLUS = "WoMeterPlus"
|
|
71
76
|
METER_PRO = "WoTHP"
|
|
77
|
+
METER_PRO_CO2 = "WoTHPc"
|
|
78
|
+
# Deprecated alias; use METER_PRO_CO2.
|
|
72
79
|
METER_PRO_C = "WoTHPc"
|
|
80
|
+
INDOOR_OUTDOOR_THERMO_HYGROMETER = "WoIOSensorTH"
|
|
81
|
+
# Deprecated alias; use INDOOR_OUTDOOR_THERMO_HYGROMETER.
|
|
73
82
|
IO_METER = "WoIOSensorTH"
|
|
74
83
|
MOTION_SENSOR = "WoPresence"
|
|
75
84
|
COLOR_BULB = "WoBulb"
|
|
76
85
|
CEILING_LIGHT = "WoCeiling"
|
|
86
|
+
CEILING_LIGHT_PRO = "WoCeilingPro"
|
|
77
87
|
LOCK = "WoLock"
|
|
78
88
|
LOCK_PRO = "WoLockPro"
|
|
79
89
|
BLIND_TILT = "WoBlindTilt"
|
|
@@ -86,6 +96,7 @@ class SwitchbotModel(StrEnum):
|
|
|
86
96
|
UNIVERSAL_REMOTE = "WoUniversalRemote"
|
|
87
97
|
EVAPORATIVE_HUMIDIFIER = "Evaporative Humidifier"
|
|
88
98
|
ROLLER_SHADE = "Roller Shade"
|
|
99
|
+
HUB_MINI = "WoLinkMini"
|
|
89
100
|
HUBMINI_MATTER = "HubMini Matter"
|
|
90
101
|
CIRCULATOR_FAN = "Circulator Fan"
|
|
91
102
|
CIRCULATOR_FAN_PRO = "Circulator Fan Pro"
|
|
@@ -33,6 +33,8 @@ DEVICE_GET_BASIC_SETTINGS_KEY = "570f4d81"
|
|
|
33
33
|
COMMAND_SET_PERCENTAGE = f"{COMMAND_HEAD}02{{percentage:02x}}"
|
|
34
34
|
READ_LED_SETTINGS_COMMAND = "570f4d05"
|
|
35
35
|
READ_LED_STATUS_COMMAND = "570f4d07"
|
|
36
|
+
RESET_FILTER_USAGE_COMMAND = f"{COMMAND_HEAD}09"
|
|
37
|
+
READ_FILTER_USAGE_COMMAND = "570f4d09"
|
|
36
38
|
|
|
37
39
|
|
|
38
40
|
class SwitchbotAirPurifier(SwitchbotSequenceBaseLight, SwitchbotEncryptedDevice):
|
|
@@ -147,6 +149,31 @@ class SwitchbotAirPurifier(SwitchbotSequenceBaseLight, SwitchbotEncryptedDevice)
|
|
|
147
149
|
return data | {"pm25": pm25}
|
|
148
150
|
return data
|
|
149
151
|
|
|
152
|
+
async def reset_filter_usage(self) -> bool:
|
|
153
|
+
"""Reset filter usage, returning True only after a verified zero readback."""
|
|
154
|
+
result = await self._send_command(RESET_FILTER_USAGE_COMMAND, retry=0)
|
|
155
|
+
if not self._check_command_result(result, 0, {1}):
|
|
156
|
+
raise SwitchbotOperationError("Filter usage reset was rejected")
|
|
157
|
+
|
|
158
|
+
result = await self._send_command(READ_FILTER_USAGE_COMMAND)
|
|
159
|
+
if not result or len(result) < 3:
|
|
160
|
+
raise SwitchbotOperationError(
|
|
161
|
+
"Reset was sent, but filter usage could not be verified. "
|
|
162
|
+
"Check the device before retrying"
|
|
163
|
+
)
|
|
164
|
+
if not self._check_command_result(result, 0, {1}):
|
|
165
|
+
raise SwitchbotOperationError("Filter usage read was rejected")
|
|
166
|
+
used_hours = _UNPACK_UINT16_BE(result, 1)[0]
|
|
167
|
+
if used_hours != 0:
|
|
168
|
+
raise SwitchbotOperationError(
|
|
169
|
+
f"Reset was sent, but the device still reports {used_hours} used hours. "
|
|
170
|
+
"Check the device before retrying"
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
self._update_parsed_data({"filter element working time": used_hours})
|
|
174
|
+
self._fire_callbacks()
|
|
175
|
+
return True
|
|
176
|
+
|
|
150
177
|
@update_after_operation
|
|
151
178
|
async def set_preset_mode(self, preset_mode: str) -> bool:
|
|
152
179
|
"""Send command to set air purifier preset_mode."""
|
|
@@ -65,27 +65,28 @@ def _extract_region(userinfo: dict[str, Any]) -> str:
|
|
|
65
65
|
API_MODEL_TO_ENUM: dict[str, SwitchbotModel] = {
|
|
66
66
|
"WoHand": SwitchbotModel.BOT,
|
|
67
67
|
"WoCurtain": SwitchbotModel.CURTAIN,
|
|
68
|
-
"WoCurtain3": SwitchbotModel.
|
|
68
|
+
"WoCurtain3": SwitchbotModel.CURTAIN_3,
|
|
69
69
|
"WoHumi": SwitchbotModel.HUMIDIFIER,
|
|
70
70
|
"WoHumi2": SwitchbotModel.EVAPORATIVE_HUMIDIFIER,
|
|
71
|
-
"
|
|
72
|
-
"
|
|
71
|
+
"WoPlugUS": SwitchbotModel.PLUG_MINI_US,
|
|
72
|
+
"WoPlugJP": SwitchbotModel.PLUG_MINI_JP,
|
|
73
73
|
"WoContact": SwitchbotModel.CONTACT_SENSOR,
|
|
74
74
|
"WoStrip": SwitchbotModel.LIGHT_STRIP,
|
|
75
75
|
"WoMeter": SwitchbotModel.METER,
|
|
76
|
-
"WoMeterPlus": SwitchbotModel.
|
|
76
|
+
"WoMeterPlus": SwitchbotModel.METER_PLUS,
|
|
77
77
|
"WoPresence": SwitchbotModel.MOTION_SENSOR,
|
|
78
78
|
"WoBulb": SwitchbotModel.COLOR_BULB,
|
|
79
79
|
"WoCeiling": SwitchbotModel.CEILING_LIGHT,
|
|
80
|
-
"WoCeilingPro": SwitchbotModel.
|
|
80
|
+
"WoCeilingPro": SwitchbotModel.CEILING_LIGHT_PRO,
|
|
81
81
|
"WoLock": SwitchbotModel.LOCK,
|
|
82
82
|
"WoLockPro": SwitchbotModel.LOCK_PRO,
|
|
83
83
|
"WoLockLite": SwitchbotModel.LOCK_LITE,
|
|
84
84
|
"WoBlindTilt": SwitchbotModel.BLIND_TILT,
|
|
85
|
-
"WoIOSensor": SwitchbotModel.
|
|
85
|
+
"WoIOSensor": SwitchbotModel.INDOOR_OUTDOOR_THERMO_HYGROMETER,
|
|
86
86
|
"WoButton": SwitchbotModel.REMOTE, # Remote button
|
|
87
87
|
"WoUniversalRemote": SwitchbotModel.UNIVERSAL_REMOTE, # Universal Remote
|
|
88
|
-
"WoLinkMini": SwitchbotModel.
|
|
88
|
+
"WoLinkMini": SwitchbotModel.HUB_MINI,
|
|
89
|
+
"WoLinkMatter": SwitchbotModel.HUBMINI_MATTER,
|
|
89
90
|
"WoFan2": SwitchbotModel.CIRCULATOR_FAN,
|
|
90
91
|
"WoHub2": SwitchbotModel.HUB2,
|
|
91
92
|
"WoRollerShade": SwitchbotModel.ROLLER_SHADE,
|
|
@@ -104,7 +105,7 @@ API_MODEL_TO_ENUM: dict[str, SwitchbotModel] = {
|
|
|
104
105
|
"W1083001": SwitchbotModel.RELAY_SWITCH_2PM,
|
|
105
106
|
"W1083002": SwitchbotModel.RELAY_SWITCH_1, # Relay Switch 1
|
|
106
107
|
"W1079000": SwitchbotModel.METER_PRO, # Meter Pro (another variant)
|
|
107
|
-
"W1079001": SwitchbotModel.
|
|
108
|
+
"W1079001": SwitchbotModel.METER_PRO_CO2,
|
|
108
109
|
"W1101000": SwitchbotModel.PRESENCE_SENSOR,
|
|
109
110
|
"W1091000": SwitchbotModel.LOCK_ULTRA,
|
|
110
111
|
"W1096000": SwitchbotModel.HUB3,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "2.10.0"
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|