-
Notifications
You must be signed in to change notification settings - Fork 514
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Solution #495
base: master
Are you sure you want to change the base?
Solution #495
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,9 @@ | ||
import random | ||
import string | ||
import asyncio | ||
from typing import Protocol | ||
|
||
from .message import Message, MessageType | ||
from app.iot.message import Message, MessageType | ||
|
||
|
||
def generate_id(length: int = 8) -> str: | ||
|
@@ -12,38 +13,37 @@ def generate_id(length: int = 8) -> str: | |
# Protocol is very similar to ABC, but uses duck typing | ||
# so devices should not inherit for it (if it walks like a duck, and quacks like a duck, it's a duck) | ||
class Device(Protocol): | ||
def connect(self) -> None: | ||
async def connect(self) -> None: | ||
... # Ellipsis - similar to "pass", but sometimes has different meaning | ||
|
||
def disconnect(self) -> None: | ||
async def disconnect(self) -> None: | ||
... | ||
|
||
def send_message(self, message_type: MessageType, data: str) -> None: | ||
async def send_message(self, message_type: MessageType, data: str) -> None: | ||
... | ||
|
||
|
||
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: | ||
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 program | ||
Comment on lines
+43
to
+45
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The |
||
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, device_id: str, msg_type: MessageType, data: str = "") -> None: | ||
await self.devices[device_id].send_message(msg_type, data) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,44 +1,55 @@ | ||
import time | ||
import asyncio | ||
from typing import Any, Awaitable | ||
|
||
from iot.devices import HueLightDevice, SmartSpeakerDevice, SmartToiletDevice | ||
from iot.message import Message, MessageType | ||
from iot.message import MessageType | ||
from iot.service import IOTService | ||
|
||
|
||
def main() -> None: | ||
async def run_sequence(*functions: Awaitable[Any]) -> None: | ||
for function in functions: | ||
await function | ||
|
||
async def run_parallel(*functions: Awaitable[Any]) -> None: | ||
await asyncio.gather(*functions) | ||
|
||
|
||
async def main() -> None: | ||
# create an IOT service | ||
service = IOTService() | ||
|
||
# create and register a few devices | ||
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) | ||
|
||
# create a few programs | ||
wake_up_program = [ | ||
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"), | ||
] | ||
|
||
sleep_program = [ | ||
Message(hue_light_id, MessageType.SWITCH_OFF), | ||
Message(speaker_id, MessageType.SWITCH_OFF), | ||
Message(toilet_id, MessageType.FLUSH), | ||
Message(toilet_id, MessageType.CLEAN), | ||
] | ||
|
||
# run the programs | ||
service.run_program(wake_up_program) | ||
service.run_program(sleep_program) | ||
hue_light, speaker, toilet = await asyncio.gather( | ||
service.register_device(HueLightDevice()), | ||
service.register_device(SmartSpeakerDevice()), | ||
service.register_device(SmartToiletDevice()) | ||
) | ||
|
||
wake_up = run_sequence( | ||
run_parallel( | ||
service.send_msg(hue_light, MessageType.SWITCH_ON), | ||
service.send_msg(speaker, MessageType.SWITCH_ON) | ||
), | ||
service.send_msg(speaker, MessageType.PLAY_SONG, "Rick Astley - Never Gonna Give You Up") | ||
) | ||
|
||
sleep = run_sequence( | ||
run_parallel( | ||
service.send_msg(hue_light, MessageType.SWITCH_OFF), | ||
service.send_msg(speaker, MessageType.SWITCH_OFF) | ||
), | ||
service.send_msg(toilet, MessageType.FLUSH), | ||
service.send_msg(toilet, MessageType.CLEAN) | ||
) | ||
|
||
# run the programs. | ||
await service.run_program(run_parallel(wake_up, sleep)) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The
Comment on lines
+46
to
+47
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The |
||
|
||
|
||
if __name__ == "__main__": | ||
start = time.perf_counter() | ||
main() | ||
asyncio.run(main()) | ||
end = time.perf_counter() | ||
|
||
print("Elapsed:", end - start) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The
run_program
method attempts toawait
a list ofMessage
objects, which is not valid. You need to iterate over theprogram
list and await each message's processing individually. Consider using a loop to handle each message asynchronously.