Skip to content

Commit f60d335

Browse files
authored
Fix manual button presses with WoHumi (#150)
1 parent 5b6e76f commit f60d335

File tree

1 file changed

+20
-13
lines changed

1 file changed

+20
-13
lines changed

switchbot/devices/humidifier.py

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@
1616
# 2. 570F 4381 0101 43FF FFFF FF
1717
# 3 . 570F 4381 0101 64FF FFFF FF
1818

19+
MANUAL_BUTTON_PRESSES_TO_LEVEL = {
20+
101: 33,
21+
102: 66,
22+
103: 100,
23+
}
24+
1925

2026
class SwitchbotHumidifier(SwitchbotDevice):
2127
"""Representation of a Switchbot humidifier."""
@@ -29,27 +35,27 @@ def _generate_command(
2935
) -> str:
3036
"""Generate command."""
3137
if level is None:
32-
level = self.get_level()
38+
level = self.get_target_humidity() or 128
3339
if on is None:
3440
on = self.is_on()
3541
on_hex = "01" if on else "00"
3642
return f"{HUMIDIFIER_COMMAND}01{on_hex}{level:02X}FFFFFFFF"
3743

38-
async def turn_on(self) -> bool:
39-
"""Turn device on."""
40-
result = await self._send_command(self._generate_command(on=True))
44+
async def _async_set_state(self, state: bool) -> bool:
45+
level = self.get_target_humidity() or 128
46+
result = await self._send_command(self._generate_command(on=state, level=level))
4147
ret = self._check_command_result(result, 0, {0x01})
42-
self._override_state({"isOn": True})
48+
self._override_state({"isOn": state, "level": level})
4349
self._fire_callbacks()
4450
return ret
4551

52+
async def turn_on(self) -> bool:
53+
"""Turn device on."""
54+
await self._async_set_state(True)
55+
4656
async def turn_off(self) -> bool:
4757
"""Turn device off."""
48-
result = await self._send_command(self._generate_command(on=False))
49-
ret = self._check_command_result(result, 0, {0x01})
50-
self._override_state({"isOn": False})
51-
self._fire_callbacks()
52-
return ret
58+
await self._async_set_state(False)
5359

5460
async def set_level(self, level: int) -> bool:
5561
"""Set level."""
@@ -74,7 +80,7 @@ async def async_set_manual(self) -> bool:
7480

7581
def is_auto(self) -> bool:
7682
"""Return auto state from cache."""
77-
return self.get_level() == 128
83+
return self.get_level() in (228, 128)
7884

7985
def get_level(self) -> int | None:
8086
"""Return level state from cache."""
@@ -87,5 +93,6 @@ def is_on(self) -> bool | None:
8793
def get_target_humidity(self) -> int | None:
8894
"""Return target humidity from cache."""
8995
level = self.get_level()
90-
is_auto = level == 128
91-
return None if is_auto else level
96+
if self.is_auto():
97+
return None
98+
return MANUAL_BUTTON_PRESSES_TO_LEVEL.get(level, level)

0 commit comments

Comments
 (0)