diff --git a/apps/api/main.py b/apps/api/main.py index f45c20b..e9e238d 100644 --- a/apps/api/main.py +++ b/apps/api/main.py @@ -127,27 +127,19 @@ async def redis_state_listener(): logger.info("Redis state listener connected") - while True: - try: - message = await asyncio.wait_for( - pubsub.get_message(ignore_subscribe_messages=True), - timeout=1.0 - ) - - if message and message["type"] == "message": - data = message["data"] - try: - state_data = json.loads(data) - if state_data.get("type") == "state" and state_data.get("device_id"): - device_id = state_data["device_id"] - payload = state_data.get("payload", {}) - device_states[device_id] = payload - logger.debug(f"Updated state cache for {device_id}: {payload}") - except Exception as e: - logger.warning(f"Failed to parse state data: {e}") - - except asyncio.TimeoutError: - pass # No message, continue + # listen() blocks async and waits for messages - prevents busy loop + async for message in pubsub.listen(): + if message["type"] == "message": + data = message["data"] + try: + state_data = json.loads(data) + if state_data.get("type") == "state" and state_data.get("device_id"): + device_id = state_data["device_id"] + payload = state_data.get("payload", {}) + device_states[device_id] = payload + logger.debug(f"Updated state cache for {device_id}: {payload}") + except Exception as e: + logger.warning(f"Failed to parse state data: {e}") except asyncio.CancelledError: logger.info("Redis state listener cancelled")