PySwitchbot 2.6.0__py3-none-any.whl → 2.7.1__py3-none-any.whl

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.4
2
2
  Name: PySwitchbot
3
- Version: 2.6.0
3
+ Version: 2.7.1
4
4
  Summary: A library to communicate with Switchbot
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -93,10 +93,10 @@ from switchbot.discovery import GetSwitchbotDevices
93
93
  from switchbot.devices import lock
94
94
  from switchbot.const import SwitchbotModel
95
95
 
96
- BLE_MAC="XX:XX:XX:XX:XX:XX" # The MAC of your lock
97
- KEY_ID="XX" # The key-ID of your encryption-key for your lock
98
- ENC_KEY="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # The encryption-key with key-ID "XX"
99
- LOCK_MODEL=SwitchbotModel.LOCK_PRO # Your lock model (here we use the Lock-Pro)
96
+ BLE_MAC = "XX:XX:XX:XX:XX:XX" # The MAC of your lock
97
+ KEY_ID = "XX" # The key-ID of your encryption-key for your lock
98
+ ENC_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # The encryption-key with key-ID "XX"
99
+ LOCK_MODEL = SwitchbotModel.LOCK_PRO # Your lock model (here we use the Lock-Pro)
100
100
 
101
101
 
102
102
  async def main():
@@ -117,10 +117,10 @@ from switchbot.discovery import GetSwitchbotDevices
117
117
  from switchbot.devices import lock
118
118
  from switchbot.const import SwitchbotModel
119
119
 
120
- BLE_MAC="XX:XX:XX:XX:XX:XX" # The MAC of your lock
121
- KEY_ID="XX" # The key-ID of your encryption-key for your lock
122
- ENC_KEY="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # The encryption-key with key-ID "XX"
123
- LOCK_MODEL=SwitchbotModel.LOCK_PRO # Your lock model (here we use the Lock-Pro)
120
+ BLE_MAC = "XX:XX:XX:XX:XX:XX" # The MAC of your lock
121
+ KEY_ID = "XX" # The key-ID of your encryption-key for your lock
122
+ ENC_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # The encryption-key with key-ID "XX"
123
+ LOCK_MODEL = SwitchbotModel.LOCK_PRO # Your lock model (here we use the Lock-Pro)
124
124
 
125
125
 
126
126
  async def main():
@@ -1,6 +1,6 @@
1
1
  switchbot/__init__.py,sha256=iItr_zGA3ARTGbneIjVDyW9fi6EviVFqN2yHyvMI5wA,4332
2
- switchbot/__version__.py,sha256=OEib63e0yPEGlhEXyrWE1OwRnleR0cHI7KSX7oZEQLs,22
3
- switchbot/adv_parser.py,sha256=QKnXzuxvXgKa6qjcbQjtGbKnyyXdDQpFANcaaOK_4nE,34959
2
+ switchbot/__version__.py,sha256=yRpSH6mBb4BJgbFlT7rt8MSjCUW17Ycx0RziLf-lQLA,22
3
+ switchbot/adv_parser.py,sha256=O5cVtZq4IRozO7X76hIrrQCGPna78Z7YHHkbROyHWcI,35353
4
4
  switchbot/adv_parsers/__init__.py,sha256=d39GEAICA1RrQiLy1ks49x0d9a-A_yKn9Awkj5za8Uk,46
5
5
  switchbot/adv_parsers/_sensor_th.py,sha256=ze182l3_YFHJJv98_vq6qB2twlUTExkxoC1sLZL3TLs,1199
6
6
  switchbot/adv_parsers/air_purifier.py,sha256=MU24S-lGNR4kqW-olodqcleHNnkOa5bd7Vj4wYPEymQ,1535
@@ -33,7 +33,7 @@ switchbot/adv_parsers/smart_thermostat_radiator.py,sha256=feaYZL8sGfYDLXpKlIc71V
33
33
  switchbot/adv_parsers/vacuum.py,sha256=3ncf6BxE3UeC5SIIoiujYFdhDLyDjLfqjRwVqv-6Zo0,2108
34
34
  switchbot/adv_parsers/weather_station.py,sha256=HOCZ-gef7e6HrOdfzcIx12rV9XURwoCetUQuShyk1R4,1155
35
35
  switchbot/api_config.py,sha256=WSsoKkgNORkbqBZDH0U0rsEwc-etpBDTCXLSJnChsPA,263
36
- switchbot/const/__init__.py,sha256=UfhUkWjnEOPMqaF__K8pO-c52zQHHPIWbCOXdKxucAs,4622
36
+ switchbot/const/__init__.py,sha256=VzZ_anvQApWqeZ85pyuXKPDLm9RfjrxYzPMNZ49BELg,4660
37
37
  switchbot/const/air_purifier.py,sha256=eKMMgArZuANoDAWUKXWu0X7DPVR6di2T7i4SfO4Kddk,379
38
38
  switchbot/const/climate.py,sha256=4Kuz1nopygRs734KAyC_IgEXmPpRLgeE9JJgyJBclQA,902
39
39
  switchbot/const/evaporative_humidifier.py,sha256=Klf-jlGovrDr6DreXEkPsQnYr6Gb9U02EtB0dM7u8Z0,831
@@ -51,7 +51,7 @@ switchbot/devices/base_light.py,sha256=WWJJdRHfvoSYMRHDSv_RCmo5D6hYoZRxQVYfsOXZ7
51
51
  switchbot/devices/blind_tilt.py,sha256=tY0JoZhyqU_6PlhjtnIaEeIG3Z-JdZKJ5Jwg_5b6xSQ,5761
52
52
  switchbot/devices/bot.py,sha256=Co2IiQa2si0WPs3HFize2CPpj5GVbMT570vMP5YWpaQ,4121
53
53
  switchbot/devices/bulb.py,sha256=ISxXck8JsBlFojLB8M5Wfip_z4o6_-VvyFbBvqK6_Bg,2313
54
- switchbot/devices/ceiling_light.py,sha256=DypuzNHZ2TLI-xg0BauTHo9yl8LNujXc17UeW1K-oqE,2652
54
+ switchbot/devices/ceiling_light.py,sha256=PBG69_jsuDF5R_6Man22Kqk9ZW0nIemzAjniqfuQbLU,2820
55
55
  switchbot/devices/contact.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
56
56
  switchbot/devices/curtain.py,sha256=p3qcPWHaSA5ewPONl811hL7swFRca37Omb2LKYoAxgo,7086
57
57
  switchbot/devices/device.py,sha256=MmbnWHxlWGTHZmhnxFyQQXwe_Fo6Ce7lu36lA06o0UU,49713
@@ -61,7 +61,7 @@ switchbot/devices/humidifier.py,sha256=oqtRFMSA5ZSaKMEisg1gwHwWQeWBcEt21N5Qg-fqe
61
61
  switchbot/devices/keypad.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
62
62
  switchbot/devices/keypad_vision.py,sha256=hhkbzT_uWqGy07pcReNlfAjcU5r27O4HI45xBiPAi1M,5367
63
63
  switchbot/devices/light_strip.py,sha256=Wgq4tgsZ8RXnX6SBUetDuV58kYQHrZ5BsSq6YkswNJQ,16271
64
- switchbot/devices/lock.py,sha256=GNytU2mBoDFIQxHPVS_XEcydhUt2HHa_rdIHLUclGLM,11878
64
+ switchbot/devices/lock.py,sha256=Wc4NivXFXg3ldNaI2ow5H2bJuSIC28qOQkfxaPB6hEk,12580
65
65
  switchbot/devices/meter.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
66
66
  switchbot/devices/meter_pro.py,sha256=qpi4gag9p5kmUjObMedaCYSX8CnRG88Zff8UV71t1zQ,7149
67
67
  switchbot/devices/motion.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
@@ -76,7 +76,7 @@ switchbot/enum.py,sha256=0IfWypBw2oe9lWgdRkrD_1FqqeHpakCxtwlSaUlmcPg,125
76
76
  switchbot/helpers.py,sha256=DJLvYZ4Dq0dkiGMOzfR--nSTM_8jE9QtB7t570PuGSU,2091
77
77
  switchbot/models.py,sha256=xibQOVGHC60FWWc54N6BW46vxFuJUjj6tK1Qw0_eTbI,372
78
78
  switchbot/utils.py,sha256=glU1SDBeoXuu9K46nSGvg1YVWGNAGC0bo13tJ-ccDNU,724
79
- pyswitchbot-2.6.0.dist-info/METADATA,sha256=yLsIT4jkB9dPgwZIKKQQTU4CaE9pg162aotUByv397A,5794
80
- pyswitchbot-2.6.0.dist-info/WHEEL,sha256=EGEvSphFYqXKs23-kQBeyNoJP1nrT8ZJKQoi5p5DYL8,88
81
- pyswitchbot-2.6.0.dist-info/licenses/LICENSE,sha256=_hdUCmoRDzki4fYDJfn-5KpG7-7p6YJ6IsbMfrTXN6Y,1078
82
- pyswitchbot-2.6.0.dist-info/RECORD,,
79
+ pyswitchbot-2.7.1.dist-info/METADATA,sha256=Rg_wVLedpHizkv7sjviy2_w5jF-Y68ylS52aMDRvVKM,5818
80
+ pyswitchbot-2.7.1.dist-info/WHEEL,sha256=EGEvSphFYqXKs23-kQBeyNoJP1nrT8ZJKQoi5p5DYL8,88
81
+ pyswitchbot-2.7.1.dist-info/licenses/LICENSE,sha256=_hdUCmoRDzki4fYDJfn-5KpG7-7p6YJ6IsbMfrTXN6Y,1078
82
+ pyswitchbot-2.7.1.dist-info/RECORD,,
switchbot/__version__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "2.6.0"
1
+ __version__ = "2.7.1"
switchbot/adv_parser.py CHANGED
@@ -898,6 +898,18 @@ SUPPORTED_TYPES: dict[str | bytes, SwitchbotSupportedType] = {
898
898
  "func": process_wolock_pro,
899
899
  "manufacturer_id": 2409,
900
900
  },
901
+ b"\x00\x11\x9f\xb8": {
902
+ "modelName": SwitchbotModel.LOCK_ULTRA_MAX,
903
+ "modelFriendlyName": "Lock Ultra Max",
904
+ "func": process_lock2,
905
+ "manufacturer_id": 2409,
906
+ },
907
+ b"\x01\x11\x9f\xb8": {
908
+ "modelName": SwitchbotModel.LOCK_ULTRA_MAX,
909
+ "modelFriendlyName": "Lock Ultra Max",
910
+ "func": process_lock2,
911
+ "manufacturer_id": 2409,
912
+ },
901
913
  b"\x00\x11\x07\x60": {
902
914
  "modelName": SwitchbotModel.STANDING_FAN,
903
915
  "modelFriendlyName": "Standing Fan",
@@ -126,6 +126,7 @@ class SwitchbotModel(StrEnum):
126
126
  LOCK_VISION_PRO = "Lock Vision Pro"
127
127
  LOCK_VISION = "Lock Vision"
128
128
  LOCK_PRO_WIFI = "Lock Pro Wifi"
129
+ LOCK_ULTRA_MAX = "Lock Ultra Max"
129
130
  WEATHER_STATION = "Weather Station"
130
131
 
131
132
 
@@ -60,7 +60,11 @@ class SwitchbotCeilingLight(SwitchbotSequenceBaseLight):
60
60
  return None
61
61
  _version_info, _data = res
62
62
 
63
- self._state["cw"] = int.from_bytes(_data[3:5], "big")
63
+ color_temp = int.from_bytes(_data[3:5], "big")
64
+ if self.min_temp <= color_temp <= self.max_temp:
65
+ self._state["cw"] = color_temp
66
+ else:
67
+ self._state.setdefault("cw", DEFAULT_COLOR_TEMP)
64
68
 
65
69
  return {
66
70
  "isOn": bool(_data[1] & 0b10000000),
switchbot/devices/lock.py CHANGED
@@ -22,6 +22,7 @@ COMMAND_LOCK_INFO = {
22
22
  SwitchbotModel.LOCK_LITE: f"{COMMAND_HEADER}0f4f8101",
23
23
  SwitchbotModel.LOCK_PRO: f"{COMMAND_HEADER}0f4f8104",
24
24
  SwitchbotModel.LOCK_ULTRA: f"{COMMAND_HEADER}0f4f8107",
25
+ SwitchbotModel.LOCK_ULTRA_MAX: f"{COMMAND_HEADER}0f4f8107",
25
26
  SwitchbotModel.LOCK_VISION_PRO: f"{COMMAND_HEADER}0f4f8102",
26
27
  SwitchbotModel.LOCK_VISION: f"{COMMAND_HEADER}0f4f8102",
27
28
  SwitchbotModel.LOCK_PRO_WIFI: f"{COMMAND_HEADER}0f4f810a",
@@ -31,6 +32,7 @@ COMMAND_UNLOCK = {
31
32
  SwitchbotModel.LOCK_LITE: f"{COMMAND_HEADER}0f4e01011080",
32
33
  SwitchbotModel.LOCK_PRO: f"{COMMAND_HEADER}0f4e0101000080",
33
34
  SwitchbotModel.LOCK_ULTRA: f"{COMMAND_HEADER}0f4e0101000080",
35
+ SwitchbotModel.LOCK_ULTRA_MAX: f"{COMMAND_HEADER}0f4e0101000080",
34
36
  SwitchbotModel.LOCK_VISION_PRO: f"{COMMAND_HEADER}0f4e0101000080",
35
37
  SwitchbotModel.LOCK_VISION: f"{COMMAND_HEADER}0f4e0101000080",
36
38
  SwitchbotModel.LOCK_PRO_WIFI: f"{COMMAND_HEADER}0f4e0101000080",
@@ -40,6 +42,7 @@ COMMAND_UNLOCK_WITHOUT_UNLATCH = {
40
42
  SwitchbotModel.LOCK_LITE: f"{COMMAND_HEADER}0f4e010110a0",
41
43
  SwitchbotModel.LOCK_PRO: f"{COMMAND_HEADER}0f4e01010000a0",
42
44
  SwitchbotModel.LOCK_ULTRA: f"{COMMAND_HEADER}0f4e01010000a0",
45
+ SwitchbotModel.LOCK_ULTRA_MAX: f"{COMMAND_HEADER}0f4e01010000a0",
43
46
  SwitchbotModel.LOCK_VISION_PRO: f"{COMMAND_HEADER}0f4e01010000a0",
44
47
  SwitchbotModel.LOCK_VISION: f"{COMMAND_HEADER}0f4e01010000a0",
45
48
  SwitchbotModel.LOCK_PRO_WIFI: f"{COMMAND_HEADER}0f4e01010000a0",
@@ -49,6 +52,7 @@ COMMAND_LOCK = {
49
52
  SwitchbotModel.LOCK_LITE: f"{COMMAND_HEADER}0f4e01011000",
50
53
  SwitchbotModel.LOCK_PRO: f"{COMMAND_HEADER}0f4e0101000000",
51
54
  SwitchbotModel.LOCK_ULTRA: f"{COMMAND_HEADER}0f4e0101000000",
55
+ SwitchbotModel.LOCK_ULTRA_MAX: f"{COMMAND_HEADER}0f4e0101000000",
52
56
  SwitchbotModel.LOCK_VISION_PRO: f"{COMMAND_HEADER}0f4e0101000000",
53
57
  SwitchbotModel.LOCK_VISION: f"{COMMAND_HEADER}0f4e0101000000",
54
58
  SwitchbotModel.LOCK_PRO_WIFI: f"{COMMAND_HEADER}0f4e0101000000",
@@ -62,6 +66,7 @@ COMMAND_ENABLE_NOTIFICATIONS = {
62
66
  SwitchbotModel.LOCK_LITE: f"{COMMAND_HEADER}0e01001e00008101",
63
67
  SwitchbotModel.LOCK_PRO: f"{COMMAND_HEADER}0e01001e00008104",
64
68
  SwitchbotModel.LOCK_ULTRA: f"{COMMAND_HEADER}0e01001e00008107",
69
+ SwitchbotModel.LOCK_ULTRA_MAX: f"{COMMAND_HEADER}0e01001e00008107",
65
70
  SwitchbotModel.LOCK_VISION_PRO: f"{COMMAND_HEADER}0e01001e00008102",
66
71
  SwitchbotModel.LOCK_VISION: f"{COMMAND_HEADER}0e01001e00008102",
67
72
  SwitchbotModel.LOCK_PRO_WIFI: f"{COMMAND_HEADER}0e01001e0000810a",
@@ -102,6 +107,7 @@ class SwitchbotLock(SwitchbotSequenceDevice, SwitchbotEncryptedDevice):
102
107
  SwitchbotModel.LOCK_PRO,
103
108
  SwitchbotModel.LOCK_LITE,
104
109
  SwitchbotModel.LOCK_ULTRA,
110
+ SwitchbotModel.LOCK_ULTRA_MAX,
105
111
  SwitchbotModel.LOCK_VISION_PRO,
106
112
  SwitchbotModel.LOCK_VISION,
107
113
  SwitchbotModel.LOCK_PRO_WIFI,
@@ -143,6 +149,11 @@ class SwitchbotLock(SwitchbotSequenceDevice, SwitchbotEncryptedDevice):
143
149
 
144
150
  def _parse_basic_data(self, basic_data: bytes) -> dict[str, Any]:
145
151
  """Parse basic data from lock."""
152
+ if self._model is SwitchbotModel.LOCK_ULTRA_MAX:
153
+ # Lock Ultra Max's basic-info response format is not documented.
154
+ # Its advertisement already carries the reliable battery and state
155
+ # data, so never overwrite that data with an unverified response.
156
+ return {}
146
157
  return {
147
158
  "battery": basic_data[1],
148
159
  "firmware": basic_data[2] / 10.0,