Skip to content

Commit

Permalink
chore: fix class names to meet convention
Browse files Browse the repository at this point in the history
Signed-off-by: Tomer Figenblat <[email protected]>
  • Loading branch information
TomerFi committed Sep 17, 2022
1 parent 5d88702 commit e8154ac
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 38 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ pip install aioswitcher
await api.control_breeze_device(command)

# create the remote manager outside the context for re-using (5)
remote_manager = BreezeRemoteManager()
remote_manager = SwitcherBreezeRemoteManager()
asyncio.get_event_loop().run_until_complete(
control_breeze("111.222.11.22", "ab1c2d", remote_manager, "DLK65863")
)
Expand Down
6 changes: 3 additions & 3 deletions docs/usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,17 +126,17 @@ async def control_breeze(device_ip, device_id, remote_manager, remote_id) :
await api.control_breeze_device(command)

# create the remote manager outside the context for re-using (5)
remote_manager = BreezeRemoteManager()
remote_manager = SwitcherBreezeRemoteManager()
asyncio.get_event_loop().run_until_complete(
control_breeze("111.222.11.22", "ab1c2d", remote_manager, "DLK65863")
)
```

1. [SwitcherThermostatStateResponse](./codedocs.md#src.aioswitcher.api.messages.SwitcherThermostatStateResponse)
2. [BreezeRemote](./codedocs.md#src.aioswitcher.api.messages.BreezeRemote)
2. [SwitcherBreezeRemote](./codedocs.md#src.aioswitcher.api.messages.SwitcherBreezeRemote)
3. [SwitcherBreezeCommand](./codedocs.md#src.aioswitcher.api.SwitcherBreezeCommand)
4. [SwitcherBaseResponse](./codedocs.md#src.aioswitcher.api.messages.SwitcherBaseResponse)
5. [BreezeRemoteManager](./codedocs.md#src.aioswitcher.api.BreezeRemoteManager)
5. [SwitcherBreezeRemoteManager](./codedocs.md#src.aioswitcher.api.SwitcherBreezeRemoteManager)

!!! info
You can find the supported device types stated in [this enum](./codedocs.md#src.aioswitcher.device.DeviceType) members.
8 changes: 4 additions & 4 deletions scripts/control_device.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@
from typing import Any, Dict, List

from aioswitcher.api import (
BreezeRemote,
BreezeRemoteManager,
Command,
SwitcherBreezeRemote,
SwitcherBreezeRemoteManager,
SwitcherType1Api,
SwitcherType2Api,
)
Expand Down Expand Up @@ -268,7 +268,7 @@ async def control_thermostat(
) -> None:
"""Control Breeze device."""
async with SwitcherType2Api(device_ip, device_id) as api:
rm = BreezeRemoteManager()
rm = SwitcherBreezeRemoteManager()
resp: SwitcherThermostatStateResponse = await api.get_breeze_state()

new_state = possible_states[state]
Expand All @@ -278,7 +278,7 @@ async def control_thermostat(
new_target_temp = target_temp if target_temp else resp.target_temperature

# First time it'll download the IRSet JSON file from switcher
remote: BreezeRemote = rm.get_remote(resp.remote_id)
remote: SwitcherBreezeRemote = rm.get_remote(resp.remote_id)

command = remote.get_command(
new_state, new_mode, new_target_temp, new_fan_level, new_swing, resp.state
Expand Down
28 changes: 17 additions & 11 deletions src/aioswitcher/api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -577,7 +577,7 @@ def __init__(self, ip_address: str, device_id: str) -> None:
super().__init__(ip_address, device_id, SWITCHER_TCP_PORT_TYPE2)


class BreezeRemote(object):
class SwitcherBreezeRemote(object):
"""Class that represent a remote for a Breeze device/s."""

COMMAND_TO_MODE = {
Expand Down Expand Up @@ -799,9 +799,11 @@ def get_command(
ThermostatMode.FAN,
]:
# the command key should start with mode (aa/ad/ar/ah)
key.append(BreezeRemote.MODE_TO_COMMAND[mode])
key.append(SwitcherBreezeRemote.MODE_TO_COMMAND[mode])
# add the requested fan level (_f0, _f1, _f2, _f3)
key.append("_" + BreezeRemote.FAN_LEVEL_TO_COMMAND[fan_level])
key.append(
"_" + SwitcherBreezeRemote.FAN_LEVEL_TO_COMMAND[fan_level]
)

# add the swing On (_d1) to the key
if swing == ThermostatSwing.ON:
Expand All @@ -810,9 +812,11 @@ def get_command(
self._lookup_key_in_irset(key)

if mode in [ThermostatMode.COOL, ThermostatMode.HEAT]:
key.append(BreezeRemote.MODE_TO_COMMAND[mode])
key.append(SwitcherBreezeRemote.MODE_TO_COMMAND[mode])
key.append(str(target_temp))
key.append("_" + BreezeRemote.FAN_LEVEL_TO_COMMAND[fan_level])
key.append(
"_" + SwitcherBreezeRemote.FAN_LEVEL_TO_COMMAND[fan_level]
)
if swing == ThermostatSwing.ON:
key.append("_d1")

Expand All @@ -837,7 +841,7 @@ def _resolve_capabilities(self, ir_set):
for wave in ir_set["IRWaveList"]:
key = wave["Key"]
try:
mode = BreezeRemote.COMMAND_TO_MODE[key[0:2]]
mode = SwitcherBreezeRemote.COMMAND_TO_MODE[key[0:2]]
if mode not in self._modes_features:
self._modes_features[mode] = {
"swing": False,
Expand All @@ -856,7 +860,7 @@ def _resolve_capabilities(self, ir_set):
if fan_level:
if mode:
self._modes_features[mode]["fan_levels"].add(
BreezeRemote.COMMAND_TO_FAN_LEVEL[fan_level.group(1)]
SwitcherBreezeRemote.COMMAND_TO_FAN_LEVEL[fan_level.group(1)]
)

temp = key[2:4]
Expand All @@ -875,25 +879,27 @@ def _resolve_capabilities(self, ir_set):
self._ir_wave_map[key] = {"Para": wave["Para"], "HexCode": wave["HexCode"]}


class BreezeRemoteManager(object):
class SwitcherBreezeRemoteManager(object):
"""Class the used to download and hold all Breeze remotes."""

def __init__(self, remotes_db_path: str = BREEZE_REMOTE_DB_FPATH):
"""Initialize the Remote manager."""
self._remotes_db: Dict[str, BreezeRemote] = {}
self._remotes_db: Dict[str, SwitcherBreezeRemote] = {}
self._remotes_db_fpath = remotes_db_path
# verify the file exists
if not path.isfile(self._remotes_db_fpath):
raise OSError(
f"The specified remote db path {self._remotes_db_fpath} does not exist"
)

def get_remote(self, remote_id: str) -> BreezeRemote:
def get_remote(self, remote_id: str) -> SwitcherBreezeRemote:
"""Get Breeze remote by the remote id."""
# check if the remote was already loaded
if remote_id not in self._remotes_db:
# load the remote into the memory
with open(self._remotes_db_fpath) as remotes_fd:
self._remotes_db[remote_id] = BreezeRemote(load(remotes_fd)[remote_id])
self._remotes_db[remote_id] = SwitcherBreezeRemote(
load(remotes_fd)[remote_id]
)

return self._remotes_db[remote_id]
38 changes: 19 additions & 19 deletions tests/test_api_tcp_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@
from pytest import fixture, mark, raises

from aioswitcher.api import (
BreezeRemote,
BreezeRemoteManager,
Command,
SwitcherBreezeCommand,
SwitcherBreezeRemote,
SwitcherBreezeRemoteManager,
SwitcherType1Api,
SwitcherType2Api,
)
Expand Down Expand Up @@ -207,7 +207,7 @@ async def test_get_breeze_state_function_with_a_faulty_get_state_response_should
async def test_control_breeze_device_function_with_valid_packets(reader_mock, writer_write, connected_api_type2, resource_path_root):
two_packets = _get_two_packets(resource_path_root, "control_breeze_response")
with patch.object(reader_mock, "read", side_effect=two_packets):
remote = BreezeRemoteManager().get_remote('ELEC7022')
remote = SwitcherBreezeRemoteManager().get_remote('ELEC7022')
command: SwitcherBreezeCommand = remote.get_command(DeviceState.ON, ThermostatMode.COOL, 24, ThermostatFanLevel.HIGH, ThermostatSwing.ON, DeviceState.OFF)
response = await connected_api_type2.control_breeze_device(command)
assert_that(writer_write.call_count).is_equal_to(2)
Expand All @@ -216,7 +216,7 @@ async def test_control_breeze_device_function_with_valid_packets(reader_mock, wr


async def test_breeze_remote_min_max_temp():
remote = BreezeRemoteManager().get_remote('ELEC7001')
remote = SwitcherBreezeRemoteManager().get_remote('ELEC7001')
max_temp = remote.max_temperature
min_temp = remote.min_temperature
assert_that(min_temp).is_equal_to(16)
Expand All @@ -226,15 +226,15 @@ async def test_breeze_remote_min_max_temp():


async def test_breeze_get_remote_id():
remote = BreezeRemoteManager().get_remote('ELEC7001')
remote = SwitcherBreezeRemoteManager().get_remote('ELEC7001')
remote_id = remote.remote_id
assert_that(remote_id).is_equal_to("ELEC7001")
assert_that(remote_id).is_instance_of(str)


async def test_control_breeze_function_with_a_faulty_get_state_response_should_raise_error(reader_mock, writer_write, connected_api_type2):
with raises(RuntimeError, match="login request was not successful"):
remote = BreezeRemoteManager().get_remote('ELEC7022')
remote = SwitcherBreezeRemoteManager().get_remote('ELEC7022')
command: SwitcherBreezeCommand = remote.get_command(DeviceState.ON, ThermostatMode.COOL, 24, ThermostatFanLevel.HIGH, ThermostatSwing.ON, DeviceState.OFF)
with patch.object(reader_mock, "read", return_value=b''):
await connected_api_type2.control_breeze_device(command)
Expand All @@ -244,7 +244,7 @@ async def test_control_breeze_function_with_a_faulty_get_state_response_should_r
async def test_get_breeze_command_function_with_low_temp(reader_mock, writer_write, connected_api_type2, resource_path_root):
two_packets = _get_two_packets(resource_path_root, "control_breeze_response")
with patch.object(reader_mock, "read", side_effect=two_packets):
remote = BreezeRemoteManager().get_remote('ELEC7022')
remote = SwitcherBreezeRemoteManager().get_remote('ELEC7022')
command: SwitcherBreezeCommand = remote.get_command(DeviceState.ON, ThermostatMode.COOL, 10, ThermostatFanLevel.HIGH, ThermostatSwing.ON, DeviceState.OFF)
response = await connected_api_type2.control_breeze_device(command)
assert_that(writer_write.call_count).is_equal_to(2)
Expand All @@ -255,7 +255,7 @@ async def test_get_breeze_command_function_with_low_temp(reader_mock, writer_wri
async def test_get_breeze_command_function_with_high_temp(reader_mock, writer_write, connected_api_type2, resource_path_root):
two_packets = _get_two_packets(resource_path_root, "control_breeze_response")
with patch.object(reader_mock, "read", side_effect=two_packets):
remote = BreezeRemoteManager().get_remote('ELEC7022')
remote = SwitcherBreezeRemoteManager().get_remote('ELEC7022')
command: SwitcherBreezeCommand = remote.get_command(DeviceState.ON, ThermostatMode.COOL, 100, ThermostatFanLevel.HIGH, ThermostatSwing.ON, DeviceState.OFF)
response = await connected_api_type2.control_breeze_device(command)
assert_that(writer_write.call_count).is_equal_to(2)
Expand All @@ -265,15 +265,15 @@ async def test_get_breeze_command_function_with_high_temp(reader_mock, writer_wr

async def test_breeze_get_command_function_with_non_supported_mode(resource_path_root):
# test invalid non existing mode (cool)
brm = BreezeRemoteManager(str(resource_path_root) + "/breeze_data/irset_db_invalid_elec7022_data.json")
brm = SwitcherBreezeRemoteManager(str(resource_path_root) + "/breeze_data/irset_db_invalid_elec7022_data.json")
remote = brm.get_remote('ELEC7022')
with raises(RuntimeError, match=f"Invalid mode \"{ThermostatMode.COOL.display}\", available modes for this device are: {', '.join([x.display for x in remote.supported_modes])}"):
remote.get_command(DeviceState.ON, ThermostatMode.COOL, 20, ThermostatFanLevel.HIGH, ThermostatSwing.ON, DeviceState.OFF)


async def test_breeze_get_command_function_non_toggle_type_off_state(resource_path_root):
elec7022_turn_off_cmd = unhexlify((resource_path_root / ("breeze_data/" + "breeze_elec7022_turn_off_command" + ".txt")).read_text().replace('\n', '').encode())
remote = BreezeRemoteManager().get_remote('ELEC7022')
remote = SwitcherBreezeRemoteManager().get_remote('ELEC7022')
command = remote.get_command(DeviceState.OFF, ThermostatMode.DRY, 20, ThermostatFanLevel.HIGH, ThermostatSwing.ON, DeviceState.OFF)
assert_that(command).is_instance_of(SwitcherBreezeCommand)
assert_that(command.command).is_equal_to(hexlify(elec7022_turn_off_cmd).decode())
Expand All @@ -282,7 +282,7 @@ async def test_breeze_get_command_function_non_toggle_type_off_state(resource_pa
async def test_breeze_get_command_function_toggle_type(resource_path_root):
elec7001_turn_off_cmd = unhexlify((resource_path_root / ("breeze_data/" + "breeze_elec7001_turn_off_command" + ".txt")).read_text().replace('\n', '').encode())

remote = BreezeRemoteManager().get_remote('ELEC7001')
remote = SwitcherBreezeRemoteManager().get_remote('ELEC7001')
command = remote.get_command(DeviceState.OFF, ThermostatMode.DRY, 20, ThermostatFanLevel.HIGH, ThermostatSwing.ON, DeviceState.ON)
assert_that(command).is_instance_of(SwitcherBreezeCommand)
assert_that(command.command).is_equal_to(hexlify(elec7001_turn_off_cmd).decode())
Expand All @@ -291,7 +291,7 @@ async def test_breeze_get_command_function_toggle_type(resource_path_root):
async def test_breeze_get_command_function_should_raise_command_does_not_eixst(resource_path_root):
elec7001_turn_off_cmd = unhexlify((resource_path_root / ("breeze_data/" + "breeze_elec7001_turn_off_command" + ".txt")).read_text().replace('\n', '').encode())

remote = BreezeRemoteManager().get_remote('ELEC7001')
remote = SwitcherBreezeRemoteManager().get_remote('ELEC7001')
command = remote.get_command(DeviceState.OFF, ThermostatMode.DRY, 20, ThermostatFanLevel.HIGH, ThermostatSwing.ON, DeviceState.ON)
assert_that(command).is_instance_of(SwitcherBreezeCommand)
assert_that(command.command).is_equal_to(hexlify(elec7001_turn_off_cmd).decode())
Expand All @@ -300,39 +300,39 @@ async def test_breeze_get_command_function_should_raise_command_does_not_eixst(r
async def test_breeze_remote_manager_with_none_existing_remotes_db():
local_remotes_db = "/wrong/directory/remotes_db.json"
with raises(OSError, match=f"The specified remote db path {local_remotes_db} does not exist"):
BreezeRemoteManager(local_remotes_db)
SwitcherBreezeRemoteManager(local_remotes_db)


async def test_breeze_remote_manager_get_from_local_database():
remote_manager = BreezeRemoteManager()
remote_manager = SwitcherBreezeRemoteManager()
remote_7022 = remote_manager.get_remote("ELEC7022")
assert_that(remote_7022).is_type_of(BreezeRemote)
assert_that(remote_7022).is_type_of(SwitcherBreezeRemote)
assert_that(remote_7022.remote_id).is_equal_to("ELEC7022")


async def test_breeze_get_swing_command():
remote_manager = BreezeRemoteManager()
remote_manager = SwitcherBreezeRemoteManager()
remote_7022 = remote_manager.get_remote("ELEC7022")
command = remote_7022.get_swing_command(swing=ThermostatSwing.ON)
assert_that(command.command).is_equal_to("000000004e4543587c32367c33327c31352c31357c31352c34307c31357c54303043387c33307c30317c414241425b33305d7c423234443642393445303146")


async def test_breeze_get_swing_command_on_wrong_remote():
remote_manager = BreezeRemoteManager()
remote_manager = SwitcherBreezeRemoteManager()
remote_7001 = remote_manager.get_remote("ELEC7001")
with raises(RuntimeWarning, match=f"Swing special function doesn't apply on this remote {remote_7001.remote_id}"):
remote_7001.get_swing_command(swing=ThermostatSwing.ON)


async def test_breeze_get_swing_command_on_invalid_remote(resource_path_root):
brm = BreezeRemoteManager(str(resource_path_root) + "/breeze_data/irset_db_invalid_elec7022_data.json")
brm = SwitcherBreezeRemoteManager(str(resource_path_root) + "/breeze_data/irset_db_invalid_elec7022_data.json")
remote_7022 = brm.get_remote('ELEC7022')
with raises(RuntimeError):
remote_7022.get_swing_command(swing=ThermostatSwing.ON)


async def test_breeze_get_command_function_invalid_mode(resource_path_root):
brm = BreezeRemoteManager(str(resource_path_root) + "/breeze_data/irset_db_invalid_elec7022_data.json")
brm = SwitcherBreezeRemoteManager(str(resource_path_root) + "/breeze_data/irset_db_invalid_elec7022_data.json")
remote = brm.get_remote('ELEC7022')
with raises(RuntimeError, match="Invalid mode \"cool\", available modes for this device are: auto, dry, fan"):
remote.get_command(DeviceState.ON, ThermostatMode.COOL, 20, ThermostatFanLevel.AUTO, ThermostatSwing.ON, DeviceState.OFF)
Expand Down

0 comments on commit e8154ac

Please sign in to comment.