|
145 | 145 | 'modes': ['manual', 'auto', 'sleep', 'off', 'turbo'], |
146 | 146 | 'features': ['air_quality', 'fan_rotate'], |
147 | 147 | 'levels': list(range(1, 4)) |
| 148 | + }, |
| 149 | + 'SmartTowerFan': { |
| 150 | + 'module': 'VeSyncTowerFan', |
| 151 | + 'models': ['LTF-F422S-KEU', 'LTF-F422S-WUSR', 'LTF-F422_WJP', 'LTF-F422S-WUS'], |
| 152 | + 'modes': ['normal', 'auto', 'advancedSleep', 'turbo', 'off'], |
| 153 | + 'set_mode_method': 'setTowerFanMode', |
| 154 | + 'features': ['fan_speed'], |
| 155 | + 'levels': list(range(1, 13)) |
148 | 156 | } |
149 | 157 | } |
150 | 158 |
|
@@ -1321,7 +1329,7 @@ def mode_toggle(self, mode: str) -> bool: |
1321 | 1329 |
|
1322 | 1330 | body['deviceId'] = self.cid |
1323 | 1331 | body['payload']['data'] = { |
1324 | | - 'workMode': mode.lower() |
| 1332 | + 'workMode': mode |
1325 | 1333 | } |
1326 | 1334 |
|
1327 | 1335 | r, _ = Helpers.call_api( |
@@ -1638,6 +1646,96 @@ def displayJSON(self) -> str: |
1638 | 1646 | return json.dumps(sup_val, indent=4) |
1639 | 1647 |
|
1640 | 1648 |
|
| 1649 | +class VeSyncTowerFan(VeSyncAirBaseV2): |
| 1650 | + """Levoit Tower Fan Device Class.""" |
| 1651 | + |
| 1652 | + def __init__(self, details: Dict[str, list], manager): |
| 1653 | + """Initialize the VeSync Base API V2 Fan Class.""" |
| 1654 | + super().__init__(details, manager) |
| 1655 | + |
| 1656 | + def get_details(self) -> None: |
| 1657 | + """Build API V2 Fan details dictionary.""" |
| 1658 | + head, body = self.build_api_dict('getTowerFanStatus') |
| 1659 | + r, _ = Helpers.call_api( |
| 1660 | + '/cloud/v2/deviceManaged/bypassV2', |
| 1661 | + method='post', |
| 1662 | + headers=head, |
| 1663 | + json_object=body, |
| 1664 | + ) |
| 1665 | + if Helpers.nested_code_check(r) is False or not isinstance(r, dict): |
| 1666 | + logger.debug('Error getting purifier details') |
| 1667 | + self.connection_status = 'offline' |
| 1668 | + return |
| 1669 | + |
| 1670 | + inner_result = r.get('result', {}).get('result') |
| 1671 | + |
| 1672 | + if inner_result is not None: |
| 1673 | + self.build_purifier_dict(inner_result) |
| 1674 | + else: |
| 1675 | + self.connection_status = 'offline' |
| 1676 | + logger.debug('error in inner result dict from purifier') |
| 1677 | + if inner_result.get('configuration', {}): |
| 1678 | + self.build_config_dict(inner_result.get('configuration', {})) |
| 1679 | + |
| 1680 | + def mode_toggle(self, mode: str) -> bool: |
| 1681 | + """Set Levoit Tower Fan purifier mode. |
| 1682 | +
|
| 1683 | + Parameters |
| 1684 | + ---------- |
| 1685 | + mode : str |
| 1686 | + Mode to set purifier to, options are: auto, manual, sleep |
| 1687 | +
|
| 1688 | + Returns |
| 1689 | + ------- |
| 1690 | + bool |
| 1691 | + """ |
| 1692 | + if mode.lower() not in [x.lower() for x in self.modes]: |
| 1693 | + logger.debug('Invalid purifier mode used - %s', |
| 1694 | + mode) |
| 1695 | + return False |
| 1696 | + |
| 1697 | + if mode == 'off': |
| 1698 | + return self.turn_off() |
| 1699 | + |
| 1700 | + head, body = self.build_api_dict('setTowerFanMode') |
| 1701 | + if not head and not body: |
| 1702 | + return False |
| 1703 | + |
| 1704 | + body['deviceId'] = self.cid |
| 1705 | + body['payload']['data'] = { |
| 1706 | + 'workMode': mode |
| 1707 | + } |
| 1708 | + |
| 1709 | + r, _ = Helpers.call_api( |
| 1710 | + '/cloud/v2/deviceManaged/bypassV2', |
| 1711 | + method='post', |
| 1712 | + headers=head, |
| 1713 | + json_object=body, |
| 1714 | + ) |
| 1715 | + |
| 1716 | + if Helpers.code_check(r): |
| 1717 | + self.mode = mode |
| 1718 | + return True |
| 1719 | + logger.debug('Error setting purifier mode') |
| 1720 | + return False |
| 1721 | + |
| 1722 | + def normal_mode(self): |
| 1723 | + """Set mode to normal.""" |
| 1724 | + return self.mode_toggle('normal') |
| 1725 | + |
| 1726 | + def manual_mode(self): |
| 1727 | + """Adapter to set mode to normal.""" |
| 1728 | + return self.normal_mode() |
| 1729 | + |
| 1730 | + def advanced_sleep_mode(self) -> bool: |
| 1731 | + """Set advanced sleep mode.""" |
| 1732 | + return self.mode_toggle('advancedSleep') |
| 1733 | + |
| 1734 | + def sleep_mode(self) -> bool: |
| 1735 | + """Adapter to set advanced sleep mode.""" |
| 1736 | + return self.advanced_sleep_mode() |
| 1737 | + |
| 1738 | + |
1641 | 1739 | class VeSyncHumid200300S(VeSyncBaseDevice): |
1642 | 1740 | """200S/300S Humidifier Class.""" |
1643 | 1741 |
|
|
0 commit comments