diff --git a/app.py b/app.py index d08aa7a..8383208 100644 --- a/app.py +++ b/app.py @@ -43,16 +43,6 @@ camera_streams: Dict[str, Dict[str, Any]] = {} subscription_to_camera: Dict[str, str] = {} # Store latest frames for REST API access (separate from processing buffer) latest_frames: Dict[str, Any] = {} -# Store cached detection dict after successful pipeline completion -cached_detections: Dict[str, Dict[str, Any]] = {} -# Track frame skipping for pipeline buffer after detection -frame_skip_flags: Dict[str, bool] = {} -# Track camera connection states for immediate error handling -camera_states: Dict[str, Dict[str, Any]] = {} -# Track session ID states and pipeline modes per camera -session_pipeline_states: Dict[str, Dict[str, Any]] = {} -# Store full pipeline results for caching -cached_full_pipeline_results: Dict[str, Dict[str, Any]] = {} with open("config.json", "r") as f: config = json.load(f) @@ -79,22 +69,11 @@ logging.basicConfig( logger = logging.getLogger("detector_worker") logger.setLevel(logging.DEBUG) # Set app-specific logger to DEBUG level -# Create WebSocket communication logger -ws_logger = logging.getLogger("websocket_comm") -ws_logger.setLevel(logging.INFO) -ws_handler = logging.FileHandler("websocket_comm.log", encoding='utf-8') -ws_formatter = logging.Formatter("%(asctime)s [%(levelname)s] %(message)s") -ws_handler.setFormatter(ws_formatter) -ws_logger.addHandler(ws_handler) -ws_logger.propagate = False # Don't propagate to root logger - # Ensure all other libraries (including root) use at least INFO level logging.getLogger().setLevel(logging.INFO) logger.info("Starting detector worker application") logger.info(f"Configuration: Target FPS: {TARGET_FPS}, Max streams: {max_streams}, Max retries: {max_retries}") -ws_logger.info("WebSocket communication logging started - TX/RX format") -logger.info("WebSocket communication will be logged to websocket_comm.log") # Ensure the models directory exists os.makedirs("models", exist_ok=True) @@ -139,34 +118,15 @@ def download_mpta(url: str, dest_path: str) -> str: def fetch_snapshot(url: str): try: from requests.auth import HTTPBasicAuth, HTTPDigestAuth - import requests.adapters - import urllib3 # Parse URL to extract credentials parsed = urlparse(url) - # Prepare headers - some cameras require User-Agent and specific headers + # Prepare headers - some cameras require User-Agent headers = { - 'User-Agent': 'Mozilla/5.0 (compatible; DetectorWorker/1.0)', - 'Accept': 'image/jpeg,image/*,*/*', - 'Connection': 'close', - 'Cache-Control': 'no-cache' + 'User-Agent': 'Mozilla/5.0 (compatible; DetectorWorker/1.0)' } - # Create a session with custom adapter for better connection handling - session = requests.Session() - adapter = requests.adapters.HTTPAdapter( - pool_connections=1, - pool_maxsize=1, - max_retries=urllib3.util.retry.Retry( - total=2, - backoff_factor=0.1, - status_forcelist=[500, 502, 503, 504] - ) - ) - session.mount('http://', adapter) - session.mount('https://', adapter) - # Reconstruct URL without credentials clean_url = f"{parsed.scheme}://{parsed.hostname}" if parsed.port: @@ -176,68 +136,44 @@ def fetch_snapshot(url: str): clean_url += f"?{parsed.query}" auth = None - response = None - if parsed.username and parsed.password: # Try HTTP Digest authentication first (common for IP cameras) try: auth = HTTPDigestAuth(parsed.username, parsed.password) - response = session.get(clean_url, auth=auth, headers=headers, timeout=(5, 15), stream=True) + response = requests.get(clean_url, auth=auth, headers=headers, timeout=10) if response.status_code == 200: logger.debug(f"Successfully authenticated using HTTP Digest for {clean_url}") elif response.status_code == 401: # If Digest fails, try Basic auth logger.debug(f"HTTP Digest failed, trying Basic auth for {clean_url}") auth = HTTPBasicAuth(parsed.username, parsed.password) - response = session.get(clean_url, auth=auth, headers=headers, timeout=(5, 15), stream=True) + response = requests.get(clean_url, auth=auth, headers=headers, timeout=10) if response.status_code == 200: logger.debug(f"Successfully authenticated using HTTP Basic for {clean_url}") except Exception as auth_error: logger.debug(f"Authentication setup error: {auth_error}") # Fallback to original URL with embedded credentials - response = session.get(url, headers=headers, timeout=(5, 15), stream=True) + response = requests.get(url, headers=headers, timeout=10) else: # No credentials in URL, make request as-is - response = session.get(url, headers=headers, timeout=(5, 15), stream=True) + response = requests.get(url, headers=headers, timeout=10) - if response and response.status_code == 200: - # Read content with size limit to prevent memory issues - content = b'' - max_size = 10 * 1024 * 1024 # 10MB limit - for chunk in response.iter_content(chunk_size=8192): - content += chunk - if len(content) > max_size: - logger.error(f"Snapshot too large (>{max_size} bytes) from {clean_url}") - return None - + if response.status_code == 200: # Convert response content to numpy array - nparr = np.frombuffer(content, np.uint8) + nparr = np.frombuffer(response.content, np.uint8) # Decode image frame = cv2.imdecode(nparr, cv2.IMREAD_COLOR) if frame is not None: - logger.debug(f"Successfully fetched snapshot from {clean_url}, shape: {frame.shape}, size: {len(content)} bytes") + logger.debug(f"Successfully fetched snapshot from {clean_url}, shape: {frame.shape}") return frame else: - logger.error(f"Failed to decode image from snapshot URL: {clean_url} (content size: {len(content)} bytes)") + logger.error(f"Failed to decode image from snapshot URL: {clean_url}") return None - elif response: - logger.error(f"Failed to fetch snapshot (status code {response.status_code}): {clean_url}") - # Log response headers and first part of content for debugging - logger.debug(f"Response headers: {dict(response.headers)}") - if len(response.content) < 1000: - logger.debug(f"Response content: {response.content[:500]}") - return None else: - logger.error(f"No response received from snapshot URL: {clean_url}") + logger.error(f"Failed to fetch snapshot (status code {response.status_code}): {clean_url}") return None - except requests.exceptions.Timeout as e: - logger.error(f"Timeout fetching snapshot from {url}: {str(e)}") - return None - except requests.exceptions.ConnectionError as e: - logger.error(f"Connection error fetching snapshot from {url}: {str(e)}") - return None except Exception as e: - logger.error(f"Exception fetching snapshot from {url}: {str(e)}", exc_info=True) + logger.error(f"Exception fetching snapshot from {url}: {str(e)}") return None # Helper to get crop coordinates from stream @@ -249,87 +185,6 @@ def get_crop_coords(stream): "cropY2": stream.get("cropY2") } -# Camera state management functions -def set_camera_connected(camera_id, connected=True, error_msg=None): - """Set camera connection state and track error information""" - current_time = time.time() - - if camera_id not in camera_states: - camera_states[camera_id] = { - "connected": True, - "last_error": None, - "last_error_time": None, - "consecutive_failures": 0, - "disconnection_notified": False - } - - state = camera_states[camera_id] - was_connected = state["connected"] - - if connected: - state["connected"] = True - state["consecutive_failures"] = 0 - state["disconnection_notified"] = False - if not was_connected: - logger.info(f"📶 CAMERA RECONNECTED: {camera_id}") - else: - state["connected"] = False - state["last_error"] = error_msg - state["last_error_time"] = current_time - state["consecutive_failures"] += 1 - - # Distinguish between temporary and permanent disconnection - is_permanent = state["consecutive_failures"] >= 3 - - if was_connected and is_permanent: - logger.error(f"📵 CAMERA DISCONNECTED: {camera_id} - {error_msg} (consecutive failures: {state['consecutive_failures']})") - logger.info(f"🚨 CAMERA ERROR DETECTED - Will send detection: null to reset backend session for {camera_id}") - -def is_camera_connected(camera_id): - """Check if camera is currently connected""" - return camera_states.get(camera_id, {}).get("connected", True) - -def should_notify_disconnection(camera_id): - """Check if we should notify backend about disconnection""" - state = camera_states.get(camera_id, {}) - is_disconnected = not state.get("connected", True) - not_yet_notified = not state.get("disconnection_notified", False) - has_enough_failures = state.get("consecutive_failures", 0) >= 3 - - return is_disconnected and not_yet_notified and has_enough_failures - -def mark_disconnection_notified(camera_id): - """Mark that we've notified backend about this disconnection""" - if camera_id in camera_states: - camera_states[camera_id]["disconnection_notified"] = True - logger.debug(f"Marked disconnection notification sent for camera {camera_id}") - -def get_or_init_session_pipeline_state(camera_id): - """Get or initialize session pipeline state for a camera""" - if camera_id not in session_pipeline_states: - session_pipeline_states[camera_id] = { - "mode": "validation_detecting", # "validation_detecting", "send_detections", "waiting_for_session_id", "full_pipeline", "lightweight" - "session_id_received": False, - "full_pipeline_completed": False, - "absence_counter": 0, - "max_absence_frames": 3 - # Removed validation_counter and validation_threshold - now using only track-based validation - } - return session_pipeline_states[camera_id] - -def update_session_pipeline_mode(camera_id, new_mode, session_id=None): - """Update session pipeline mode and related state""" - state = get_or_init_session_pipeline_state(camera_id) - old_mode = state["mode"] - state["mode"] = new_mode - - if session_id: - state["session_id_received"] = True - state["absence_counter"] = 0 # Reset absence counter when session starts - - logger.info(f"📊 Camera {camera_id}: Pipeline mode changed from '{old_mode}' to '{new_mode}'") - return state - #################################################### # REST API endpoint for image retrieval #################################################### @@ -381,47 +236,6 @@ async def detect(websocket: WebSocket): async def handle_detection(camera_id, stream, frame, websocket, model_tree, persistent_data): try: - # Check camera connection state first - handle disconnection immediately - if should_notify_disconnection(camera_id): - logger.error(f"🚨 CAMERA DISCONNECTION DETECTED: {camera_id} - sending immediate detection: null") - - # Clear cached detections and occupancy state - cached_detections.pop(camera_id, None) - frame_skip_flags.pop(camera_id, None) - cached_full_pipeline_results.pop(camera_id, None) # Clear cached pipeline results - session_pipeline_states.pop(camera_id, None) # Reset session pipeline state - - # Reset pipeline state immediately - from siwatsystem.pympta import reset_tracking_state - model_id = stream.get("modelId", "unknown") - reset_tracking_state(camera_id, model_id, "camera disconnected") - - # Send immediate detection: null to backend - detection_data = { - "type": "imageDetection", - "subscriptionIdentifier": stream["subscriptionIdentifier"], - "timestamp": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), - "data": { - "detection": None, # null detection for disconnection - "modelId": stream["modelId"], - "modelName": stream["modelName"] - } - } - - try: - ws_logger.info(f"TX -> {json.dumps(detection_data, separators=(',', ':'))}") - await websocket.send_json(detection_data) - except RuntimeError as e: - if "websocket.close" in str(e): - logger.warning(f"WebSocket connection closed - cannot send disconnection signal for camera {camera_id}") - return persistent_data - else: - raise - mark_disconnection_notified(camera_id) - logger.info(f"📡 SENT DISCONNECTION SIGNAL - detection: null for camera {camera_id}, backend should clear session") - - return persistent_data - # Apply crop if specified cropped_frame = frame if all(coord is not None for coord in [stream.get("cropX1"), stream.get("cropY1"), stream.get("cropX2"), stream.get("cropY2")]): @@ -436,326 +250,81 @@ async def detect(websocket: WebSocket): subscription_parts = stream["subscriptionIdentifier"].split(';') display_identifier = subscription_parts[0] if subscription_parts else None - # Get backend session ID if available - backend_session_id = session_ids.get(display_identifier) - - # Get or initialize session pipeline state - pipeline_state = get_or_init_session_pipeline_state(camera_id) - current_mode = pipeline_state["mode"] - - logger.debug(f"🔍 SESSIONID LOOKUP: display='{display_identifier}', session_id={repr(backend_session_id)}, mode='{current_mode}'") - logger.debug(f"🔍 Available session_ids: {session_ids}") - - # ═══ SESSION ID-BASED PROCESSING MODE ═══ - if not backend_session_id: - # No session ID - keep current mode if it's validation_detecting or send_detections - if current_mode not in ["validation_detecting", "send_detections", "waiting_for_session_id"]: - update_session_pipeline_mode(camera_id, "validation_detecting") - current_mode = "validation_detecting" - logger.debug(f"🔍 Camera {camera_id}: No session ID - in {current_mode} mode") - else: - # Session ID available - switch to full pipeline mode - if current_mode in ["send_detections", "waiting_for_session_id"]: - # Session ID just arrived - switch to full pipeline mode - update_session_pipeline_mode(camera_id, "full_pipeline", backend_session_id) - current_mode = "full_pipeline" - logger.info(f"🔥 Camera {camera_id}: Session ID received ({backend_session_id}) - switching to FULL PIPELINE mode") - - # Create context for pipeline execution + # Create context for pipeline execution (session_id will be generated by pipeline) pipeline_context = { "camera_id": camera_id, - "display_id": display_identifier, - "backend_session_id": backend_session_id + "display_id": display_identifier } - start_time = time.time() - detection_result = None - - if current_mode == "validation_detecting": - # ═══ TRACK VALIDATION MODE ═══ - # Run tracking-based validation with track ID stability - logger.debug(f"🔍 Camera {camera_id}: In validation_detecting mode - running track-based validation") - - # Get tracking configuration from model_tree - tracking_config = model_tree.get("tracking", {}) - tracking_enabled = tracking_config.get("enabled", True) - stability_threshold = tracking_config.get("stabilityThreshold", 4) - - # Default to "none" - only proceed after track validation - detection_result = {"class": "none", "confidence": 1.0, "bbox": [0, 0, 0, 0]} - - if tracking_enabled: - # Run full tracking detection to get track IDs - from siwatsystem.pympta import run_detection_with_tracking - all_detections, regions_dict, track_validation_result = run_detection_with_tracking(cropped_frame, model_tree, pipeline_context) - - if track_validation_result.get("validation_complete", False): - # Track validation completed - we have stable track IDs - stable_tracks = track_validation_result.get("stable_tracks", []) - logger.info(f"🎯 Camera {camera_id}: TRACK VALIDATION COMPLETED - stable tracks: {stable_tracks}") - - # Switch to send_detections mode - update_session_pipeline_mode(camera_id, "send_detections") - - # Send the best detection with stable track - if all_detections: - # Find detection with stable track ID - stable_detection = None - for detection in all_detections: - if detection.get("id") in stable_tracks: - stable_detection = detection - break - - if stable_detection: - detection_result = { - "class": stable_detection.get("class", "car"), - "confidence": stable_detection.get("confidence", 0.0), - "bbox": stable_detection.get("bbox", [0, 0, 0, 0]), - "track_id": stable_detection.get("id") - } - logger.info(f"🚗 Camera {camera_id}: SENDING STABLE DETECTION - track ID {detection_result['track_id']}") - else: - logger.warning(f"⚠️ Camera {camera_id}: Stable tracks found but no matching detection") - else: - # Track validation still in progress - stable_tracks = track_validation_result.get("stable_tracks", []) - current_tracks = track_validation_result.get("current_tracks", []) - - if current_tracks: - track_id = current_tracks[0] if current_tracks else "None" - stable_status = "STABLE" if stable_tracks else "validating" - logger.info(f"🔍 Camera {camera_id}: TRACK VALIDATION - car track_id {track_id} ({stable_status}, need {stability_threshold} consecutive frames)") - else: - logger.debug(f"👻 Camera {camera_id}: No car detected") - - logger.debug(f"📤 Camera {camera_id}: Sending 'none' (track validation in progress)") - else: - # Tracking disabled - fall back to basic detection validation - logger.debug(f"🔍 Camera {camera_id}: Tracking disabled - using basic detection validation") - from siwatsystem.pympta import run_lightweight_detection - basic_detection = run_lightweight_detection(cropped_frame, model_tree) - - if basic_detection and basic_detection.get("car_detected"): - best_detection = basic_detection.get("best_detection") - - # Increment validation counter for basic detection - pipeline_state["validation_counter"] += 1 - current_count = pipeline_state["validation_counter"] - threshold = pipeline_state["validation_threshold"] - - if current_count >= threshold: - update_session_pipeline_mode(camera_id, "send_detections") - detection_result = { - "class": best_detection.get("class", "car"), - "confidence": best_detection.get("confidence", 0.0), - "bbox": best_detection.get("bbox", [0, 0, 0, 0]) - } - logger.info(f"🎯 Camera {camera_id}: BASIC VALIDATION COMPLETED after {current_count} frames") - else: - logger.info(f"📊 Camera {camera_id}: Basic validation progress {current_count}/{threshold}") - else: - # Reset validation counter - if pipeline_state["validation_counter"] > 0: - pipeline_state["validation_counter"] = 0 - logger.info(f"🔄 Camera {camera_id}: Reset validation counter (no detection)") - - elif current_mode == "send_detections": - # ═══ SEND DETECTIONS MODE ═══ - # Validation completed - now send detection_dict for car detections, detection: null for no car - logger.debug(f"📤 Camera {camera_id}: In send_detections mode - sending detection_dict for cars") - from siwatsystem.pympta import run_lightweight_detection - basic_detection = run_lightweight_detection(cropped_frame, model_tree) - - if basic_detection and basic_detection.get("car_detected"): - # Car detected - send detection_dict - best_detection = basic_detection.get("best_detection") - detection_result = { - "class": best_detection.get("class", "car"), - "confidence": best_detection.get("confidence", 0.0), - "bbox": best_detection.get("bbox", [0, 0, 0, 0]) - } - logger.info(f"🚗 Camera {camera_id}: SENDING DETECTION_DICT - {detection_result['class']} (conf={detection_result['confidence']:.3f}) - backend should generate session ID") - else: - # No car detected - send "none" - detection_result = {"class": "none", "confidence": 1.0, "bbox": [0, 0, 0, 0]} - logger.debug(f"👻 Camera {camera_id}: No car detected - sending 'none'") - - elif current_mode == "waiting_for_session_id": - # ═══ WAITING FOR SESSION ID MODE ═══ - # Stop processing snapshots, wait for session ID - logger.debug(f"⏳ Camera {camera_id}: In waiting_for_session_id mode - not processing snapshots") - return persistent_data # Don't process or send anything - - elif current_mode == "full_pipeline": - # ═══ FULL PIPELINE MODE ═══ - logger.info(f"🔥 Camera {camera_id}: Running FULL PIPELINE (detection + branches + Redis + PostgreSQL)") - detection_result = run_pipeline(cropped_frame, model_tree, context=pipeline_context) - - if detection_result and isinstance(detection_result, dict): - # Cache the full pipeline result - cached_full_pipeline_results[camera_id] = { - "result": detection_result.copy(), - "timestamp": time.time() - } - # Switch to lightweight mode - update_session_pipeline_mode(camera_id, "lightweight") - logger.info(f"✅ Camera {camera_id}: Full pipeline completed - switching to LIGHTWEIGHT mode") - - elif current_mode == "lightweight": - # ═══ LIGHTWEIGHT MODE ═══ - # Use tracking to check for stable car presence - from siwatsystem.pympta import run_detection_with_tracking - all_detections, regions_dict, track_validation_result = run_detection_with_tracking(cropped_frame, model_tree, pipeline_context) - - stable_tracks = track_validation_result.get("stable_tracks", []) - current_tracks = track_validation_result.get("current_tracks", []) - stable_tracks_present = bool(set(stable_tracks) & set(current_tracks)) - - if stable_tracks_present: - # Stable tracked car still present - use cached result - pipeline_state["absence_counter"] = 0 - if camera_id in cached_full_pipeline_results: - detection_result = cached_full_pipeline_results[camera_id]["result"] - logger.debug(f"🔄 Camera {camera_id}: Stable tracked car still present - using cached detection") - else: - logger.warning(f"⚠️ Camera {camera_id}: Stable tracked car detected but no cached result available") - detection_result = None - else: - # No stable tracked cars - increment absence counter - pipeline_state["absence_counter"] += 1 - absence_count = pipeline_state["absence_counter"] - max_absence = pipeline_state["max_absence_frames"] - - logger.debug(f"👻 Camera {camera_id}: No stable tracked cars - absence {absence_count}/{max_absence}") - - if absence_count >= max_absence: - # Send "none" detection and reset to validation mode - detection_result = { - "class": "none", - "confidence": 1.0, - "bbox": [0, 0, 0, 0], - "branch_results": {} - } - cached_full_pipeline_results.pop(camera_id, None) # Clear cache - update_session_pipeline_mode(camera_id, "validation_detecting") - logger.info(f"📤 Camera {camera_id}: Stable tracked cars absent for {absence_count} frames - sending 'none' and resetting to track validation") - else: - # Still within absence tolerance - use cached result - if camera_id in cached_full_pipeline_results: - detection_result = cached_full_pipeline_results[camera_id]["result"] - logger.debug(f"⏳ Camera {camera_id}: Stable tracked cars absent {absence_count}/{max_absence} - still using cached detection") - else: - detection_result = None - + detection_result = run_pipeline(cropped_frame, model_tree, context=pipeline_context) process_time = (time.time() - start_time) * 1000 - logger.debug(f"Detection for camera {camera_id} completed in {process_time:.2f}ms (mode: {current_mode})") + logger.debug(f"Detection for camera {camera_id} completed in {process_time:.2f}ms") - # Skip processing if no detection result (blocked by session gating) - if detection_result is None: - logger.debug(f"No detection result to process for camera {camera_id}") - return persistent_data - # Log the raw detection result for debugging logger.debug(f"Raw detection result for camera {camera_id}:\n{json.dumps(detection_result, indent=2, default=str)}") - # Extract session_id from pipeline result (always use backend sessionId) - session_id = backend_session_id - logger.debug(f"Using backend session_id: {session_id}") + # Extract session_id from pipeline result (generated during database record creation) + session_id = None + if detection_result and isinstance(detection_result, dict): + # Check if pipeline generated a session_id (happens when Car+Frontal detected together) + if "session_id" in detection_result: + session_id = detection_result["session_id"] + logger.debug(f"Extracted session_id from pipeline result: {session_id}") - - # Process detection result based on current mode - if current_mode == "validation_detecting": - # ═══ VALIDATION DETECTING MODE ═══ - # Always send detection: null during validation phase - detection_dict = None - logger.debug(f"🔍 SENDING 'NONE' - validation_detecting mode for camera {camera_id}") - - elif current_mode == "send_detections": - # ═══ SEND DETECTIONS MODE ═══ - if detection_result.get("class") == "none": - # No car detected - send detection: null - detection_dict = None - logger.debug(f"📤 SENDING 'NONE' - send_detections mode (no car) for camera {camera_id}") - else: - # Car detected - check if we have sessionId to determine what to send - if backend_session_id: - # Have sessionId - send full detection_dict for database updates - detection_dict = { - "carModel": None, - "carBrand": None, - "carYear": None, - "bodyType": None, - "licensePlateText": None, - "licensePlateConfidence": None - } - logger.info(f"📤 SENDING FULL DETECTION_DICT - send_detections mode with sessionId {backend_session_id} (conf={detection_result.get('confidence', 0):.3f}) for camera {camera_id}") - else: - # No sessionId - send empty detection_dict to trigger backend to generate sessionId - detection_dict = {} - logger.info(f"📤 SENDING EMPTY DETECTION_DICT - send_detections mode without sessionId, triggering backend to generate sessionId (conf={detection_result.get('confidence', 0):.3f}) for camera {camera_id}") - - elif detection_result.get("class") == "none": - # "None" detection in other modes (lightweight) - car left or absent for 3 frames - detection_dict = None - logger.info(f"📤 SENDING 'NONE' (detection: null) - Car absent, expecting backend to clear session for camera {camera_id}") + # Process detection result - run_pipeline returns the primary detection directly + if detection_result and isinstance(detection_result, dict) and "class" in detection_result: + highest_confidence_detection = detection_result else: - # Valid detection - convert to backend format - detection_dict = { - "carModel": None, - "carBrand": None, - "carYear": None, - "bodyType": None, - "licensePlateText": None, - "licensePlateConfidence": None + # No detection found + highest_confidence_detection = { + "class": "none", + "confidence": 1.0, + "bbox": [0, 0, 0, 0], + "branch_results": {} } - # Extract and process branch results from parallel classification (only for valid detections) - if detection_result.get("class") != "none" and "branch_results" in detection_result: - def process_branch_results(branch_results, depth=0): - """Recursively process branch results including nested branches.""" - if not isinstance(branch_results, dict): - return - - indent = " " * depth - for branch_id, branch_data in branch_results.items(): - if isinstance(branch_data, dict): - logger.debug(f"{indent}Processing branch {branch_id}: {branch_data}") + # Convert detection format to match backend expectations exactly as in worker.md section 4.2 + detection_dict = { + "carModel": None, + "carBrand": None, + "carYear": None, + "bodyType": None, + "licensePlateText": None, + "licensePlateConfidence": None + } + + # Extract and process branch results from parallel classification + branch_results = highest_confidence_detection.get("branch_results", {}) + if branch_results: + logger.debug(f"Processing branch results: {branch_results}") + + # Transform branch results into backend-expected detection attributes + for branch_id, branch_data in branch_results.items(): + if isinstance(branch_data, dict): + logger.debug(f"Processing branch {branch_id}: {branch_data}") + + # Map common classification fields to backend-expected names + if "brand" in branch_data: + detection_dict["carBrand"] = branch_data["brand"] + if "body_type" in branch_data: + detection_dict["bodyType"] = branch_data["body_type"] + if "class" in branch_data: + class_name = branch_data["class"] - # Map common classification fields to backend-expected names - if "brand" in branch_data: - detection_dict["carBrand"] = branch_data["brand"] - logger.debug(f"{indent}Mapped carBrand: {branch_data['brand']}") - if "body_type" in branch_data: - detection_dict["bodyType"] = branch_data["body_type"] - logger.debug(f"{indent}Mapped bodyType: {branch_data['body_type']}") - if "class" in branch_data: - class_name = branch_data["class"] - - # Map based on branch/model type - if "brand" in branch_id.lower(): - detection_dict["carBrand"] = class_name - logger.debug(f"{indent}Mapped carBrand from class: {class_name}") - elif "bodytype" in branch_id.lower() or "body" in branch_id.lower(): - detection_dict["bodyType"] = class_name - logger.debug(f"{indent}Mapped bodyType from class: {class_name}") - - # Process nested branch results recursively - if "branch_results" in branch_data: - logger.debug(f"{indent}Processing nested branches in {branch_id}") - process_branch_results(branch_data["branch_results"], depth + 1) - - branch_results = detection_result.get("branch_results", {}) - if branch_results: - logger.debug(f"Processing branch results: {branch_results}") - process_branch_results(branch_results) - logger.info(f"Detection payload after branch processing: {detection_dict}") - else: - logger.debug("No branch results found in detection result") + # Map based on branch/model type + if "brand" in branch_id.lower(): + detection_dict["carBrand"] = class_name + elif "bodytype" in branch_id.lower() or "body" in branch_id.lower(): + detection_dict["bodyType"] = class_name + + logger.info(f"Detection payload after branch processing: {detection_dict}") + else: + logger.debug("No branch results found in detection result") detection_data = { "type": "imageDetection", "subscriptionIdentifier": stream["subscriptionIdentifier"], - "timestamp": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), + "timestamp": time.strftime("%Y-%m-%dT%H:%M:%S.%fZ", time.gmtime()), # "timestamp": time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime()) + f".{int(time.time() * 1000) % 1000:03d}Z", "data": { "detection": detection_dict, @@ -764,38 +333,22 @@ async def detect(websocket: WebSocket): } } - # Add session ID to detection data (NOT for "none" detections - backend uses absence of sessionId to know to clear the session) - if session_id and detection_result.get("class") != "none": + # Add session ID if available (generated by pipeline when Car+Frontal detected) + if session_id is not None: detection_data["sessionId"] = session_id - logger.debug(f"Including sessionId {session_id} in WebSocket message") - elif detection_result.get("class") == "none": - logger.debug(f"NOT including sessionId in 'none' detection - backend should clear session") + logger.debug(f"Added session_id to WebSocket response: {session_id}") - # Log detection details - if detection_result.get("class") != "none": - confidence = detection_result.get("confidence", 0.0) - logger.info(f"Camera {camera_id}: Detected {detection_result['class']} with confidence {confidence:.2f} using model {stream['modelName']}") + if highest_confidence_detection.get("class") != "none": + confidence = highest_confidence_detection.get("confidence", 0.0) + logger.info(f"Camera {camera_id}: Detected {highest_confidence_detection['class']} with confidence {confidence:.2f} using model {stream['modelName']}") + + # Log session ID if available + if session_id: + logger.debug(f"Detection associated with session ID: {session_id}") - # Send detection data to backend (session gating handled above in processing logic) - logger.debug(f"📤 SENDING TO BACKEND for camera {camera_id}: {json.dumps(detection_data, indent=2)}") - try: - ws_logger.info(f"TX -> {json.dumps(detection_data, separators=(',', ':'))}") - await websocket.send_json(detection_data) - logger.debug(f"Sent detection data to client for camera {camera_id}") - except RuntimeError as e: - if "websocket.close" in str(e): - logger.warning(f"WebSocket connection closed - cannot send detection data for camera {camera_id}") - return persistent_data - else: - raise - - # Log status after sending - if session_id and detection_result.get("class") != "none": - logger.info(f"📤 WEBSOCKET RESPONSE with sessionId: {session_id} for camera {camera_id}") - elif detection_result.get("class") == "none": - logger.info(f"📡 SENT 'none' detection - backend should clear session for camera {camera_id}") - else: - logger.info(f"📡 Detection data sent for camera {camera_id}") + await websocket.send_json(detection_data) + logger.debug(f"Sent detection data to client for camera {camera_id}") + logger.debug(f"Sent this detection data: {detection_data}") return persistent_data except Exception as e: logger.error(f"Error in handle_detection for camera {camera_id}: {str(e)}", exc_info=True) @@ -814,10 +367,8 @@ async def detect(websocket: WebSocket): height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = cap.get(cv2.CAP_PROP_FPS) logger.info(f"Camera {camera_id} opened successfully with resolution {width}x{height}, FPS: {fps}") - set_camera_connected(camera_id, True) else: logger.error(f"Camera {camera_id} failed to open initially") - set_camera_connected(camera_id, False, "Failed to open camera initially") while not stop_event.is_set(): try: @@ -832,25 +383,20 @@ async def detect(websocket: WebSocket): ret, frame = cap.read() if not ret: - error_msg = f"Connection lost for camera: {camera_id}, retry {retries+1}/{max_retries}" - logger.warning(error_msg) - set_camera_connected(camera_id, False, error_msg) + logger.warning(f"Connection lost for camera: {camera_id}, retry {retries+1}/{max_retries}") cap.release() time.sleep(reconnect_interval) retries += 1 if retries > max_retries and max_retries != -1: logger.error(f"Max retries reached for camera: {camera_id}, stopping frame reader") - set_camera_connected(camera_id, False, "Max retries reached") break # Re-open logger.info(f"Attempting to reopen RTSP stream for camera: {camera_id}") cap = cv2.VideoCapture(streams[camera_id]["rtsp_url"]) if not cap.isOpened(): logger.error(f"Failed to reopen RTSP stream for camera: {camera_id}") - set_camera_connected(camera_id, False, "Failed to reopen RTSP stream") continue logger.info(f"Successfully reopened RTSP stream for camera: {camera_id}") - set_camera_connected(camera_id, True) continue # Successfully read a frame @@ -864,7 +410,6 @@ async def detect(websocket: WebSocket): logger.debug(f"Successfully read frame from camera {camera_id}, shape: {frame.shape}") retries = 0 - set_camera_connected(camera_id, True) # Mark as connected on successful frame read # Overwrite old frame if buffer is full if not buffer.empty(): @@ -880,28 +425,21 @@ async def detect(websocket: WebSocket): time.sleep(0.01) except cv2.error as e: - error_msg = f"OpenCV error for camera {camera_id}: {e}" - logger.error(error_msg, exc_info=True) - set_camera_connected(camera_id, False, error_msg) + logger.error(f"OpenCV error for camera {camera_id}: {e}", exc_info=True) cap.release() time.sleep(reconnect_interval) retries += 1 if retries > max_retries and max_retries != -1: logger.error(f"Max retries reached after OpenCV error for camera {camera_id}") - set_camera_connected(camera_id, False, "Max retries reached after OpenCV error") break logger.info(f"Attempting to reopen RTSP stream after OpenCV error for camera: {camera_id}") cap = cv2.VideoCapture(streams[camera_id]["rtsp_url"]) if not cap.isOpened(): logger.error(f"Failed to reopen RTSP stream for camera {camera_id} after OpenCV error") - set_camera_connected(camera_id, False, "Failed to reopen after OpenCV error") continue logger.info(f"Successfully reopened RTSP stream after OpenCV error for camera: {camera_id}") - set_camera_connected(camera_id, True) except Exception as e: - error_msg = f"Unexpected error for camera {camera_id}: {str(e)}" - logger.error(error_msg, exc_info=True) - set_camera_connected(camera_id, False, error_msg) + logger.error(f"Unexpected error for camera {camera_id}: {str(e)}", exc_info=True) cap.release() break except Exception as e: @@ -914,14 +452,10 @@ async def detect(websocket: WebSocket): def snapshot_reader(camera_id, snapshot_url, snapshot_interval, buffer, stop_event): """Frame reader that fetches snapshots from HTTP/HTTPS URL at specified intervals""" retries = 0 - consecutive_failures = 0 # Track consecutive failures for backoff logger.info(f"Starting snapshot reader thread for camera {camera_id} from {snapshot_url}") frame_count = 0 last_log_time = time.time() - # Initialize camera state - set_camera_connected(camera_id, True) - try: interval_seconds = snapshot_interval / 1000.0 # Convert milliseconds to seconds logger.info(f"Snapshot interval for camera {camera_id}: {interval_seconds}s") @@ -932,34 +466,15 @@ async def detect(websocket: WebSocket): frame = fetch_snapshot(snapshot_url) if frame is None: - consecutive_failures += 1 - error_msg = f"Failed to fetch snapshot for camera: {camera_id}, consecutive failures: {consecutive_failures}" - logger.warning(error_msg) - set_camera_connected(camera_id, False, error_msg) + logger.warning(f"Failed to fetch snapshot for camera: {camera_id}, retry {retries+1}/{max_retries}") retries += 1 - - # Check network connectivity with a simple ping-like test - if consecutive_failures % 5 == 1: # Every 5th failure, test connectivity - try: - test_response = requests.get(snapshot_url, timeout=(2, 5), stream=False) - logger.info(f"Camera {camera_id}: Connectivity test result: {test_response.status_code}") - except Exception as test_error: - logger.warning(f"Camera {camera_id}: Connectivity test failed: {test_error}") - if retries > max_retries and max_retries != -1: logger.error(f"Max retries reached for snapshot camera: {camera_id}, stopping reader") - set_camera_connected(camera_id, False, "Max retries reached for snapshot camera") break - - # Exponential backoff based on consecutive failures - backoff_delay = min(30, max(1, min(2 ** min(consecutive_failures - 1, 6), interval_seconds * 2))) # Start with 1s, max 30s - logger.debug(f"Camera {camera_id}: Backing off for {backoff_delay:.1f}s (consecutive failures: {consecutive_failures})") - if stop_event.wait(backoff_delay): # Use wait with timeout instead of sleep - break # Exit if stop_event is set during backoff + time.sleep(min(interval_seconds, reconnect_interval)) continue - # Successfully fetched a frame - reset consecutive failures - consecutive_failures = 0 # Reset backoff on success + # Successfully fetched a frame frame_count += 1 current_time = time.time() # Log frame stats every 5 seconds @@ -970,7 +485,6 @@ async def detect(websocket: WebSocket): logger.debug(f"Successfully fetched snapshot from camera {camera_id}, shape: {frame.shape}") retries = 0 - set_camera_connected(camera_id, True) # Mark as connected on successful snapshot # Overwrite old frame if buffer is full if not buffer.empty(): @@ -989,21 +503,12 @@ async def detect(websocket: WebSocket): time.sleep(sleep_time) except Exception as e: - consecutive_failures += 1 - error_msg = f"Unexpected error fetching snapshot for camera {camera_id}: {str(e)}" - logger.error(error_msg, exc_info=True) - set_camera_connected(camera_id, False, error_msg) + logger.error(f"Unexpected error fetching snapshot for camera {camera_id}: {str(e)}", exc_info=True) retries += 1 if retries > max_retries and max_retries != -1: logger.error(f"Max retries reached after error for snapshot camera {camera_id}") - set_camera_connected(camera_id, False, "Max retries reached after error") break - - # Exponential backoff for exceptions too - backoff_delay = min(30, max(1, min(2 ** min(consecutive_failures - 1, 6), interval_seconds * 2))) # Start with 1s, max 30s - logger.debug(f"Camera {camera_id}: Exception backoff for {backoff_delay:.1f}s (consecutive failures: {consecutive_failures})") - if stop_event.wait(backoff_delay): # Use wait with timeout instead of sleep - break # Exit if stop_event is set during backoff + time.sleep(min(interval_seconds, reconnect_interval)) except Exception as e: logger.error(f"Error in snapshot_reader thread for camera {camera_id}: {str(e)}", exc_info=True) finally: @@ -1181,23 +686,6 @@ async def detect(websocket: WebSocket): streams[camera_id] = stream_info subscription_to_camera[camera_id] = camera_url logger.info(f"Subscribed to camera {camera_id}") - - # Send initial "none" detection to backend on camera connect - initial_detection_data = { - "type": "imageDetection", - "subscriptionIdentifier": subscriptionIdentifier, - "timestamp": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), - "data": { - "detection": None, - "modelId": modelId, - "modelName": modelName - } - } - - ws_logger.info(f"TX -> {json.dumps(initial_detection_data, separators=(',', ':'))}") - await websocket.send_json(initial_detection_data) - logger.info(f"📡 Sent initial 'none' detection to backend for camera {camera_id}") - logger.debug(f"Initial detection data: {initial_detection_data}") async def unsubscribe_internal(subscription_id): """Internal unsubscription logic""" @@ -1217,11 +705,6 @@ async def detect(websocket: WebSocket): del camera_streams[camera_url] latest_frames.pop(subscription_id, None) - cached_detections.pop(subscription_id, None) # Clear cached detection - frame_skip_flags.pop(subscription_id, None) # Clear frame skip flag - camera_states.pop(subscription_id, None) # Clear camera state - cached_full_pipeline_results.pop(subscription_id, None) # Clear cached pipeline results - session_pipeline_states.pop(subscription_id, None) # Clear session pipeline state cleanup_camera_stability(subscription_id) logger.info(f"Unsubscribed from camera {subscription_id}") @@ -1320,7 +803,6 @@ async def detect(websocket: WebSocket): while True: try: msg = await websocket.receive_text() - ws_logger.info(f"RX <- {msg}") logger.debug(f"Received message: {msg}") data = json.loads(msg) msg_type = data.get("type") @@ -1384,7 +866,6 @@ async def detect(websocket: WebSocket): "subscriptionIdentifier": subscriptionIdentifier, "error": f"Failed to download model from {model_url}" } - ws_logger.info(f"TX -> {json.dumps(error_response, separators=(',', ':'))}") await websocket.send_json(error_response) continue model_tree = load_pipeline_from_zip(local_path, extraction_dir) @@ -1399,7 +880,6 @@ async def detect(websocket: WebSocket): "subscriptionIdentifier": subscriptionIdentifier, "error": f"Model file not found: {model_url}" } - ws_logger.info(f"TX -> {json.dumps(error_response, separators=(',', ':'))}") await websocket.send_json(error_response) continue model_tree = load_pipeline_from_zip(model_url, extraction_dir) @@ -1542,9 +1022,6 @@ async def detect(websocket: WebSocket): # Clean up cached frame and stability tracking latest_frames.pop(camera_id, None) - cached_detections.pop(camera_id, None) # Clear cached detection - frame_skip_flags.pop(camera_id, None) # Clear frame skip flag - camera_states.pop(camera_id, None) # Clear camera state cleanup_camera_stability(camera_id) logger.info(f"Unsubscribed from camera {camera_id}") # Note: Keep models in memory for potential reuse @@ -1588,79 +1065,14 @@ async def detect(websocket: WebSocket): display_identifier = payload.get("displayIdentifier") session_id = payload.get("sessionId") - # Debug sessionId value types and contents - session_id_type = type(session_id).__name__ - if session_id is None: - logger.info(f"🆔 BACKEND SESSIONID RECEIVED: displayId={display_identifier}, sessionId=None (type: {session_id_type})") - logger.info(f"🔄 BACKEND WANTS TO CLEAR SESSION for display {display_identifier}") - elif session_id == "null": - logger.info(f"🆔 BACKEND SESSIONID RECEIVED: displayId={display_identifier}, sessionId='null' (type: {session_id_type})") - logger.info(f"🔄 BACKEND SENT STRING 'null' for display {display_identifier}") - elif session_id == "": - logger.info(f"🆔 BACKEND SESSIONID RECEIVED: displayId={display_identifier}, sessionId='' (empty string, type: {session_id_type})") - logger.info(f"🔄 BACKEND SENT EMPTY STRING for display {display_identifier}") - else: - logger.info(f"🆔 BACKEND SESSIONID RECEIVED: displayId={display_identifier}, sessionId='{session_id}' (type: {session_id_type}, length: {len(str(session_id))})") - logger.info(f"🔄 BACKEND CREATED/UPDATED SESSION: {session_id} for display {display_identifier}") - - logger.debug(f"Full setSessionId payload: {payload}") - logger.debug(f"WebSocket message raw data: {json.dumps(data, indent=2)}") - logger.debug(f"Current active cameras: {list(streams.keys())}") - if display_identifier: # Store session ID for this display - if session_id is None or session_id == "null" or session_id == "": - old_session_id = session_ids.get(display_identifier) + if session_id is None: session_ids.pop(display_identifier, None) - - if session_id is None: - logger.info(f"🚫 BACKEND ENDED SESSION: Cleared session ID for display {display_identifier} (was: {old_session_id}) - received None") - elif session_id == "null": - logger.info(f"🚫 BACKEND ENDED SESSION: Cleared session ID for display {display_identifier} (was: {old_session_id}) - received string 'null'") - elif session_id == "": - logger.info(f"🚫 BACKEND ENDED SESSION: Cleared session ID for display {display_identifier} (was: {old_session_id}) - received empty string") - - logger.debug(f"Session IDs after clearing: {session_ids}") - - # Reset tracking state for all cameras associated with this display - with streams_lock: - affected_cameras = [] - for camera_id, stream in streams.items(): - if stream["subscriptionIdentifier"].startswith(display_identifier + ";"): - affected_cameras.append(camera_id) - # Import here to avoid circular import - from siwatsystem.pympta import reset_tracking_state - model_id = stream.get("modelId", "unknown") - reset_tracking_state(camera_id, model_id, "backend session ended") - - - logger.info(f"Reset tracking for camera {camera_id} (display: {display_identifier})") - logger.debug(f"Reset tracking for {len(affected_cameras)} cameras: {affected_cameras}") + logger.info(f"Cleared session ID for display {display_identifier}") else: - old_session_id = session_ids.get(display_identifier) session_ids[display_identifier] = session_id - logger.info(f"✅ BACKEND SESSION STARTED: Set session ID {session_id} for display {display_identifier} (previous: {old_session_id})") - logger.debug(f"Session IDs after update: {session_ids}") - logger.debug(f"🎯 CMS Backend created sessionId {session_id} after receiving detection data") - - # Clear waiting state for cameras associated with this display - with streams_lock: - affected_cameras = [] - for camera_id, stream in streams.items(): - if stream["subscriptionIdentifier"].startswith(display_identifier + ";"): - affected_cameras.append(camera_id) - from siwatsystem.pympta import get_camera_stability_data - model_id = stream.get("modelId", "unknown") - stability_data = get_camera_stability_data(camera_id, model_id) - session_state = stability_data["session_state"] - if session_state.get("waiting_for_backend_session", False): - session_state["waiting_for_backend_session"] = False - session_state["wait_start_time"] = 0.0 - logger.info(f"🚀 PIPELINE UNBLOCKED: Backend sessionId {session_id} received - camera {camera_id} can proceed with database operations") - logger.debug(f"📋 Camera {camera_id}: SessionId {session_id} now available for future database operations") - logger.debug(f"Updated session state for {len(affected_cameras)} cameras: {affected_cameras}") - else: - logger.warning(f"🚨 Invalid setSessionId message: missing displayIdentifier in payload") + logger.info(f"Set session ID {session_id} for display {display_identifier}") elif msg_type == "patchSession": session_id = data.get("sessionId") @@ -1675,7 +1087,6 @@ async def detect(websocket: WebSocket): "message": "Session patch acknowledged" } } - ws_logger.info(f"TX -> {json.dumps(response, separators=(',', ':'))}") await websocket.send_json(response) logger.info(f"Acknowledged patch for session {session_id}") @@ -1720,10 +1131,5 @@ async def detect(websocket: WebSocket): with models_lock: models.clear() latest_frames.clear() - cached_detections.clear() - frame_skip_flags.clear() - camera_states.clear() - cached_full_pipeline_results.clear() - session_pipeline_states.clear() session_ids.clear() logger.info("WebSocket connection closed") diff --git a/siwatsystem/pympta.py b/siwatsystem/pympta.py index d1158e8..2ba7453 100644 --- a/siwatsystem/pympta.py +++ b/siwatsystem/pympta.py @@ -13,7 +13,6 @@ import concurrent.futures from ultralytics import YOLO from urllib.parse import urlparse from .database import DatabaseManager -from datetime import datetime # Create a logger specifically for this module logger = logging.getLogger("detector_worker.pympta") @@ -22,8 +21,8 @@ logger = logging.getLogger("detector_worker.pympta") # Structure: {camera_id: {model_id: {"track_stability_counters": {track_id: count}, "stable_tracks": set(), "session_state": {...}}}} _camera_stability_tracking = {} -# Session timeout configuration (waiting for backend sessionId) -_session_timeout_seconds = 15 +# Timer-based cooldown configuration (for testing) +_cooldown_duration_seconds = 30 def validate_redis_config(redis_config: dict) -> bool: """Validate Redis configuration parameters.""" @@ -100,20 +99,18 @@ def load_pipeline_node(node_config: dict, mpta_dir: str, redis_client, db_manage if name in trigger_classes] logger.debug(f"Converted trigger classes to indices: {trigger_class_indices}") - # Extract stability threshold from main pipeline config (not tracking config) + # Extract stability threshold from tracking config tracking_config = node_config.get("tracking", {"enabled": True, "reidConfigPath": "botsort.yaml"}) - stability_threshold = node_config.get("stabilityThreshold", 4) # Read from main config, default to 4 + stability_threshold = tracking_config.get("stabilityThreshold", 1) node = { "modelId": node_config["modelId"], "modelFile": node_config["modelFile"], "triggerClasses": trigger_classes, "triggerClassIndices": trigger_class_indices, - "classMapping": node_config.get("classMapping", {}), "crop": node_config.get("crop", False), "cropClass": node_config.get("cropClass"), "minConfidence": node_config.get("minConfidence", None), - "minBboxAreaRatio": node_config.get("minBboxAreaRatio", 0.0), "multiClass": node_config.get("multiClass", False), "expectedClasses": node_config.get("expectedClasses", []), "parallel": node_config.get("parallel", False), @@ -533,7 +530,6 @@ def resolve_field_mapping(value_template, branch_results, action_context): def run_detection_with_tracking(frame, node, context=None): """ Structured function for running YOLO detection with BoT-SORT tracking. - Now includes track ID-based validation requiring N consecutive frames of the same track ID. Args: frame: Input frame/image @@ -541,10 +537,9 @@ def run_detection_with_tracking(frame, node, context=None): context: Optional context information (camera info, session data, etc.) Returns: - tuple: (all_detections, regions_dict, track_validation_result) where: + tuple: (all_detections, regions_dict) where: - all_detections: List of all detection objects - regions_dict: Dict mapping class names to highest confidence detections - - track_validation_result: Dict with validation status and stable tracks Configuration options in node: - model: YOLO model instance @@ -554,16 +549,13 @@ def run_detection_with_tracking(frame, node, context=None): - expectedClasses: List of expected class names for multi-class validation - tracking: Dict with tracking configuration - enabled: Boolean to enable/disable tracking - - method: Tracking method ("botsort") - - reidConfig: Path to ReID config file - - stabilityThreshold: Number of consecutive frames required for validation + - reidConfigPath: Path to ReID config file (default: "botsort.yaml") """ try: # Extract tracking configuration tracking_config = node.get("tracking", {}) tracking_enabled = tracking_config.get("enabled", True) - reid_config_path = tracking_config.get("reidConfig", tracking_config.get("reidConfigPath", "botsort.yaml")) - stability_threshold = tracking_config.get("stabilityThreshold", node.get("stabilityThreshold", 4)) + reid_config_path = tracking_config.get("reidConfigPath", "botsort.yaml") # Check if we need to reset tracker after cooldown camera_id = context.get("camera_id", "unknown") if context else "unknown" @@ -585,7 +577,7 @@ def run_detection_with_tracking(frame, node, context=None): trigger_class_indices = node.get("triggerClassIndices") class_filter = {"classes": trigger_class_indices} if trigger_class_indices else {} - logger.debug(f"Running detection for {node['modelId']} - tracking: {tracking_enabled}, stability_threshold: {stability_threshold}, classes: {node.get('triggerClasses', 'all')}") + logger.debug(f"Running detection for {node['modelId']} - tracking: {tracking_enabled}, classes: {node.get('triggerClasses', 'all')}") if tracking_enabled and tracking_zone: # Use tracking with zone validation @@ -616,33 +608,27 @@ def run_detection_with_tracking(frame, node, context=None): )[0] # Process detection results - candidate_detections = [] + all_detections = [] + regions_dict = {} min_confidence = node.get("minConfidence", 0.0) if res.boxes is None or len(res.boxes) == 0: - logger.debug(f"🚫 Camera {camera_id}: YOLO returned no detections") - - # Update stability tracking even when no detection (to reset counters) - camera_id = context.get("camera_id", "unknown") if context else "unknown" - model_id = node.get("modelId", "unknown") - track_validation_result = update_single_track_stability(node, None, camera_id, frame.shape, stability_threshold) - - # Store validation state in context for pipeline decisions - if context is not None: - context["track_validation_result"] = track_validation_result - - return [], {}, track_validation_result + logger.debug("No detections found") + return [], {} - logger.debug(f"🔍 Camera {camera_id}: YOLO detected {len(res.boxes)} raw objects - processing with tracking...") + logger.debug(f"Processing {len(res.boxes)} raw detections") - # First pass: collect all valid detections - logger.debug(f"🔍 Camera {camera_id}: === DETECTION ANALYSIS ===") for i, box in enumerate(res.boxes): # Extract detection data conf = float(box.cpu().conf[0]) cls_id = int(box.cpu().cls[0]) class_name = node["model"].names[cls_id] + # Apply confidence filtering + if conf < min_confidence: + logger.debug(f"Detection {i} '{class_name}' rejected: {conf:.3f} < {min_confidence}") + continue + # Extract bounding box xy = box.cpu().xyxy[0] x1, y1, x2, y2 = map(int, xy) @@ -653,13 +639,6 @@ def run_detection_with_tracking(frame, node, context=None): if hasattr(box, "id") and box.id is not None: track_id = int(box.id.item()) - logger.debug(f"🔍 Camera {camera_id}: Detection {i+1}: class='{class_name}' conf={conf:.3f} track_id={track_id} bbox={bbox}") - - # Apply confidence filtering - if conf < min_confidence: - logger.debug(f"❌ Camera {camera_id}: Detection {i+1} REJECTED - confidence {conf:.3f} < {min_confidence}") - continue - # Apply tracking zone validation if enabled if tracking_enabled and tracking_zone: bbox_center_x = (x1 + x2) // 2 @@ -667,7 +646,7 @@ def run_detection_with_tracking(frame, node, context=None): # Check if detection center is within tracking zone if not _point_in_polygon((bbox_center_x, bbox_center_y), tracking_zone): - logger.debug(f"❌ Camera {camera_id}: Detection {i+1} REJECTED - outside tracking zone") + logger.debug(f"Detection {i} '{class_name}' outside tracking zone") continue # Create detection object @@ -679,60 +658,17 @@ def run_detection_with_tracking(frame, node, context=None): "class_id": cls_id } - candidate_detections.append(detection) - logger.debug(f"✅ Camera {camera_id}: Detection {i+1} ACCEPTED as candidate: {class_name} (conf={conf:.3f}, track_id={track_id})") - - # Second pass: select only the highest confidence detection overall - if not candidate_detections: - logger.debug(f"🚫 Camera {camera_id}: No valid candidates after filtering - no car will be tracked") + all_detections.append(detection) + logger.debug(f"Detection {i} accepted: {class_name} (conf={conf:.3f}, id={track_id}, bbox={bbox})") - # Update stability tracking even when no detection (to reset counters) - camera_id = context.get("camera_id", "unknown") if context else "unknown" - model_id = node.get("modelId", "unknown") - track_validation_result = update_single_track_stability(node, None, camera_id, frame.shape, stability_threshold) - - # Store validation state in context for pipeline decisions - if context is not None: - context["track_validation_result"] = track_validation_result - - return [], {}, track_validation_result - - logger.debug(f"🏆 Camera {camera_id}: === SELECTING HIGHEST CONFIDENCE CAR ===") - for i, detection in enumerate(candidate_detections): - logger.debug(f"🏆 Camera {camera_id}: Candidate {i+1}: {detection['class']} conf={detection['confidence']:.3f} track_id={detection['id']}") - - # Find the single highest confidence detection across all detected classes - best_detection = max(candidate_detections, key=lambda x: x["confidence"]) - original_class = best_detection["class"] - track_id = best_detection["id"] - - logger.info(f"🎯 Camera {camera_id}: SELECTED WINNER: {original_class} (conf={best_detection['confidence']:.3f}, track_id={track_id}, bbox={best_detection['bbox']})") - - # Show which cars were NOT selected - for detection in candidate_detections: - if detection != best_detection: - logger.debug(f"🚫 Camera {camera_id}: NOT SELECTED: {detection['class']} (conf={detection['confidence']:.3f}, track_id={detection['id']}) - lower confidence") - - # Apply class mapping if configured - mapped_class = original_class - class_mapping = node.get("classMapping", {}) - if original_class in class_mapping: - mapped_class = class_mapping[original_class] - logger.info(f"Class mapping applied: {original_class} → {mapped_class}") - # Update the detection object with mapped class - best_detection["class"] = mapped_class - best_detection["original_class"] = original_class # Keep original for reference - - # Keep only the single best detection with mapped class - all_detections = [best_detection] - regions_dict = { - mapped_class: { - "bbox": best_detection["bbox"], - "confidence": best_detection["confidence"], - "detection": best_detection, - "track_id": track_id - } - } + # Update regions_dict with highest confidence detection per class + if class_name not in regions_dict or conf > regions_dict[class_name]["confidence"]: + regions_dict[class_name] = { + "bbox": bbox, + "confidence": conf, + "detection": detection, + "track_id": track_id + } # Multi-class validation if node.get("multiClass", False) and node.get("expectedClasses"): @@ -749,26 +685,18 @@ def run_detection_with_tracking(frame, node, context=None): logger.info(f"Multi-class validation passed: {matching_classes} detected") - logger.info(f"✅ Camera {camera_id}: DETECTION COMPLETE - tracking single car: track_id={track_id}, conf={best_detection['confidence']:.3f}") - logger.debug(f"📊 Camera {camera_id}: Detection summary: {len(res.boxes)} raw → {len(candidate_detections)} candidates → 1 selected") + logger.info(f"Detection completed: {len(all_detections)} detections, {len(regions_dict)} unique classes") - # Update track-based stability tracking for the single selected car + # Update stability tracking for detections with track IDs (requires camera_id from context) camera_id = context.get("camera_id", "unknown") if context else "unknown" - model_id = node.get("modelId", "unknown") + update_track_stability(node, all_detections, camera_id) - # Update stability tracking for the single best detection - track_validation_result = update_single_track_stability(node, best_detection, camera_id, frame.shape, stability_threshold) - - # Store validation state in context for pipeline decisions - if context is not None: - context["track_validation_result"] = track_validation_result - - return all_detections, regions_dict, track_validation_result + return all_detections, regions_dict except Exception as e: logger.error(f"Error in detection_with_tracking for {node.get('modelId', 'unknown')}: {e}") logger.debug(f"Detection error traceback: {traceback.format_exc()}") - return [], {}, {"validation_complete": False, "stable_tracks": [], "current_tracks": []} + return [], {} def _point_in_polygon(point, polygon): """Check if a point is inside a polygon using ray casting algorithm.""" @@ -803,270 +731,50 @@ def get_camera_stability_data(camera_id, model_id): if model_id not in _camera_stability_tracking[camera_id]: logger.warning(f"🔄 Camera {camera_id}: Creating NEW stability data for {model_id} - this will reset any cooldown!") _camera_stability_tracking[camera_id][model_id] = { - "track_stability_counters": {}, # Track ID -> consecutive frame count - "stable_tracks": set(), # Set of track IDs that have reached stability threshold + "track_stability_counters": {}, + "stable_tracks": set(), "session_state": { "active": True, - "waiting_for_backend_session": False, - "wait_start_time": 0.0, + "cooldown_until": 0.0, "reset_tracker_on_resume": False - }, - "occupancy_state": { - "phase": "validation", # "validation", "waiting_for_session", or "occupancy" - "absence_counter": 0, # Count consecutive frames without stable tracks - "max_absence_frames": 3, # Trigger "none" after this many absent frames - "pipeline_completed": False # Track if full pipeline has run } - # Removed detection_counter - using only track-based validation now } return _camera_stability_tracking[camera_id][model_id] -def update_single_track_stability(node, detection, camera_id, frame_shape=None, stability_threshold=4): - """Update track stability validation for a single highest confidence car.""" - model_id = node.get("modelId", "unknown") - - # Branch nodes should not do validation - only main pipeline should - is_branch_node = node.get("cropClass") is not None or node.get("parallel") is True - if is_branch_node: - logger.debug(f"⏭️ Camera {camera_id}: Skipping validation for branch node {model_id} - validation only done at main pipeline level") - return {"validation_complete": False, "branch_node": True, "stable_tracks": [], "current_tracks": []} - - # Get camera-specific stability data - stability_data = get_camera_stability_data(camera_id, model_id) - track_counters = stability_data["track_stability_counters"] - stable_tracks = stability_data["stable_tracks"] - occupancy_state = stability_data["occupancy_state"] - - current_phase = occupancy_state["phase"] - current_track_id = detection.get("id") if detection else None - - if current_phase == "validation": - # ═══ VALIDATION PHASE: Count consecutive frames for single track ═══ - logger.debug(f"📋 Camera {camera_id}: === TRACK VALIDATION ANALYSIS ===") - logger.debug(f"📋 Camera {camera_id}: Current track_id: {current_track_id}") - logger.debug(f"📋 Camera {camera_id}: Existing counters: {dict(track_counters)}") - logger.debug(f"📋 Camera {camera_id}: Stable tracks: {list(stable_tracks)}") - - if current_track_id is not None: - # Check if this is a different track than we were tracking - previous_track_ids = list(track_counters.keys()) - - # ALWAYS reset counter if: - # 1. This is a different track ID than before - # 2. OR if we had no previous tracking (fresh start) - should_reset = ( - len(previous_track_ids) == 0 or # No previous tracking - current_track_id not in previous_track_ids # Different track ID - ) - - logger.debug(f"📋 Camera {camera_id}: Previous track_ids: {previous_track_ids}") - logger.debug(f"📋 Camera {camera_id}: Should reset counters: {should_reset} (no_previous={len(previous_track_ids) == 0}, different_id={current_track_id not in previous_track_ids})") - - if should_reset and previous_track_ids: - # Clear all previous tracking - different car detected - for old_track_id in previous_track_ids: - old_count = track_counters.pop(old_track_id, 0) - stable_tracks.discard(old_track_id) - logger.info(f"🔄 Camera {camera_id}: Different car detected (track {current_track_id}) - RESET previous track {old_track_id} counter from {old_count} to 0") - logger.debug(f"🔄 Camera {camera_id}: Cleared track {old_track_id} from counters and stable_tracks") - - # Set counter to 1 for current track (fresh start each frame) - old_count = track_counters.get(current_track_id, 0) - track_counters[current_track_id] = track_counters.get(current_track_id, 0) + 1 - current_count = track_counters[current_track_id] - - logger.debug(f"🔢 Camera {camera_id}: Track {current_track_id} counter: {old_count} → {current_count}") - logger.info(f"🔍 Camera {camera_id}: Track ID {current_track_id} validation {current_count}/{stability_threshold}") - - # Check if track has reached stability threshold - logger.debug(f"📊 Camera {camera_id}: Checking stability: {current_count} >= {stability_threshold}? {current_count >= stability_threshold}") - logger.debug(f"📊 Camera {camera_id}: Already stable: {current_track_id in stable_tracks}") - - if current_count >= stability_threshold and current_track_id not in stable_tracks: - stable_tracks.add(current_track_id) - occupancy_state["phase"] = "waiting_for_session" - occupancy_state["pipeline_completed"] = False - logger.info(f"✅ Camera {camera_id}: Track ID {current_track_id} STABLE after {current_count} consecutive frames") - logger.info(f"🎯 Camera {camera_id}: TRACK VALIDATION COMPLETE") - logger.debug(f"🎯 Camera {camera_id}: Phase changed to: waiting_for_session") - logger.debug(f"🎯 Camera {camera_id}: Stable tracks now: {list(stable_tracks)}") - return { - "validation_complete": True, - "send_none_detection": True, - "stable_tracks": [current_track_id], - "newly_stable_tracks": [current_track_id], - "current_tracks": [current_track_id] - } - elif current_count >= stability_threshold: - logger.debug(f"📊 Camera {camera_id}: Track {current_track_id} already stable - not re-adding") - else: - # No car detected - ALWAYS clear all tracking and reset counters - logger.debug(f"🚫 Camera {camera_id}: NO CAR DETECTED - clearing all tracking") - if track_counters: - logger.debug(f"🚫 Camera {camera_id}: Existing counters before reset: {dict(track_counters)}") - for track_id in list(track_counters.keys()): - old_count = track_counters.pop(track_id, 0) - stable_tracks.discard(track_id) - logger.info(f"🔄 Camera {camera_id}: No car detected - RESET track {track_id} counter from {old_count} to 0") - logger.debug(f"🚫 Camera {camera_id}: Cleared track {track_id} (was at {old_count}/{stability_threshold})") - track_counters.clear() # Ensure complete reset - stable_tracks.clear() # Clear all stable tracks - logger.debug(f"🚫 Camera {camera_id}: All counters and stable tracks cleared") - else: - logger.debug(f"🚫 Camera {camera_id}: No existing counters to clear") - logger.debug(f"Camera {camera_id}: VALIDATION - no car detected (all counters reset)") - - elif current_phase == "waiting_for_session": - # ═══ WAITING PHASE: Maintain track stability ═══ - logger.debug(f"⏳ Camera {camera_id}: WAITING FOR SESSION - monitoring stable track") - logger.debug(f"⏳ Camera {camera_id}: Current track_id: {current_track_id}, Stable tracks: {list(stable_tracks)}") - - if current_track_id is None or current_track_id not in stable_tracks: - # Lost the stable track - logger.debug(f"⏳ Camera {camera_id}: Stable track lost - clearing all tracking") - stable_tracks.clear() - track_counters.clear() - logger.info(f"🔄 Camera {camera_id}: Lost stable track during waiting phase") - else: - logger.debug(f"⏳ Camera {camera_id}: Stable track {current_track_id} still present") - - elif current_phase == "occupancy": - # ═══ OCCUPANCY PHASE: Monitor track presence ═══ - logger.debug(f"🏢 Camera {camera_id}: OCCUPANCY MONITORING") - logger.debug(f"🏢 Camera {camera_id}: Current track_id: {current_track_id}, Stable tracks: {list(stable_tracks)}") - logger.debug(f"🏢 Camera {camera_id}: Absence counter before: {occupancy_state['absence_counter']}") - - if current_track_id is not None and current_track_id in stable_tracks: - old_absence = occupancy_state["absence_counter"] - occupancy_state["absence_counter"] = 0 - if old_absence > 0: - logger.debug(f"🏢 Camera {camera_id}: Stable car returned - absence counter reset from {old_absence} to 0") - else: - occupancy_state["absence_counter"] += 1 - logger.debug(f"🏢 Camera {camera_id}: Stable car absent - absence counter: {occupancy_state['absence_counter']}") - if occupancy_state["absence_counter"] == 1: - logger.info(f"👻 Camera {camera_id}: Stable car disappeared - absence counter: {occupancy_state['absence_counter']}") - - # Final return - validation not complete - result = { - "validation_complete": False, - "stable_tracks": list(stable_tracks), - "current_tracks": [current_track_id] if current_track_id is not None else [] - } - - logger.debug(f"📋 Camera {camera_id}: Track stability result: {result}") - logger.debug(f"📋 Camera {camera_id}: Final counters: {dict(track_counters)}") - logger.debug(f"📋 Camera {camera_id}: Final stable tracks: {list(stable_tracks)}") - - return result - -# Keep the old function for backward compatibility but mark as deprecated -def update_track_stability_validation(node, detections, camera_id, frame_shape=None, stability_threshold=4): - """DEPRECATED: Use update_single_track_stability instead.""" - logger.warning(f"update_track_stability_validation called for camera {camera_id} - this function is deprecated, use update_single_track_stability instead") - if detections: - best_detection = max(detections, key=lambda x: x.get("confidence", 0)) - return update_single_track_stability(node, best_detection, camera_id, frame_shape, stability_threshold) - else: - return update_single_track_stability(node, None, camera_id, frame_shape, stability_threshold) - -def update_detection_stability(node, detections, camera_id, frame_shape=None): - """Legacy detection-based stability counter - DEPRECATED.""" - # This function is deprecated in favor of track-based validation only - logger.warning(f"update_detection_stability called for camera {camera_id} - this function is deprecated, use track-based validation instead") - return {"validation_complete": False, "valid_detections": 0, "deprecated": True} - -def update_track_stability(node, detections, camera_id, frame_shape=None): - """Update stability counters with two-phase detection system: validation → occupancy.""" +def update_track_stability(node, detections, camera_id): + """Update stability counters for tracked objects per camera.""" stability_threshold = node.get("stabilityThreshold", 1) model_id = node.get("modelId", "unknown") - min_bbox_area_ratio = node.get("minBboxAreaRatio", 0.0) - - # Note: This function is deprecated - using detection-based stability now # Get camera-specific stability data stability_data = get_camera_stability_data(camera_id, model_id) track_counters = stability_data["track_stability_counters"] stable_tracks = stability_data["stable_tracks"] - occupancy_state = stability_data["occupancy_state"] - # Validate detections against confidence + area requirements - valid_detections = [] - if frame_shape is not None: - frame_height, frame_width = frame_shape[:2] - frame_area = frame_width * frame_height - - for detection in detections: - bbox = detection.get("bbox", []) - if len(bbox) >= 4: - x1, y1, x2, y2 = bbox - bbox_width = abs(x2 - x1) - bbox_height = abs(y2 - y1) - bbox_area = bbox_width * bbox_height - area_ratio = bbox_area / frame_area if frame_area > 0 else 0.0 - - if area_ratio >= min_bbox_area_ratio: - valid_detections.append(detection) - pass # Valid detection - no debug spam - else: - pass # Small detection - no debug spam - else: - valid_detections = detections - - current_phase = occupancy_state["phase"] - - if current_phase == "validation": - # ═══ VALIDATION PHASE: Count detections until stable ═══ - detection_key = f"camera_{camera_id}_detections" - - if valid_detections: - # Valid detection found - increment counter - track_counters[detection_key] = track_counters.get(detection_key, 0) + 1 - current_count = track_counters[detection_key] + # Get current track IDs from detections + current_track_ids = set() + for detection in detections: + track_id = detection.get("id") + if track_id is not None: + current_track_ids.add(track_id) - pass # Validation count - shown in main logs + # Increment counter for this track + track_counters[track_id] = track_counters.get(track_id, 0) + 1 - # Check if we've reached the stability threshold - if current_count >= stability_threshold and detection_key not in stable_tracks: - stable_tracks.add(detection_key) - # Switch to waiting for backend session phase - occupancy_state["phase"] = "waiting_for_session" - occupancy_state["absence_counter"] = 0 - occupancy_state["pipeline_completed"] = False - logger.info(f"✅ Camera {camera_id}: VALIDATION COMPLETE after {current_count} detections - READY FOR FULL PIPELINE") - else: - # No valid detections - reset validation counter for consecutive requirement - if detection_key in track_counters: - old_count = track_counters[detection_key] - track_counters.pop(detection_key, None) - stable_tracks.discard(detection_key) - logger.info(f"🔄 Camera {camera_id}: VALIDATION RESET - no valid detection, counter reset from {old_count} to 0 (requires consecutive detections)") - else: - logger.debug(f"Camera {camera_id}: VALIDATION - no valid detection, counter remains 0") + # Check if track becomes stable + if track_counters[track_id] >= stability_threshold and track_id not in stable_tracks: + stable_tracks.add(track_id) + logger.info(f"Camera {camera_id}: Track ID {track_id} became stable after {track_counters[track_id]} detections (threshold: {stability_threshold})") - elif current_phase == "waiting_for_session": - # ═══ WAITING FOR BACKEND SESSION PHASE ═══ - # Don't do occupancy monitoring yet, just maintain validation of current detections - # The main pipeline will handle sessionId detection and phase transition - pass # Waiting phase - no occupancy logic yet - - elif current_phase == "occupancy": - # ═══ OCCUPANCY PHASE: Monitor car presence ═══ - if valid_detections: - # Car still present - reset absence counter - if occupancy_state["absence_counter"] > 0: - pass # Car detected - counter reset (no debug spam) - occupancy_state["absence_counter"] = 0 - else: - # No car detected - increment absence counter - occupancy_state["absence_counter"] += 1 - pass # Absence count - will show in timeout log + # Clean up counters for tracks that disappeared + disappeared_tracks = set(track_counters.keys()) - current_track_ids + for track_id in disappeared_tracks: + logger.debug(f"Camera {camera_id}: Track ID {track_id} disappeared, removing from counters") + track_counters.pop(track_id, None) + stable_tracks.discard(track_id) - pass # Phase summary - excessive debug - - # Return occupancy state for pipeline decisions - return occupancy_state + logger.debug(f"Camera {camera_id}: Track stability: active={list(current_track_ids)}, stable={list(stable_tracks)}, counters={track_counters}") def check_stable_tracks(camera_id, model_id, regions_dict): """Check if any stable tracks match the detected classes for a specific camera.""" @@ -1077,9 +785,8 @@ def check_stable_tracks(camera_id, model_id, regions_dict): if not stable_tracks: return False, [] - # Check for track-based stability + # Check if any detection in regions_dict has a stable track ID stable_detections = [] - for class_name, region_data in regions_dict.items(): detection = region_data.get("detection", {}) track_id = detection.get("id") @@ -1091,79 +798,70 @@ def check_stable_tracks(camera_id, model_id, regions_dict): has_stable_tracks = len(stable_detections) > 0 return has_stable_tracks, stable_detections -def reset_tracking_state(camera_id, model_id, reason="session ended"): - """Reset tracking state after session completion or timeout.""" +def start_cooldown_timer(camera_id, model_id): + """Start 30-second cooldown timer after successful pipeline completion.""" stability_data = get_camera_stability_data(camera_id, model_id) session_state = stability_data["session_state"] - # Clear all tracking data for fresh start - stability_data["track_stability_counters"].clear() - stability_data["stable_tracks"].clear() - session_state["active"] = True - session_state["waiting_for_backend_session"] = False - session_state["wait_start_time"] = 0.0 - session_state["reset_tracker_on_resume"] = True + # Start timer-based cooldown + cooldown_until = time.time() + _cooldown_duration_seconds + session_state["cooldown_until"] = cooldown_until + session_state["active"] = False + session_state["reset_tracker_on_resume"] = True # Flag to reset YOLO tracker - logger.info(f"Camera {camera_id}: 🔄 Reset tracking state - {reason}") - logger.info(f"Camera {camera_id}: 🧹 Cleared stability counters and stable tracks for fresh session") + logger.info(f"Camera {camera_id}: 🛑 Starting {_cooldown_duration_seconds}s cooldown timer (until: {cooldown_until:.2f})") + + # DO NOT clear tracking state here - preserve it during cooldown + # Tracking state will be cleared when cooldown expires and new session starts def is_camera_active(camera_id, model_id): - """Check if camera should be processing detections.""" + """Check if camera should be processing detections (timer-based cooldown).""" stability_data = get_camera_stability_data(camera_id, model_id) session_state = stability_data["session_state"] - # Check if waiting for backend sessionId has timed out - if session_state.get("waiting_for_backend_session", False): + # Check if cooldown timer has expired + if not session_state["active"]: current_time = time.time() - wait_start_time = session_state.get("wait_start_time", 0) - elapsed_time = current_time - wait_start_time + cooldown_until = session_state["cooldown_until"] + remaining_time = cooldown_until - current_time - if elapsed_time >= _session_timeout_seconds: - logger.warning(f"Camera {camera_id}: Backend sessionId timeout ({_session_timeout_seconds}s) - resetting tracking") - reset_tracking_state(camera_id, model_id, "backend sessionId timeout") - return True + if current_time >= cooldown_until: + session_state["active"] = True + session_state["reset_tracker_on_resume"] = True # Ensure tracker reset flag is set + + # Clear tracking state NOW - before new detection session starts + stability_data["track_stability_counters"].clear() + stability_data["stable_tracks"].clear() + + logger.info(f"Camera {camera_id}: 📢 Cooldown timer ended, resuming detection with fresh track IDs") + logger.info(f"Camera {camera_id}: 🧹 Cleared stability counters and stable tracks for fresh session") else: - remaining_time = _session_timeout_seconds - elapsed_time - logger.debug(f"Camera {camera_id}: Still waiting for backend sessionId - {remaining_time:.1f}s remaining") - return False + logger.debug(f"Camera {camera_id}: Still in cooldown - {remaining_time:.1f}s remaining") - return session_state.get("active", True) + return session_state["active"] def cleanup_camera_stability(camera_id): - """Clean up stability tracking data when a camera is disconnected.""" + """Clean up stability tracking data when a camera is disconnected, preserving cooldown timers.""" global _camera_stability_tracking if camera_id in _camera_stability_tracking: - del _camera_stability_tracking[camera_id] - logger.info(f"Cleaned up stability tracking data for camera {camera_id}") - -def occupancy_detector(camera_id, model_id, enable=True): - """ - Temporary function to stop model inference after pipeline completion. - - Args: - camera_id (str): Camera identifier - model_id (str): Model identifier - enable (bool): True to enable occupancy mode (stop model after pipeline), False to disable - - When enabled: - - Model stops inference after completing full pipeline - - Backend sessionId handling continues in background - - Note: This is a temporary function that will be changed in the future. - """ - stability_data = get_camera_stability_data(camera_id, model_id) - session_state = stability_data["session_state"] - - if enable: - session_state["occupancy_mode"] = True - session_state["occupancy_enabled_at"] = time.time() - logger.info(f"Camera {camera_id}: 🏢 OCCUPANCY MODE ENABLED - model will stop after pipeline completion") - else: - session_state["occupancy_mode"] = False - session_state.pop("occupancy_enabled_at", None) - logger.info(f"Camera {camera_id}: 🔄 OCCUPANCY MODE DISABLED - model will continue running") - - return session_state.get("occupancy_mode", False) + # Check if any models are still in cooldown before cleanup + models_in_cooldown = [] + for model_id, model_data in _camera_stability_tracking[camera_id].items(): + session_state = model_data.get("session_state", {}) + if not session_state.get("active", True) and time.time() < session_state.get("cooldown_until", 0): + cooldown_remaining = session_state["cooldown_until"] - time.time() + models_in_cooldown.append((model_id, cooldown_remaining)) + logger.warning(f"⚠️ Camera {camera_id}: Model {model_id} is in cooldown ({cooldown_remaining:.1f}s remaining) - preserving timer!") + + if models_in_cooldown: + # DO NOT clear any tracking data during cooldown - preserve everything + logger.warning(f"⚠️ Camera {camera_id}: PRESERVING ALL data during cooldown - no cleanup performed!") + logger.warning(f" - Track IDs will reset only AFTER cooldown expires") + logger.warning(f" - Stability counters preserved until cooldown ends") + else: + # Safe to delete everything - no active cooldowns + del _camera_stability_tracking[camera_id] + logger.info(f"Cleaned up stability tracking data for camera {camera_id} (no active cooldowns)") def validate_pipeline_execution(node, regions_dict): """ @@ -1224,143 +922,6 @@ def validate_pipeline_execution(node, regions_dict): logger.info(f"Pipeline pre-validation PASSED: all required branches {list(required_branches)} will execute") return True, [] -def run_lightweight_detection_with_validation(frame, node: dict, min_confidence=0.7, min_bbox_area_ratio=0.3): - """ - Run lightweight detection with validation rules for session ID triggering. - Returns detection info only if it passes validation thresholds. - """ - logger.debug(f"Running lightweight detection with validation: {node['modelId']} (conf>={min_confidence}, bbox_area>={min_bbox_area_ratio})") - - try: - # Run basic detection only - no branches, no actions - model = node["model"] - trigger_classes = node.get("triggerClasses", []) - trigger_class_indices = node.get("triggerClassIndices") - - # Run YOLO inference - res = model(frame, verbose=False) - - best_detection = None - frame_height, frame_width = frame.shape[:2] - frame_area = frame_height * frame_width - - for r in res: - boxes = r.boxes - if boxes is None or len(boxes) == 0: - continue - - for box in boxes: - # Extract detection info - xyxy = box.xyxy[0].cpu().numpy() - conf = box.conf[0].cpu().numpy() - cls_id = int(box.cls[0].cpu().numpy()) - class_name = model.names[cls_id] - - # Apply confidence threshold - if conf < min_confidence: - continue - - # Apply trigger class filtering if specified - if trigger_class_indices and cls_id not in trigger_class_indices: - continue - if trigger_classes and class_name not in trigger_classes: - continue - - # Calculate bbox area ratio - x1, y1, x2, y2 = xyxy - bbox_area = (x2 - x1) * (y2 - y1) - bbox_area_ratio = bbox_area / frame_area if frame_area > 0 else 0 - - # Apply bbox area threshold - if bbox_area_ratio < min_bbox_area_ratio: - logger.debug(f"Detection filtered out: bbox_area_ratio={bbox_area_ratio:.3f} < {min_bbox_area_ratio}") - continue - - # Validation passed - if not best_detection or conf > best_detection["confidence"]: - best_detection = { - "class": class_name, - "confidence": float(conf), - "bbox": [int(x) for x in xyxy], - "bbox_area_ratio": float(bbox_area_ratio), - "validation_passed": True - } - - if best_detection: - logger.debug(f"Validation PASSED: {best_detection['class']} (conf: {best_detection['confidence']:.3f}, area: {best_detection['bbox_area_ratio']:.3f})") - return best_detection - else: - logger.debug(f"Validation FAILED: No detection meets criteria (conf>={min_confidence}, area>={min_bbox_area_ratio})") - return {"validation_passed": False} - - except Exception as e: - logger.error(f"Error in lightweight detection with validation: {str(e)}", exc_info=True) - return {"validation_passed": False} - -def run_lightweight_detection(frame, node: dict): - """ - Run lightweight detection for car presence validation only. - Returns basic detection info without running branches or external actions. - """ - logger.debug(f"Running lightweight detection: {node['modelId']}") - - try: - # Run basic detection only - no branches, no actions - model = node["model"] - min_confidence = node.get("minConfidence", 0.5) - trigger_classes = node.get("triggerClasses", []) - trigger_class_indices = node.get("triggerClassIndices") - - # Run YOLO inference - res = model(frame, verbose=False) - - car_detected = False - best_detection = None - - for r in res: - boxes = r.boxes - if boxes is None or len(boxes) == 0: - continue - - for box in boxes: - # Extract detection info - xyxy = box.xyxy[0].cpu().numpy() - conf = box.conf[0].cpu().numpy() - cls_id = int(box.cls[0].cpu().numpy()) - class_name = model.names[cls_id] - - # Apply confidence threshold - if conf < min_confidence: - continue - - # Apply trigger class filtering if specified - if trigger_class_indices and cls_id not in trigger_class_indices: - continue - if trigger_classes and class_name not in trigger_classes: - continue - - # Car detected - car_detected = True - if not best_detection or conf > best_detection["confidence"]: - best_detection = { - "class": class_name, - "confidence": float(conf), - "bbox": [int(x) for x in xyxy] - } - - logger.debug(f"Lightweight detection result: car_detected={car_detected}") - if best_detection: - logger.debug(f"Best detection: {best_detection['class']} (conf: {best_detection['confidence']:.3f})") - - return { - "car_detected": car_detected, - "best_detection": best_detection - } - - except Exception as e: - logger.error(f"Error in lightweight detection: {str(e)}", exc_info=True) - return {"car_detected": False, "best_detection": None} - def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None): """ Enhanced pipeline that supports: @@ -1370,14 +931,6 @@ def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None): - Context passing for session/camera information """ try: - # Extract backend sessionId from context at the start of function - backend_session_id = context.get("backend_session_id") if context else None - camera_id = context.get("camera_id", "unknown") if context else "unknown" - model_id = node.get("modelId", "unknown") - - if backend_session_id: - logger.info(f"🔑 PIPELINE USING BACKEND SESSION_ID: {backend_session_id} for camera {camera_id}") - task = getattr(node["model"], "task", None) # ─── Classification stage ─────────────────────────────────── @@ -1411,166 +964,47 @@ def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None): elif "color" in model_id: det["color"] = class_name - execute_actions(node, frame, det, context.get("regions_dict") if context else None) + execute_actions(node, frame, det) return (det, None) if return_bbox else det - # ─── Occupancy mode check (stop future frames after pipeline completion) ─────────────────────────────────────── - # Old occupancy mode logic removed - now using two-phase detection system - # ─── Session management check ─────────────────────────────────────── + camera_id = context.get("camera_id", "unknown") if context else "unknown" + model_id = node.get("modelId", "unknown") + if not is_camera_active(camera_id, model_id): - logger.debug(f"⏰ Camera {camera_id}: Waiting for backend sessionId, sending 'none' detection") - none_detection = { - "class": "none", - "confidence": 1.0, - "bbox": [0, 0, 0, 0], - "branch_results": {} - } - return (none_detection, [0, 0, 0, 0]) if return_bbox else none_detection + logger.info(f"⏰ Camera {camera_id}: Tracker stopped - in cooldown period, skipping all detection") + return (None, None) if return_bbox else None # ─── Detection stage - Using structured detection function ────────────────── - all_detections, regions_dict, track_validation_result = run_detection_with_tracking(frame, node, context) + all_detections, regions_dict = run_detection_with_tracking(frame, node, context) if not all_detections: - logger.debug("No detections from structured detection function - sending 'none' detection") - none_detection = { - "class": "none", - "confidence": 1.0, - "bbox": [0, 0, 0, 0], - "branch_results": {} - } - return (none_detection, [0, 0, 0, 0]) if return_bbox else none_detection + logger.warning("No detections from structured detection function - returning null") + return (None, None) if return_bbox else None # Extract bounding boxes for compatibility all_boxes = [det["bbox"] for det in all_detections] - # ─── Track-Based Validation System: Using Track ID Stability ──────────────────────── - tracking_config = node.get("tracking", {}) - stability_threshold = tracking_config.get("stabilityThreshold", node.get("stabilityThreshold", 1)) - - camera_id = context.get("camera_id", "unknown") if context else "unknown" - - if stability_threshold > 1 and tracking_config.get("enabled", True): - # Extract occupancy state from stability data (updated by track validation function) + # ─── Stability validation (only for root pipeline node) ──────────────────────── + stability_threshold = node.get("stabilityThreshold", 1) + if stability_threshold > 1: + # Extract camera_id for stability check + camera_id = context.get("camera_id", "unknown") if context else "unknown" model_id = node.get("modelId", "unknown") - stability_data = get_camera_stability_data(camera_id, model_id) - occupancy_state = stability_data["occupancy_state"] - current_phase = occupancy_state.get("phase", "validation") - absence_counter = occupancy_state.get("absence_counter", 0) - max_absence_frames = occupancy_state.get("max_absence_frames", 3) + # Check if we have stable tracks for this specific camera + has_stable_tracks, stable_detections = check_stable_tracks(camera_id, model_id, regions_dict) - if current_phase == "validation": - # ═══ TRACK VALIDATION PHASE ═══ - # Check if this is a branch node - branches should execute regardless of main validation state - is_branch_node = node.get("cropClass") is not None or node.get("parallel") is True - - if is_branch_node: - # This is a branch node - allow normal execution regardless of main pipeline validation - logger.debug(f"🔍 Camera {camera_id}: Branch node {model_id} executing during track validation phase") - else: - # Main pipeline node during track validation - check for stable tracks - stable_tracks = track_validation_result.get("stable_tracks", []) - - if not stable_tracks: - # No stable tracks yet - return detection without branches until track validation completes - if all_detections: - # Return the best detection but skip branches during validation - primary_detection = max(all_detections, key=lambda x: x["confidence"]) - logger.debug(f"🔍 Camera {camera_id}: TRACK VALIDATION PHASE - returning detection without branches (stable_tracks: {len(stable_tracks)}, sessionId: {backend_session_id or 'none'})") - else: - # No detection - return none - primary_detection = {"class": "none", "confidence": 0.0, "bbox": [0, 0, 0, 0]} - logger.debug(f"🔍 Camera {camera_id}: TRACK VALIDATION PHASE - no detection found (sessionId: {backend_session_id or 'none'})") - - primary_bbox = primary_detection.get("bbox", [0, 0, 0, 0]) - return (primary_detection, primary_bbox) if return_bbox else primary_detection - else: - # We have stable tracks - validation is complete, proceed with pipeline - logger.info(f"🎯 Camera {camera_id}: STABLE TRACKS DETECTED - proceeding with full pipeline (tracks: {stable_tracks})") - - elif current_phase == "waiting_for_session": - # ═══ WAITING FOR BACKEND SESSION PHASE ═══ - if backend_session_id: - # Backend has responded with sessionId - NOW run the full pipeline for the first time - logger.info(f"🎯 Camera {camera_id}: BACKEND SESSION RECEIVED - RUNNING FULL PIPELINE (sessionId: {backend_session_id})") - occupancy_state["phase"] = "occupancy" - occupancy_state["absence_counter"] = 0 - # Continue with normal pipeline processing now that we have sessionId - else: - # Still waiting for backend sessionId - send None detection dict to trigger sessionId generation - if not occupancy_state["pipeline_completed"]: - # First time in waiting phase - send empty detection to trigger sessionId - logger.info(f"⚙️ Camera {camera_id}: WAITING PHASE - sending empty detection {{}} for sessionId generation") - occupancy_state["pipeline_completed"] = True - - # Return a special detection that signals app.py to send empty detection: {} - none_detection = { - "class": "validation_complete", - "confidence": 1.0, - "bbox": [0, 0, 0, 0], - "send_empty_detection": True - } - return (none_detection, [0, 0, 0, 0]) if return_bbox else none_detection - else: - # Already sent None detection - continue waiting for sessionId - logger.debug(f"⏳ Camera {camera_id}: WAITING FOR BACKEND SESSION - None detection already sent, waiting for sessionId") - - waiting_detection = { - "class": "waiting_session_id", - "confidence": 1.0, - "bbox": [0, 0, 0, 0], - "waiting_for_session": True - } - return (waiting_detection, [0, 0, 0, 0]) if return_bbox else waiting_detection - - elif current_phase == "occupancy": - # ═══ OCCUPANCY PHASE ═══ - stable_tracks = track_validation_result.get("stable_tracks", []) - current_tracks = track_validation_result.get("current_tracks", []) - - # Check if any stable tracks are still present - stable_tracks_present = bool(set(stable_tracks) & set(current_tracks)) - - if absence_counter >= max_absence_frames: - # Stable tracks have been absent for too long - trigger "none" detection and reset - logger.info(f"🕒 Camera {camera_id}: OCCUPANCY TIMEOUT - Stable tracks absent for {absence_counter} frames, resetting to validation (sessionId: {backend_session_id or 'none'})") - - # Reset occupancy state to validation phase - stability_data = get_camera_stability_data(camera_id, model_id) - stability_data["occupancy_state"]["phase"] = "validation" - stability_data["occupancy_state"]["absence_counter"] = 0 - stability_data["track_stability_counters"].clear() - stability_data["stable_tracks"].clear() - - logger.info(f"🔄 Camera {camera_id}: RESET TO VALIDATION PHASE - cleared track stability tracking (sessionId should become null)") - - # Return "none" detection to trigger cache clearing in app.py - none_detection = {"class": "none", "confidence": 1.0, "bbox": [0, 0, 0, 0], "occupancy_triggered": True} - return (none_detection, [0, 0, 0, 0]) if return_bbox else none_detection - else: - # Still in occupancy phase - check if stable tracks are present - if stable_tracks_present: - # Stable tracks detected - continue with cached result or light processing - logger.debug(f"👁️ Camera {camera_id}: OCCUPANCY PHASE - stable tracks present: {set(stable_tracks) & set(current_tracks)} (sessionId: {backend_session_id or 'none'})") - else: - # No stable tracks - absence counter was already incremented in track validation - logger.debug(f"👁️ Camera {camera_id}: OCCUPANCY PHASE - stable tracks absent {absence_counter}/{max_absence_frames} (sessionId: {backend_session_id or 'none'})") - - # Continue with normal pipeline processing - pass + if not has_stable_tracks: + logger.info(f"Camera {camera_id}: Track not stable yet (threshold: {stability_threshold}) - validation only, skipping branches") + # Return early with just the detection result, no branch processing + primary_detection = max(all_detections, key=lambda x: x["confidence"]) if all_detections else {"class": "none", "confidence": 0.0, "bbox": [0, 0, 0, 0]} + primary_bbox = primary_detection.get("bbox", [0, 0, 0, 0]) + return (primary_detection, primary_bbox) if return_bbox else primary_detection + else: + logger.info(f"Camera {camera_id}: Stable tracks {[det[1] for det in stable_detections]} detected - proceeding with full pipeline") - # ─── Pre-validate pipeline execution (only proceed if we have stable tracks for main pipeline) ──────────────────────── - is_branch_node = node.get("cropClass") is not None or node.get("parallel") is True - - if not is_branch_node and stability_threshold > 1 and tracking_config.get("enabled", True): - # Main pipeline node with tracking - check for stable tracks before proceeding - stable_tracks = track_validation_result.get("stable_tracks", []) - if not stable_tracks: - logger.debug(f"🔒 Camera {camera_id}: Main pipeline requires stable tracks - none found, skipping pipeline execution") - none_detection = {"class": "none", "confidence": 1.0, "bbox": [0, 0, 0, 0], "awaiting_stable_tracks": True} - return (none_detection, [0, 0, 0, 0]) if return_bbox else none_detection - + # ─── Pre-validate pipeline execution ──────────────────────── pipeline_valid, missing_branches = validate_pipeline_execution(node, regions_dict) if not pipeline_valid: @@ -1585,42 +1019,37 @@ def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None): **(context or {}) } - # ─── Database operations will be handled when backend sessionId is received ──── - - if node.get("db_manager") and regions_dict: - detected_classes = list(regions_dict.keys()) - logger.debug(f"Valid detections found: {detected_classes}") + # ─── Create initial database record when Car+Frontal detected ──── + if node.get("db_manager") and node.get("multiClass", False): + # Only create database record if we have both Car and Frontal + has_car = "Car" in regions_dict + has_frontal = "Frontal" in regions_dict - if backend_session_id: - # Backend sessionId is available, proceed with database operations + if has_car and has_frontal: + # Generate UUID session_id since client session is None for now + import uuid as uuid_lib from datetime import datetime + generated_session_id = str(uuid_lib.uuid4()) + + # Insert initial detection record display_id = detection_result.get("display_id", "unknown") timestamp = datetime.now().strftime("%Y-%m-%dT%H-%M-%S") inserted_session_id = node["db_manager"].insert_initial_detection( display_id=display_id, captured_timestamp=timestamp, - session_id=backend_session_id + session_id=generated_session_id ) if inserted_session_id: + # Update detection_result with the generated session_id for actions and branches detection_result["session_id"] = inserted_session_id - detection_result["timestamp"] = timestamp - logger.info(f"💾 DATABASE RECORD CREATED with backend session_id: {inserted_session_id}") - logger.debug(f"Database record: display_id={display_id}, timestamp={timestamp}") - else: - logger.error(f"Failed to create database record with backend session_id: {backend_session_id}") + detection_result["timestamp"] = timestamp # Update with proper timestamp + logger.info(f"Created initial database record with session_id: {inserted_session_id}") else: - logger.info(f"📡 Camera {camera_id}: Full pipeline completed, detection data will be sent to backend. Database operations will occur when sessionId is received.") - # Store detection info for later database operations when sessionId arrives - detection_result["awaiting_session_id"] = True - from datetime import datetime - detection_result["timestamp"] = datetime.now().strftime("%Y-%m-%dT%H-%M-%S") + logger.debug(f"Database record not created - missing required classes. Has Car: {has_car}, Has Frontal: {has_frontal}") - # Execute actions for root node only if it doesn't have branches - # Branch nodes with actions will execute them after branch processing - if not node.get("branches") or node.get("modelId") == "yolo11n": - execute_actions(node, frame, detection_result, regions_dict) + execute_actions(node, frame, detection_result, regions_dict) # ─── Branch processing (no stability check here) ───────────────────────────── if node["branches"]: @@ -1660,37 +1089,21 @@ def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None): futures = {} for br in active_branches: + crop_class = br.get("cropClass", br.get("triggerClasses", [])[0] if br.get("triggerClasses") else None) sub_frame = frame - crop_class = br.get("cropClass") - logger.info(f"Starting parallel branch: {br['modelId']}, cropClass: {crop_class}") + logger.info(f"Starting parallel branch: {br['modelId']}, crop_class: {crop_class}") if br.get("crop", False) and crop_class: - if crop_class in regions_dict: - cropped = crop_region_by_class(frame, regions_dict, crop_class) - if cropped is not None: - sub_frame = cropped # Use cropped image without manual resizing - logger.debug(f"Successfully cropped {crop_class} region for {br['modelId']} - model will handle resizing") - else: - logger.warning(f"Failed to crop {crop_class} region for {br['modelId']}, skipping branch") - continue + cropped = crop_region_by_class(frame, regions_dict, crop_class) + if cropped is not None: + sub_frame = cv2.resize(cropped, (224, 224)) + logger.debug(f"Successfully cropped {crop_class} region for {br['modelId']}") else: - logger.warning(f"Crop class {crop_class} not found in detected regions for {br['modelId']}, skipping branch") + logger.warning(f"Failed to crop {crop_class} region for {br['modelId']}, skipping branch") continue - # Add regions_dict and session_id to context for child branches - branch_context = dict(context) if context else {} - branch_context["regions_dict"] = regions_dict - - # Pass session_id from detection_result to branch context for Redis actions - if "session_id" in detection_result: - branch_context["session_id"] = detection_result["session_id"] - logger.debug(f"Added session_id to branch context: {detection_result['session_id']}") - elif backend_session_id: - branch_context["session_id"] = backend_session_id - logger.debug(f"Added backend_session_id to branch context: {backend_session_id}") - - future = executor.submit(run_pipeline, sub_frame, br, True, branch_context) + future = executor.submit(run_pipeline, sub_frame, br, True, context) futures[future] = br # Collect results @@ -1706,38 +1119,22 @@ def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None): else: # Run branches sequentially for br in active_branches: + crop_class = br.get("cropClass", br.get("triggerClasses", [])[0] if br.get("triggerClasses") else None) sub_frame = frame - crop_class = br.get("cropClass") - logger.info(f"Starting sequential branch: {br['modelId']}, cropClass: {crop_class}") + logger.info(f"Starting sequential branch: {br['modelId']}, crop_class: {crop_class}") if br.get("crop", False) and crop_class: - if crop_class in regions_dict: - cropped = crop_region_by_class(frame, regions_dict, crop_class) - if cropped is not None: - sub_frame = cropped # Use cropped image without manual resizing - logger.debug(f"Successfully cropped {crop_class} region for {br['modelId']} - model will handle resizing") - else: - logger.warning(f"Failed to crop {crop_class} region for {br['modelId']}, skipping branch") - continue + cropped = crop_region_by_class(frame, regions_dict, crop_class) + if cropped is not None: + sub_frame = cv2.resize(cropped, (224, 224)) + logger.debug(f"Successfully cropped {crop_class} region for {br['modelId']}") else: - logger.warning(f"Crop class {crop_class} not found in detected regions for {br['modelId']}, skipping branch") + logger.warning(f"Failed to crop {crop_class} region for {br['modelId']}, skipping branch") continue try: - # Add regions_dict and session_id to context for child branches - branch_context = dict(context) if context else {} - branch_context["regions_dict"] = regions_dict - - # Pass session_id from detection_result to branch context for Redis actions - if "session_id" in detection_result: - branch_context["session_id"] = detection_result["session_id"] - logger.debug(f"Added session_id to sequential branch context: {detection_result['session_id']}") - elif backend_session_id: - branch_context["session_id"] = backend_session_id - logger.debug(f"Added backend_session_id to sequential branch context: {backend_session_id}") - - result, _ = run_pipeline(sub_frame, br, True, branch_context) + result, _ = run_pipeline(sub_frame, br, True, context) if result: branch_results[br["modelId"]] = result logger.info(f"Branch {br['modelId']} completed: {result}") @@ -1755,25 +1152,9 @@ def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None): if node.get("parallelActions") and "branch_results" in detection_result: execute_parallel_actions(node, frame, detection_result, regions_dict) - # ─── Auto-enable occupancy mode after successful pipeline completion ───────────────── - camera_id = context.get("camera_id", "unknown") if context else "unknown" - model_id = node.get("modelId", "unknown") - - # Enable occupancy detector automatically after first successful pipeline - logger.info(f"Camera {camera_id}: Pipeline completed successfully - auto-enabling occupancy mode") - occupancy_detector(camera_id, model_id, enable=True) - - logger.info(f"✅ Camera {camera_id}: Pipeline completed, detection data will be sent to backend") - logger.info(f"🛑 Camera {camera_id}: Model will stop inference for future frames") - logger.info(f"📡 Backend sessionId will be handled when received via WebSocket") - - # ─── Execute actions after successful detection AND branch processing ────────── - # This ensures detection nodes (like frontal_detection_v1) execute their actions - # after completing both detection and branch processing - if node.get("actions") and regions_dict and node.get("modelId") != "yolo11n": - # Execute actions for branch detection nodes, skip root to avoid duplication - logger.debug(f"Executing post-detection actions for branch node {node.get('modelId')}") - execute_actions(node, frame, detection_result, regions_dict) + # ─── Start 30s cooldown timer after successful pipeline completion ───────────────── + start_cooldown_timer(camera_id, model_id) + logger.info(f"Camera {camera_id}: Pipeline completed successfully, starting 30s cooldown") # ─── Return detection result ──────────────────────────────── primary_detection = max(all_detections, key=lambda x: x["confidence"]) @@ -1789,6 +1170,5 @@ def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None): except Exception as e: logger.error(f"Error in node {node.get('modelId')}: {e}") - import traceback traceback.print_exc() return (None, None) if return_bbox else None diff --git a/test/sample.png b/test/sample.png deleted file mode 100644 index 568e38f..0000000 Binary files a/test/sample.png and /dev/null differ diff --git a/test/sample2.png b/test/sample2.png deleted file mode 100644 index c1e8485..0000000 Binary files a/test/sample2.png and /dev/null differ diff --git a/test/test.py b/test/test.py deleted file mode 100644 index ff073c4..0000000 --- a/test/test.py +++ /dev/null @@ -1,60 +0,0 @@ -from ultralytics import YOLO -import cv2 -import os - -# Load the model -# model = YOLO('../models/webcam-local-01/4/bangchak_poc/yolo11n.pt') -model = YOLO('yolo11m.pt') - -def test_image(image_path): - """Test a single image with YOLO model""" - if not os.path.exists(image_path): - print(f"Image not found: {image_path}") - return - - # Run inference - filter for car class only (class 2 in COCO) - results = model(image_path, classes=[2, 5, 7]) # 2, 5, 7 = car, bus, truck in COCO dataset - - # Display results - for r in results: - im_array = r.plot() # plot a BGR numpy array of predictions - - # Resize image for display (max width/height 800px) - height, width = im_array.shape[:2] - max_dimension = 800 - if width > max_dimension or height > max_dimension: - if width > height: - new_width = max_dimension - new_height = int(height * (max_dimension / width)) - else: - new_height = max_dimension - new_width = int(width * (max_dimension / height)) - im_array = cv2.resize(im_array, (new_width, new_height)) - - # Show image with predictions - cv2.imshow('YOLO Test - Car Detection Only', im_array) - cv2.waitKey(0) - cv2.destroyAllWindows() - - # Print detection info - print(f"\nDetections for {image_path}:") - if r.boxes is not None and len(r.boxes) > 0: - for i, box in enumerate(r.boxes): - cls = int(box.cls[0]) - conf = float(box.conf[0]) - original_class = model.names[cls] # Original class name (car/bus/truck) - # Get bounding box coordinates - x1, y1, x2, y2 = box.xyxy[0].tolist() - # Rename all vehicle types to "car" - print(f"Detection {i+1}: car (was: {original_class}) - Confidence: {conf:.3f} - BBox: ({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f})") - print(f"Total cars detected: {len(r.boxes)}") - else: - print("No cars detected in the image") - -if __name__ == "__main__": - # Test with an image file - image_path = input("Enter image path (or press Enter for default test): ") - if not image_path: - image_path = "sample.png" # Default test image - - test_image(image_path) \ No newline at end of file diff --git a/test/test_botsort_zone_track.py b/test_botsort_zone_track.py similarity index 100% rename from test/test_botsort_zone_track.py rename to test_botsort_zone_track.py diff --git a/test_detection_tracking.py b/test_detection_tracking.py new file mode 100644 index 0000000..ce38d8e --- /dev/null +++ b/test_detection_tracking.py @@ -0,0 +1,190 @@ +#!/usr/bin/env python3 +""" +Test script for the refactored detection and tracking functionality. +""" +import os +import sys +import cv2 +import numpy as np +import logging +from pathlib import Path + +# Add the project root to Python path +sys.path.insert(0, str(Path(__file__).parent)) + +from siwatsystem.pympta import run_detection_with_tracking, load_pipeline_from_zip + +# Set up logging +logging.basicConfig( + level=logging.DEBUG, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' +) +logger = logging.getLogger(__name__) + +def create_test_frame(): + """Create a simple test frame for detection testing.""" + frame = np.zeros((480, 640, 3), dtype=np.uint8) + # Add some simple shapes to simulate objects + cv2.rectangle(frame, (50, 50), (200, 150), (255, 0, 0), -1) # Blue rectangle + cv2.rectangle(frame, (300, 200), (450, 350), (0, 255, 0), -1) # Green rectangle + cv2.putText(frame, "Test Frame", (250, 400), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2) + return frame + +def test_detection_function(): + """Test the structured detection function with mock data.""" + logger.info("Testing run_detection_with_tracking function...") + + # Create test frame + test_frame = create_test_frame() + + # Mock node configuration (simulating what would come from an MPTA file) + mock_node = { + "modelId": "test_detection_v1", + "triggerClasses": ["car", "person"], + "triggerClassIndices": [0, 1], + "minConfidence": 0.5, + "multiClass": False, + "expectedClasses": [], + "tracking": { + "enabled": True, + "reidConfigPath": "botsort.yaml" + } + } + + # Mock context + test_context = { + "display_id": "test-display-001", + "camera_id": "test-cam-001" + } + + logger.info("Mock node configuration:") + for key, value in mock_node.items(): + logger.info(f" {key}: {value}") + + # Note: This test will fail without a real YOLO model, but demonstrates the structure + try: + detections, regions = run_detection_with_tracking(test_frame, mock_node, test_context) + logger.info(f"Function executed successfully!") + logger.info(f"Returned detections: {len(detections)}") + logger.info(f"Returned regions: {list(regions.keys())}") + return True + except Exception as e: + logger.error(f"Function failed (expected without real model): {e}") + return False + +def test_mpta_loading(): + """Test loading an MPTA file with tracking configuration.""" + logger.info("Testing MPTA loading with tracking configuration...") + + # Check if models directory exists + models_dir = Path("models") + if not models_dir.exists(): + logger.warning("No models directory found - skipping MPTA test") + return False + + # Look for any .mpta files + mpta_files = list(models_dir.glob("**/*.mpta")) + if not mpta_files: + logger.warning("No .mpta files found in models directory - skipping MPTA test") + return False + + mpta_file = mpta_files[0] + logger.info(f"Testing with MPTA file: {mpta_file}") + + try: + # Attempt to load pipeline + target_dir = f"temp_test_{os.getpid()}" + pipeline = load_pipeline_from_zip(str(mpta_file), target_dir) + + if pipeline: + logger.info("MPTA loaded successfully!") + logger.info(f"Pipeline model ID: {pipeline.get('modelId')}") + logger.info(f"Tracking config: {pipeline.get('tracking')}") + + # Clean up + import shutil + if os.path.exists(target_dir): + shutil.rmtree(target_dir) + + return True + else: + logger.error("Failed to load MPTA pipeline") + return False + + except Exception as e: + logger.error(f"MPTA loading failed: {e}") + return False + +def print_usage_example(): + """Print example usage of the new structured functions.""" + logger.info("\n" + "="*60) + logger.info("USAGE EXAMPLE - Structured Detection & Tracking") + logger.info("="*60) + + example_config = ''' + Example pipeline.json configuration: + + { + "pipeline": { + "modelId": "car_frontal_detection_v1", + "modelFile": "yolo11n.pt", + "triggerClasses": ["Car", "Frontal"], + "minConfidence": 0.7, + "multiClass": true, + "expectedClasses": ["Car", "Frontal"], + "tracking": { + "enabled": true, + "reidConfigPath": "botsort_reid.yaml" + }, + "actions": [...], + "branches": [...] + } + } + ''' + + logger.info(example_config) + + code_example = ''' + Usage in code: + + # Load pipeline from MPTA file + pipeline = load_pipeline_from_zip("model.mpta", "temp_dir") + + # Run detection with tracking + detections, regions = run_detection_with_tracking(frame, pipeline, context) + + # Process results + for detection in detections: + class_name = detection["class"] + confidence = detection["confidence"] + track_id = detection["id"] # Available when tracking enabled + bbox = detection["bbox"] + print(f"Detected: {class_name} (ID: {track_id}, conf: {confidence:.2f})") + ''' + + logger.info(code_example) + +def main(): + """Main test function.""" + logger.info("Starting detection & tracking refactoring tests...") + + # Test 1: Function structure + test1_passed = test_detection_function() + + # Test 2: MPTA loading + test2_passed = test_mpta_loading() + + # Print usage examples + print_usage_example() + + # Summary + logger.info("\n" + "="*60) + logger.info("TEST SUMMARY") + logger.info("="*60) + logger.info(f"Function structure test: {'PASS' if test1_passed else 'EXPECTED FAIL (no model)'}") + logger.info(f"MPTA loading test: {'PASS' if test2_passed else 'SKIP (no files)'}") + logger.info("\nRefactoring completed successfully!") + logger.info("The detection and tracking code is now structured and easy to configure.") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/view_redis_images.py b/view_redis_images.py deleted file mode 100644 index b1b3c63..0000000 --- a/view_redis_images.py +++ /dev/null @@ -1,162 +0,0 @@ -#!/usr/bin/env python3 -""" -Script to view frontal images saved in Redis -""" -import redis -import cv2 -import numpy as np -import sys -from datetime import datetime - -# Redis connection config (from pipeline.json) -REDIS_CONFIG = { - "host": "10.100.1.3", - "port": 6379, - "password": "FBQgi0i5RevAAMO5Hh66", - "db": 0 -} - -def connect_redis(): - """Connect to Redis server.""" - try: - client = redis.Redis( - host=REDIS_CONFIG["host"], - port=REDIS_CONFIG["port"], - password=REDIS_CONFIG["password"], - db=REDIS_CONFIG["db"], - decode_responses=False # Keep bytes for images - ) - client.ping() - print(f"✅ Connected to Redis at {REDIS_CONFIG['host']}:{REDIS_CONFIG['port']}") - return client - except redis.exceptions.ConnectionError as e: - print(f"❌ Failed to connect to Redis: {e}") - return None - -def list_image_keys(client): - """List all image keys in Redis.""" - try: - # Look for keys matching the inference pattern - keys = client.keys("inference:*") - print(f"\n📋 Found {len(keys)} image keys:") - for i, key in enumerate(keys): - key_str = key.decode() if isinstance(key, bytes) else key - print(f"{i+1}. {key_str}") - return keys - except Exception as e: - print(f"❌ Error listing keys: {e}") - return [] - -def view_image(client, key): - """View a specific image from Redis.""" - try: - # Get image data from Redis - image_data = client.get(key) - if image_data is None: - print(f"❌ No data found for key: {key}") - return - - print(f"📸 Image size: {len(image_data)} bytes") - - # Convert bytes to numpy array - nparr = np.frombuffer(image_data, np.uint8) - - # Decode image - img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) - if img is None: - print("❌ Failed to decode image data") - return - - print(f"🖼️ Image dimensions: {img.shape[1]}x{img.shape[0]} pixels") - - # Display image - key_str = key.decode() if isinstance(key, bytes) else key - cv2.imshow(f'Redis Image: {key_str}', img) - print("👁️ Image displayed. Press any key to close...") - cv2.waitKey(0) - cv2.destroyAllWindows() - - # Ask if user wants to save the image - save = input("💾 Save image to file? (y/n): ").lower().strip() - if save == 'y': - timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - filename = f"redis_image_{timestamp}.jpg" - cv2.imwrite(filename, img) - print(f"💾 Image saved as: {filename}") - - except Exception as e: - print(f"❌ Error viewing image: {e}") - -def monitor_new_images(client): - """Monitor for new images being added to Redis.""" - print("👀 Monitoring for new images... (Press Ctrl+C to stop)") - try: - # Subscribe to Redis pub/sub for car detections - pubsub = client.pubsub() - pubsub.subscribe('car_detections') - - for message in pubsub.listen(): - if message['type'] == 'message': - data = message['data'].decode() - print(f"🚨 New detection: {data}") - - # Try to extract image key from message - import json - try: - detection_data = json.loads(data) - image_key = detection_data.get('image_key') - if image_key: - print(f"🖼️ New image available: {image_key}") - view_choice = input("View this image now? (y/n): ").lower().strip() - if view_choice == 'y': - view_image(client, image_key) - except json.JSONDecodeError: - pass - - except KeyboardInterrupt: - print("\n👋 Stopping monitor...") - except Exception as e: - print(f"❌ Monitor error: {e}") - -def main(): - """Main function.""" - print("🔍 Redis Image Viewer") - print("=" * 50) - - # Connect to Redis - client = connect_redis() - if not client: - return - - while True: - print("\n📋 Options:") - print("1. List all image keys") - print("2. View specific image") - print("3. Monitor for new images") - print("4. Exit") - - choice = input("\nEnter choice (1-4): ").strip() - - if choice == '1': - keys = list_image_keys(client) - elif choice == '2': - keys = list_image_keys(client) - if keys: - try: - idx = int(input(f"\nEnter image number (1-{len(keys)}): ")) - 1 - if 0 <= idx < len(keys): - view_image(client, keys[idx]) - else: - print("❌ Invalid selection") - except ValueError: - print("❌ Please enter a valid number") - elif choice == '3': - monitor_new_images(client) - elif choice == '4': - print("👋 Goodbye!") - break - else: - print("❌ Invalid choice") - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/websocket_comm.log b/websocket_comm.log deleted file mode 100644 index daaf88c..0000000 --- a/websocket_comm.log +++ /dev/null @@ -1,801 +0,0 @@ -2025-08-27 19:32:11,903 [INFO] WebSocket communication logging started - TX/RX format -2025-08-27 19:32:44,133 [INFO] TX -> {"type":"stateReport","cpuUsage":20.9,"memoryUsage":87.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]} -2025-08-27 19:32:46,136 [INFO] TX -> {"type":"stateReport","cpuUsage":14.2,"memoryUsage":87.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]} -2025-08-27 19:32:48,162 [INFO] TX -> {"type":"stateReport","cpuUsage":13.9,"memoryUsage":87.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]} -2025-08-27 19:32:50,189 [INFO] TX -> {"type":"stateReport","cpuUsage":16.6,"memoryUsage":87.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]} -2025-08-27 19:32:52,182 [INFO] TX -> {"type":"stateReport","cpuUsage":20.2,"memoryUsage":87.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]} -2025-08-27 19:32:54,170 [INFO] TX -> {"type":"stateReport","cpuUsage":14.1,"memoryUsage":87.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]} -2025-08-27 19:32:56,188 [INFO] TX -> {"type":"stateReport","cpuUsage":15.3,"memoryUsage":87.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]} -2025-08-27 19:32:58,195 [INFO] TX -> {"type":"stateReport","cpuUsage":15.1,"memoryUsage":87.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]} -2025-08-27 19:33:00,198 [INFO] TX -> {"type":"stateReport","cpuUsage":17.0,"memoryUsage":87.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]} -2025-08-27 19:33:02,202 [INFO] TX -> {"type":"stateReport","cpuUsage":20.7,"memoryUsage":87.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]} -2025-08-27 19:33:04,206 [INFO] TX -> {"type":"stateReport","cpuUsage":14.2,"memoryUsage":87.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]} -2025-08-27 19:33:06,226 [INFO] TX -> {"type":"stateReport","cpuUsage":17.9,"memoryUsage":86.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]} -2025-08-27 19:33:06,500 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123306Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=df972f271a1a73c1795d984030fefee6a0723be4191bf11ef23eee1079543690","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:33:12,753 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:12Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:12,756 [INFO] TX -> {"type":"stateReport","cpuUsage":19.3,"memoryUsage":88.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:13,587 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:13Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:14,779 [INFO] TX -> {"type":"stateReport","cpuUsage":22.0,"memoryUsage":89.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:14,921 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:14Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:16,783 [INFO] TX -> {"type":"stateReport","cpuUsage":16.1,"memoryUsage":89.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:16,936 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:16Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:18,776 [INFO] TX -> {"type":"stateReport","cpuUsage":16.7,"memoryUsage":89.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:19,022 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:19Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:20,760 [INFO] TX -> {"type":"stateReport","cpuUsage":32.4,"memoryUsage":92.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:21,004 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:21Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:22,768 [INFO] TX -> {"type":"stateReport","cpuUsage":51.0,"memoryUsage":90.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:23,054 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:23Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:24,775 [INFO] TX -> {"type":"stateReport","cpuUsage":24.2,"memoryUsage":90.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:25,133 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:25Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:26,768 [INFO] TX -> {"type":"stateReport","cpuUsage":17.4,"memoryUsage":90.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:27,161 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:27Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:28,768 [INFO] TX -> {"type":"stateReport","cpuUsage":25.3,"memoryUsage":88.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:29,158 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:29Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:30,772 [INFO] TX -> {"type":"stateReport","cpuUsage":20.6,"memoryUsage":87.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:31,194 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:31Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:32,780 [INFO] TX -> {"type":"stateReport","cpuUsage":18.2,"memoryUsage":87.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:33,235 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:33Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:34,786 [INFO] TX -> {"type":"stateReport","cpuUsage":22.8,"memoryUsage":87.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:35,283 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:35Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:36,498 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123336Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=5817dbe7129eb56cdb41d70c10d62049c5b409b11ca300745c4defe96087fc7b","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:33:36,855 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:36Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:36,857 [INFO] TX -> {"type":"stateReport","cpuUsage":21.9,"memoryUsage":87.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:37,478 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:37Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:38,867 [INFO] TX -> {"type":"stateReport","cpuUsage":17.9,"memoryUsage":87.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:39,489 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:39Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:40,883 [INFO] TX -> {"type":"stateReport","cpuUsage":17.6,"memoryUsage":87.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:41,584 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:41Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:42,910 [INFO] TX -> {"type":"stateReport","cpuUsage":18.0,"memoryUsage":87.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:43,507 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:43Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:44,898 [INFO] TX -> {"type":"stateReport","cpuUsage":18.2,"memoryUsage":87.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:45,553 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:45Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:46,924 [INFO] TX -> {"type":"stateReport","cpuUsage":17.2,"memoryUsage":87.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:47,576 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:47Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:48,923 [INFO] TX -> {"type":"stateReport","cpuUsage":20.4,"memoryUsage":87.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:49,094 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:49Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:50,913 [INFO] TX -> {"type":"stateReport","cpuUsage":19.9,"memoryUsage":87.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:51,164 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:51Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:52,942 [INFO] TX -> {"type":"stateReport","cpuUsage":17.2,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:53,192 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:53Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:54,930 [INFO] TX -> {"type":"stateReport","cpuUsage":32.9,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:55,152 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:55Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:56,951 [INFO] TX -> {"type":"stateReport","cpuUsage":27.5,"memoryUsage":87.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:57,200 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:57Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:33:58,971 [INFO] TX -> {"type":"stateReport","cpuUsage":32.6,"memoryUsage":87.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:33:59,355 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:59Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:00,963 [INFO] TX -> {"type":"stateReport","cpuUsage":27.7,"memoryUsage":87.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:01,324 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:01Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:02,983 [INFO] TX -> {"type":"stateReport","cpuUsage":20.7,"memoryUsage":87.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:03,401 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:03Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:04,994 [INFO] TX -> {"type":"stateReport","cpuUsage":38.4,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:05,442 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:05Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:06,499 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123406Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=ca980e1e53eb2cc6571314abefbaa675d8addb32ee7773fe4b460850dd752c14","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:34:06,990 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:06Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:06,992 [INFO] TX -> {"type":"stateReport","cpuUsage":30.8,"memoryUsage":85.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:07,682 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:07Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:09,001 [INFO] TX -> {"type":"stateReport","cpuUsage":19.6,"memoryUsage":85.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:09,703 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:09Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:11,021 [INFO] TX -> {"type":"stateReport","cpuUsage":28.0,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:11,629 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:11Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:13,023 [INFO] TX -> {"type":"stateReport","cpuUsage":30.6,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:13,664 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:13Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:15,026 [INFO] TX -> {"type":"stateReport","cpuUsage":31.8,"memoryUsage":86.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:15,190 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:15Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:17,029 [INFO] TX -> {"type":"stateReport","cpuUsage":19.4,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:17,252 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:17Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:19,041 [INFO] TX -> {"type":"stateReport","cpuUsage":19.8,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:19,227 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:19Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:21,040 [INFO] TX -> {"type":"stateReport","cpuUsage":29.2,"memoryUsage":86.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:21,290 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:21Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:23,053 [INFO] TX -> {"type":"stateReport","cpuUsage":28.0,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:23,278 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:23Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:25,080 [INFO] TX -> {"type":"stateReport","cpuUsage":16.0,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:25,322 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:25Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:27,095 [INFO] TX -> {"type":"stateReport","cpuUsage":26.4,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:27,415 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:27Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:29,107 [INFO] TX -> {"type":"stateReport","cpuUsage":24.5,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:29,469 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:29Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:31,090 [INFO] TX -> {"type":"stateReport","cpuUsage":30.8,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:31,508 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:31Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:33,105 [INFO] TX -> {"type":"stateReport","cpuUsage":21.5,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:33,495 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:33Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:35,100 [INFO] TX -> {"type":"stateReport","cpuUsage":15.3,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:35,550 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:35Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:36,501 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123436Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=9506b72d5086fae6a2a6b9c31c4a1d3688177ae0147b37a6519d98b4d6bd81a6","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:34:37,156 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:37Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:37,159 [INFO] TX -> {"type":"stateReport","cpuUsage":22.0,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:37,750 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:37Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:39,156 [INFO] TX -> {"type":"stateReport","cpuUsage":23.0,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:39,744 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:39Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:41,134 [INFO] TX -> {"type":"stateReport","cpuUsage":15.2,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:41,794 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:41Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:43,153 [INFO] TX -> {"type":"stateReport","cpuUsage":17.5,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:43,771 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:43Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:45,139 [INFO] TX -> {"type":"stateReport","cpuUsage":18.2,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:45,813 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:45Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:47,154 [INFO] TX -> {"type":"stateReport","cpuUsage":25.2,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:47,898 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:47Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:49,175 [INFO] TX -> {"type":"stateReport","cpuUsage":15.6,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:49,371 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:49Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:51,173 [INFO] TX -> {"type":"stateReport","cpuUsage":18.4,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:51,421 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:51Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:53,181 [INFO] TX -> {"type":"stateReport","cpuUsage":24.7,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:53,451 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:53Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:55,177 [INFO] TX -> {"type":"stateReport","cpuUsage":25.7,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:55,518 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:55Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:57,183 [INFO] TX -> {"type":"stateReport","cpuUsage":17.5,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:57,525 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:57Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:34:59,197 [INFO] TX -> {"type":"stateReport","cpuUsage":32.5,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:34:59,533 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:59Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:01,222 [INFO] TX -> {"type":"stateReport","cpuUsage":26.0,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:01,612 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:01Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:03,232 [INFO] TX -> {"type":"stateReport","cpuUsage":39.7,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:03,555 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:03Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:05,236 [INFO] TX -> {"type":"stateReport","cpuUsage":44.7,"memoryUsage":86.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:05,719 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:05Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:06,506 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123506Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=100ebd94adbb2de5b85719b1c3e199fe6fe6f9ebb87ea415f58cd7c5d6669321","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:35:07,290 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:07Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:07,297 [INFO] TX -> {"type":"stateReport","cpuUsage":28.6,"memoryUsage":87.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:08,023 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:08Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:09,305 [INFO] TX -> {"type":"stateReport","cpuUsage":29.6,"memoryUsage":87.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:10,184 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:10Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:11,327 [INFO] TX -> {"type":"stateReport","cpuUsage":26.1,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:12,114 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:12Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:13,336 [INFO] TX -> {"type":"stateReport","cpuUsage":21.3,"memoryUsage":86.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:13,993 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:13Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:15,351 [INFO] TX -> {"type":"stateReport","cpuUsage":19.3,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:15,967 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:15Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:17,353 [INFO] TX -> {"type":"stateReport","cpuUsage":20.6,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:17,997 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:17Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:19,380 [INFO] TX -> {"type":"stateReport","cpuUsage":27.3,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:19,498 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:19Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:21,393 [INFO] TX -> {"type":"stateReport","cpuUsage":24.9,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:21,642 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:21Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:23,405 [INFO] TX -> {"type":"stateReport","cpuUsage":17.2,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:23,600 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:23Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:25,417 [INFO] TX -> {"type":"stateReport","cpuUsage":20.3,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:25,619 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:25Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:27,438 [INFO] TX -> {"type":"stateReport","cpuUsage":23.8,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:27,732 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:27Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:29,442 [INFO] TX -> {"type":"stateReport","cpuUsage":20.9,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:29,731 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:29Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:31,449 [INFO] TX -> {"type":"stateReport","cpuUsage":24.0,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:31,750 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:31Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:33,444 [INFO] TX -> {"type":"stateReport","cpuUsage":20.7,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:33,769 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:33Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:35,464 [INFO] TX -> {"type":"stateReport","cpuUsage":25.8,"memoryUsage":85.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:35,827 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:35Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:36,504 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123536Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=2f2af3a51acc5abc3593b80e3097ad5dae97d1bc8bea7a0b46e36daad6a4146c","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:35:37,425 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:37Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:37,488 [INFO] TX -> {"type":"stateReport","cpuUsage":26.4,"memoryUsage":85.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:38,034 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:38Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:39,495 [INFO] TX -> {"type":"stateReport","cpuUsage":26.1,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:40,058 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:40Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:41,517 [INFO] TX -> {"type":"stateReport","cpuUsage":34.3,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:42,098 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:42Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:43,535 [INFO] TX -> {"type":"stateReport","cpuUsage":29.8,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:44,089 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:44Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:45,537 [INFO] TX -> {"type":"stateReport","cpuUsage":33.3,"memoryUsage":86.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:46,108 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:46Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:47,693 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:47Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:47,695 [INFO] TX -> {"type":"stateReport","cpuUsage":28.1,"memoryUsage":87.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:49,697 [INFO] TX -> {"type":"stateReport","cpuUsage":35.0,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:50,256 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:50Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:51,779 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:51Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:51,781 [INFO] TX -> {"type":"stateReport","cpuUsage":30.9,"memoryUsage":87.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:53,796 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:53Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:53,798 [INFO] TX -> {"type":"stateReport","cpuUsage":30.9,"memoryUsage":87.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:55,801 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:55Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:55,803 [INFO] TX -> {"type":"stateReport","cpuUsage":27.8,"memoryUsage":86.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:57,752 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:57Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:57,821 [INFO] TX -> {"type":"stateReport","cpuUsage":28.0,"memoryUsage":86.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:35:59,823 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:59Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:35:59,824 [INFO] TX -> {"type":"stateReport","cpuUsage":33.1,"memoryUsage":87.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:01,795 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:01Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:01,833 [INFO] TX -> {"type":"stateReport","cpuUsage":31.3,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:03,845 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:03Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:03,846 [INFO] TX -> {"type":"stateReport","cpuUsage":24.7,"memoryUsage":87.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:05,854 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:05Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:05,855 [INFO] TX -> {"type":"stateReport","cpuUsage":14.8,"memoryUsage":87.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:06,505 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123606Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=a4b09295a15145beda38fbfe467db83086b5d13214a040da4a51116cc118c327","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:36:07,529 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:07Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:07,855 [INFO] TX -> {"type":"stateReport","cpuUsage":23.8,"memoryUsage":87.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:08,140 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:08Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:09,882 [INFO] TX -> {"type":"stateReport","cpuUsage":20.9,"memoryUsage":86.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:10,185 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:10Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:11,911 [INFO] TX -> {"type":"stateReport","cpuUsage":20.6,"memoryUsage":86.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:12,242 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:12Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:13,806 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:13Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:13,903 [INFO] TX -> {"type":"stateReport","cpuUsage":26.0,"memoryUsage":86.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:15,779 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:15Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:15,886 [INFO] TX -> {"type":"stateReport","cpuUsage":20.9,"memoryUsage":86.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:17,806 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:17Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:17,896 [INFO] TX -> {"type":"stateReport","cpuUsage":13.6,"memoryUsage":86.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:19,854 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:19Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:19,890 [INFO] TX -> {"type":"stateReport","cpuUsage":18.8,"memoryUsage":86.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:21,915 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:21Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:21,917 [INFO] TX -> {"type":"stateReport","cpuUsage":26.9,"memoryUsage":86.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:23,949 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:23Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:23,950 [INFO] TX -> {"type":"stateReport","cpuUsage":23.7,"memoryUsage":86.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:25,971 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:25Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:25,972 [INFO] TX -> {"type":"stateReport","cpuUsage":22.7,"memoryUsage":86.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:27,986 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:27Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:27,988 [INFO] TX -> {"type":"stateReport","cpuUsage":39.1,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:30,043 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:30,044 [INFO] TX -> {"type":"stateReport","cpuUsage":28.8,"memoryUsage":88.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:32,067 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:32Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:32,069 [INFO] TX -> {"type":"stateReport","cpuUsage":25.0,"memoryUsage":88.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:34,188 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:34Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:34,190 [INFO] TX -> {"type":"stateReport","cpuUsage":31.1,"memoryUsage":88.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:36,143 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:36Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:36,199 [INFO] TX -> {"type":"stateReport","cpuUsage":24.6,"memoryUsage":88.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:36,507 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123636Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=1c57f5567d81679524d29d5937f1d7e1172124d95b5eba45c5fe71adedbb59d5","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:36:37,658 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:37Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:38,377 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:38Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:38,381 [INFO] TX -> {"type":"stateReport","cpuUsage":30.8,"memoryUsage":89.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:40,388 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:40Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:40,390 [INFO] TX -> {"type":"stateReport","cpuUsage":35.4,"memoryUsage":89.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:42,430 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:42Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:42,432 [INFO] TX -> {"type":"stateReport","cpuUsage":36.9,"memoryUsage":90.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:44,447 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:44Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:44,449 [INFO] TX -> {"type":"stateReport","cpuUsage":33.9,"memoryUsage":90.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:46,464 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:46Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:46,465 [INFO] TX -> {"type":"stateReport","cpuUsage":22.8,"memoryUsage":90.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:48,017 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:48Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:48,489 [INFO] TX -> {"type":"stateReport","cpuUsage":19.0,"memoryUsage":89.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:50,070 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:50Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:50,497 [INFO] TX -> {"type":"stateReport","cpuUsage":20.2,"memoryUsage":89.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:52,050 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:52Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:52,513 [INFO] TX -> {"type":"stateReport","cpuUsage":21.6,"memoryUsage":88.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:54,094 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:54Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:54,525 [INFO] TX -> {"type":"stateReport","cpuUsage":18.2,"memoryUsage":88.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:56,116 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:56Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:56,532 [INFO] TX -> {"type":"stateReport","cpuUsage":15.8,"memoryUsage":88.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:36:58,131 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:58Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:36:58,543 [INFO] TX -> {"type":"stateReport","cpuUsage":19.7,"memoryUsage":88.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:00,177 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:00Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:00,542 [INFO] TX -> {"type":"stateReport","cpuUsage":21.4,"memoryUsage":88.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:02,189 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:02Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:02,549 [INFO] TX -> {"type":"stateReport","cpuUsage":16.1,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:04,293 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:04Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:04,557 [INFO] TX -> {"type":"stateReport","cpuUsage":26.5,"memoryUsage":90.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:06,272 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:06Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:06,509 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123706Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=86fd5e153da950b378ce9e1e216e92b362ea2c42ed325b458a806fd49e03690a","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:37:07,789 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:07Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:07,793 [INFO] TX -> {"type":"stateReport","cpuUsage":26.3,"memoryUsage":89.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:08,490 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:08Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:09,797 [INFO] TX -> {"type":"stateReport","cpuUsage":28.9,"memoryUsage":88.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:10,490 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:10Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:11,809 [INFO] TX -> {"type":"stateReport","cpuUsage":27.3,"memoryUsage":89.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:12,677 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:12Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:13,831 [INFO] TX -> {"type":"stateReport","cpuUsage":21.5,"memoryUsage":88.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:14,024 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:14Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:15,881 [INFO] TX -> {"type":"stateReport","cpuUsage":19.9,"memoryUsage":88.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:16,068 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:16Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:17,898 [INFO] TX -> {"type":"stateReport","cpuUsage":24.9,"memoryUsage":88.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:18,074 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:18Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:19,897 [INFO] TX -> {"type":"stateReport","cpuUsage":19.4,"memoryUsage":88.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:20,129 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:20Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:21,912 [INFO] TX -> {"type":"stateReport","cpuUsage":32.3,"memoryUsage":89.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:22,155 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:22Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:23,943 [INFO] TX -> {"type":"stateReport","cpuUsage":34.0,"memoryUsage":88.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:24,206 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:24Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:25,950 [INFO] TX -> {"type":"stateReport","cpuUsage":35.1,"memoryUsage":89.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:26,203 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:26Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:27,963 [INFO] TX -> {"type":"stateReport","cpuUsage":33.5,"memoryUsage":89.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:28,235 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:28Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:29,986 [INFO] TX -> {"type":"stateReport","cpuUsage":30.2,"memoryUsage":89.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:30,264 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:31,985 [INFO] TX -> {"type":"stateReport","cpuUsage":30.0,"memoryUsage":89.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:32,324 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:32Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:33,997 [INFO] TX -> {"type":"stateReport","cpuUsage":30.9,"memoryUsage":89.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:34,371 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:34Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:36,018 [INFO] TX -> {"type":"stateReport","cpuUsage":36.5,"memoryUsage":89.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:36,405 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:36Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:36,509 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123736Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=334aeadca2c53bc51ae2425d05062d07fcc34537a280a1c1dfc7663038d99d40","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:37:37,926 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:37Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:38,019 [INFO] TX -> {"type":"stateReport","cpuUsage":36.6,"memoryUsage":89.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:38,557 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:38Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:40,027 [INFO] TX -> {"type":"stateReport","cpuUsage":28.1,"memoryUsage":90.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:40,572 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:40Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:42,030 [INFO] TX -> {"type":"stateReport","cpuUsage":23.4,"memoryUsage":90.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:42,614 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:42Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:44,029 [INFO] TX -> {"type":"stateReport","cpuUsage":10.6,"memoryUsage":90.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:44,221 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:44Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:46,050 [INFO] TX -> {"type":"stateReport","cpuUsage":14.6,"memoryUsage":89.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:46,302 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:46Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:48,059 [INFO] TX -> {"type":"stateReport","cpuUsage":21.4,"memoryUsage":89.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:48,230 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:48Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:50,067 [INFO] TX -> {"type":"stateReport","cpuUsage":17.3,"memoryUsage":89.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:50,310 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:50Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:52,046 [INFO] TX -> {"type":"stateReport","cpuUsage":13.6,"memoryUsage":89.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:52,276 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:52Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:54,067 [INFO] TX -> {"type":"stateReport","cpuUsage":14.9,"memoryUsage":89.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:54,332 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:54Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:56,072 [INFO] TX -> {"type":"stateReport","cpuUsage":14.5,"memoryUsage":89.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:56,371 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:56Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:37:58,095 [INFO] TX -> {"type":"stateReport","cpuUsage":16.8,"memoryUsage":89.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:37:58,426 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:58Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:00,104 [INFO] TX -> {"type":"stateReport","cpuUsage":18.7,"memoryUsage":89.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:00,444 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:00Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:02,129 [INFO] TX -> {"type":"stateReport","cpuUsage":14.1,"memoryUsage":89.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:02,466 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:02Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:04,138 [INFO] TX -> {"type":"stateReport","cpuUsage":14.6,"memoryUsage":89.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:04,515 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:04Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:06,152 [INFO] TX -> {"type":"stateReport","cpuUsage":16.4,"memoryUsage":89.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:06,613 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:06Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:06,614 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123806Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=dd9cac91477fd8992e7cd48c314effd2bd800f6b974012a4c5962fabc4e2b7a2","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:38:08,072 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:08Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:08,163 [INFO] TX -> {"type":"stateReport","cpuUsage":15.8,"memoryUsage":89.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:08,670 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:08Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:10,180 [INFO] TX -> {"type":"stateReport","cpuUsage":11.5,"memoryUsage":88.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:10,712 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:10Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:12,327 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:12Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:12,328 [INFO] TX -> {"type":"stateReport","cpuUsage":16.1,"memoryUsage":88.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:14,303 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:14Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:14,325 [INFO] TX -> {"type":"stateReport","cpuUsage":15.3,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:16,372 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:16Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:16,373 [INFO] TX -> {"type":"stateReport","cpuUsage":13.6,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:18,393 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:18Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:18,394 [INFO] TX -> {"type":"stateReport","cpuUsage":16.9,"memoryUsage":88.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:20,405 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:20Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:20,406 [INFO] TX -> {"type":"stateReport","cpuUsage":24.9,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:22,428 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:22Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:22,429 [INFO] TX -> {"type":"stateReport","cpuUsage":15.3,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:24,464 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:24Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:24,465 [INFO] TX -> {"type":"stateReport","cpuUsage":17.9,"memoryUsage":88.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:26,416 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:26Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:26,473 [INFO] TX -> {"type":"stateReport","cpuUsage":14.5,"memoryUsage":88.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:28,518 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:28Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:28,519 [INFO] TX -> {"type":"stateReport","cpuUsage":13.5,"memoryUsage":88.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:30,468 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:30,529 [INFO] TX -> {"type":"stateReport","cpuUsage":16.8,"memoryUsage":88.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:32,574 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:32Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:32,575 [INFO] TX -> {"type":"stateReport","cpuUsage":20.3,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:34,567 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:34Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:34,588 [INFO] TX -> {"type":"stateReport","cpuUsage":12.9,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:36,683 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:36Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:36,683 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123836Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=d2d5a6fe8534d9559ee0a850d32d2bed4f6f11388efc12a6029c82b1a9694049","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:38:38,225 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:38Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:38,227 [INFO] TX -> {"type":"stateReport","cpuUsage":12.6,"memoryUsage":88.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:38,833 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:38Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:40,251 [INFO] TX -> {"type":"stateReport","cpuUsage":20.3,"memoryUsage":89.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:40,364 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:40Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:42,255 [INFO] TX -> {"type":"stateReport","cpuUsage":14.0,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:42,899 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:42Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:44,276 [INFO] TX -> {"type":"stateReport","cpuUsage":16.8,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:44,525 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:44Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:46,300 [INFO] TX -> {"type":"stateReport","cpuUsage":16.3,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:46,530 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:46Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:48,312 [INFO] TX -> {"type":"stateReport","cpuUsage":16.0,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:48,506 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:48Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:50,319 [INFO] TX -> {"type":"stateReport","cpuUsage":12.3,"memoryUsage":88.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:50,555 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:50Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:52,329 [INFO] TX -> {"type":"stateReport","cpuUsage":18.9,"memoryUsage":88.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:52,598 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:52Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:54,321 [INFO] TX -> {"type":"stateReport","cpuUsage":15.9,"memoryUsage":88.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:54,664 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:54Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:56,337 [INFO] TX -> {"type":"stateReport","cpuUsage":24.4,"memoryUsage":88.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:56,715 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:56Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:38:58,361 [INFO] TX -> {"type":"stateReport","cpuUsage":18.8,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:38:58,689 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:58Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:00,379 [INFO] TX -> {"type":"stateReport","cpuUsage":21.0,"memoryUsage":88.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:00,715 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:00Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:02,384 [INFO] TX -> {"type":"stateReport","cpuUsage":19.7,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:02,743 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:02Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:04,399 [INFO] TX -> {"type":"stateReport","cpuUsage":28.2,"memoryUsage":88.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:04,769 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:04Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:06,386 [INFO] TX -> {"type":"stateReport","cpuUsage":28.2,"memoryUsage":87.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:06,516 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123906Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=9b4d9eb8abdf088c03ce1144edbeb095b71a86e043982c504ef78182e18edac5","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:39:08,351 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:08Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:08,397 [INFO] TX -> {"type":"stateReport","cpuUsage":20.1,"memoryUsage":85.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:08,942 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:08Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:10,420 [INFO] TX -> {"type":"stateReport","cpuUsage":23.8,"memoryUsage":85.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:10,937 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:10Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:12,434 [INFO] TX -> {"type":"stateReport","cpuUsage":27.0,"memoryUsage":85.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:13,069 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:13Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:14,544 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:14Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:14,544 [INFO] TX -> {"type":"stateReport","cpuUsage":11.2,"memoryUsage":85.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:16,592 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:16Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:16,593 [INFO] TX -> {"type":"stateReport","cpuUsage":17.8,"memoryUsage":85.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:18,641 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:18Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:18,642 [INFO] TX -> {"type":"stateReport","cpuUsage":19.4,"memoryUsage":85.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:20,697 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:20Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:20,699 [INFO] TX -> {"type":"stateReport","cpuUsage":26.2,"memoryUsage":85.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:22,652 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:22Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:22,717 [INFO] TX -> {"type":"stateReport","cpuUsage":20.7,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:24,664 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:24Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:24,725 [INFO] TX -> {"type":"stateReport","cpuUsage":27.4,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:26,749 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:26Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:26,750 [INFO] TX -> {"type":"stateReport","cpuUsage":19.2,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:28,767 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:28Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:28,768 [INFO] TX -> {"type":"stateReport","cpuUsage":17.7,"memoryUsage":85.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:30,875 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:30,876 [INFO] TX -> {"type":"stateReport","cpuUsage":18.1,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:32,829 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:32Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:32,883 [INFO] TX -> {"type":"stateReport","cpuUsage":21.0,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:34,852 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:34Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:34,891 [INFO] TX -> {"type":"stateReport","cpuUsage":16.6,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:36,518 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123936Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=a79ce9dd2583e6f1fb7aef013cfd30b00f36098267581d287042addf955d2c70","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:39:38,472 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:38Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:38,476 [INFO] TX -> {"type":"stateReport","cpuUsage":17.8,"memoryUsage":85.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:39,075 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:39Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:40,472 [INFO] TX -> {"type":"stateReport","cpuUsage":13.7,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:40,659 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:40Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:42,484 [INFO] TX -> {"type":"stateReport","cpuUsage":27.0,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:43,137 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:43Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:44,497 [INFO] TX -> {"type":"stateReport","cpuUsage":25.9,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:45,133 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:45Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:46,520 [INFO] TX -> {"type":"stateReport","cpuUsage":12.8,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:46,726 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:46Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:48,528 [INFO] TX -> {"type":"stateReport","cpuUsage":16.4,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:48,721 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:48Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:50,527 [INFO] TX -> {"type":"stateReport","cpuUsage":28.1,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:50,733 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:50Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:52,546 [INFO] TX -> {"type":"stateReport","cpuUsage":20.0,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:52,764 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:52Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:54,560 [INFO] TX -> {"type":"stateReport","cpuUsage":14.4,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:54,799 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:54Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:56,575 [INFO] TX -> {"type":"stateReport","cpuUsage":19.1,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:56,902 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:56Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:39:58,586 [INFO] TX -> {"type":"stateReport","cpuUsage":23.3,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:39:58,804 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:58Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:00,611 [INFO] TX -> {"type":"stateReport","cpuUsage":21.7,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:00,887 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:00Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:02,613 [INFO] TX -> {"type":"stateReport","cpuUsage":18.8,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:02,893 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:02Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:04,610 [INFO] TX -> {"type":"stateReport","cpuUsage":14.6,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:04,889 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:04Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:06,518 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124006Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=e4d127d03f79459fe442645b7c5c5b7fa43aac113a80562a77937c0bd9827808","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:40:06,617 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:06Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:06,620 [INFO] TX -> {"type":"stateReport","cpuUsage":24.3,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:06,898 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:06Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:08,634 [INFO] TX -> {"type":"stateReport","cpuUsage":17.9,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:08,925 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:08Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:10,644 [INFO] TX -> {"type":"stateReport","cpuUsage":15.6,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:10,959 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:10Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:12,674 [INFO] TX -> {"type":"stateReport","cpuUsage":11.3,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:12,988 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:12Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:14,678 [INFO] TX -> {"type":"stateReport","cpuUsage":20.3,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:15,008 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:15Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:16,703 [INFO] TX -> {"type":"stateReport","cpuUsage":20.3,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:17,049 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:17Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:18,724 [INFO] TX -> {"type":"stateReport","cpuUsage":14.1,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:19,118 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:19Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:20,729 [INFO] TX -> {"type":"stateReport","cpuUsage":18.3,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:21,205 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:21Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:22,713 [INFO] TX -> {"type":"stateReport","cpuUsage":23.2,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:23,249 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:23Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:24,736 [INFO] TX -> {"type":"stateReport","cpuUsage":20.3,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:25,208 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:25Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:26,723 [INFO] TX -> {"type":"stateReport","cpuUsage":22.8,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:27,271 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:27Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:28,731 [INFO] TX -> {"type":"stateReport","cpuUsage":16.1,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:29,287 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:29Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:30,755 [INFO] TX -> {"type":"stateReport","cpuUsage":18.8,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:31,311 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:31Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:32,779 [INFO] TX -> {"type":"stateReport","cpuUsage":19.0,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:33,350 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:33Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:34,796 [INFO] TX -> {"type":"stateReport","cpuUsage":17.6,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:35,361 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:35Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:36,523 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124036Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=f6a13f3d369875138cd9b3d53d97c6538c1eca61160a0219b892d06cdfe4953f","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:40:36,725 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:36Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:36,816 [INFO] TX -> {"type":"stateReport","cpuUsage":14.5,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:37,368 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:37Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:38,948 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:38Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:38,949 [INFO] TX -> {"type":"stateReport","cpuUsage":21.6,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:40,929 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:40Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:40,950 [INFO] TX -> {"type":"stateReport","cpuUsage":26.8,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:42,952 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:42Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:42,953 [INFO] TX -> {"type":"stateReport","cpuUsage":16.7,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:45,086 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:45Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:45,087 [INFO] TX -> {"type":"stateReport","cpuUsage":19.1,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:40:47,086 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:47Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:40:47,087 [INFO] TX -> {"type":"stateReport","cpuUsage":16.4,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:44:13,495 [INFO] WebSocket communication logging started - TX/RX format -2025-08-27 19:44:44,784 [INFO] TX -> {"type":"stateReport","cpuUsage":19.1,"memoryUsage":86.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]} -2025-08-27 19:44:46,766 [INFO] TX -> {"type":"stateReport","cpuUsage":13.6,"memoryUsage":86.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]} -2025-08-27 19:44:48,786 [INFO] TX -> {"type":"stateReport","cpuUsage":20.0,"memoryUsage":86.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]} -2025-08-27 19:44:50,783 [INFO] TX -> {"type":"stateReport","cpuUsage":18.7,"memoryUsage":86.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]} -2025-08-27 19:44:52,759 [INFO] TX -> {"type":"stateReport","cpuUsage":15.4,"memoryUsage":86.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]} -2025-08-27 19:44:54,780 [INFO] TX -> {"type":"stateReport","cpuUsage":8.9,"memoryUsage":86.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]} -2025-08-27 19:44:56,767 [INFO] TX -> {"type":"stateReport","cpuUsage":24.4,"memoryUsage":86.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]} -2025-08-27 19:44:58,773 [INFO] TX -> {"type":"stateReport","cpuUsage":11.8,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]} -2025-08-27 19:44:59,847 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124459Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=8fd479a0828d0edbff1924f42508baba788dbca60d93217e799e461e8bef6f5b","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:45:05,969 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:05Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:45:05,971 [INFO] TX -> {"type":"stateReport","cpuUsage":17.1,"memoryUsage":87.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:06,676 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:06Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:45:07,989 [INFO] TX -> {"type":"stateReport","cpuUsage":19.5,"memoryUsage":85.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:08,616 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:08Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:45:09,991 [INFO] TX -> {"type":"stateReport","cpuUsage":17.4,"memoryUsage":85.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:10,697 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:10Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:45:11,998 [INFO] TX -> {"type":"stateReport","cpuUsage":21.9,"memoryUsage":85.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:12,231 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:12Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:45:14,016 [INFO] TX -> {"type":"stateReport","cpuUsage":18.5,"memoryUsage":85.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:14,195 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:14Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:45:16,030 [INFO] TX -> {"type":"stateReport","cpuUsage":25.3,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:16,238 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:16Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:45:18,046 [INFO] TX -> {"type":"stateReport","cpuUsage":23.4,"memoryUsage":87.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:18,337 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:18Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:45:20,055 [INFO] TX -> {"type":"stateReport","cpuUsage":26.3,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:20,272 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:20Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:45:22,073 [INFO] TX -> {"type":"stateReport","cpuUsage":16.0,"memoryUsage":87.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:22,382 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:22Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:45:24,082 [INFO] TX -> {"type":"stateReport","cpuUsage":17.6,"memoryUsage":87.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:24,369 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:24Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:45:26,085 [INFO] TX -> {"type":"stateReport","cpuUsage":20.4,"memoryUsage":86.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:26,387 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:26Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:45:28,113 [INFO] TX -> {"type":"stateReport","cpuUsage":21.5,"memoryUsage":86.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:28,396 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:28Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:45:29,851 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124529Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=d9d228302554626ef1de3473dbf98dde2b6c0b318ab7f3db0266ca7df6ae41d6","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:45:30,053 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:45:30,111 [INFO] TX -> {"type":"stateReport","cpuUsage":19.1,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:30,455 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:45:32,121 [INFO] TX -> {"type":"stateReport","cpuUsage":18.0,"memoryUsage":86.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:32,436 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:32Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:45:34,131 [INFO] TX -> {"type":"stateReport","cpuUsage":12.7,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:34,529 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:34Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:45:36,132 [INFO] TX -> {"type":"stateReport","cpuUsage":32.3,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:36,504 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:36Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:45:38,156 [INFO] TX -> {"type":"stateReport","cpuUsage":14.5,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:38,567 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:38Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:45:38,598 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":146}} -2025-08-27 19:45:40,170 [INFO] TX -> {"type":"stateReport","cpuUsage":21.1,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:40,619 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:40Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":146} -2025-08-27 19:45:42,182 [INFO] TX -> {"type":"stateReport","cpuUsage":20.7,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:42,644 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:42Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":146} -2025-08-27 19:45:44,170 [INFO] TX -> {"type":"stateReport","cpuUsage":20.0,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:44,662 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:44Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":146} -2025-08-27 19:45:46,173 [INFO] TX -> {"type":"stateReport","cpuUsage":17.9,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:46,696 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:46Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":146} -2025-08-27 19:45:48,188 [INFO] TX -> {"type":"stateReport","cpuUsage":19.3,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:48,740 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:48Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":146} -2025-08-27 19:45:50,188 [INFO] TX -> {"type":"stateReport","cpuUsage":11.6,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:50,781 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:50Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":146} -2025-08-27 19:45:52,177 [INFO] TX -> {"type":"stateReport","cpuUsage":21.1,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:52,323 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:52Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":146} -2025-08-27 19:45:54,174 [INFO] TX -> {"type":"stateReport","cpuUsage":15.2,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:54,358 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:54Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":146} -2025-08-27 19:45:56,192 [INFO] TX -> {"type":"stateReport","cpuUsage":15.8,"memoryUsage":85.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:56,437 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:56Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":146} -2025-08-27 19:45:58,203 [INFO] TX -> {"type":"stateReport","cpuUsage":14.9,"memoryUsage":85.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:45:58,458 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:58Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":146} -2025-08-27 19:45:59,855 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124559Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=561e2e1469a5ffa40f3746be2face4cd6f706e957dba86aaaa45ce4ee17cf72d","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:46:00,186 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:00Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:46:00,209 [INFO] TX -> {"type":"stateReport","cpuUsage":20.2,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:00,210 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":null}} -2025-08-27 19:46:00,446 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:00Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:46:02,227 [INFO] TX -> {"type":"stateReport","cpuUsage":22.0,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:02,565 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:02Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:46:04,241 [INFO] TX -> {"type":"stateReport","cpuUsage":16.7,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:04,496 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:04Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:46:06,260 [INFO] TX -> {"type":"stateReport","cpuUsage":15.7,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:06,539 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:06Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:46:08,280 [INFO] TX -> {"type":"stateReport","cpuUsage":27.4,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:08,576 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:08Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:46:08,598 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":147}} -2025-08-27 19:46:10,300 [INFO] TX -> {"type":"stateReport","cpuUsage":23.3,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:10,642 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:10Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":147} -2025-08-27 19:46:12,306 [INFO] TX -> {"type":"stateReport","cpuUsage":15.7,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:12,644 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:12Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":147} -2025-08-27 19:46:14,320 [INFO] TX -> {"type":"stateReport","cpuUsage":21.0,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:14,665 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:14Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":147} -2025-08-27 19:46:16,350 [INFO] TX -> {"type":"stateReport","cpuUsage":21.6,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:16,691 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:16Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":147} -2025-08-27 19:46:18,342 [INFO] TX -> {"type":"stateReport","cpuUsage":24.5,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:18,848 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:18Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":147} -2025-08-27 19:46:20,352 [INFO] TX -> {"type":"stateReport","cpuUsage":24.8,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:20,847 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:20Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":147} -2025-08-27 19:46:22,369 [INFO] TX -> {"type":"stateReport","cpuUsage":19.6,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:22,780 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:22Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":147} -2025-08-27 19:46:24,395 [INFO] TX -> {"type":"stateReport","cpuUsage":13.1,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:24,841 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:24Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":147} -2025-08-27 19:46:26,412 [INFO] TX -> {"type":"stateReport","cpuUsage":20.6,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:26,896 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:26Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":147} -2025-08-27 19:46:28,408 [INFO] TX -> {"type":"stateReport","cpuUsage":17.2,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:28,999 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:28Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":147} -2025-08-27 19:46:29,857 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124629Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=8c5e5a2c026dbc63f7e4bdb9f61d5ecbde713dc1371839b72bbf34e784bcfe48","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:46:30,337 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:46:30,371 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":null}} -2025-08-27 19:46:30,414 [INFO] TX -> {"type":"stateReport","cpuUsage":18.7,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:30,939 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:46:32,422 [INFO] TX -> {"type":"stateReport","cpuUsage":16.9,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:33,016 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:33Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:46:34,569 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:34Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:46:34,570 [INFO] TX -> {"type":"stateReport","cpuUsage":25.8,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:36,557 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:36Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:46:36,587 [INFO] TX -> {"type":"stateReport","cpuUsage":20.8,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:38,603 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:38Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:46:38,604 [INFO] TX -> {"type":"stateReport","cpuUsage":18.3,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:38,621 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":148}} -2025-08-27 19:46:40,606 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:40Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":148} -2025-08-27 19:46:40,608 [INFO] TX -> {"type":"stateReport","cpuUsage":20.8,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:42,631 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:42Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":148} -2025-08-27 19:46:42,632 [INFO] TX -> {"type":"stateReport","cpuUsage":18.5,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:44,734 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:44Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":148} -2025-08-27 19:46:44,736 [INFO] TX -> {"type":"stateReport","cpuUsage":17.7,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:46,689 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:46Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":148} -2025-08-27 19:46:46,753 [INFO] TX -> {"type":"stateReport","cpuUsage":21.6,"memoryUsage":86.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:48,762 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:48Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":148} -2025-08-27 19:46:48,763 [INFO] TX -> {"type":"stateReport","cpuUsage":22.8,"memoryUsage":87.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:50,758 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:50Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":148} -2025-08-27 19:46:50,759 [INFO] TX -> {"type":"stateReport","cpuUsage":29.7,"memoryUsage":89.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:52,967 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:52Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":148} -2025-08-27 19:46:52,970 [INFO] TX -> {"type":"stateReport","cpuUsage":26.0,"memoryUsage":89.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:55,049 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:55Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":148} -2025-08-27 19:46:55,051 [INFO] TX -> {"type":"stateReport","cpuUsage":26.7,"memoryUsage":89.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:57,033 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:57Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":148} -2025-08-27 19:46:57,079 [INFO] TX -> {"type":"stateReport","cpuUsage":21.2,"memoryUsage":89.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:58,969 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:58Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":148} -2025-08-27 19:46:59,081 [INFO] TX -> {"type":"stateReport","cpuUsage":22.9,"memoryUsage":88.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:46:59,864 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124659Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=2c634b5e97c25f9fcc88782992b7a2754430b33c32483ea18b4c158bf78ee21d","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:47:00,462 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:00Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:47:00,480 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":null}} -2025-08-27 19:47:01,098 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:01Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:47:01,099 [INFO] TX -> {"type":"stateReport","cpuUsage":23.6,"memoryUsage":88.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:47:03,085 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:03Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:47:03,086 [INFO] TX -> {"type":"stateReport","cpuUsage":18.7,"memoryUsage":88.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:47:04,659 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:04Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:47:05,095 [INFO] TX -> {"type":"stateReport","cpuUsage":20.5,"memoryUsage":88.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:47:06,807 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:06Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:47:07,106 [INFO] TX -> {"type":"stateReport","cpuUsage":18.7,"memoryUsage":88.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:47:08,822 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:08Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:47:08,841 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":149}} -2025-08-27 19:47:09,128 [INFO] TX -> {"type":"stateReport","cpuUsage":17.8,"memoryUsage":88.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:47:10,759 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:10Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":149} -2025-08-27 19:47:11,146 [INFO] TX -> {"type":"stateReport","cpuUsage":24.4,"memoryUsage":87.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:47:12,785 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:12Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":149} -2025-08-27 19:47:13,148 [INFO] TX -> {"type":"stateReport","cpuUsage":12.1,"memoryUsage":87.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:47:14,817 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:14Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":149} -2025-08-27 19:47:15,142 [INFO] TX -> {"type":"stateReport","cpuUsage":12.6,"memoryUsage":87.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:47:16,879 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:16Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":149} -2025-08-27 19:47:17,156 [INFO] TX -> {"type":"stateReport","cpuUsage":19.9,"memoryUsage":87.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:47:18,916 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:18Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":149} -2025-08-27 19:47:19,170 [INFO] TX -> {"type":"stateReport","cpuUsage":20.2,"memoryUsage":88.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:47:20,999 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:20Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":149} -2025-08-27 19:47:21,181 [INFO] TX -> {"type":"stateReport","cpuUsage":21.5,"memoryUsage":87.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:47:23,005 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:23Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":149} -2025-08-27 19:47:23,205 [INFO] TX -> {"type":"stateReport","cpuUsage":20.8,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:47:25,052 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:25Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":149} -2025-08-27 19:47:25,213 [INFO] TX -> {"type":"stateReport","cpuUsage":17.7,"memoryUsage":87.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:47:27,057 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:27Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":149} -2025-08-27 19:47:27,226 [INFO] TX -> {"type":"stateReport","cpuUsage":16.8,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:47:29,075 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:29Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":149} -2025-08-27 19:47:29,252 [INFO] TX -> {"type":"stateReport","cpuUsage":14.2,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:47:29,865 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124729Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=6fd2f997434a4947ac596b17b36b971ba10b068afd3a4e7ecf333ba3cee583f4","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:47:30,598 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:47:30,627 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":null}} -2025-08-27 19:47:31,192 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:31Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:47:31,263 [INFO] TX -> {"type":"stateReport","cpuUsage":14.4,"memoryUsage":87.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:47:33,244 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:33Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:47:33,275 [INFO] TX -> {"type":"stateReport","cpuUsage":19.2,"memoryUsage":87.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:47:35,274 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:35Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:47:35,274 [INFO] TX -> {"type":"stateReport","cpuUsage":21.4,"memoryUsage":87.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]} -2025-08-27 19:48:45,364 [INFO] WebSocket communication logging started - TX/RX format -2025-08-27 19:48:53,127 [INFO] RX <- {"type":"subscribe","payload":{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"","modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124853Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=ee67f7674c24eedefdb9ddca6b0c2aba268ed11063e0601ec2fe00786e73ec37","modelName":"bangchak_full","modelId":20}} -2025-08-27 19:48:59,879 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124859Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=bb6408c8df465a5331f01a1600c1c13f2f52168bdc2b5d636eb80dfe0342199d","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:48:59,880 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:48:59Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:00,525 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:00Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:02,504 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:02Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:04,444 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:04Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:06,468 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:06Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:08,513 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:08Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:08,531 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":150}} -2025-08-27 19:49:10,629 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:10Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":150} -2025-08-27 19:49:12,575 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:12Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":150} -2025-08-27 19:49:14,135 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:14Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":150} -2025-08-27 19:49:16,196 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:16Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":150} -2025-08-27 19:49:18,324 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:18Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":150} -2025-08-27 19:49:20,361 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:20Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":150} -2025-08-27 19:49:22,329 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:22Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":150} -2025-08-27 19:49:24,424 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:24Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":150} -2025-08-27 19:49:26,427 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:26Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":150} -2025-08-27 19:49:28,516 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:28Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":150} -2025-08-27 19:49:29,880 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124929Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=45aaaf27b2756c214e6b930c29e844a4ff450b4b8225889337c5e78492199099","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:49:30,027 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:30,046 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":null}} -2025-08-27 19:49:30,453 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:32,542 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:32Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:34,610 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:34Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:36,593 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:36Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:38,581 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:38Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:40,619 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:40Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:42,643 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:42Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:44,697 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:44Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:46,686 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:46Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:48,813 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:48Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:50,271 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:50Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:52,782 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:52Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:54,786 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:54Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:56,360 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:56Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:58,306 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:58Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:49:59,879 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124959Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=02f629c0b0b6db85781932ad17e5cd7432be9c6d455cd147b52e800b2b01fedc","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:50:00,152 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:00Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:50:00,338 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:00Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:50:02,375 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:02Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:50:04,420 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:04Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:50:06,476 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:06Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:50:08,525 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:08Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:50:10,531 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:10Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:50:12,562 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:12Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:50:14,685 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:14Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:50:16,632 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:16Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:50:16,649 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":151}} -2025-08-27 19:50:18,673 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:18Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":151} -2025-08-27 19:50:20,807 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:20Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":151} -2025-08-27 19:50:22,769 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:22Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":151} -2025-08-27 19:50:24,811 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:24Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":151} -2025-08-27 19:50:26,772 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:26Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":151} -2025-08-27 19:50:28,802 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:28Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":151} -2025-08-27 19:50:29,879 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T125029Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=1349011364def2df06f0498387ef5d0e9fff56e419d077fc3038f36aa6b0ec1f","modelId":20,"modelName":"bangchak_full"}]} -2025-08-27 19:50:30,271 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:50:30,299 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":null}} -2025-08-27 19:50:30,868 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:50:32,933 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:32Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:50:34,975 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:34Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:50:36,523 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:36Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:50:38,578 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:38Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}} -2025-08-27 19:50:38,595 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":152}} -2025-08-27 19:50:40,706 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:40Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":152} -2025-08-27 19:50:43,416 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:43Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":152} -2025-08-27 19:50:44,846 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:44Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":152} -2025-08-27 19:50:46,727 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:46Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":152} -2025-08-28 01:41:13,800 [INFO] WebSocket communication logging started - TX/RX format -2025-08-28 01:44:02,219 [INFO] WebSocket communication logging started - TX/RX format -2025-08-28 01:51:20,240 [INFO] WebSocket communication logging started - TX/RX format -2025-08-28 11:20:05,469 [INFO] WebSocket communication logging started - TX/RX format -2025-08-28 11:20:16,810 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_poc-1756312318569.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250828%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250828T042016Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=8fe7abc333e68ed2a7c30710fd8f0b15850a5f2e8631dbdc058b31670c46cb4a","modelId":21,"modelName":"bangchak_poc"}]} -2025-08-28 11:20:24,371 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:24Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:20:31,136 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:31Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:20:31,359 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:31Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:20:31,363 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":null}} -2025-08-28 11:20:32,799 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:32Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:20:34,995 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:34Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:20:36,899 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:36Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:20:38,975 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:38Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:20:40,972 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:40Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:20:43,322 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:43Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:20:45,637 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:45Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:20:46,716 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_poc-1756312318569.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250828%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250828T042046Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=54a8e18cdc4958a8140a48a94eb2fcacf94ee1a66d37270b2984dc223c642382","modelId":21,"modelName":"bangchak_poc"}]} -2025-08-28 11:20:48,472 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:48Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:20:49,241 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:49Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:20:51,452 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:51Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:20:53,377 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:53Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:20:55,270 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:55Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:20:56,793 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:56Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:20:58,745 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:58Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:01,530 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:01Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:03,347 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:03Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:05,344 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:05Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:07,551 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:07Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:09,566 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:09Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:10,996 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:10Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:13,125 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:13Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:15,131 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:15Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:16,699 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_poc-1756312318569.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250828%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250828T042116Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=20dc86a7131462dd0bbdf01922ea44c5c272e70fa1fda444b38a6fe5df14968c","modelId":21,"modelName":"bangchak_poc"}]} -2025-08-28 11:21:18,605 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:18Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:19,401 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:19Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:21,422 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:21Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:23,454 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:23Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:25,415 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:25Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:27,449 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:27Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:29,352 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:29Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:31,302 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:31Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:33,402 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:33Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:35,408 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:35Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:37,418 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:37Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:39,512 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:39Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:41,505 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:41Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:43,456 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:43Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:45,473 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:45Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:46,699 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_poc-1756312318569.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250828%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250828T042146Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=3ad593cd5ab8dbe843e4acd83843009fdbbfc3492a75a7e6a05e59d5d945b334","modelId":21,"modelName":"bangchak_poc"}]} -2025-08-28 11:21:46,714 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:46Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:47,522 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:47Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:49,073 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:49Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:51,177 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:51Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:53,304 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:53Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:55,221 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:55Z","data":{"detection":{},"modelId":21,"modelName":"bangchak_poc"}} -2025-08-28 11:21:55,249 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":153}} -2025-08-28 11:21:59,139 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:59Z","data":{"detection":{"carModel":null,"carBrand":"Isuzu","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"},"sessionId":153} -2025-08-28 11:21:59,497 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:59Z","data":{"detection":{"carModel":null,"carBrand":"Isuzu","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"},"sessionId":153} -2025-08-28 11:22:01,445 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:22:01Z","data":{"detection":{"carModel":null,"carBrand":"Isuzu","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"},"sessionId":153}