diff --git a/core/communication/websocket.py b/core/communication/websocket.py index 931a755..a756002 100644 --- a/core/communication/websocket.py +++ b/core/communication/websocket.py @@ -39,6 +39,8 @@ class WebSocketHandler: self.connected = False self._heartbeat_task: Optional[asyncio.Task] = None self._message_task: Optional[asyncio.Task] = None + self._heartbeat_count = 0 + self._last_processed_models: set = set() # Cache of last processed model IDs async def handle_connection(self) -> None: """ @@ -99,7 +101,7 @@ class WebSocketHandler: ) await self._send_message(state_report) - logger.info(f"[TX → Backend] stateReport: CPU {cpu_usage:.1f}%, Memory {memory_usage:.1f}%, " + logger.info(f"[TX → Backend] Initial stateReport: CPU {cpu_usage:.1f}%, Memory {memory_usage:.1f}%, " f"GPU {gpu_usage or 'N/A'}, {len(camera_connections)} cameras") except Exception as e: @@ -126,8 +128,14 @@ class WebSocketHandler: ) await self._send_message(state_report) - logger.info(f"[TX → Backend] Heartbeat: CPU {cpu_usage:.1f}%, Memory {memory_usage:.1f}%, " - f"GPU {gpu_usage or 'N/A'}, {len(camera_connections)} cameras") + + # Only log full details every 10th heartbeat, otherwise just show a dot + self._heartbeat_count += 1 + if self._heartbeat_count % 10 == 0: + logger.info(f"[TX → Backend] Heartbeat #{self._heartbeat_count}: CPU {cpu_usage:.1f}%, Memory {memory_usage:.1f}%, " + f"GPU {gpu_usage or 'N/A'}, {len(camera_connections)} cameras") + else: + print(".", end="", flush=True) # Just show a dot to indicate heartbeat activity await asyncio.sleep(HEARTBEAT_INTERVAL) @@ -217,7 +225,14 @@ class WebSocketHandler: 'model_name': subscription.modelName } + # Check if model set has changed to avoid redundant processing + current_model_ids = set(unique_models.keys()) + if current_model_ids == self._last_processed_models: + logger.debug(f"[Model Management] Model set unchanged {list(current_model_ids)}, skipping checks") + return + logger.info(f"[Model Management] Processing {len(unique_models)} unique models: {list(unique_models.keys())}") + self._last_processed_models = current_model_ids # Check and download models concurrently download_tasks = [] @@ -337,10 +352,8 @@ class WebSocketHandler: try: json_message = serialize_outgoing_message(message) await self.websocket.send_text(json_message) - # Log heartbeats at INFO level with simplified format - if hasattr(message, 'type') and message.type == 'stateReport': - logger.info(f"[TX → Backend] {message.type}") - else: + # Log non-heartbeat messages only (heartbeats are logged in their respective functions) + if not (hasattr(message, 'type') and message.type == 'stateReport'): logger.info(f"[TX → Backend] {json_message}") except Exception as e: logger.error(f"Failed to send WebSocket message: {e}")