|
| 1 | +"""Library to handle connection with Switchbot.""" |
| 2 | +from __future__ import annotations |
| 3 | + |
| 4 | +from .device import REQ_HEADER, SwitchbotDevice |
| 5 | + |
| 6 | +HUMIDIFIER_COMMAND_HEADER = "4381" |
| 7 | +HUMIDIFIER_REQUEST = f"{REQ_HEADER}4481" |
| 8 | +HUMIDIFIER_COMMAND = f"{REQ_HEADER}{HUMIDIFIER_COMMAND_HEADER}" |
| 9 | +HUMIDIFIER_OFF_KEY = f"{HUMIDIFIER_COMMAND}010080FFFFFFFF" |
| 10 | +HUMIDIFIER_ON_KEY = f"{HUMIDIFIER_COMMAND}010180FFFFFFFF" |
| 11 | +## |
| 12 | +# OFF 570F 4381 0100 80FF FFFF FF |
| 13 | +# ON 570F 4381 0101 80FF FFFF FF |
| 14 | +# AUTO 570F 4381 0101 80FF FFFF FF |
| 15 | +# 1. 570F 4381 0101 22FF FFFF FF |
| 16 | +# 2. 570F 4381 0101 43FF FFFF FF |
| 17 | +# 3 . 570F 4381 0101 64FF FFFF FF |
| 18 | + |
| 19 | + |
| 20 | +class SwitchbotHumidifier(SwitchbotDevice): |
| 21 | + """Representation of a Switchbot humidifier.""" |
| 22 | + |
| 23 | + async def update(self, interface: int | None = None) -> None: |
| 24 | + """Update state of device.""" |
| 25 | + await self.get_device_data(retry=self._retry_count, interface=interface) |
| 26 | + |
| 27 | + async def turn_on(self) -> bool: |
| 28 | + """Turn device on.""" |
| 29 | + result = await self._send_command(HUMIDIFIER_ON_KEY) |
| 30 | + ret = self._check_command_result(result, 0, {0x01}) |
| 31 | + self._override_adv_data = {"isOn": True} |
| 32 | + self._fire_callbacks() |
| 33 | + return ret |
| 34 | + |
| 35 | + async def turn_off(self) -> bool: |
| 36 | + """Turn device off.""" |
| 37 | + result = await self._send_command(HUMIDIFIER_OFF_KEY) |
| 38 | + ret = self._check_command_result(result, 0, {0x01}) |
| 39 | + self._override_adv_data = {"isOn": False} |
| 40 | + self._fire_callbacks() |
| 41 | + return ret |
| 42 | + |
| 43 | + async def set_level(self, level: int) -> bool: |
| 44 | + """Set level.""" |
| 45 | + assert 1 <= level <= 100, "Level must be between 1 and 100" |
| 46 | + result = await self._send_command( |
| 47 | + f"{HUMIDIFIER_COMMAND}0101{level:02X}FFFFFFFF" |
| 48 | + ) |
| 49 | + ret = self._check_command_result(result, 0, {0x01}) |
| 50 | + self._override_adv_data = {"isOn": False, "level": level} |
| 51 | + self._fire_callbacks() |
| 52 | + return ret |
| 53 | + |
| 54 | + def is_on(self) -> bool | None: |
| 55 | + """Return switch state from cache.""" |
| 56 | + return self._get_adv_value("isOn") |
0 commit comments