Successful
This commit is contained in:
		
							parent
							
								
									39394caa8e
								
							
						
					
					
						commit
						5875b76d74
					
				
					 3 changed files with 846 additions and 0 deletions
				
			
		
							
								
								
									
										438
									
								
								app.py
									
										
									
									
									
								
							
							
						
						
									
										438
									
								
								app.py
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -17,6 +17,7 @@ import ssl
 | 
			
		|||
import urllib3
 | 
			
		||||
import subprocess
 | 
			
		||||
import tempfile
 | 
			
		||||
import redis
 | 
			
		||||
from urllib.parse import urlparse
 | 
			
		||||
from requests.adapters import HTTPAdapter
 | 
			
		||||
from urllib3.util.ssl_ import create_urllib3_context
 | 
			
		||||
| 
						 | 
				
			
			@ -45,6 +46,10 @@ subscription_to_camera: Dict[str, str] = {}
 | 
			
		|||
latest_frames: Dict[str, Any] = {}
 | 
			
		||||
# Store cached detection dict after successful pipeline completion
 | 
			
		||||
cached_detections: Dict[str, Dict[str, Any]] = {}
 | 
			
		||||
# Enhanced caching system for LPR integration
 | 
			
		||||
session_detections: Dict[str, Dict[str, Any]] = {}  # session_id -> detection data
 | 
			
		||||
session_to_camera: Dict[str, str] = {}              # session_id -> camera_id
 | 
			
		||||
detection_timestamps: Dict[str, float] = {}         # session_id -> timestamp (for cleanup)
 | 
			
		||||
# Track frame skipping for pipeline buffer after detection
 | 
			
		||||
frame_skip_flags: Dict[str, bool] = {}
 | 
			
		||||
# Track camera connection states for immediate error handling
 | 
			
		||||
| 
						 | 
				
			
			@ -102,6 +107,335 @@ logger.info("Ensured models directory exists")
 | 
			
		|||
 | 
			
		||||
# Constants for heartbeat and timeouts
 | 
			
		||||
HEARTBEAT_INTERVAL = 2  # seconds
 | 
			
		||||
 | 
			
		||||
# Global Redis connection for LPR integration
 | 
			
		||||
redis_client_global = None
 | 
			
		||||
lpr_listener_thread = None
 | 
			
		||||
cleanup_timer_thread = None
 | 
			
		||||
lpr_integration_started = False
 | 
			
		||||
 | 
			
		||||
# Redis connection helper functions
 | 
			
		||||
def get_redis_config_from_model(camera_id: str) -> Dict[str, Any]:
 | 
			
		||||
    """Extract Redis configuration from loaded model pipeline"""
 | 
			
		||||
    try:
 | 
			
		||||
        for model_id, model_tree in models.get(camera_id, {}).items():
 | 
			
		||||
            if hasattr(model_tree, 'get') and 'redis_client' in model_tree:
 | 
			
		||||
                # Extract config from existing Redis client
 | 
			
		||||
                client = model_tree['redis_client']
 | 
			
		||||
                if client:
 | 
			
		||||
                    return {
 | 
			
		||||
                        'host': client.connection_pool.connection_kwargs['host'],
 | 
			
		||||
                        'port': client.connection_pool.connection_kwargs['port'],
 | 
			
		||||
                        'password': client.connection_pool.connection_kwargs.get('password'),
 | 
			
		||||
                        'db': client.connection_pool.connection_kwargs.get('db', 0)
 | 
			
		||||
                    }
 | 
			
		||||
    except Exception as e:
 | 
			
		||||
        logger.debug(f"Could not extract Redis config from model: {e}")
 | 
			
		||||
    
 | 
			
		||||
    # Fallback - try to read from pipeline.json directly
 | 
			
		||||
    try:
 | 
			
		||||
        pipeline_dirs = []
 | 
			
		||||
        models_dir = "models"
 | 
			
		||||
        if os.path.exists(models_dir):
 | 
			
		||||
            for root, dirs, files in os.walk(models_dir):
 | 
			
		||||
                if "pipeline.json" in files:
 | 
			
		||||
                    with open(os.path.join(root, "pipeline.json"), 'r') as f:
 | 
			
		||||
                        config = json.load(f)
 | 
			
		||||
                        if 'redis' in config:
 | 
			
		||||
                            return config['redis']
 | 
			
		||||
    except Exception as e:
 | 
			
		||||
        logger.debug(f"Could not read Redis config from pipeline.json: {e}")
 | 
			
		||||
    
 | 
			
		||||
    return None
 | 
			
		||||
 | 
			
		||||
def create_redis_connection() -> redis.Redis:
 | 
			
		||||
    """Create Redis connection using config from pipeline"""
 | 
			
		||||
    global redis_client_global
 | 
			
		||||
    
 | 
			
		||||
    if redis_client_global is not None:
 | 
			
		||||
        try:
 | 
			
		||||
            redis_client_global.ping()
 | 
			
		||||
            return redis_client_global
 | 
			
		||||
        except:
 | 
			
		||||
            redis_client_global = None
 | 
			
		||||
    
 | 
			
		||||
    # Find any camera with a loaded model to get Redis config
 | 
			
		||||
    redis_config = None
 | 
			
		||||
    for camera_id in models.keys():
 | 
			
		||||
        redis_config = get_redis_config_from_model(camera_id)
 | 
			
		||||
        if redis_config:
 | 
			
		||||
            break
 | 
			
		||||
    
 | 
			
		||||
    if not redis_config:
 | 
			
		||||
        logger.error("No Redis configuration found in any loaded models")
 | 
			
		||||
        return None
 | 
			
		||||
    
 | 
			
		||||
    try:
 | 
			
		||||
        redis_client_global = redis.Redis(
 | 
			
		||||
            host=redis_config['host'],
 | 
			
		||||
            port=redis_config['port'],
 | 
			
		||||
            password=redis_config.get('password'),
 | 
			
		||||
            db=redis_config.get('db', 0),
 | 
			
		||||
            decode_responses=True,
 | 
			
		||||
            socket_connect_timeout=5,
 | 
			
		||||
            socket_timeout=5
 | 
			
		||||
        )
 | 
			
		||||
        redis_client_global.ping()
 | 
			
		||||
        logger.info(f"✅ Connected to Redis for LPR at {redis_config['host']}:{redis_config['port']}")
 | 
			
		||||
        return redis_client_global
 | 
			
		||||
    except Exception as e:
 | 
			
		||||
        logger.error(f"❌ Failed to connect to Redis for LPR: {e}")
 | 
			
		||||
        redis_client_global = None
 | 
			
		||||
        return None
 | 
			
		||||
 | 
			
		||||
# LPR Integration Functions
 | 
			
		||||
def process_license_result(lpr_data: Dict[str, Any]):
 | 
			
		||||
    """Process incoming LPR result and update backend"""
 | 
			
		||||
    try:
 | 
			
		||||
        # Enhanced debugging for LPR data reception
 | 
			
		||||
        logger.info("=" * 60)
 | 
			
		||||
        logger.info("🚗 LPR SERVICE DATA RECEIVED")
 | 
			
		||||
        logger.info("=" * 60)
 | 
			
		||||
        logger.info(f"📥 Raw LPR data: {json.dumps(lpr_data, indent=2)}")
 | 
			
		||||
        
 | 
			
		||||
        session_id = str(lpr_data.get('session_id', ''))
 | 
			
		||||
        license_text = lpr_data.get('license_character', '')
 | 
			
		||||
        
 | 
			
		||||
        logger.info(f"🔍 Extracted session_id: '{session_id}'")
 | 
			
		||||
        logger.info(f"🔍 Extracted license_character: '{license_text}'")
 | 
			
		||||
        logger.info(f"📊 Current cached sessions count: {len(session_detections)}")
 | 
			
		||||
        logger.info(f"📊 Available session IDs: {list(session_detections.keys())}")
 | 
			
		||||
        
 | 
			
		||||
        # Find cached detection by session_id
 | 
			
		||||
        if session_id not in session_detections:
 | 
			
		||||
            logger.warning("❌ LPR SESSION ID NOT FOUND!")
 | 
			
		||||
            logger.warning(f"   Looking for session_id: '{session_id}'")
 | 
			
		||||
            logger.warning(f"   Available sessions: {list(session_detections.keys())}")
 | 
			
		||||
            logger.warning(f"   Session count: {len(session_detections)}")
 | 
			
		||||
            
 | 
			
		||||
            # Additional debugging - show session timestamps
 | 
			
		||||
            if session_detections:
 | 
			
		||||
                logger.warning("📅 Available session details:")
 | 
			
		||||
                for sid, timestamp in detection_timestamps.items():
 | 
			
		||||
                    age = time.time() - timestamp
 | 
			
		||||
                    camera = session_to_camera.get(sid, 'unknown')
 | 
			
		||||
                    logger.warning(f"   Session {sid}: camera={camera}, age={age:.1f}s")
 | 
			
		||||
            else:
 | 
			
		||||
                logger.warning("   No cached sessions available - worker may not have processed any detections yet")
 | 
			
		||||
            
 | 
			
		||||
            logger.warning("💡 Possible causes:")
 | 
			
		||||
            logger.warning("   1. Session expired (TTL: 10 minutes)")
 | 
			
		||||
            logger.warning("   2. Session ID mismatch between detection and LPR service")
 | 
			
		||||
            logger.warning("   3. Detection was not cached (no sessionId from backend)")
 | 
			
		||||
            logger.warning("   4. Worker restarted after detection but before LPR result")
 | 
			
		||||
            return
 | 
			
		||||
        
 | 
			
		||||
        # Get the original detection data
 | 
			
		||||
        detection_data = session_detections[session_id].copy()
 | 
			
		||||
        camera_id = session_to_camera.get(session_id, 'unknown')
 | 
			
		||||
        
 | 
			
		||||
        logger.info("✅ LPR SESSION FOUND!")
 | 
			
		||||
        logger.info(f"   📹 Camera ID: {camera_id}")
 | 
			
		||||
        logger.info(f"   ⏰ Session age: {time.time() - detection_timestamps.get(session_id, 0):.1f} seconds")
 | 
			
		||||
        
 | 
			
		||||
        # Show original detection structure before update
 | 
			
		||||
        original_license = detection_data.get('data', {}).get('detection', {}).get('licensePlateText')
 | 
			
		||||
        logger.info(f"   🔍 Original licensePlateText: {original_license}")
 | 
			
		||||
        logger.info(f"   🆕 New licensePlateText: '{license_text}'")
 | 
			
		||||
        
 | 
			
		||||
        # Update licensePlateText in detection
 | 
			
		||||
        if 'data' in detection_data and 'detection' in detection_data['data']:
 | 
			
		||||
            detection_data['data']['detection']['licensePlateText'] = license_text
 | 
			
		||||
            
 | 
			
		||||
            logger.info("🎯 LICENSE PLATE UPDATE SUCCESS!")
 | 
			
		||||
            logger.info(f"   ✅ Updated detection for session {session_id}")
 | 
			
		||||
            logger.info(f"   ✅ Set licensePlateText = '{license_text}'")
 | 
			
		||||
            
 | 
			
		||||
            # Show full detection structure after update
 | 
			
		||||
            detection_dict = detection_data['data']['detection']
 | 
			
		||||
            logger.info("📋 Updated detection dictionary:")
 | 
			
		||||
            logger.info(f"   carModel: {detection_dict.get('carModel')}")
 | 
			
		||||
            logger.info(f"   carBrand: {detection_dict.get('carBrand')}")
 | 
			
		||||
            logger.info(f"   bodyType: {detection_dict.get('bodyType')}")
 | 
			
		||||
            logger.info(f"   licensePlateText: {detection_dict.get('licensePlateText')} ← UPDATED")
 | 
			
		||||
            logger.info(f"   licensePlateConfidence: {detection_dict.get('licensePlateConfidence')}")
 | 
			
		||||
        else:
 | 
			
		||||
            logger.error("❌ INVALID DETECTION DATA STRUCTURE!")
 | 
			
		||||
            logger.error(f"   Session {session_id} has malformed detection data")
 | 
			
		||||
            logger.error(f"   Detection data keys: {list(detection_data.keys())}")
 | 
			
		||||
            if 'data' in detection_data:
 | 
			
		||||
                logger.error(f"   Data keys: {list(detection_data['data'].keys())}")
 | 
			
		||||
            return
 | 
			
		||||
        
 | 
			
		||||
        # Update timestamp to indicate this is an LPR update
 | 
			
		||||
        detection_data['timestamp'] = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
 | 
			
		||||
        
 | 
			
		||||
        # Update all caches with new data
 | 
			
		||||
        session_detections[session_id] = detection_data.copy()
 | 
			
		||||
        cached_detections[camera_id] = detection_data.copy()
 | 
			
		||||
        
 | 
			
		||||
        # CRITICAL: Also update the pipeline state cached detection dict (used by lightweight mode)
 | 
			
		||||
        if camera_id in session_pipeline_states:
 | 
			
		||||
            pipeline_state = session_pipeline_states[camera_id]
 | 
			
		||||
            current_cached_dict = pipeline_state.get("cached_detection_dict", {})
 | 
			
		||||
            
 | 
			
		||||
            # Update the pipeline cached detection dict with new license plate
 | 
			
		||||
            updated_dict = current_cached_dict.copy() if current_cached_dict else {}
 | 
			
		||||
            updated_dict['licensePlateText'] = license_text
 | 
			
		||||
            
 | 
			
		||||
            pipeline_state["cached_detection_dict"] = updated_dict
 | 
			
		||||
            logger.info(f"✅ LPR: Updated pipeline state cached_detection_dict for camera {camera_id}")
 | 
			
		||||
            logger.debug(f"🔍 Pipeline cached dict now: {updated_dict}")
 | 
			
		||||
        else:
 | 
			
		||||
            logger.warning(f"⚠️ Camera {camera_id} not found in session_pipeline_states - pipeline cache not updated")
 | 
			
		||||
        
 | 
			
		||||
        logger.info("📡 SENDING UPDATED DETECTION TO BACKEND")
 | 
			
		||||
        logger.info(f"   📹 Camera ID: {camera_id}")
 | 
			
		||||
        logger.info(f"   📨 Updated licensePlateText: '{license_text}'")
 | 
			
		||||
        logger.info("   🔄 Updated both cache systems:")
 | 
			
		||||
        logger.info(f"     1️⃣ cached_detections[{camera_id}] ✅")
 | 
			
		||||
        logger.info(f"     2️⃣ session_pipeline_states[{camera_id}].cached_detection_dict ✅")
 | 
			
		||||
        
 | 
			
		||||
        # Log the full message being sent
 | 
			
		||||
        logger.info("📋 Updated detection data in cache:")
 | 
			
		||||
        logger.info(json.dumps(detection_data, indent=2))
 | 
			
		||||
        
 | 
			
		||||
        logger.info("✅ ALL CACHES UPDATED!")
 | 
			
		||||
        logger.info(f"   🎯 Lightweight mode will now use updated licensePlateText")
 | 
			
		||||
        logger.info(f"   📤 Backend will receive: licensePlateText = '{license_text}'")
 | 
			
		||||
        logger.info("   🔄 Both cache systems synchronized with LPR data")
 | 
			
		||||
        
 | 
			
		||||
        logger.info("=" * 60)
 | 
			
		||||
        logger.info("🏁 LPR PROCESSING COMPLETE")
 | 
			
		||||
        logger.info(f"   Session: {session_id}")
 | 
			
		||||
        logger.info(f"   License: '{license_text}'")
 | 
			
		||||
        logger.info(f"   Status: ✅ SUCCESS - DETECTION CACHE UPDATED")
 | 
			
		||||
        logger.info("=" * 60)
 | 
			
		||||
            
 | 
			
		||||
    except Exception as e:
 | 
			
		||||
        logger.error("=" * 60)
 | 
			
		||||
        logger.error("❌ LPR PROCESSING FAILED")
 | 
			
		||||
        logger.error("=" * 60)
 | 
			
		||||
        logger.error(f"Error: {e}")
 | 
			
		||||
        import traceback
 | 
			
		||||
        logger.error(f"Traceback: {traceback.format_exc()}")
 | 
			
		||||
        logger.error("=" * 60)
 | 
			
		||||
 | 
			
		||||
# LPR integration now uses cached detection mechanism instead of direct WebSocket sending
 | 
			
		||||
 | 
			
		||||
def license_results_listener():
 | 
			
		||||
    """Background thread to listen for LPR results from Redis"""
 | 
			
		||||
    logger.info("🎧 Starting LPR listener thread...")
 | 
			
		||||
    
 | 
			
		||||
    while True:
 | 
			
		||||
        try:
 | 
			
		||||
            redis_client = create_redis_connection()
 | 
			
		||||
            if not redis_client:
 | 
			
		||||
                logger.error("❌ No Redis connection available for LPR listener")
 | 
			
		||||
                time.sleep(10)
 | 
			
		||||
                continue
 | 
			
		||||
            
 | 
			
		||||
            pubsub = redis_client.pubsub()
 | 
			
		||||
            pubsub.subscribe("license_results")
 | 
			
		||||
            logger.info("✅ LPR listener subscribed to 'license_results' channel")
 | 
			
		||||
            
 | 
			
		||||
            for message in pubsub.listen():
 | 
			
		||||
                try:
 | 
			
		||||
                    if message['type'] == 'message':
 | 
			
		||||
                        logger.info("🔔 REDIS MESSAGE RECEIVED!")
 | 
			
		||||
                        logger.info(f"   📡 Channel: {message['channel']}")
 | 
			
		||||
                        logger.info(f"   📥 Raw data: {message['data']}")
 | 
			
		||||
                        logger.info(f"   📏 Data size: {len(str(message['data']))} bytes")
 | 
			
		||||
                        
 | 
			
		||||
                        try:
 | 
			
		||||
                            lpr_data = json.loads(message['data'])
 | 
			
		||||
                            logger.info("✅ JSON parsing successful")
 | 
			
		||||
                            logger.info("🏁 Starting LPR processing...")
 | 
			
		||||
                            process_license_result(lpr_data)
 | 
			
		||||
                            logger.info("✅ LPR processing completed")
 | 
			
		||||
                        except json.JSONDecodeError as e:
 | 
			
		||||
                            logger.error("❌ JSON PARSING FAILED!")
 | 
			
		||||
                            logger.error(f"   Error: {e}")
 | 
			
		||||
                            logger.error(f"   Raw data: {message['data']}")
 | 
			
		||||
                            logger.error(f"   Data type: {type(message['data'])}")
 | 
			
		||||
                        except Exception as e:
 | 
			
		||||
                            logger.error("❌ LPR PROCESSING ERROR!")
 | 
			
		||||
                            logger.error(f"   Error: {e}")
 | 
			
		||||
                            import traceback
 | 
			
		||||
                            logger.error(f"   Traceback: {traceback.format_exc()}")
 | 
			
		||||
                    elif message['type'] == 'subscribe':
 | 
			
		||||
                        logger.info(f"📡 LPR listener subscribed to channel: {message['channel']}")
 | 
			
		||||
                        logger.info("🎧 Ready to receive license plate results...")
 | 
			
		||||
                    elif message['type'] == 'unsubscribe':
 | 
			
		||||
                        logger.warning(f"📡 LPR listener unsubscribed from channel: {message['channel']}")
 | 
			
		||||
                    else:
 | 
			
		||||
                        logger.debug(f"📡 Redis message type: {message['type']}")
 | 
			
		||||
                        
 | 
			
		||||
                except Exception as e:
 | 
			
		||||
                    logger.error(f"❌ Error in LPR message processing loop: {e}")
 | 
			
		||||
                    break
 | 
			
		||||
                    
 | 
			
		||||
        except redis.exceptions.ConnectionError as e:
 | 
			
		||||
            logger.error(f"❌ Redis connection lost in LPR listener: {e}")
 | 
			
		||||
            time.sleep(5)  # Wait before reconnecting
 | 
			
		||||
        except Exception as e:
 | 
			
		||||
            logger.error(f"❌ Unexpected error in LPR listener: {e}")
 | 
			
		||||
            time.sleep(10)
 | 
			
		||||
    
 | 
			
		||||
    logger.warning("🛑 LPR listener thread stopped")
 | 
			
		||||
 | 
			
		||||
def cleanup_expired_sessions():
 | 
			
		||||
    """Remove sessions older than TTL (10 minutes)"""
 | 
			
		||||
    try:
 | 
			
		||||
        current_time = time.time()
 | 
			
		||||
        ttl_seconds = 600  # 10 minutes
 | 
			
		||||
        
 | 
			
		||||
        expired_sessions = [
 | 
			
		||||
            session_id for session_id, timestamp in detection_timestamps.items()
 | 
			
		||||
            if current_time - timestamp > ttl_seconds
 | 
			
		||||
        ]
 | 
			
		||||
        
 | 
			
		||||
        if expired_sessions:
 | 
			
		||||
            logger.info(f"🧹 Cleaning up {len(expired_sessions)} expired sessions")
 | 
			
		||||
            
 | 
			
		||||
            for session_id in expired_sessions:
 | 
			
		||||
                session_detections.pop(session_id, None)
 | 
			
		||||
                camera_id = session_to_camera.pop(session_id, None)
 | 
			
		||||
                detection_timestamps.pop(session_id, None)
 | 
			
		||||
                logger.debug(f"Cleaned up expired session: {session_id} (camera: {camera_id})")
 | 
			
		||||
                
 | 
			
		||||
        else:
 | 
			
		||||
            logger.debug(f"🧹 No expired sessions to clean up ({len(detection_timestamps)} active)")
 | 
			
		||||
            
 | 
			
		||||
    except Exception as e:
 | 
			
		||||
        logger.error(f"❌ Error in session cleanup: {e}")
 | 
			
		||||
 | 
			
		||||
def cleanup_timer():
 | 
			
		||||
    """Background thread for periodic session cleanup"""
 | 
			
		||||
    logger.info("⏰ Starting session cleanup timer thread...")
 | 
			
		||||
    
 | 
			
		||||
    while True:
 | 
			
		||||
        try:
 | 
			
		||||
            time.sleep(120)  # Run cleanup every 2 minutes
 | 
			
		||||
            cleanup_expired_sessions()
 | 
			
		||||
        except Exception as e:
 | 
			
		||||
            logger.error(f"❌ Error in cleanup timer: {e}")
 | 
			
		||||
            time.sleep(120)
 | 
			
		||||
 | 
			
		||||
def start_lpr_integration():
 | 
			
		||||
    """Start LPR integration threads"""
 | 
			
		||||
    global lpr_listener_thread, cleanup_timer_thread
 | 
			
		||||
    
 | 
			
		||||
    # Start LPR listener thread
 | 
			
		||||
    lpr_listener_thread = threading.Thread(target=license_results_listener, daemon=True, name="LPR-Listener")
 | 
			
		||||
    lpr_listener_thread.start()
 | 
			
		||||
    logger.info("✅ LPR listener thread started")
 | 
			
		||||
    
 | 
			
		||||
    # Start cleanup timer thread  
 | 
			
		||||
    cleanup_timer_thread = threading.Thread(target=cleanup_timer, daemon=True, name="Session-Cleanup")
 | 
			
		||||
    cleanup_timer_thread.start()
 | 
			
		||||
    logger.info("✅ Session cleanup timer thread started")
 | 
			
		||||
 | 
			
		||||
WORKER_TIMEOUT_MS = 10000
 | 
			
		||||
logger.debug(f"Heartbeat interval set to {HEARTBEAT_INTERVAL} seconds")
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -335,6 +669,37 @@ def update_session_pipeline_mode(camera_id, new_mode, session_id=None):
 | 
			
		|||
####################################################
 | 
			
		||||
# REST API endpoint for image retrieval
 | 
			
		||||
####################################################
 | 
			
		||||
@app.get("/lpr/debug")
 | 
			
		||||
async def get_lpr_debug_info():
 | 
			
		||||
    """Debug endpoint to inspect LPR integration state"""
 | 
			
		||||
    try:
 | 
			
		||||
        return {
 | 
			
		||||
            "status": "success",
 | 
			
		||||
            "lpr_integration_started": lpr_integration_started,
 | 
			
		||||
            "redis_connected": redis_client_global is not None and redis_client_global.ping() if redis_client_global else False,
 | 
			
		||||
            "active_sessions": len(session_detections),
 | 
			
		||||
            "session_details": {
 | 
			
		||||
                session_id: {
 | 
			
		||||
                    "camera_id": session_to_camera.get(session_id, "unknown"),
 | 
			
		||||
                    "timestamp": detection_timestamps.get(session_id, 0),
 | 
			
		||||
                    "age_seconds": time.time() - detection_timestamps.get(session_id, time.time()),
 | 
			
		||||
                    "has_license": session_detections[session_id].get('data', {}).get('detection', {}).get('licensePlateText') is not None
 | 
			
		||||
                }
 | 
			
		||||
                for session_id in session_detections.keys()
 | 
			
		||||
            },
 | 
			
		||||
            "thread_status": {
 | 
			
		||||
                "lpr_listener_alive": lpr_listener_thread.is_alive() if lpr_listener_thread else False,
 | 
			
		||||
                "cleanup_timer_alive": cleanup_timer_thread.is_alive() if cleanup_timer_thread else False
 | 
			
		||||
            },
 | 
			
		||||
            "cached_detections_by_camera": list(cached_detections.keys())
 | 
			
		||||
        }
 | 
			
		||||
    except Exception as e:
 | 
			
		||||
        return {
 | 
			
		||||
            "status": "error",
 | 
			
		||||
            "error": str(e),
 | 
			
		||||
            "lpr_integration_started": lpr_integration_started
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@app.get("/camera/{camera_id}/image")
 | 
			
		||||
async def get_camera_image(camera_id: str):
 | 
			
		||||
    """
 | 
			
		||||
| 
						 | 
				
			
			@ -889,6 +1254,15 @@ async def detect(websocket: WebSocket):
 | 
			
		|||
                if detection_dict is not None and detection_result.get("class") != "none":
 | 
			
		||||
                    cached_detections[camera_id] = detection_data.copy()
 | 
			
		||||
                    logger.debug(f"Cached detection for camera {camera_id}: {detection_dict}")
 | 
			
		||||
                    
 | 
			
		||||
                    # Enhanced caching: Store by session_id for LPR integration
 | 
			
		||||
                    session_id = detection_data.get('sessionId')
 | 
			
		||||
                    if session_id:
 | 
			
		||||
                        session_id_str = str(session_id)
 | 
			
		||||
                        session_detections[session_id_str] = detection_data.copy()
 | 
			
		||||
                        session_to_camera[session_id_str] = camera_id
 | 
			
		||||
                        detection_timestamps[session_id_str] = time.time()
 | 
			
		||||
                        logger.debug(f"🔑 Cached detection for LPR by session_id {session_id_str}: {camera_id}")
 | 
			
		||||
                else:
 | 
			
		||||
                    # Don't cache null/none detections - let them reset properly
 | 
			
		||||
                    cached_detections.pop(camera_id, None)
 | 
			
		||||
| 
						 | 
				
			
			@ -1259,6 +1633,16 @@ async def detect(websocket: WebSocket):
 | 
			
		|||
                        models[camera_id] = {}
 | 
			
		||||
                    models[camera_id][modelId] = model_tree
 | 
			
		||||
                    
 | 
			
		||||
                    # Start LPR integration threads after first model is loaded (only once)
 | 
			
		||||
                    global lpr_integration_started
 | 
			
		||||
                    if not lpr_integration_started and hasattr(model_tree, 'get') and model_tree.get('redis_client'):
 | 
			
		||||
                        try:
 | 
			
		||||
                            start_lpr_integration()
 | 
			
		||||
                            lpr_integration_started = True
 | 
			
		||||
                            logger.info("🚀 LPR integration started after first model load")
 | 
			
		||||
                        except Exception as e:
 | 
			
		||||
                            logger.error(f"❌ Failed to start LPR integration: {e}")
 | 
			
		||||
 | 
			
		||||
        # Create stream (same logic as original)
 | 
			
		||||
        if camera_id and (rtsp_url or snapshot_url) and len(streams) < max_streams:
 | 
			
		||||
            camera_url = snapshot_url if snapshot_url else rtsp_url
 | 
			
		||||
| 
						 | 
				
			
			@ -1572,6 +1956,15 @@ async def detect(websocket: WebSocket):
 | 
			
		|||
                                models[camera_id][modelId] = model_tree
 | 
			
		||||
                                logger.info(f"Successfully loaded model {modelId} for camera {camera_id}")
 | 
			
		||||
                                logger.debug(f"Model extraction directory: {extraction_dir}")
 | 
			
		||||
                                
 | 
			
		||||
                                # Start LPR integration threads after first model is loaded (only once)
 | 
			
		||||
                                if not lpr_integration_started and hasattr(model_tree, 'get') and model_tree.get('redis_client'):
 | 
			
		||||
                                    try:
 | 
			
		||||
                                        start_lpr_integration()
 | 
			
		||||
                                        lpr_integration_started = True
 | 
			
		||||
                                        logger.info("🚀 LPR integration started after first model load")
 | 
			
		||||
                                    except Exception as e:
 | 
			
		||||
                                        logger.error(f"❌ Failed to start LPR integration: {e}")
 | 
			
		||||
                    if camera_id and (rtsp_url or snapshot_url):
 | 
			
		||||
                        with streams_lock:
 | 
			
		||||
                            # Determine camera URL for shared stream management
 | 
			
		||||
| 
						 | 
				
			
			@ -1798,6 +2191,47 @@ async def detect(websocket: WebSocket):
 | 
			
		|||
                            logger.debug(f"Session IDs after update: {session_ids}")
 | 
			
		||||
                            logger.debug(f"🎯 CMS Backend created sessionId {session_id} after receiving detection data")
 | 
			
		||||
                            
 | 
			
		||||
                            # 🔑 LPR Integration: Retroactively cache the last detection by this new session_id
 | 
			
		||||
                            session_id_str = str(session_id)
 | 
			
		||||
                            logger.info(f"🔑 LPR: Attempting to retroactively cache detection for session_id {session_id_str}")
 | 
			
		||||
                            
 | 
			
		||||
                            # Find cameras associated with this display
 | 
			
		||||
                            display_cameras = []
 | 
			
		||||
                            with streams_lock:
 | 
			
		||||
                                for camera_id, stream in streams.items():
 | 
			
		||||
                                    if stream["subscriptionIdentifier"].startswith(display_identifier + ";"):
 | 
			
		||||
                                        display_cameras.append(camera_id)
 | 
			
		||||
                            
 | 
			
		||||
                            logger.debug(f"🔍 Found {len(display_cameras)} cameras for display {display_identifier}: {display_cameras}")
 | 
			
		||||
                            
 | 
			
		||||
                            # Cache the most recent detection for each camera by the new session_id
 | 
			
		||||
                            cached_count = 0
 | 
			
		||||
                            for camera_id in display_cameras:
 | 
			
		||||
                                if camera_id in cached_detections:
 | 
			
		||||
                                    detection_data = cached_detections[camera_id].copy()
 | 
			
		||||
                                    
 | 
			
		||||
                                    # Add sessionId to the detection data
 | 
			
		||||
                                    detection_data['sessionId'] = session_id
 | 
			
		||||
                                    
 | 
			
		||||
                                    # Cache by session_id for LPR lookup
 | 
			
		||||
                                    session_detections[session_id_str] = detection_data
 | 
			
		||||
                                    session_to_camera[session_id_str] = camera_id
 | 
			
		||||
                                    detection_timestamps[session_id_str] = time.time()
 | 
			
		||||
                                    cached_count += 1
 | 
			
		||||
                                    
 | 
			
		||||
                                    logger.info(f"✅ LPR: Cached detection for session_id {session_id_str} -> camera {camera_id}")
 | 
			
		||||
                                    logger.debug(f"🔍 Detection data: {detection_data.get('data', {}).get('detection', {})}")
 | 
			
		||||
                                else:
 | 
			
		||||
                                    logger.debug(f"⚠️ No cached detection available for camera {camera_id}")
 | 
			
		||||
                            
 | 
			
		||||
                            if cached_count > 0:
 | 
			
		||||
                                logger.info(f"🎉 LPR: Successfully cached {cached_count} detection(s) for session_id {session_id_str}")
 | 
			
		||||
                                logger.info(f"📊 Total LPR sessions now cached: {len(session_detections)}")
 | 
			
		||||
                            else:
 | 
			
		||||
                                logger.warning(f"⚠️ LPR: No detections could be cached for session_id {session_id_str}")
 | 
			
		||||
                                logger.warning(f"   Display cameras: {display_cameras}")
 | 
			
		||||
                                logger.warning(f"   Available cached detections: {list(cached_detections.keys())}")
 | 
			
		||||
                            
 | 
			
		||||
                            # Clear waiting state for cameras associated with this display
 | 
			
		||||
                            with streams_lock:
 | 
			
		||||
                                affected_cameras = []
 | 
			
		||||
| 
						 | 
				
			
			@ -1881,4 +2315,8 @@ async def detect(websocket: WebSocket):
 | 
			
		|||
        cached_full_pipeline_results.clear()
 | 
			
		||||
        session_pipeline_states.clear()
 | 
			
		||||
        session_ids.clear()
 | 
			
		||||
        # Clean up LPR integration caches
 | 
			
		||||
        session_detections.clear()
 | 
			
		||||
        session_to_camera.clear()
 | 
			
		||||
        detection_timestamps.clear()
 | 
			
		||||
        logger.info("WebSocket connection closed")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										92
									
								
								test_lpr.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								test_lpr.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,92 @@
 | 
			
		|||
#!/usr/bin/env python3
 | 
			
		||||
"""
 | 
			
		||||
Test script for LPR (License Plate Recognition) integration.
 | 
			
		||||
This script simulates LPR service sending license plate results to Redis.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
import json
 | 
			
		||||
import time
 | 
			
		||||
import redis
 | 
			
		||||
import sys
 | 
			
		||||
import os
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
    """Test LPR integration by sending mock license plate results to Redis"""
 | 
			
		||||
    
 | 
			
		||||
    # Redis configuration (should match pipeline.json)
 | 
			
		||||
    redis_config = {
 | 
			
		||||
        'host': '10.100.1.3',
 | 
			
		||||
        'port': 6379,
 | 
			
		||||
        'password': 'FBQgi0i5RevAAMO5Hh66',
 | 
			
		||||
        'db': 0
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    try:
 | 
			
		||||
        # Connect to Redis
 | 
			
		||||
        print("🔌 Connecting to Redis...")
 | 
			
		||||
        redis_client = redis.Redis(
 | 
			
		||||
            host=redis_config['host'],
 | 
			
		||||
            port=redis_config['port'],
 | 
			
		||||
            password=redis_config['password'],
 | 
			
		||||
            db=redis_config['db'],
 | 
			
		||||
            decode_responses=True
 | 
			
		||||
        )
 | 
			
		||||
        
 | 
			
		||||
        # Test connection
 | 
			
		||||
        redis_client.ping()
 | 
			
		||||
        print(f"✅ Connected to Redis at {redis_config['host']}:{redis_config['port']}")
 | 
			
		||||
        
 | 
			
		||||
        # Mock LPR results to send
 | 
			
		||||
        test_cases = [
 | 
			
		||||
            {
 | 
			
		||||
                "session_id": "123",
 | 
			
		||||
                "license_character": "ABC-1234"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "session_id": "124", 
 | 
			
		||||
                "license_character": "XYZ-5678"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "session_id": "125",
 | 
			
		||||
                "license_character": "DEF-9999"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
        
 | 
			
		||||
        print("\n🧪 Sending mock LPR results...")
 | 
			
		||||
        
 | 
			
		||||
        for i, test_case in enumerate(test_cases, 1):
 | 
			
		||||
            print(f"\n📤 Test {i}: Sending LPR result for session {test_case['session_id']}")
 | 
			
		||||
            print(f"   License: {test_case['license_character']}")
 | 
			
		||||
            
 | 
			
		||||
            # Publish to license_results channel
 | 
			
		||||
            result = redis_client.publish("license_results", json.dumps(test_case))
 | 
			
		||||
            print(f"   📡 Published to 'license_results' channel (subscribers: {result})")
 | 
			
		||||
            
 | 
			
		||||
            if result == 0:
 | 
			
		||||
                print("   ⚠️  Warning: No subscribers listening to 'license_results' channel")
 | 
			
		||||
                print("   💡 Make sure the detector worker is running and has loaded a model")
 | 
			
		||||
            
 | 
			
		||||
            # Wait between test cases
 | 
			
		||||
            if i < len(test_cases):
 | 
			
		||||
                print("   ⏳ Waiting 3 seconds before next test...")
 | 
			
		||||
                time.sleep(3)
 | 
			
		||||
        
 | 
			
		||||
        print(f"\n✅ Completed {len(test_cases)} test cases")
 | 
			
		||||
        print("🔍 Check detector worker logs for LPR processing messages:")
 | 
			
		||||
        print("   - Look for '🚗 LPR Result received' messages")
 | 
			
		||||
        print("   - Look for '✅ Updated detection' messages") 
 | 
			
		||||
        print("   - Look for '📤 Sent LPR update to backend' messages")
 | 
			
		||||
        
 | 
			
		||||
    except redis.exceptions.ConnectionError as e:
 | 
			
		||||
        print(f"❌ Failed to connect to Redis: {e}")
 | 
			
		||||
        print("💡 Make sure Redis is running and accessible")
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
        
 | 
			
		||||
    except Exception as e:
 | 
			
		||||
        print(f"❌ Error during testing: {e}")
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    print("🧪 LPR Integration Test Script")
 | 
			
		||||
    print("=" * 50)
 | 
			
		||||
    main()
 | 
			
		||||
| 
						 | 
				
			
			@ -2641,3 +2641,319 @@
 | 
			
		|||
2025-08-29 00:56:51,499 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T17:56:51Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 00:56:53,072 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T17:56:53Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 00:56:55,677 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T17:56:55Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:25:18,643 [INFO] WebSocket communication logging started - TX/RX format
 | 
			
		||||
2025-08-29 01:25:24,888 [INFO] RX <- {"type":"subscribe","payload":{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"","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=20250828T182524Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=77cda8178a749b675fdf7dea3c86bcd8b8ebe621e536ef52a629036a8c6c29ff","modelName":"bangchak_poc","modelId":21}}
 | 
			
		||||
2025-08-29 01:25:31,104 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":180}}
 | 
			
		||||
2025-08-29 01:25:50,765 [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=20250828T182550Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=bab736397b44c34e417b89b0f0ac24fb4f5e2e8526165e2bed5f8db96fa89515","modelId":21,"modelName":"bangchak_poc"}]}
 | 
			
		||||
2025-08-29 01:25:50,767 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:25:50Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:25:50,806 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":null}}
 | 
			
		||||
2025-08-29 01:25:51,654 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:25:51Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:25:53,347 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:25:53Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:25:55,405 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:25:55Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:25:57,463 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:25:57Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:25:59,544 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:25:59Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:01,569 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:01Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:03,604 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:03Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:05,692 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:05Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:07,622 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:07Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:09,641 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:09Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:11,762 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:11Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:13,855 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:13Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:15,825 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:15Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:17,879 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:17Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:19,364 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:19Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:20,766 [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=20250828T182620Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=fcdfc360359e51812f10ef457daafe246ff0cf1224ce68a810bf2b86ad3c2b41","modelId":21,"modelName":"bangchak_poc"}]}
 | 
			
		||||
2025-08-29 01:26:21,357 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:21Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:23,591 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:23Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:25,521 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:25Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:27,349 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:27Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:29,405 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:29Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:31,434 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:31Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:33,457 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:33Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:35,543 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:35Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:37,538 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:37Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:39,699 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:39Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:41,613 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:41Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:43,728 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:43Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:45,684 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:45Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:47,697 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:47Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:49,226 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:49Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:50,767 [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=20250828T182650Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=27054eed77f501f2bd8ba385fa9ef06c25816637e89959451ce7ca9630fbde0b","modelId":21,"modelName":"bangchak_poc"}]}
 | 
			
		||||
2025-08-29 01:26:51,715 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:51Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:53,858 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:53Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:55,377 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:55Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:57,357 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:57Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:26:59,377 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:26:59Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:01,388 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:01Z","data":{"detection":{},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:01,404 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":181}}
 | 
			
		||||
2025-08-29 01:27:04,543 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:04Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:05,672 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:05Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:07,784 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:07Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:09,729 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:09Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:11,782 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:11Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:13,830 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:13Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:15,933 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:15Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:17,444 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:17Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:19,413 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:19Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:20,770 [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=20250828T182720Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=5b7dcc8a5826932b67cbdad86a33193c5bf683583693cd4eb13a72a610284321","modelId":21,"modelName":"bangchak_poc"}]}
 | 
			
		||||
2025-08-29 01:27:21,495 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:21Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:23,973 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:23Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:25,499 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:25Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:28,171 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:28Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:29,849 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:29Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:31,742 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:31Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:33,760 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:33Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:35,772 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:35Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:37,915 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:37Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:39,823 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:39Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:41,887 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:41Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:43,864 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:43Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:45,852 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:45Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:47,840 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:47Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:49,932 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:49Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:50,775 [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=20250828T182750Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=f694c3e88d0cb84cc31fef10e22434302bae1bad00637db784eee8086fda30c9","modelId":21,"modelName":"bangchak_poc"}]}
 | 
			
		||||
2025-08-29 01:27:51,983 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:51Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:54,016 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:54Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:56,009 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:56Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:57,547 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:57Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:27:59,560 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:27:59Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:28:01,643 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:28:01Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:28:03,659 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:28:03Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:28:05,678 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:28:05Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:28:07,656 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:28:07Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:28:09,781 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:28:09Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:32:58,119 [INFO] WebSocket communication logging started - TX/RX format
 | 
			
		||||
2025-08-29 01:33:12,868 [INFO] RX <- {"type":"subscribe","payload":{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"","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=20250828T183312Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=25dfc895e3fffc1b74d9b8f52935061ee0c2624bb72145e8a55f3ff82fcf0a44","modelName":"bangchak_poc","modelId":21}}
 | 
			
		||||
2025-08-29 01:33:19,028 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":181}}
 | 
			
		||||
2025-08-29 01:33:20,817 [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=20250828T183320Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=4bd825f820f88a114f846fac06160b0f143d1d6289c51c4db38a7b5640dd5a3b","modelId":21,"modelName":"bangchak_poc"}]}
 | 
			
		||||
2025-08-29 01:33:20,817 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:20Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:33:20,837 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":null}}
 | 
			
		||||
2025-08-29 01:33:21,800 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:21Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:33:23,455 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:23Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:33:24,975 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:24Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:33:27,039 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:27Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:33:29,158 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:29Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:33:31,101 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:31Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:33:33,204 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:33Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:33:35,224 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:35Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:33:37,148 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:37Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:33:39,235 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:39Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:33:41,243 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:41Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:33:43,268 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:43Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:33:45,381 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:45Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:33:47,414 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:47Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:33:49,476 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:49Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:33:50,821 [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=20250828T183350Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=cc8495b754abb47a097c85106b9295300d95512186f1532e87d4fc56a1bf3fce","modelId":21,"modelName":"bangchak_poc"}]}
 | 
			
		||||
2025-08-29 01:33:51,454 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:51Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:33:53,515 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:53Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:33:55,515 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:55Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:33:57,506 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:57Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:33:59,504 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:33:59Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:01,558 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:01Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:03,638 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:03Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:05,776 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:05Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:07,324 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:07Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:09,210 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:09Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:11,319 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:11Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:13,319 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:13Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:15,359 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:15Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:17,356 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:17Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:19,438 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:19Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:20,823 [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=20250828T183420Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=f61e4d74b83b18686d5923c2be451676db53676d9cc0482c19e403513d91f0f4","modelId":21,"modelName":"bangchak_poc"}]}
 | 
			
		||||
2025-08-29 01:34:21,410 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:21Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:23,501 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:23Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:25,583 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:25Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:27,565 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:27Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:29,491 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:29Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:31,537 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:31Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:33,562 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:33Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:35,585 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:35Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:37,653 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:37Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:39,756 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:39Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:41,718 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:41Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:43,818 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:43Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:45,859 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:45Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:47,401 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:47Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:49,384 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:49Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:50,829 [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=20250828T183450Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=3c1be26323688d8abe54cd74901d85fbda848b92cb20ce869ce32af2cc4582fe","modelId":21,"modelName":"bangchak_poc"}]}
 | 
			
		||||
2025-08-29 01:34:51,488 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:51Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:53,510 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:53Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:55,483 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:55Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:57,612 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:57Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:34:59,633 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:34:59Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:35:01,606 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:35:01Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:35:03,660 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:35:03Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:35:05,743 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:35:05Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:35:07,800 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:35:07Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:35:09,813 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:35:09Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:35:11,764 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:35:11Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:35:13,772 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:35:13Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:35:15,790 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:35:15Z","data":{"detection":{},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:35:15,807 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":182}}
 | 
			
		||||
2025-08-29 01:35:18,939 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:35:18Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:35:19,564 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:35:19Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:35:20,834 [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=20250828T183520Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=1a5c25f2f05b95da715e56cacdc499abe434d8d01f7afe1f35c993d10a11a99c","modelId":21,"modelName":"bangchak_poc"}]}
 | 
			
		||||
2025-08-29 01:35:21,575 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:35:21Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:35:23,597 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:35:23Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:35:25,712 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:35:25Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:35:27,710 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:35:27Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:35:29,767 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:35:29Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:35:31,753 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:35:31Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:41:23,243 [INFO] WebSocket communication logging started - TX/RX format
 | 
			
		||||
2025-08-29 01:42:05,097 [INFO] RX <- {"type":"subscribe","payload":{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"","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=20250828T184204Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=04142a6aec2028a31802ea001152662f385ab94c0898ac20c855b7859a3c2183","modelName":"bangchak_poc","modelId":21}}
 | 
			
		||||
2025-08-29 01:42:11,217 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":182}}
 | 
			
		||||
2025-08-29 01:42:20,887 [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=20250828T184220Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=b1a8a1a143e861aad34ff25d97913f7c077b628600aaae9789b7af73b632a72f","modelId":21,"modelName":"bangchak_poc"}]}
 | 
			
		||||
2025-08-29 01:42:20,891 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:20Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:42:20,911 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":null}}
 | 
			
		||||
2025-08-29 01:42:21,792 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:21Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:42:23,528 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:23Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:42:25,555 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:25Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:42:27,093 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:27Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:42:29,131 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:29Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:42:31,170 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:31Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:42:33,232 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:33Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:42:35,258 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:35Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:42:37,277 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:37Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:42:39,311 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:39Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:42:41,429 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:41Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:42:43,383 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:43Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:42:45,509 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:45Z","data":{"detection":{},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:42:45,529 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":183}}
 | 
			
		||||
2025-08-29 01:42:47,493 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:47Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:42:47,516 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":null}}
 | 
			
		||||
2025-08-29 01:42:49,662 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:49Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:42:50,889 [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=20250828T184250Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=f70cb32cf073cd72a5f07ac0081829d79a60b9562d3cae8c63bd4554374ab70f","modelId":21,"modelName":"bangchak_poc"}]}
 | 
			
		||||
2025-08-29 01:42:51,632 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:51Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:42:53,637 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:53Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:42:55,673 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:55Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:42:57,691 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:57Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:42:59,724 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:42:59Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:01,813 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:01Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:03,757 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:03Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:05,248 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:05Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:07,297 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:07Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:09,338 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:09Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:11,349 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:11Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:13,464 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:13Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:15,482 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:15Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:17,461 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:17Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:19,572 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:19Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:20,894 [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=20250828T184320Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=24952138a2b43f59409b5c9144f371001e866f4806ae06a56bb85b91a558b213","modelId":21,"modelName":"bangchak_poc"}]}
 | 
			
		||||
2025-08-29 01:43:21,523 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:21Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:23,621 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:23Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:25,593 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:25Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:27,597 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:27Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:29,635 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:29Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:31,724 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:31Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:33,702 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:33Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:35,778 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:35Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:37,805 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:37Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:39,805 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:39Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:41,835 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:41Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:43,462 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:43Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:45,455 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:45Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:47,540 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:43:47Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:43:58,911 [INFO] WebSocket communication logging started - TX/RX format
 | 
			
		||||
2025-08-29 01:43:59,280 [INFO] RX <- {"type":"subscribe","payload":{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"","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=20250828T184358Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=e111189769862219db099bae51d549f4454015c5b493f585eea37bd7533c803d","modelName":"bangchak_poc","modelId":21}}
 | 
			
		||||
2025-08-29 01:44:20,903 [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=20250828T184420Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=c0161ddfb23b851184f8db8a07037a94fe659684f3d7f6ffe3f1fa66d2dd3790","modelId":21,"modelName":"bangchak_poc"}]}
 | 
			
		||||
2025-08-29 01:44:20,907 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:44:20Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:44:21,412 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:44:21Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:44:23,146 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:44:23Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:44:25,270 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:44:25Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:44:27,228 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:44:27Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:44:29,299 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:44:29Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:44:31,279 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:44:31Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:44:33,338 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:44:33Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:44:35,443 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:44:35Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:44:37,479 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:44:37Z","data":{"detection":{},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:44:37,496 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":184}}
 | 
			
		||||
2025-08-29 01:44:40,669 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:44:40Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:44:41,293 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:44:41Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:44:43,316 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:44:43Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:44:45,341 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:44:45Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:44:47,378 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:44:47Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:44:49,433 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:44:49Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 01:44:50,904 [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=20250828T184450Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=c837b4b6f5d21130eb72ab35a93982f0e78941fa5143bb186d9e5c961d9f5532","modelId":21,"modelName":"bangchak_poc"}]}
 | 
			
		||||
2025-08-29 01:44:51,464 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T18:44:51Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:01:31,757 [INFO] WebSocket communication logging started - TX/RX format
 | 
			
		||||
2025-08-29 02:02:05,175 [INFO] RX <- {"type":"subscribe","payload":{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"","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=20250828T190204Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=6619c62fd0777dc9e20829d043cd9d025c0f9cdded146342ea9bf9a632cbcd29","modelName":"bangchak_poc","modelId":21}}
 | 
			
		||||
2025-08-29 02:02:13,360 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":184}}
 | 
			
		||||
2025-08-29 02:02:21,017 [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=20250828T190220Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0df8a7ed3ab0ab1cb7510508107902c029d9dc8a886228d7e3fa8b79917066a0","modelId":21,"modelName":"bangchak_poc"}]}
 | 
			
		||||
2025-08-29 02:02:21,038 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:02:21Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:02:21,064 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":null}}
 | 
			
		||||
2025-08-29 02:02:23,295 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:02:23Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:02:23,599 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:02:23Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:02:25,565 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:02:25Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:02:27,545 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:02:27Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:02:30,125 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:02:30Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:02:31,729 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:02:31Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:02:33,740 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:02:33Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:02:35,703 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:02:35Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:02:38,242 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:02:38Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:02:39,810 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:02:39Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:02:41,862 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:02:41Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:02:43,830 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:02:43Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:02:45,912 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:02:45Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:02:48,041 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:02:48Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:02:49,915 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:02:49Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:02:51,022 [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=20250828T190250Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=5bbd005b66db6f9830b70f131b43d1d816f4f2d019c5d374d1c468380d24ec08","modelId":21,"modelName":"bangchak_poc"}]}
 | 
			
		||||
2025-08-29 02:02:51,978 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:02:51Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:02:53,929 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:02:53Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:02:56,086 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:02:56Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:02:58,029 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:02:58Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:00,051 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:00Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:02,086 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:02Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:04,138 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:04Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:06,303 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:06Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:08,251 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:08Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:10,316 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:10Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:12,337 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:12Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:13,733 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:13Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:15,669 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:15Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:17,710 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:17Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:19,800 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:19Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:21,020 [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=20250828T190320Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=48c0909f723371a0d24a6c354d6a134a44ec16e40a823ea23c5f8aaf751fd5c3","modelId":21,"modelName":"bangchak_poc"}]}
 | 
			
		||||
2025-08-29 02:03:21,808 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:21Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:23,831 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:23Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:25,855 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:25Z","data":{"detection":{},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:25,876 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":185}}
 | 
			
		||||
2025-08-29 02:03:29,042 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:29Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:29,669 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:29Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:31,705 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:31Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:33,801 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:33Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:35,778 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:35Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:37,807 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:37Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:39,844 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:39Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:03:41,898 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:03:41Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:09:37,133 [INFO] WebSocket communication logging started - TX/RX format
 | 
			
		||||
2025-08-29 02:10:17,157 [INFO] RX <- {"type":"subscribe","payload":{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"","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=20250828T191016Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=5ebceac0a2aa8f1862161d7a8e32dcec6a77594cb9ec648d08585673df65239c","modelName":"bangchak_poc","modelId":21}}
 | 
			
		||||
2025-08-29 02:10:24,522 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":185}}
 | 
			
		||||
2025-08-29 02:10:24,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_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=20250828T191020Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=1339bbc74caf57c36aa1abbcd09ec3db5a71ba4f37bc7189ebd27dca8a926156","modelId":21,"modelName":"bangchak_poc"}]}
 | 
			
		||||
2025-08-29 02:10:24,525 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:10:24Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:10:24,600 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":null}}
 | 
			
		||||
2025-08-29 02:10:25,823 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:10:25Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:10:27,001 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:10:27Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:10:29,125 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:10:29Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:10:31,087 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:10:31Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:10:33,148 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:10:33Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:10:35,329 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:10:35Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:10:37,467 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:10:37Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:10:39,316 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:10:39Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:10:41,489 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:10:41Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:10:43,216 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:10:43Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:10:45,271 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:10:45Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:10:47,274 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:10:47Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:10:49,378 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:10:49Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:10:50,824 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:10:50Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:10:51,071 [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=20250828T191050Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=6b5df3332e3e9f7caff96a862b1bbe1447d8b727ea0b0522b887dbf3361893c0","modelId":21,"modelName":"bangchak_poc"}]}
 | 
			
		||||
2025-08-29 02:10:52,861 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:10:52Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:10:54,888 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:10:54Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:10:56,959 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:10:56Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:10:59,052 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:10:59Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:11:01,018 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:11:01Z","data":{"detection":{},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:11:01,034 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":186}}
 | 
			
		||||
2025-08-29 02:11:04,269 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:11:04Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:11:05,490 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:11:05Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":"\u0e0e\u0e2840 314","licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:11:06,890 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:11:06Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":"\u0e0e\u0e2840 314","licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:11:08,913 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:11:08Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":"\u0e0e\u0e2840 314","licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
2025-08-29 02:11:11,049 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T19:11:11Z","data":{"detection":{"carModel":null,"carBrand":"Toyota","carYear":null,"bodyType":"Pickup","licensePlateText":"\u0e0e\u0e2840 314","licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"}}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue