Skip to content

Commit 13d45b9

Browse files
llluciusabmantis
andauthored
Split washer and dryer class (#96)
Co-authored-by: Leland <Leland> Co-authored-by: abmantis <[email protected]>
1 parent f048952 commit 13d45b9

File tree

9 files changed

+596
-75
lines changed

9 files changed

+596
-75
lines changed

cli.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55
import aiohttp
66

77
from cli_ac_menu import show_aircon_menu
8+
from cli_dryer_menu import show_dryer_menu
89
from cli_oven_menu import show_oven_menu
910
from cli_refrigerator_menu import show_refrigerator_menu
10-
from cli_washerdryer_menu import show_washerdryer_menu
11+
from cli_washer_menu import show_washer_menu
1112
from whirlpool.appliancesmanager import AppliancesManager
1213
from whirlpool.auth import Auth
1314
from whirlpool.backendselector import BackendSelector, Brand, Region
@@ -69,8 +70,11 @@ async def start():
6970
if appliance_manager.aircons:
7071
print("\n".join(map(str, appliance_manager.aircons)))
7172

72-
if appliance_manager.washer_dryers:
73-
print("\n".join(map(str, appliance_manager.washer_dryers)))
73+
if appliance_manager.dryers:
74+
print("\n".join(map(str, appliance_manager.dryers)))
75+
76+
if appliance_manager.washers:
77+
print("\n".join(map(str, appliance_manager.washers)))
7478

7579
if appliance_manager.ovens:
7680
print("\n".join(map(str, appliance_manager.ovens)))
@@ -99,9 +103,14 @@ async def __aexit__(self, *args) -> None:
99103
await show_aircon_menu(ac_data)
100104
return
101105

102-
for wd_data in appliance_manager.washer_dryers:
103-
if wd_data.said == args.said:
104-
await show_washerdryer_menu(wd_data)
106+
for dr_data in appliance_manager.dryers:
107+
if dr_data.said == args.said:
108+
await show_dryer_menu(dr_data)
109+
return
110+
111+
for wr_data in appliance_manager.washers:
112+
if wr_data.said == args.said:
113+
await show_washer_menu(wr_data)
105114
return
106115

107116
for mo_data in appliance_manager.ovens:

cli_dryer_menu.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import json
2+
3+
import aioconsole
4+
5+
from whirlpool.dryer import Dryer
6+
7+
8+
async def show_dryer_menu(dr: Dryer) -> None:
9+
def print_menu():
10+
print("\n")
11+
print(30 * "-", "MENU", 30 * "-")
12+
print("u. Update status from server")
13+
print("p. Print status")
14+
print("v. Print raw status")
15+
print("c. Custom command")
16+
print("q. Exit")
17+
print(67 * "-")
18+
19+
def print_status(dr: Dryer):
20+
print(f"online: {dr.get_online()}")
21+
print(f"state: {dr.get_machine_state()}")
22+
print(f"door open: {dr.get_door_open()}")
23+
print(f"est time remaining: {dr.get_est_time_remaining()}")
24+
print(f"extra power changeable: {dr.get_extra_power_changeable()}")
25+
print(f"steam changeable: {dr.get_steam_changeable()}")
26+
print(f"cycle select: {dr.get_cycle_changeable()}")
27+
print(f"dryness: {dr.get_dryness_changeable()}")
28+
print(f"manual dry time: {dr.get_manual_dry_time_changeable()}")
29+
print(f"static guard: {dr.get_static_guard_changeable()}")
30+
print(f"temperature: {dr.get_temperature_changeable()}")
31+
print(f"wrinkle shield: {dr.get_wrinkle_shield_changeable()}")
32+
print(f"airflow status: {dr.get_cycle_status_airflow_status()}")
33+
print(f"cool down: {dr.get_cycle_status_cool_down()}")
34+
print(f"damp: {dr.get_cycle_status_damp()}")
35+
print(f"drying: {dr.get_cycle_status_drying()}")
36+
print(f"limited cycle: {dr.get_cycle_status_limited_cycle()}")
37+
print(f"sensing: {dr.get_cycle_status_sensing()}")
38+
print(f"static reduce: {dr.get_cycle_status_static_reduce()}")
39+
print(f"steaming: {dr.get_cycle_status_steaming()}")
40+
print(f"wet: {dr.get_cycle_status_wet()}")
41+
print(f"cycle count: {dr.get_cycle_count()}")
42+
43+
print(f"set dryness: {dr.get_dryness()}")
44+
print(f"set manual dry time: {dr.get_manual_dry_time()}")
45+
print(f"set cycle select: {dr.get_cycle()}")
46+
print(f"set temperature: {dr.get_temperature()}")
47+
print(f"set wrinkle shield: {dr.get_wrinkle_shield()}")
48+
49+
def attr_upd():
50+
print("Attributes updated")
51+
52+
dr.register_attr_callback(attr_upd)
53+
54+
loop = True
55+
while loop:
56+
print_menu()
57+
choice = await aioconsole.ainput("Enter your choice: ")
58+
59+
if choice == "p":
60+
print_status(dr)
61+
elif choice == "u":
62+
await dr.fetch_data()
63+
print_status(dr)
64+
elif choice == "v":
65+
print(json.dumps(dr._data_dict, indent=4))
66+
elif choice == "c":
67+
cmd = await aioconsole.ainput("Command: ")
68+
val = await aioconsole.ainput("Value: ")
69+
await dr.send_attributes({cmd: val})
70+
elif choice == "q":
71+
print("Bye")
72+
loop = False
73+
else:
74+
print("Wrong option selection. Enter any key to try again..")

cli_washerdryer_menu.py renamed to cli_washer_menu.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
import aioconsole
44

5-
from whirlpool.washerdryer import WasherDryer
5+
from whirlpool.washer import Washer
66

77

8-
async def show_washerdryer_menu(wd: WasherDryer) -> None:
8+
async def show_washer_menu(wr: Washer) -> None:
99
def print_menu():
1010
print("\n")
1111
print(30 * "-", "MENU", 30 * "-")
@@ -16,37 +16,37 @@ def print_menu():
1616
print("q. Exit")
1717
print(67 * "-")
1818

19-
def print_status(wd: WasherDryer):
20-
print("online: " + str(wd.get_online()))
21-
print("state: " + str(wd.get_machine_state()))
22-
print("sensing: " + str(wd.get_cycle_status_sensing()))
23-
print("filling: " + str(wd.get_cycle_status_filling()))
24-
print("soaking: " + str(wd.get_cycle_status_soaking()))
25-
print("washing: " + str(wd.get_cycle_status_washing()))
26-
print("rinsing: " + str(wd.get_cycle_status_rinsing()))
27-
print("spinning: " + str(wd.get_cycle_status_spinning()))
19+
def print_status(wr: Washer):
20+
print("online: " + str(wr.get_online()))
21+
print("state: " + str(wr.get_machine_state()))
22+
print("sensing: " + str(wr.get_cycle_status_sensing()))
23+
print("filling: " + str(wr.get_cycle_status_filling()))
24+
print("soaking: " + str(wr.get_cycle_status_soaking()))
25+
print("washing: " + str(wr.get_cycle_status_washing()))
26+
print("rinsing: " + str(wr.get_cycle_status_rinsing()))
27+
print("spinning: " + str(wr.get_cycle_status_spinning()))
2828

2929
def attr_upd():
3030
print("Attributes updated")
3131

32-
wd.register_attr_callback(attr_upd)
32+
wr.register_attr_callback(attr_upd)
3333

3434
loop = True
3535
while loop:
3636
print_menu()
3737
choice = await aioconsole.ainput("Enter your choice: ")
3838

3939
if choice == "p":
40-
print_status(wd)
40+
print_status(wr)
4141
elif choice == "u":
42-
await wd.fetch_data()
43-
print_status(wd)
42+
await wr.fetch_data()
43+
print_status(wr)
4444
elif choice == "v":
45-
print(json.dumps(wd._data_dict, indent=4))
45+
print(json.dumps(wr._data_dict, indent=4))
4646
elif choice == "c":
4747
cmd = await aioconsole.ainput("Command: ")
4848
val = await aioconsole.ainput("Value: ")
49-
await wd.send_attributes({cmd: val})
49+
await wr.send_attributes({cmd: val})
5050
elif choice == "q":
5151
print("Bye")
5252
loop = False

tests/data/owned_appliances.json

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,39 @@
8888
"CATEGORY_NAME": "Climate",
8989
"MODEL_NO": "CoolMyBeer",
9090
"SERIAL": "FR12345678"
91+
},
92+
{
93+
"DATA_MODEL_KEY": "DDM_LAUNDRY_VMAX20_MAYTAG_DRYER_6_V1",
94+
"CATEGORY_NAME": "FabricCare",
95+
"MODEL_NO": "MGD6230HW3",
96+
"REPLENISHMENT_DEVICE_MODEL": null,
97+
"IMAGE_PATH": null,
98+
"APPLIANCE_ID": 999,
99+
"APPLIANCE_MASTER_ID": 3703,
100+
"MODEL_SKU_ID": null,
101+
"CREATED_AT": 1693943005000,
102+
"UPDATED_AT": 1693943005000,
103+
"APPLIANCE_NAME": "Dryer",
104+
"SAID": "SAIDDRYER1",
105+
"NEST_AWAY": 0,
106+
"CYCLE_HANDOFF": 0,
107+
"NEST_THERMOSTAT_ID": 0,
108+
"THERMOSTAT_INFLUENCE_THRESHOLD": null,
109+
"THERMOSTAT_DESIRED_OFFSET": null,
110+
"THERMOSTAT_OFFSET_NEEDED": null,
111+
"DELETE_FLAG": 0,
112+
"DISPLAY_POSITION": null,
113+
"SERIAL": "MC1234567",
114+
"LOCATION_ID": 999,
115+
"MACHINE_ID": null,
116+
"MACHINE_POSITION": 0,
117+
"ISVOICEDEFAULT": 1,
118+
"DEVICE_ID": "9d83427a-b994-4859-a2b9-2472c5dcbc26",
119+
"IS_ENROLLED": null,
120+
"STATUS": "CLAIMED",
121+
"APPLIANCE_TYPE_ID": null,
122+
"MACHINE_STATUS": null,
123+
"APPLIANCE_MODE": 2
91124
}
92125
]
93126
}

tests/test_dryer.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from whirlpool.appliancesmanager import AppliancesManager
2+
from whirlpool.dryer import (
3+
Cycle,
4+
Dryness,
5+
MachineState,
6+
Temperature,
7+
WrinkleShield,
8+
)
9+
10+
11+
async def test_attributes(appliances_manager: AppliancesManager):
12+
dryer = appliances_manager.dryers[0]
13+
assert dryer.get_machine_state() == MachineState.Standby
14+
assert not dryer.get_door_open()
15+
assert dryer.get_est_time_remaining() == 1800
16+
assert not dryer.get_drum_light_on()
17+
assert dryer.get_steam_changeable()
18+
assert not dryer.get_cycle_changeable()
19+
assert dryer.get_dryness_changeable()
20+
assert dryer.get_manual_dry_time_changeable()
21+
assert dryer.get_steam_changeable()
22+
assert dryer.get_wrinkle_shield_changeable()
23+
assert dryer.get_dryness() == Dryness.High
24+
assert dryer.get_manual_dry_time() == 1800
25+
assert dryer.get_cycle() == Cycle.TimedDry
26+
assert not dryer.get_cycle_status_airflow_status()
27+
assert not dryer.get_cycle_status_cool_down()
28+
assert not dryer.get_cycle_status_damp()
29+
assert not dryer.get_cycle_status_drying()
30+
assert not dryer.get_cycle_status_limited_cycle()
31+
assert not dryer.get_cycle_status_sensing()
32+
assert not dryer.get_cycle_status_static_reduce()
33+
assert not dryer.get_cycle_status_steaming()
34+
assert not dryer.get_cycle_status_wet()
35+
assert dryer.get_cycle_count() == 195
36+
assert dryer.get_damp_notification_tone_volume() == 0
37+
assert dryer.get_alert_tone_volume() == 0
38+
assert dryer.get_temperature() == Temperature.Cool
39+
assert dryer.get_wrinkle_shield() == WrinkleShield.Off

tests/test_washer.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from whirlpool.appliancesmanager import AppliancesManager
2+
from whirlpool.washer import MachineState
3+
4+
5+
async def test_attributes(appliances_manager: AppliancesManager):
6+
washer = appliances_manager.washers[0]
7+
8+
assert washer.get_machine_state() == MachineState.Standby
9+
assert washer.get_cycle_status_sensing() is False
10+
assert washer.get_cycle_status_filling() is False
11+
assert washer.get_cycle_status_soaking() is False
12+
assert washer.get_cycle_status_washing() is False
13+
assert washer.get_cycle_status_rinsing() is False
14+
assert washer.get_cycle_status_spinning() is False
15+
assert washer.get_dispense_1_level() == 4
16+
assert washer.get_door_open() is True
17+
assert washer.get_time_remaining() == 4080
18+
19+

whirlpool/appliancesmanager.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@
1111
from .appliance import Appliance
1212
from .auth import Auth
1313
from .backendselector import BackendSelector
14+
from .dryer import Dryer
1415
from .oven import Oven
1516
from .refrigerator import Refrigerator
1617
from .types import ApplianceInfo
17-
from .washerdryer import WasherDryer
18+
from .washer import Washer
1819

1920
LOGGER = logging.getLogger(__name__)
2021

@@ -31,15 +32,17 @@ def __init__(
3132
self._session: aiohttp.ClientSession = session
3233
self._event_socket: EventSocket | None = None
3334
self._aircons: dict[str, Any] = {}
34-
self._washerdryers: dict[str, Any] = {}
35+
self._dryers: dict[str, Any] = {}
36+
self._washers: dict[str, Any] = {}
3537
self._ovens: dict[str, Any] = {}
3638
self._refrigerators: dict[str, Any] = {}
3739

3840
@cached_property
3941
def all_appliances(self) -> dict[str, Appliance]:
4042
return {
4143
**self._aircons,
42-
**self._washerdryers,
44+
**self._dryers,
45+
**self._washers,
4346
**self._ovens,
4447
**self._refrigerators,
4548
}
@@ -49,8 +52,12 @@ def aircons(self) -> list[Aircon]:
4952
return list(self._aircons.values())
5053

5154
@property
52-
def washer_dryers(self) -> list[WasherDryer]:
53-
return list(self._washerdryers.values())
55+
def dryers(self) -> list[Dryer]:
56+
return list(self._dryers.values())
57+
58+
@property
59+
def washers(self) -> list[Washer]:
60+
return list(self._washers.values())
5461

5562
@property
5663
def ovens(self) -> list[Oven]:
@@ -85,8 +92,12 @@ def _add_appliance(self, appliance: dict[str, Any]) -> None:
8592
self._aircons[appliance_data.said] = Aircon(
8693
self._backend_selector, self._auth, self._session, appliance_data
8794
)
88-
elif "dryer" in data_model or "washer" in data_model:
89-
self._washerdryers[appliance_data.said] = WasherDryer(
95+
elif "dryer" in data_model:
96+
self._dryers[appliance_data.said] = Dryer(
97+
self._backend_selector, self._auth, self._session, appliance_data
98+
)
99+
elif "washer" in data_model:
100+
self._washers[appliance_data.said] = Washer(
90101
self._backend_selector, self._auth, self._session, appliance_data
91102
)
92103
elif any(model in data_model for model in oven_models):

0 commit comments

Comments
 (0)