Skip to content

Commit

Permalink
separate out fan class
Browse files Browse the repository at this point in the history
  • Loading branch information
webdjoe committed Sep 25, 2024
1 parent fd5fb82 commit 8b15c7d
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 19 deletions.
112 changes: 94 additions & 18 deletions src/pyvesync/vesyncfan.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,12 +136,10 @@
'levels': list(range(1, 4))
},
'SmartTowerFan': {
'module': 'VeSyncAirBaseV2',
'module': 'VeSyncTowerFan',
'models': ['LTF-F422S-KEU', 'LTF-F422S-WUSR', 'LTF-F422_WJP', 'LTF-F422S-WUS'],
'modes': ['manual', 'auto', 'sleep', 'turbo', 'off'],
'mode_remap': {'manual': 'normal', 'sleep': 'advancedSleep'},
'modes': ['normal', 'auto', 'advancedSleep', 'turbo', 'off'],
'set_mode_method': 'setTowerFanMode',
'get_status_method': 'getTowerFanStatus',
'features': ['fan_speed'],
'levels': list(range(1, 13))
}
Expand Down Expand Up @@ -943,12 +941,7 @@ def light_detection_state(self) -> bool:

def get_details(self) -> None:
"""Build API V2 Purifier details dictionary."""
head, body = self.build_api_dict(
self._config_dict.get(
'get_status_method',
'getPurifierStatus',
)
)
head, body = self.build_api_dict('getPurifierStatus')

r, _ = Helpers.call_api(
'/cloud/v2/deviceManaged/bypassV2',
Expand Down Expand Up @@ -1310,8 +1303,6 @@ def mode_toggle(self, mode: str) -> bool:
mode)
return False

mode = self._config_dict.get('mode_remap', {}).get(mode, mode.lower())

# Call change_fan_speed if mode is set to manual
if mode == 'manual':
if self.speed is None or self.speed == 0:
Expand All @@ -1321,12 +1312,7 @@ def mode_toggle(self, mode: str) -> bool:
if mode == 'off':
return self.turn_off()

head, body = self.build_api_dict(
self._config_dict.get(
'set_mode_method',
'setPurifierMode',
)
)
head, body = self.build_api_dict('setPurifierMode')
if not head and not body:
return False

Expand Down Expand Up @@ -1649,6 +1635,96 @@ def displayJSON(self) -> str:
return json.dumps(sup_val, indent=4)


class VeSyncTowerFan(VeSyncAirBaseV2):
"""Levoit Tower Fan Device Class."""

def __init__(self, details: Dict[str, list], manager):
"""Initialize the VeSync Base API V2 Fan Class."""
super().__init__(details, manager)

def get_details(self) -> None:
"""Build API V2 Fan details dictionary."""
head, body = self.build_api_dict('getTowerFanStatus')
r, _ = Helpers.call_api(
'/cloud/v2/deviceManaged/bypassV2',
method='post',
headers=head,
json_object=body,
)
if Helpers.nested_code_check(r) is False or not isinstance(r, dict):
logger.debug('Error getting purifier details')
self.connection_status = 'offline'
return

inner_result = r.get('result', {}).get('result')

if inner_result is not None:
self.build_purifier_dict(inner_result)
else:
self.connection_status = 'offline'
logger.debug('error in inner result dict from purifier')
if inner_result.get('configuration', {}):
self.build_config_dict(inner_result.get('configuration', {}))

def mode_toggle(self, mode: str) -> bool:
"""Set Levoit Tower Fan purifier mode.
Parameters
----------
mode : str
Mode to set purifier to, options are: auto, manual, sleep
Returns
-------
bool
"""
if mode.lower() not in [x.lower() for x in self.modes]:
logger.debug('Invalid purifier mode used - %s',
mode)
return False

if mode == 'off':
return self.turn_off()

head, body = self.build_api_dict('setTowerFanMode')
if not head and not body:
return False

body['deviceId'] = self.cid
body['payload']['data'] = {
'workMode': mode
}

r, _ = Helpers.call_api(
'/cloud/v2/deviceManaged/bypassV2',
method='post',
headers=head,
json_object=body,
)

if Helpers.code_check(r):
self.mode = mode
return True
logger.debug('Error setting purifier mode')
return False

def normal_mode(self):
"""Set mode to normal."""
return self.mode_toggle('normal')

def manual_mode(self):
"""Adapter to set mode to normal."""
return self.normal_mode()

def advanced_sleep_mode(self) -> bool:
"""Set advanced sleep mode."""
return self.mode_toggle('advancedSleep')

def sleep_mode(self) -> bool:
"""Adapter to set advanced sleep mode."""
return self.advanced_sleep_mode()


class VeSyncHumid200300S(VeSyncBaseDevice):
"""200S/300S Humidifier Class."""

Expand Down
2 changes: 1 addition & 1 deletion src/tests/test_fans.py
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ def test_methods(self, dev_type, method):

# Assert request matches recored request or write new records
assert_test(method_call, all_kwargs, dev_type,
self.write_api, self.overwrite)
self.write_api, self.overwrite)


class TestHumidifiers(TestBase):
Expand Down

0 comments on commit 8b15c7d

Please sign in to comment.