From ac1e876a367c0f0a14e77e5e11a054031ba7be0f Mon Sep 17 00:00:00 2001 From: struhanets Date: Sat, 11 Jan 2025 12:54:58 +0100 Subject: [PATCH] Solution --- app/iot/devices.py | 38 +++++++++++++++++++------------------- app/iot/service.py | 18 +++++++++--------- app/main.py | 33 ++++++++++++++++++++------------- 3 files changed, 48 insertions(+), 41 deletions(-) diff --git a/app/iot/devices.py b/app/iot/devices.py index 5ee5ba6a..82552011 100644 --- a/app/iot/devices.py +++ b/app/iot/devices.py @@ -1,4 +1,4 @@ -import time +import asyncio from .message import MessageType @@ -8,57 +8,57 @@ # of course this code looks dumb, but imagine some real implementations of each method here class HueLightDevice: - def connect(self) -> None: + async def connect(self) -> None: print("Connecting Hue Light.") - time.sleep(TIME_TO_SLEEP) + await asyncio.sleep(TIME_TO_SLEEP) print("Hue Light connected.") - def disconnect(self) -> None: + async def disconnect(self) -> None: print("Disconnecting Hue Light.") - time.sleep(TIME_TO_SLEEP) + await asyncio.sleep(TIME_TO_SLEEP) print("Hue Light disconnected.") - def send_message(self, message_type: MessageType, data: str = "") -> None: + async def send_message(self, message_type: MessageType, data: str = "") -> None: print( f"Hue Light handling message of type {message_type.name} with data [{data}]." ) - time.sleep(TIME_TO_SLEEP) + await asyncio.sleep(TIME_TO_SLEEP) print("Hue Light received message.") class SmartSpeakerDevice: - def connect(self) -> None: + async def connect(self) -> None: print("Connecting to Smart Speaker.") - time.sleep(TIME_TO_SLEEP) + await asyncio.sleep(TIME_TO_SLEEP) print("Smart Speaker connected.") - def disconnect(self) -> None: + async def disconnect(self) -> None: print("Disconnecting Smart Speaker.") - time.sleep(TIME_TO_SLEEP) + await asyncio.sleep(TIME_TO_SLEEP) print("Smart Speaker disconnected.") - def send_message(self, message_type: MessageType, data: str = "") -> None: + async def send_message(self, message_type: MessageType, data: str = "") -> None: print( f"Smart Speaker handling message of type {message_type.name} with data [{data}]." ) - time.sleep(TIME_TO_SLEEP) + await asyncio.sleep(TIME_TO_SLEEP) print("Smart Speaker received message.") class SmartToiletDevice: - def connect(self) -> None: + async def connect(self) -> None: print("Connecting to Smart Toilet.") - time.sleep(TIME_TO_SLEEP) + await asyncio.sleep(TIME_TO_SLEEP) print("Smart Toilet connected.") - def disconnect(self) -> None: + async def disconnect(self) -> None: print("Disconnecting Smart Toilet.") - time.sleep(TIME_TO_SLEEP) + await asyncio.sleep(TIME_TO_SLEEP) print("Smart Toilet disconnected.") - def send_message(self, message_type: MessageType, data: str = "") -> None: + async def send_message(self, message_type: MessageType, data: str = "") -> None: print( f"Smart Toilet handling message of type {message_type.name} with data [{data}]." ) - time.sleep(TIME_TO_SLEEP) + await asyncio.sleep(TIME_TO_SLEEP) print("Smart Toilet received message.") diff --git a/app/iot/service.py b/app/iot/service.py index f12b6021..5eb7031d 100644 --- a/app/iot/service.py +++ b/app/iot/service.py @@ -26,24 +26,24 @@ class IOTService: def __init__(self) -> None: self.devices: dict[str, Device] = {} - def register_device(self, device: Device) -> str: - device.connect() + async def register_device(self, device: Device) -> str: + await device.connect() device_id = generate_id() self.devices[device_id] = device return device_id - def unregister_device(self, device_id: str) -> None: - self.devices[device_id].disconnect() + async def unregister_device(self, device_id: str) -> None: + await self.devices[device_id].disconnect() del self.devices[device_id] - def get_device(self, device_id: str) -> Device: + async def get_device(self, device_id: str) -> Device: return self.devices[device_id] - def run_program(self, program: list[Message]) -> None: + async def run_program(self, program: list[Message]) -> None: print("=====RUNNING PROGRAM======") for msg in program: - self.send_msg(msg) + await self.send_msg(msg) print("=====END OF PROGRAM======") - def send_msg(self, msg: Message) -> None: - self.devices[msg.device_id].send_message(msg.msg_type, msg.data) + async def send_msg(self, msg: Message) -> None: + await self.devices[msg.device_id].send_message(msg.msg_type, msg.data) diff --git a/app/main.py b/app/main.py index 33b8f3d3..e26b9ffa 100644 --- a/app/main.py +++ b/app/main.py @@ -1,11 +1,12 @@ import time +import asyncio from iot.devices import HueLightDevice, SmartSpeakerDevice, SmartToiletDevice from iot.message import Message, MessageType from iot.service import IOTService -def main() -> None: +async def main() -> None: # create an IOT service service = IOTService() @@ -13,32 +14,38 @@ def main() -> None: hue_light = HueLightDevice() speaker = SmartSpeakerDevice() toilet = SmartToiletDevice() - hue_light_id = service.register_device(hue_light) - speaker_id = service.register_device(speaker) - toilet_id = service.register_device(toilet) + + devises_ids = await asyncio.gather( + service.register_device(hue_light), + service.register_device(speaker), + service.register_device(toilet) + + ) + hue_light_id, speaker_id, toilet_id = devises_ids # create a few programs - wake_up_program = [ + sequence_running = [ Message(hue_light_id, MessageType.SWITCH_ON), Message(speaker_id, MessageType.SWITCH_ON), Message(speaker_id, MessageType.PLAY_SONG, "Rick Astley - Never Gonna Give You Up"), + Message(toilet_id, MessageType.FLUSH), + Message(toilet_id, MessageType.CLEAN) ] - sleep_program = [ + parallel_running = [ Message(hue_light_id, MessageType.SWITCH_OFF), - Message(speaker_id, MessageType.SWITCH_OFF), - Message(toilet_id, MessageType.FLUSH), - Message(toilet_id, MessageType.CLEAN), + Message(speaker_id, MessageType.SWITCH_OFF) ] - # run the programs - service.run_program(wake_up_program) - service.run_program(sleep_program) + for message in sequence_running: + await service.run_program([message]) + + await asyncio.gather(*[service.run_program([parallel_func]) for parallel_func in parallel_running]) if __name__ == "__main__": start = time.perf_counter() - main() + asyncio.run(main()) end = time.perf_counter() print("Elapsed:", end - start)