Pair device workflow ```sequence App -> Device: Pair and provision Wifi credential App -> API: Get list device's VID, PID support AWS control App -> App: Check if device support AWS control Note left of App: If device support AWS control App -> Device: Read device id from Matter cluster App -> API: Add device to room Note left of App: If device don't support AWS control App -> API: Create new device and add to room ``` Connect websocket ```sequence Connect handle Lambda -> API: Get JWK if don't have JWK Connect handle Lambda -> Connect handle Lambda: Validate token by JWK Connect handle Lambda -> Redis: Push connection id to user's connection list Connect handle Lambda -> Redis: Check if have user's device list data in Redis Note left of Connect handle Lambda: If don't have user's device list data in Redis Connect handle Lambda -> API: Get user's device list Connect handle Lambda -> Redis: Save user's device list ``` Disconnect websocket ```sequence Disconnect handle Lambda -> Redis: Pop connection id from user's connection list ``` Device state save history ```sequence Device -> AWS IoT topic: Send device state AWS IoT topic -> AWS IoT Rule: Listen message AWS IoT Rule -> Kinesis Firehose: Trigger message Kinesis Firehose -> S3: Save device state ``` Device state real-time handle ```sequence Device -> AWS IoT topic: Send device state AWS IoT topic -> AWS IoT Rule: Listen message AWS IoT Rule -> Device state SQS: Trigger message Device state SQS -> Device state handle Lambda: Trigger event Device state handle Lambda -> Redis: Get list user's connection of device Device state handle Lambda -> API Gateway WebSocket: Send message ``` Add device to room ```sequence App -> API: Add device to room API -> DB: Add device to room API --> App: Response API -> New device SQS: Trigger message New device SQS -> New device handle Lambda: Trigger event New device handle Lambda -> Redis: Add device to user device list ``` Remove device from room ```sequence App -> API: Remove device from room API -> DB: Remove device from room API --> App: Response API -> Remove device SQS: Trigger message Remove device SQS -> Remove device handle Lambda: Trigger event Remove device handle Lambda -> Redis: Remove device from user device list ``` Control device handle ```sequence App -> API Gateway: Send control message API Gateway -> Control device handle Lambda: Trigger event Control device handle Lambda -> Redis: Check if user have permission to control device Control device handle Lambda -> AWS thing shadow: Send control message ```