Skip to content

Commit 9ea36a4

Browse files
authored
Send both curtain operation commands (#127)
1 parent 37fe186 commit 9ea36a4

File tree

1 file changed

+32
-12
lines changed

1 file changed

+32
-12
lines changed

switchbot/devices/curtain.py

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,20 @@
88

99
# Curtain keys
1010
CURTAIN_COMMAND = "4501"
11-
OPEN_KEY = f"{REQ_HEADER}{CURTAIN_COMMAND}010100"
12-
CLOSE_KEY = f"{REQ_HEADER}{CURTAIN_COMMAND}010164"
13-
POSITION_KEY = f"{REQ_HEADER}{CURTAIN_COMMAND}0101" # +actual_position
14-
STOP_KEY = f"{REQ_HEADER}{CURTAIN_COMMAND}0001"
11+
OPEN_KEYS = [
12+
f"{REQ_HEADER}{CURTAIN_COMMAND}010100",
13+
f"{REQ_HEADER}{CURTAIN_COMMAND}05ff00",
14+
]
15+
CLOSE_KEYS = [
16+
f"{REQ_HEADER}{CURTAIN_COMMAND}010164",
17+
f"{REQ_HEADER}{CURTAIN_COMMAND}05ff64",
18+
]
19+
POSITION_KEYS = [
20+
f"{REQ_HEADER}{CURTAIN_COMMAND}0101",
21+
f"{REQ_HEADER}{CURTAIN_COMMAND}05ff",
22+
] # +actual_position
23+
STOP_KEYS = [f"{REQ_HEADER}{CURTAIN_COMMAND}0001", f"{REQ_HEADER}{CURTAIN_COMMAND}00ff"]
24+
1525
CURTAIN_EXT_SUM_KEY = f"{REQ_HEADER}460401"
1626
CURTAIN_EXT_ADV_KEY = f"{REQ_HEADER}460402"
1727
CURTAIN_EXT_CHAIN_INFO_KEY = f"{REQ_HEADER}468101"
@@ -40,27 +50,37 @@ def __init__(self, *args: Any, **kwargs: Any) -> None:
4050
self.ext_info_sum: dict[str, Any] = {}
4151
self.ext_info_adv: dict[str, Any] = {}
4252

53+
async def _send_multiple_commands(self, keys: list[str]) -> bool:
54+
"""Send multiple commands to device.
55+
56+
Since we current have no way to tell which command the device
57+
needs we send both.
58+
"""
59+
final_result = False
60+
for key in keys:
61+
result = await self._send_command(key)
62+
final_result |= self._check_command_result(result, 0, {1})
63+
return final_result
64+
4365
async def open(self) -> bool:
4466
"""Send open command."""
45-
result = await self._send_command(OPEN_KEY)
46-
return self._check_command_result(result, 0, {1})
67+
return await self._send_multiple_commands(OPEN_KEYS)
4768

4869
async def close(self) -> bool:
4970
"""Send close command."""
50-
result = await self._send_command(CLOSE_KEY)
51-
return self._check_command_result(result, 0, {1})
71+
return await self._send_multiple_commands(CLOSE_KEYS)
5272

5373
async def stop(self) -> bool:
5474
"""Send stop command to device."""
55-
result = await self._send_command(STOP_KEY)
56-
return self._check_command_result(result, 0, {1})
75+
return await self._send_multiple_commands(STOP_KEYS)
5776

5877
async def set_position(self, position: int) -> bool:
5978
"""Send position command (0-100) to device."""
6079
position = (100 - position) if self._reverse else position
6180
hex_position = "%0.2X" % position
62-
result = await self._send_command(POSITION_KEY + hex_position)
63-
return self._check_command_result(result, 0, {1})
81+
return await self._send_multiple_commands(
82+
[key + hex_position for key in POSITION_KEYS]
83+
)
6484

6585
async def update(self, interface: int | None = None) -> None:
6686
"""Update position, battery percent and light level of device."""

0 commit comments

Comments
 (0)