tracking 70%

This commit is contained in:
Pongsatorn 2025-08-28 11:57:15 +07:00
parent 07eddd3f0d
commit 5bf2d49e6b
3 changed files with 2042 additions and 199 deletions

600
app.py
View file

@ -43,6 +43,16 @@ camera_streams: Dict[str, Dict[str, Any]] = {}
subscription_to_camera: Dict[str, str] = {} subscription_to_camera: Dict[str, str] = {}
# Store latest frames for REST API access (separate from processing buffer) # Store latest frames for REST API access (separate from processing buffer)
latest_frames: Dict[str, Any] = {} latest_frames: Dict[str, Any] = {}
# Store cached detection dict after successful pipeline completion
cached_detections: Dict[str, Dict[str, Any]] = {}
# Track frame skipping for pipeline buffer after detection
frame_skip_flags: Dict[str, bool] = {}
# Track camera connection states for immediate error handling
camera_states: Dict[str, Dict[str, Any]] = {}
# Track session ID states and pipeline modes per camera
session_pipeline_states: Dict[str, Dict[str, Any]] = {}
# Store full pipeline results for caching
cached_full_pipeline_results: Dict[str, Dict[str, Any]] = {}
with open("config.json", "r") as f: with open("config.json", "r") as f:
config = json.load(f) config = json.load(f)
@ -69,11 +79,22 @@ logging.basicConfig(
logger = logging.getLogger("detector_worker") logger = logging.getLogger("detector_worker")
logger.setLevel(logging.DEBUG) # Set app-specific logger to DEBUG level logger.setLevel(logging.DEBUG) # Set app-specific logger to DEBUG level
# Create WebSocket communication logger
ws_logger = logging.getLogger("websocket_comm")
ws_logger.setLevel(logging.INFO)
ws_handler = logging.FileHandler("websocket_comm.log", encoding='utf-8')
ws_formatter = logging.Formatter("%(asctime)s [%(levelname)s] %(message)s")
ws_handler.setFormatter(ws_formatter)
ws_logger.addHandler(ws_handler)
ws_logger.propagate = False # Don't propagate to root logger
# Ensure all other libraries (including root) use at least INFO level # Ensure all other libraries (including root) use at least INFO level
logging.getLogger().setLevel(logging.INFO) logging.getLogger().setLevel(logging.INFO)
logger.info("Starting detector worker application") logger.info("Starting detector worker application")
logger.info(f"Configuration: Target FPS: {TARGET_FPS}, Max streams: {max_streams}, Max retries: {max_retries}") logger.info(f"Configuration: Target FPS: {TARGET_FPS}, Max streams: {max_streams}, Max retries: {max_retries}")
ws_logger.info("WebSocket communication logging started - TX/RX format")
logger.info("WebSocket communication will be logged to websocket_comm.log")
# Ensure the models directory exists # Ensure the models directory exists
os.makedirs("models", exist_ok=True) os.makedirs("models", exist_ok=True)
@ -228,6 +249,87 @@ def get_crop_coords(stream):
"cropY2": stream.get("cropY2") "cropY2": stream.get("cropY2")
} }
# Camera state management functions
def set_camera_connected(camera_id, connected=True, error_msg=None):
"""Set camera connection state and track error information"""
current_time = time.time()
if camera_id not in camera_states:
camera_states[camera_id] = {
"connected": True,
"last_error": None,
"last_error_time": None,
"consecutive_failures": 0,
"disconnection_notified": False
}
state = camera_states[camera_id]
was_connected = state["connected"]
if connected:
state["connected"] = True
state["consecutive_failures"] = 0
state["disconnection_notified"] = False
if not was_connected:
logger.info(f"📶 CAMERA RECONNECTED: {camera_id}")
else:
state["connected"] = False
state["last_error"] = error_msg
state["last_error_time"] = current_time
state["consecutive_failures"] += 1
# Distinguish between temporary and permanent disconnection
is_permanent = state["consecutive_failures"] >= 3
if was_connected and is_permanent:
logger.error(f"📵 CAMERA DISCONNECTED: {camera_id} - {error_msg} (consecutive failures: {state['consecutive_failures']})")
logger.info(f"🚨 CAMERA ERROR DETECTED - Will send detection: null to reset backend session for {camera_id}")
def is_camera_connected(camera_id):
"""Check if camera is currently connected"""
return camera_states.get(camera_id, {}).get("connected", True)
def should_notify_disconnection(camera_id):
"""Check if we should notify backend about disconnection"""
state = camera_states.get(camera_id, {})
is_disconnected = not state.get("connected", True)
not_yet_notified = not state.get("disconnection_notified", False)
has_enough_failures = state.get("consecutive_failures", 0) >= 3
return is_disconnected and not_yet_notified and has_enough_failures
def mark_disconnection_notified(camera_id):
"""Mark that we've notified backend about this disconnection"""
if camera_id in camera_states:
camera_states[camera_id]["disconnection_notified"] = True
logger.debug(f"Marked disconnection notification sent for camera {camera_id}")
def get_or_init_session_pipeline_state(camera_id):
"""Get or initialize session pipeline state for a camera"""
if camera_id not in session_pipeline_states:
session_pipeline_states[camera_id] = {
"mode": "validation_detecting", # "validation_detecting", "send_detections", "waiting_for_session_id", "full_pipeline", "lightweight"
"session_id_received": False,
"full_pipeline_completed": False,
"absence_counter": 0,
"max_absence_frames": 3
# Removed validation_counter and validation_threshold - now using only track-based validation
}
return session_pipeline_states[camera_id]
def update_session_pipeline_mode(camera_id, new_mode, session_id=None):
"""Update session pipeline mode and related state"""
state = get_or_init_session_pipeline_state(camera_id)
old_mode = state["mode"]
state["mode"] = new_mode
if session_id:
state["session_id_received"] = True
state["absence_counter"] = 0 # Reset absence counter when session starts
logger.info(f"📊 Camera {camera_id}: Pipeline mode changed from '{old_mode}' to '{new_mode}'")
return state
#################################################### ####################################################
# REST API endpoint for image retrieval # REST API endpoint for image retrieval
#################################################### ####################################################
@ -279,6 +381,47 @@ async def detect(websocket: WebSocket):
async def handle_detection(camera_id, stream, frame, websocket, model_tree, persistent_data): async def handle_detection(camera_id, stream, frame, websocket, model_tree, persistent_data):
try: try:
# Check camera connection state first - handle disconnection immediately
if should_notify_disconnection(camera_id):
logger.error(f"🚨 CAMERA DISCONNECTION DETECTED: {camera_id} - sending immediate detection: null")
# Clear cached detections and occupancy state
cached_detections.pop(camera_id, None)
frame_skip_flags.pop(camera_id, None)
cached_full_pipeline_results.pop(camera_id, None) # Clear cached pipeline results
session_pipeline_states.pop(camera_id, None) # Reset session pipeline state
# Reset pipeline state immediately
from siwatsystem.pympta import reset_tracking_state
model_id = stream.get("modelId", "unknown")
reset_tracking_state(camera_id, model_id, "camera disconnected")
# Send immediate detection: null to backend
detection_data = {
"type": "imageDetection",
"subscriptionIdentifier": stream["subscriptionIdentifier"],
"timestamp": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()),
"data": {
"detection": None, # null detection for disconnection
"modelId": stream["modelId"],
"modelName": stream["modelName"]
}
}
try:
ws_logger.info(f"TX -> {json.dumps(detection_data, separators=(',', ':'))}")
await websocket.send_json(detection_data)
except RuntimeError as e:
if "websocket.close" in str(e):
logger.warning(f"WebSocket connection closed - cannot send disconnection signal for camera {camera_id}")
return persistent_data
else:
raise
mark_disconnection_notified(camera_id)
logger.info(f"📡 SENT DISCONNECTION SIGNAL - detection: null for camera {camera_id}, backend should clear session")
return persistent_data
# Apply crop if specified # Apply crop if specified
cropped_frame = frame cropped_frame = frame
if all(coord is not None for coord in [stream.get("cropX1"), stream.get("cropY1"), stream.get("cropX2"), stream.get("cropY2")]): if all(coord is not None for coord in [stream.get("cropX1"), stream.get("cropY1"), stream.get("cropX2"), stream.get("cropY2")]):
@ -296,51 +439,267 @@ async def detect(websocket: WebSocket):
# Get backend session ID if available # Get backend session ID if available
backend_session_id = session_ids.get(display_identifier) backend_session_id = session_ids.get(display_identifier)
# Create context for pipeline execution with backend sessionId # Get or initialize session pipeline state
pipeline_state = get_or_init_session_pipeline_state(camera_id)
current_mode = pipeline_state["mode"]
logger.debug(f"🔍 SESSIONID LOOKUP: display='{display_identifier}', session_id={repr(backend_session_id)}, mode='{current_mode}'")
logger.debug(f"🔍 Available session_ids: {session_ids}")
# ═══ SESSION ID-BASED PROCESSING MODE ═══
if not backend_session_id:
# No session ID - keep current mode if it's validation_detecting or send_detections
if current_mode not in ["validation_detecting", "send_detections", "waiting_for_session_id"]:
update_session_pipeline_mode(camera_id, "validation_detecting")
current_mode = "validation_detecting"
logger.debug(f"🔍 Camera {camera_id}: No session ID - in {current_mode} mode")
else:
# Session ID available - switch to full pipeline mode
if current_mode in ["send_detections", "waiting_for_session_id"]:
# Session ID just arrived - switch to full pipeline mode
update_session_pipeline_mode(camera_id, "full_pipeline", backend_session_id)
current_mode = "full_pipeline"
logger.info(f"🔥 Camera {camera_id}: Session ID received ({backend_session_id}) - switching to FULL PIPELINE mode")
# Create context for pipeline execution
pipeline_context = { pipeline_context = {
"camera_id": camera_id, "camera_id": camera_id,
"display_id": display_identifier, "display_id": display_identifier,
"backend_session_id": backend_session_id "backend_session_id": backend_session_id
} }
if backend_session_id: start_time = time.time()
logger.info(f"🔥 USING BACKEND SESSION_ID: {backend_session_id} for camera {camera_id} (display: {display_identifier})") detection_result = None
logger.debug(f"Pipeline context includes backend session_id: {backend_session_id}")
else:
logger.debug(f"❌ No backend session_id available for display: {display_identifier} (session_ids: {session_ids})")
if current_mode == "validation_detecting":
# ═══ TRACK VALIDATION MODE ═══
# Run tracking-based validation with track ID stability
logger.debug(f"🔍 Camera {camera_id}: In validation_detecting mode - running track-based validation")
# Get tracking configuration from model_tree
tracking_config = model_tree.get("tracking", {})
tracking_enabled = tracking_config.get("enabled", True)
stability_threshold = tracking_config.get("stabilityThreshold", 4)
# Default to "none" - only proceed after track validation
detection_result = {"class": "none", "confidence": 1.0, "bbox": [0, 0, 0, 0]}
if tracking_enabled:
# Run full tracking detection to get track IDs
from siwatsystem.pympta import run_detection_with_tracking
all_detections, regions_dict, track_validation_result = run_detection_with_tracking(cropped_frame, model_tree, pipeline_context)
if track_validation_result.get("validation_complete", False):
# Track validation completed - we have stable track IDs
stable_tracks = track_validation_result.get("stable_tracks", [])
logger.info(f"🎯 Camera {camera_id}: TRACK VALIDATION COMPLETED - stable tracks: {stable_tracks}")
# Switch to send_detections mode
update_session_pipeline_mode(camera_id, "send_detections")
# Send the best detection with stable track
if all_detections:
# Find detection with stable track ID
stable_detection = None
for detection in all_detections:
if detection.get("id") in stable_tracks:
stable_detection = detection
break
if stable_detection:
detection_result = {
"class": stable_detection.get("class", "car"),
"confidence": stable_detection.get("confidence", 0.0),
"bbox": stable_detection.get("bbox", [0, 0, 0, 0]),
"track_id": stable_detection.get("id")
}
logger.info(f"🚗 Camera {camera_id}: SENDING STABLE DETECTION - track ID {detection_result['track_id']}")
else:
logger.warning(f"⚠️ Camera {camera_id}: Stable tracks found but no matching detection")
else:
# Track validation still in progress
stable_tracks = track_validation_result.get("stable_tracks", [])
current_tracks = track_validation_result.get("current_tracks", [])
if current_tracks:
track_id = current_tracks[0] if current_tracks else "None"
stable_status = "STABLE" if stable_tracks else "validating"
logger.info(f"🔍 Camera {camera_id}: TRACK VALIDATION - car track_id {track_id} ({stable_status}, need {stability_threshold} consecutive frames)")
else:
logger.debug(f"👻 Camera {camera_id}: No car detected")
logger.debug(f"📤 Camera {camera_id}: Sending 'none' (track validation in progress)")
else:
# Tracking disabled - fall back to basic detection validation
logger.debug(f"🔍 Camera {camera_id}: Tracking disabled - using basic detection validation")
from siwatsystem.pympta import run_lightweight_detection
basic_detection = run_lightweight_detection(cropped_frame, model_tree)
if basic_detection and basic_detection.get("car_detected"):
best_detection = basic_detection.get("best_detection")
# Increment validation counter for basic detection
pipeline_state["validation_counter"] += 1
current_count = pipeline_state["validation_counter"]
threshold = pipeline_state["validation_threshold"]
if current_count >= threshold:
update_session_pipeline_mode(camera_id, "send_detections")
detection_result = {
"class": best_detection.get("class", "car"),
"confidence": best_detection.get("confidence", 0.0),
"bbox": best_detection.get("bbox", [0, 0, 0, 0])
}
logger.info(f"🎯 Camera {camera_id}: BASIC VALIDATION COMPLETED after {current_count} frames")
else:
logger.info(f"📊 Camera {camera_id}: Basic validation progress {current_count}/{threshold}")
else:
# Reset validation counter
if pipeline_state["validation_counter"] > 0:
pipeline_state["validation_counter"] = 0
logger.info(f"🔄 Camera {camera_id}: Reset validation counter (no detection)")
elif current_mode == "send_detections":
# ═══ SEND DETECTIONS MODE ═══
# Validation completed - now send detection_dict for car detections, detection: null for no car
logger.debug(f"📤 Camera {camera_id}: In send_detections mode - sending detection_dict for cars")
from siwatsystem.pympta import run_lightweight_detection
basic_detection = run_lightweight_detection(cropped_frame, model_tree)
if basic_detection and basic_detection.get("car_detected"):
# Car detected - send detection_dict
best_detection = basic_detection.get("best_detection")
detection_result = {
"class": best_detection.get("class", "car"),
"confidence": best_detection.get("confidence", 0.0),
"bbox": best_detection.get("bbox", [0, 0, 0, 0])
}
logger.info(f"🚗 Camera {camera_id}: SENDING DETECTION_DICT - {detection_result['class']} (conf={detection_result['confidence']:.3f}) - backend should generate session ID")
else:
# No car detected - send "none"
detection_result = {"class": "none", "confidence": 1.0, "bbox": [0, 0, 0, 0]}
logger.debug(f"👻 Camera {camera_id}: No car detected - sending 'none'")
elif current_mode == "waiting_for_session_id":
# ═══ WAITING FOR SESSION ID MODE ═══
# Stop processing snapshots, wait for session ID
logger.debug(f"⏳ Camera {camera_id}: In waiting_for_session_id mode - not processing snapshots")
return persistent_data # Don't process or send anything
elif current_mode == "full_pipeline":
# ═══ FULL PIPELINE MODE ═══
logger.info(f"🔥 Camera {camera_id}: Running FULL PIPELINE (detection + branches + Redis + PostgreSQL)")
detection_result = run_pipeline(cropped_frame, model_tree, context=pipeline_context) detection_result = run_pipeline(cropped_frame, model_tree, context=pipeline_context)
process_time = (time.time() - start_time) * 1000
logger.debug(f"Detection for camera {camera_id} completed in {process_time:.2f}ms")
# Log the raw detection result for debugging
logger.debug(f"Raw detection result for camera {camera_id}:\n{json.dumps(detection_result, indent=2, default=str)}")
# Extract session_id from pipeline result (uses backend sessionId)
session_id = None
if detection_result and isinstance(detection_result, dict): if detection_result and isinstance(detection_result, dict):
# Check if pipeline used backend session_id for operations # Cache the full pipeline result
if "session_id" in detection_result: cached_full_pipeline_results[camera_id] = {
session_id = detection_result["session_id"] "result": detection_result.copy(),
logger.debug(f"Pipeline used session_id: {session_id}") "timestamp": time.time()
elif backend_session_id: }
# Use backend session_id even if pipeline didn't return it # Switch to lightweight mode
session_id = backend_session_id update_session_pipeline_mode(camera_id, "lightweight")
logger.debug(f"Using backend session_id for WebSocket response: {session_id}") logger.info(f"✅ Camera {camera_id}: Full pipeline completed - switching to LIGHTWEIGHT mode")
# Process detection result - run_pipeline returns the primary detection directly elif current_mode == "lightweight":
if detection_result and isinstance(detection_result, dict) and "class" in detection_result: # ═══ LIGHTWEIGHT MODE ═══
highest_confidence_detection = detection_result # Use tracking to check for stable car presence
from siwatsystem.pympta import run_detection_with_tracking
all_detections, regions_dict, track_validation_result = run_detection_with_tracking(cropped_frame, model_tree, pipeline_context)
stable_tracks = track_validation_result.get("stable_tracks", [])
current_tracks = track_validation_result.get("current_tracks", [])
stable_tracks_present = bool(set(stable_tracks) & set(current_tracks))
if stable_tracks_present:
# Stable tracked car still present - use cached result
pipeline_state["absence_counter"] = 0
if camera_id in cached_full_pipeline_results:
detection_result = cached_full_pipeline_results[camera_id]["result"]
logger.debug(f"🔄 Camera {camera_id}: Stable tracked car still present - using cached detection")
else: else:
# No detection found logger.warning(f"⚠️ Camera {camera_id}: Stable tracked car detected but no cached result available")
highest_confidence_detection = { detection_result = None
else:
# No stable tracked cars - increment absence counter
pipeline_state["absence_counter"] += 1
absence_count = pipeline_state["absence_counter"]
max_absence = pipeline_state["max_absence_frames"]
logger.debug(f"👻 Camera {camera_id}: No stable tracked cars - absence {absence_count}/{max_absence}")
if absence_count >= max_absence:
# Send "none" detection and reset to validation mode
detection_result = {
"class": "none", "class": "none",
"confidence": 1.0, "confidence": 1.0,
"bbox": [0, 0, 0, 0], "bbox": [0, 0, 0, 0],
"branch_results": {} "branch_results": {}
} }
cached_full_pipeline_results.pop(camera_id, None) # Clear cache
update_session_pipeline_mode(camera_id, "validation_detecting")
logger.info(f"📤 Camera {camera_id}: Stable tracked cars absent for {absence_count} frames - sending 'none' and resetting to track validation")
else:
# Still within absence tolerance - use cached result
if camera_id in cached_full_pipeline_results:
detection_result = cached_full_pipeline_results[camera_id]["result"]
logger.debug(f"⏳ Camera {camera_id}: Stable tracked cars absent {absence_count}/{max_absence} - still using cached detection")
else:
detection_result = None
# Convert detection format to match backend expectations exactly as in worker.md section 4.2 process_time = (time.time() - start_time) * 1000
logger.debug(f"Detection for camera {camera_id} completed in {process_time:.2f}ms (mode: {current_mode})")
# Skip processing if no detection result (blocked by session gating)
if detection_result is None:
logger.debug(f"No detection result to process for camera {camera_id}")
return persistent_data
# Log the raw detection result for debugging
logger.debug(f"Raw detection result for camera {camera_id}:\n{json.dumps(detection_result, indent=2, default=str)}")
# Extract session_id from pipeline result (always use backend sessionId)
session_id = backend_session_id
logger.debug(f"Using backend session_id: {session_id}")
# Process detection result based on current mode
if current_mode == "validation_detecting":
# ═══ VALIDATION DETECTING MODE ═══
# Always send detection: null during validation phase
detection_dict = None
logger.debug(f"🔍 SENDING 'NONE' - validation_detecting mode for camera {camera_id}")
elif current_mode == "send_detections":
# ═══ SEND DETECTIONS MODE ═══
if detection_result.get("class") == "none":
# No car detected - send detection: null
detection_dict = None
logger.debug(f"📤 SENDING 'NONE' - send_detections mode (no car) for camera {camera_id}")
else:
# Car detected - check if we have sessionId to determine what to send
if backend_session_id:
# Have sessionId - send full detection_dict for database updates
detection_dict = {
"carModel": None,
"carBrand": None,
"carYear": None,
"bodyType": None,
"licensePlateText": None,
"licensePlateConfidence": None
}
logger.info(f"📤 SENDING FULL DETECTION_DICT - send_detections mode with sessionId {backend_session_id} (conf={detection_result.get('confidence', 0):.3f}) for camera {camera_id}")
else:
# No sessionId - send empty detection_dict to trigger backend to generate sessionId
detection_dict = {}
logger.info(f"📤 SENDING EMPTY DETECTION_DICT - send_detections mode without sessionId, triggering backend to generate sessionId (conf={detection_result.get('confidence', 0):.3f}) for camera {camera_id}")
elif detection_result.get("class") == "none":
# "None" detection in other modes (lightweight) - car left or absent for 3 frames
detection_dict = None
logger.info(f"📤 SENDING 'NONE' (detection: null) - Car absent, expecting backend to clear session for camera {camera_id}")
else:
# Valid detection - convert to backend format
detection_dict = { detection_dict = {
"carModel": None, "carModel": None,
"carBrand": None, "carBrand": None,
@ -350,30 +709,45 @@ async def detect(websocket: WebSocket):
"licensePlateConfidence": None "licensePlateConfidence": None
} }
# Extract and process branch results from parallel classification # Extract and process branch results from parallel classification (only for valid detections)
branch_results = highest_confidence_detection.get("branch_results", {}) if detection_result.get("class") != "none" and "branch_results" in detection_result:
if branch_results: def process_branch_results(branch_results, depth=0):
logger.debug(f"Processing branch results: {branch_results}") """Recursively process branch results including nested branches."""
if not isinstance(branch_results, dict):
return
# Transform branch results into backend-expected detection attributes indent = " " * depth
for branch_id, branch_data in branch_results.items(): for branch_id, branch_data in branch_results.items():
if isinstance(branch_data, dict): if isinstance(branch_data, dict):
logger.debug(f"Processing branch {branch_id}: {branch_data}") logger.debug(f"{indent}Processing branch {branch_id}: {branch_data}")
# Map common classification fields to backend-expected names # Map common classification fields to backend-expected names
if "brand" in branch_data: if "brand" in branch_data:
detection_dict["carBrand"] = branch_data["brand"] detection_dict["carBrand"] = branch_data["brand"]
logger.debug(f"{indent}Mapped carBrand: {branch_data['brand']}")
if "body_type" in branch_data: if "body_type" in branch_data:
detection_dict["bodyType"] = branch_data["body_type"] detection_dict["bodyType"] = branch_data["body_type"]
logger.debug(f"{indent}Mapped bodyType: {branch_data['body_type']}")
if "class" in branch_data: if "class" in branch_data:
class_name = branch_data["class"] class_name = branch_data["class"]
# Map based on branch/model type # Map based on branch/model type
if "brand" in branch_id.lower(): if "brand" in branch_id.lower():
detection_dict["carBrand"] = class_name detection_dict["carBrand"] = class_name
logger.debug(f"{indent}Mapped carBrand from class: {class_name}")
elif "bodytype" in branch_id.lower() or "body" in branch_id.lower(): elif "bodytype" in branch_id.lower() or "body" in branch_id.lower():
detection_dict["bodyType"] = class_name detection_dict["bodyType"] = class_name
logger.debug(f"{indent}Mapped bodyType from class: {class_name}")
# Process nested branch results recursively
if "branch_results" in branch_data:
logger.debug(f"{indent}Processing nested branches in {branch_id}")
process_branch_results(branch_data["branch_results"], depth + 1)
branch_results = detection_result.get("branch_results", {})
if branch_results:
logger.debug(f"Processing branch results: {branch_results}")
process_branch_results(branch_results)
logger.info(f"Detection payload after branch processing: {detection_dict}") logger.info(f"Detection payload after branch processing: {detection_dict}")
else: else:
logger.debug("No branch results found in detection result") logger.debug("No branch results found in detection result")
@ -390,25 +764,38 @@ async def detect(websocket: WebSocket):
} }
} }
# Add session ID if available (from backend or pipeline operations) # Add session ID to detection data (NOT for "none" detections - backend uses absence of sessionId to know to clear the session)
if session_id is not None: if session_id and detection_result.get("class") != "none":
detection_data["sessionId"] = session_id detection_data["sessionId"] = session_id
logger.info(f"📤 WEBSOCKET RESPONSE with sessionId: {session_id} for camera {camera_id}") logger.debug(f"Including sessionId {session_id} in WebSocket message")
logger.debug(f"Added session_id to WebSocket response: {session_id}") elif detection_result.get("class") == "none":
else: logger.debug(f"NOT including sessionId in 'none' detection - backend should clear session")
logger.debug(f"📤 WebSocket response WITHOUT sessionId for camera {camera_id}")
if highest_confidence_detection.get("class") != "none": # Log detection details
confidence = highest_confidence_detection.get("confidence", 0.0) if detection_result.get("class") != "none":
logger.info(f"Camera {camera_id}: Detected {highest_confidence_detection['class']} with confidence {confidence:.2f} using model {stream['modelName']}") confidence = detection_result.get("confidence", 0.0)
logger.info(f"Camera {camera_id}: Detected {detection_result['class']} with confidence {confidence:.2f} using model {stream['modelName']}")
# Log session ID if available
if session_id:
logger.debug(f"Detection associated with session ID: {session_id}")
# Send detection data to backend (session gating handled above in processing logic)
logger.debug(f"📤 SENDING TO BACKEND for camera {camera_id}: {json.dumps(detection_data, indent=2)}")
try:
ws_logger.info(f"TX -> {json.dumps(detection_data, separators=(',', ':'))}")
await websocket.send_json(detection_data) await websocket.send_json(detection_data)
logger.debug(f"Sent detection data to client for camera {camera_id}") logger.debug(f"Sent detection data to client for camera {camera_id}")
logger.debug(f"Sent this detection data: {detection_data}") except RuntimeError as e:
if "websocket.close" in str(e):
logger.warning(f"WebSocket connection closed - cannot send detection data for camera {camera_id}")
return persistent_data
else:
raise
# Log status after sending
if session_id and detection_result.get("class") != "none":
logger.info(f"📤 WEBSOCKET RESPONSE with sessionId: {session_id} for camera {camera_id}")
elif detection_result.get("class") == "none":
logger.info(f"📡 SENT 'none' detection - backend should clear session for camera {camera_id}")
else:
logger.info(f"📡 Detection data sent for camera {camera_id}")
return persistent_data return persistent_data
except Exception as e: except Exception as e:
logger.error(f"Error in handle_detection for camera {camera_id}: {str(e)}", exc_info=True) logger.error(f"Error in handle_detection for camera {camera_id}: {str(e)}", exc_info=True)
@ -427,8 +814,10 @@ async def detect(websocket: WebSocket):
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS) fps = cap.get(cv2.CAP_PROP_FPS)
logger.info(f"Camera {camera_id} opened successfully with resolution {width}x{height}, FPS: {fps}") logger.info(f"Camera {camera_id} opened successfully with resolution {width}x{height}, FPS: {fps}")
set_camera_connected(camera_id, True)
else: else:
logger.error(f"Camera {camera_id} failed to open initially") logger.error(f"Camera {camera_id} failed to open initially")
set_camera_connected(camera_id, False, "Failed to open camera initially")
while not stop_event.is_set(): while not stop_event.is_set():
try: try:
@ -443,20 +832,25 @@ async def detect(websocket: WebSocket):
ret, frame = cap.read() ret, frame = cap.read()
if not ret: if not ret:
logger.warning(f"Connection lost for camera: {camera_id}, retry {retries+1}/{max_retries}") error_msg = f"Connection lost for camera: {camera_id}, retry {retries+1}/{max_retries}"
logger.warning(error_msg)
set_camera_connected(camera_id, False, error_msg)
cap.release() cap.release()
time.sleep(reconnect_interval) time.sleep(reconnect_interval)
retries += 1 retries += 1
if retries > max_retries and max_retries != -1: if retries > max_retries and max_retries != -1:
logger.error(f"Max retries reached for camera: {camera_id}, stopping frame reader") logger.error(f"Max retries reached for camera: {camera_id}, stopping frame reader")
set_camera_connected(camera_id, False, "Max retries reached")
break break
# Re-open # Re-open
logger.info(f"Attempting to reopen RTSP stream for camera: {camera_id}") logger.info(f"Attempting to reopen RTSP stream for camera: {camera_id}")
cap = cv2.VideoCapture(streams[camera_id]["rtsp_url"]) cap = cv2.VideoCapture(streams[camera_id]["rtsp_url"])
if not cap.isOpened(): if not cap.isOpened():
logger.error(f"Failed to reopen RTSP stream for camera: {camera_id}") logger.error(f"Failed to reopen RTSP stream for camera: {camera_id}")
set_camera_connected(camera_id, False, "Failed to reopen RTSP stream")
continue continue
logger.info(f"Successfully reopened RTSP stream for camera: {camera_id}") logger.info(f"Successfully reopened RTSP stream for camera: {camera_id}")
set_camera_connected(camera_id, True)
continue continue
# Successfully read a frame # Successfully read a frame
@ -470,6 +864,7 @@ async def detect(websocket: WebSocket):
logger.debug(f"Successfully read frame from camera {camera_id}, shape: {frame.shape}") logger.debug(f"Successfully read frame from camera {camera_id}, shape: {frame.shape}")
retries = 0 retries = 0
set_camera_connected(camera_id, True) # Mark as connected on successful frame read
# Overwrite old frame if buffer is full # Overwrite old frame if buffer is full
if not buffer.empty(): if not buffer.empty():
@ -485,21 +880,28 @@ async def detect(websocket: WebSocket):
time.sleep(0.01) time.sleep(0.01)
except cv2.error as e: except cv2.error as e:
logger.error(f"OpenCV error for camera {camera_id}: {e}", exc_info=True) error_msg = f"OpenCV error for camera {camera_id}: {e}"
logger.error(error_msg, exc_info=True)
set_camera_connected(camera_id, False, error_msg)
cap.release() cap.release()
time.sleep(reconnect_interval) time.sleep(reconnect_interval)
retries += 1 retries += 1
if retries > max_retries and max_retries != -1: if retries > max_retries and max_retries != -1:
logger.error(f"Max retries reached after OpenCV error for camera {camera_id}") logger.error(f"Max retries reached after OpenCV error for camera {camera_id}")
set_camera_connected(camera_id, False, "Max retries reached after OpenCV error")
break break
logger.info(f"Attempting to reopen RTSP stream after OpenCV error for camera: {camera_id}") logger.info(f"Attempting to reopen RTSP stream after OpenCV error for camera: {camera_id}")
cap = cv2.VideoCapture(streams[camera_id]["rtsp_url"]) cap = cv2.VideoCapture(streams[camera_id]["rtsp_url"])
if not cap.isOpened(): if not cap.isOpened():
logger.error(f"Failed to reopen RTSP stream for camera {camera_id} after OpenCV error") logger.error(f"Failed to reopen RTSP stream for camera {camera_id} after OpenCV error")
set_camera_connected(camera_id, False, "Failed to reopen after OpenCV error")
continue continue
logger.info(f"Successfully reopened RTSP stream after OpenCV error for camera: {camera_id}") logger.info(f"Successfully reopened RTSP stream after OpenCV error for camera: {camera_id}")
set_camera_connected(camera_id, True)
except Exception as e: except Exception as e:
logger.error(f"Unexpected error for camera {camera_id}: {str(e)}", exc_info=True) error_msg = f"Unexpected error for camera {camera_id}: {str(e)}"
logger.error(error_msg, exc_info=True)
set_camera_connected(camera_id, False, error_msg)
cap.release() cap.release()
break break
except Exception as e: except Exception as e:
@ -517,6 +919,9 @@ async def detect(websocket: WebSocket):
frame_count = 0 frame_count = 0
last_log_time = time.time() last_log_time = time.time()
# Initialize camera state
set_camera_connected(camera_id, True)
try: try:
interval_seconds = snapshot_interval / 1000.0 # Convert milliseconds to seconds interval_seconds = snapshot_interval / 1000.0 # Convert milliseconds to seconds
logger.info(f"Snapshot interval for camera {camera_id}: {interval_seconds}s") logger.info(f"Snapshot interval for camera {camera_id}: {interval_seconds}s")
@ -528,7 +933,9 @@ async def detect(websocket: WebSocket):
if frame is None: if frame is None:
consecutive_failures += 1 consecutive_failures += 1
logger.warning(f"Failed to fetch snapshot for camera: {camera_id}, consecutive failures: {consecutive_failures}") error_msg = f"Failed to fetch snapshot for camera: {camera_id}, consecutive failures: {consecutive_failures}"
logger.warning(error_msg)
set_camera_connected(camera_id, False, error_msg)
retries += 1 retries += 1
# Check network connectivity with a simple ping-like test # Check network connectivity with a simple ping-like test
@ -541,6 +948,7 @@ async def detect(websocket: WebSocket):
if retries > max_retries and max_retries != -1: if retries > max_retries and max_retries != -1:
logger.error(f"Max retries reached for snapshot camera: {camera_id}, stopping reader") logger.error(f"Max retries reached for snapshot camera: {camera_id}, stopping reader")
set_camera_connected(camera_id, False, "Max retries reached for snapshot camera")
break break
# Exponential backoff based on consecutive failures # Exponential backoff based on consecutive failures
@ -562,6 +970,7 @@ async def detect(websocket: WebSocket):
logger.debug(f"Successfully fetched snapshot from camera {camera_id}, shape: {frame.shape}") logger.debug(f"Successfully fetched snapshot from camera {camera_id}, shape: {frame.shape}")
retries = 0 retries = 0
set_camera_connected(camera_id, True) # Mark as connected on successful snapshot
# Overwrite old frame if buffer is full # Overwrite old frame if buffer is full
if not buffer.empty(): if not buffer.empty():
@ -581,10 +990,13 @@ async def detect(websocket: WebSocket):
except Exception as e: except Exception as e:
consecutive_failures += 1 consecutive_failures += 1
logger.error(f"Unexpected error fetching snapshot for camera {camera_id}: {str(e)}", exc_info=True) error_msg = f"Unexpected error fetching snapshot for camera {camera_id}: {str(e)}"
logger.error(error_msg, exc_info=True)
set_camera_connected(camera_id, False, error_msg)
retries += 1 retries += 1
if retries > max_retries and max_retries != -1: if retries > max_retries and max_retries != -1:
logger.error(f"Max retries reached after error for snapshot camera {camera_id}") logger.error(f"Max retries reached after error for snapshot camera {camera_id}")
set_camera_connected(camera_id, False, "Max retries reached after error")
break break
# Exponential backoff for exceptions too # Exponential backoff for exceptions too
@ -770,6 +1182,23 @@ async def detect(websocket: WebSocket):
subscription_to_camera[camera_id] = camera_url subscription_to_camera[camera_id] = camera_url
logger.info(f"Subscribed to camera {camera_id}") logger.info(f"Subscribed to camera {camera_id}")
# Send initial "none" detection to backend on camera connect
initial_detection_data = {
"type": "imageDetection",
"subscriptionIdentifier": subscriptionIdentifier,
"timestamp": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()),
"data": {
"detection": None,
"modelId": modelId,
"modelName": modelName
}
}
ws_logger.info(f"TX -> {json.dumps(initial_detection_data, separators=(',', ':'))}")
await websocket.send_json(initial_detection_data)
logger.info(f"📡 Sent initial 'none' detection to backend for camera {camera_id}")
logger.debug(f"Initial detection data: {initial_detection_data}")
async def unsubscribe_internal(subscription_id): async def unsubscribe_internal(subscription_id):
"""Internal unsubscription logic""" """Internal unsubscription logic"""
if subscription_id in streams: if subscription_id in streams:
@ -788,6 +1217,11 @@ async def detect(websocket: WebSocket):
del camera_streams[camera_url] del camera_streams[camera_url]
latest_frames.pop(subscription_id, None) latest_frames.pop(subscription_id, None)
cached_detections.pop(subscription_id, None) # Clear cached detection
frame_skip_flags.pop(subscription_id, None) # Clear frame skip flag
camera_states.pop(subscription_id, None) # Clear camera state
cached_full_pipeline_results.pop(subscription_id, None) # Clear cached pipeline results
session_pipeline_states.pop(subscription_id, None) # Clear session pipeline state
cleanup_camera_stability(subscription_id) cleanup_camera_stability(subscription_id)
logger.info(f"Unsubscribed from camera {subscription_id}") logger.info(f"Unsubscribed from camera {subscription_id}")
@ -886,6 +1320,7 @@ async def detect(websocket: WebSocket):
while True: while True:
try: try:
msg = await websocket.receive_text() msg = await websocket.receive_text()
ws_logger.info(f"RX <- {msg}")
logger.debug(f"Received message: {msg}") logger.debug(f"Received message: {msg}")
data = json.loads(msg) data = json.loads(msg)
msg_type = data.get("type") msg_type = data.get("type")
@ -949,6 +1384,7 @@ async def detect(websocket: WebSocket):
"subscriptionIdentifier": subscriptionIdentifier, "subscriptionIdentifier": subscriptionIdentifier,
"error": f"Failed to download model from {model_url}" "error": f"Failed to download model from {model_url}"
} }
ws_logger.info(f"TX -> {json.dumps(error_response, separators=(',', ':'))}")
await websocket.send_json(error_response) await websocket.send_json(error_response)
continue continue
model_tree = load_pipeline_from_zip(local_path, extraction_dir) model_tree = load_pipeline_from_zip(local_path, extraction_dir)
@ -963,6 +1399,7 @@ async def detect(websocket: WebSocket):
"subscriptionIdentifier": subscriptionIdentifier, "subscriptionIdentifier": subscriptionIdentifier,
"error": f"Model file not found: {model_url}" "error": f"Model file not found: {model_url}"
} }
ws_logger.info(f"TX -> {json.dumps(error_response, separators=(',', ':'))}")
await websocket.send_json(error_response) await websocket.send_json(error_response)
continue continue
model_tree = load_pipeline_from_zip(model_url, extraction_dir) model_tree = load_pipeline_from_zip(model_url, extraction_dir)
@ -1105,6 +1542,9 @@ async def detect(websocket: WebSocket):
# Clean up cached frame and stability tracking # Clean up cached frame and stability tracking
latest_frames.pop(camera_id, None) latest_frames.pop(camera_id, None)
cached_detections.pop(camera_id, None) # Clear cached detection
frame_skip_flags.pop(camera_id, None) # Clear frame skip flag
camera_states.pop(camera_id, None) # Clear camera state
cleanup_camera_stability(camera_id) cleanup_camera_stability(camera_id)
logger.info(f"Unsubscribed from camera {camera_id}") logger.info(f"Unsubscribed from camera {camera_id}")
# Note: Keep models in memory for potential reuse # Note: Keep models in memory for potential reuse
@ -1148,33 +1588,67 @@ async def detect(websocket: WebSocket):
display_identifier = payload.get("displayIdentifier") display_identifier = payload.get("displayIdentifier")
session_id = payload.get("sessionId") session_id = payload.get("sessionId")
logger.info(f"🆔 BACKEND SESSIONID RECEIVED: displayId={display_identifier}, sessionId={session_id}") # Debug sessionId value types and contents
session_id_type = type(session_id).__name__
if session_id is None:
logger.info(f"🆔 BACKEND SESSIONID RECEIVED: displayId={display_identifier}, sessionId=None (type: {session_id_type})")
logger.info(f"🔄 BACKEND WANTS TO CLEAR SESSION for display {display_identifier}")
elif session_id == "null":
logger.info(f"🆔 BACKEND SESSIONID RECEIVED: displayId={display_identifier}, sessionId='null' (type: {session_id_type})")
logger.info(f"🔄 BACKEND SENT STRING 'null' for display {display_identifier}")
elif session_id == "":
logger.info(f"🆔 BACKEND SESSIONID RECEIVED: displayId={display_identifier}, sessionId='' (empty string, type: {session_id_type})")
logger.info(f"🔄 BACKEND SENT EMPTY STRING for display {display_identifier}")
else:
logger.info(f"🆔 BACKEND SESSIONID RECEIVED: displayId={display_identifier}, sessionId='{session_id}' (type: {session_id_type}, length: {len(str(session_id))})")
logger.info(f"🔄 BACKEND CREATED/UPDATED SESSION: {session_id} for display {display_identifier}")
logger.debug(f"Full setSessionId payload: {payload}") logger.debug(f"Full setSessionId payload: {payload}")
logger.debug(f"WebSocket message raw data: {json.dumps(data, indent=2)}")
logger.debug(f"Current active cameras: {list(streams.keys())}")
if display_identifier: if display_identifier:
# Store session ID for this display # Store session ID for this display
if session_id is None: if session_id is None or session_id == "null" or session_id == "":
old_session_id = session_ids.get(display_identifier)
session_ids.pop(display_identifier, None) session_ids.pop(display_identifier, None)
logger.info(f"🚫 BACKEND ENDED SESSION: Cleared session ID for display {display_identifier} - resetting tracking")
if session_id is None:
logger.info(f"🚫 BACKEND ENDED SESSION: Cleared session ID for display {display_identifier} (was: {old_session_id}) - received None")
elif session_id == "null":
logger.info(f"🚫 BACKEND ENDED SESSION: Cleared session ID for display {display_identifier} (was: {old_session_id}) - received string 'null'")
elif session_id == "":
logger.info(f"🚫 BACKEND ENDED SESSION: Cleared session ID for display {display_identifier} (was: {old_session_id}) - received empty string")
logger.debug(f"Session IDs after clearing: {session_ids}")
# Reset tracking state for all cameras associated with this display # Reset tracking state for all cameras associated with this display
with streams_lock: with streams_lock:
affected_cameras = []
for camera_id, stream in streams.items(): for camera_id, stream in streams.items():
if stream["subscriptionIdentifier"].startswith(display_identifier + ";"): if stream["subscriptionIdentifier"].startswith(display_identifier + ";"):
affected_cameras.append(camera_id)
# Import here to avoid circular import # Import here to avoid circular import
from siwatsystem.pympta import reset_tracking_state from siwatsystem.pympta import reset_tracking_state
model_id = stream.get("modelId", "unknown") model_id = stream.get("modelId", "unknown")
reset_tracking_state(camera_id, model_id, "backend session ended") reset_tracking_state(camera_id, model_id, "backend session ended")
logger.info(f"Reset tracking for camera {camera_id} (display: {display_identifier})") logger.info(f"Reset tracking for camera {camera_id} (display: {display_identifier})")
logger.debug(f"Reset tracking for {len(affected_cameras)} cameras: {affected_cameras}")
else: else:
old_session_id = session_ids.get(display_identifier)
session_ids[display_identifier] = session_id session_ids[display_identifier] = session_id
logger.info(f"✅ BACKEND SESSION STARTED: Set session ID {session_id} for display {display_identifier}") logger.info(f"✅ BACKEND SESSION STARTED: Set session ID {session_id} for display {display_identifier} (previous: {old_session_id})")
logger.debug(f"Current session_ids dict: {session_ids}") logger.debug(f"Session IDs after update: {session_ids}")
logger.debug(f"🎯 CMS Backend created sessionId {session_id} after receiving detection data")
# Clear waiting state for cameras associated with this display # Clear waiting state for cameras associated with this display
with streams_lock: with streams_lock:
affected_cameras = []
for camera_id, stream in streams.items(): for camera_id, stream in streams.items():
if stream["subscriptionIdentifier"].startswith(display_identifier + ";"): if stream["subscriptionIdentifier"].startswith(display_identifier + ";"):
affected_cameras.append(camera_id)
from siwatsystem.pympta import get_camera_stability_data from siwatsystem.pympta import get_camera_stability_data
model_id = stream.get("modelId", "unknown") model_id = stream.get("modelId", "unknown")
stability_data = get_camera_stability_data(camera_id, model_id) stability_data = get_camera_stability_data(camera_id, model_id)
@ -1182,7 +1656,11 @@ async def detect(websocket: WebSocket):
if session_state.get("waiting_for_backend_session", False): if session_state.get("waiting_for_backend_session", False):
session_state["waiting_for_backend_session"] = False session_state["waiting_for_backend_session"] = False
session_state["wait_start_time"] = 0.0 session_state["wait_start_time"] = 0.0
logger.info(f"🚀 PIPELINE UNBLOCKED: Backend sessionId {session_id} received - camera {camera_id} can proceed with pipeline") logger.info(f"🚀 PIPELINE UNBLOCKED: Backend sessionId {session_id} received - camera {camera_id} can proceed with database operations")
logger.debug(f"📋 Camera {camera_id}: SessionId {session_id} now available for future database operations")
logger.debug(f"Updated session state for {len(affected_cameras)} cameras: {affected_cameras}")
else:
logger.warning(f"🚨 Invalid setSessionId message: missing displayIdentifier in payload")
elif msg_type == "patchSession": elif msg_type == "patchSession":
session_id = data.get("sessionId") session_id = data.get("sessionId")
@ -1197,6 +1675,7 @@ async def detect(websocket: WebSocket):
"message": "Session patch acknowledged" "message": "Session patch acknowledged"
} }
} }
ws_logger.info(f"TX -> {json.dumps(response, separators=(',', ':'))}")
await websocket.send_json(response) await websocket.send_json(response)
logger.info(f"Acknowledged patch for session {session_id}") logger.info(f"Acknowledged patch for session {session_id}")
@ -1241,5 +1720,10 @@ async def detect(websocket: WebSocket):
with models_lock: with models_lock:
models.clear() models.clear()
latest_frames.clear() latest_frames.clear()
cached_detections.clear()
frame_skip_flags.clear()
camera_states.clear()
cached_full_pipeline_results.clear()
session_pipeline_states.clear()
session_ids.clear() session_ids.clear()
logger.info("WebSocket connection closed") logger.info("WebSocket connection closed")

View file

@ -100,9 +100,9 @@ def load_pipeline_node(node_config: dict, mpta_dir: str, redis_client, db_manage
if name in trigger_classes] if name in trigger_classes]
logger.debug(f"Converted trigger classes to indices: {trigger_class_indices}") logger.debug(f"Converted trigger classes to indices: {trigger_class_indices}")
# Extract stability threshold from tracking config # Extract stability threshold from main pipeline config (not tracking config)
tracking_config = node_config.get("tracking", {"enabled": True, "reidConfigPath": "botsort.yaml"}) tracking_config = node_config.get("tracking", {"enabled": True, "reidConfigPath": "botsort.yaml"})
stability_threshold = tracking_config.get("stabilityThreshold", 1) stability_threshold = node_config.get("stabilityThreshold", 4) # Read from main config, default to 4
node = { node = {
"modelId": node_config["modelId"], "modelId": node_config["modelId"],
@ -113,6 +113,7 @@ def load_pipeline_node(node_config: dict, mpta_dir: str, redis_client, db_manage
"crop": node_config.get("crop", False), "crop": node_config.get("crop", False),
"cropClass": node_config.get("cropClass"), "cropClass": node_config.get("cropClass"),
"minConfidence": node_config.get("minConfidence", None), "minConfidence": node_config.get("minConfidence", None),
"minBboxAreaRatio": node_config.get("minBboxAreaRatio", 0.0),
"multiClass": node_config.get("multiClass", False), "multiClass": node_config.get("multiClass", False),
"expectedClasses": node_config.get("expectedClasses", []), "expectedClasses": node_config.get("expectedClasses", []),
"parallel": node_config.get("parallel", False), "parallel": node_config.get("parallel", False),
@ -532,6 +533,7 @@ def resolve_field_mapping(value_template, branch_results, action_context):
def run_detection_with_tracking(frame, node, context=None): def run_detection_with_tracking(frame, node, context=None):
""" """
Structured function for running YOLO detection with BoT-SORT tracking. Structured function for running YOLO detection with BoT-SORT tracking.
Now includes track ID-based validation requiring N consecutive frames of the same track ID.
Args: Args:
frame: Input frame/image frame: Input frame/image
@ -539,9 +541,10 @@ def run_detection_with_tracking(frame, node, context=None):
context: Optional context information (camera info, session data, etc.) context: Optional context information (camera info, session data, etc.)
Returns: Returns:
tuple: (all_detections, regions_dict) where: tuple: (all_detections, regions_dict, track_validation_result) where:
- all_detections: List of all detection objects - all_detections: List of all detection objects
- regions_dict: Dict mapping class names to highest confidence detections - regions_dict: Dict mapping class names to highest confidence detections
- track_validation_result: Dict with validation status and stable tracks
Configuration options in node: Configuration options in node:
- model: YOLO model instance - model: YOLO model instance
@ -551,13 +554,16 @@ def run_detection_with_tracking(frame, node, context=None):
- expectedClasses: List of expected class names for multi-class validation - expectedClasses: List of expected class names for multi-class validation
- tracking: Dict with tracking configuration - tracking: Dict with tracking configuration
- enabled: Boolean to enable/disable tracking - enabled: Boolean to enable/disable tracking
- reidConfigPath: Path to ReID config file (default: "botsort.yaml") - method: Tracking method ("botsort")
- reidConfig: Path to ReID config file
- stabilityThreshold: Number of consecutive frames required for validation
""" """
try: try:
# Extract tracking configuration # Extract tracking configuration
tracking_config = node.get("tracking", {}) tracking_config = node.get("tracking", {})
tracking_enabled = tracking_config.get("enabled", True) tracking_enabled = tracking_config.get("enabled", True)
reid_config_path = tracking_config.get("reidConfigPath", "botsort.yaml") reid_config_path = tracking_config.get("reidConfig", tracking_config.get("reidConfigPath", "botsort.yaml"))
stability_threshold = tracking_config.get("stabilityThreshold", node.get("stabilityThreshold", 4))
# Check if we need to reset tracker after cooldown # Check if we need to reset tracker after cooldown
camera_id = context.get("camera_id", "unknown") if context else "unknown" camera_id = context.get("camera_id", "unknown") if context else "unknown"
@ -579,7 +585,7 @@ def run_detection_with_tracking(frame, node, context=None):
trigger_class_indices = node.get("triggerClassIndices") trigger_class_indices = node.get("triggerClassIndices")
class_filter = {"classes": trigger_class_indices} if trigger_class_indices else {} class_filter = {"classes": trigger_class_indices} if trigger_class_indices else {}
logger.debug(f"Running detection for {node['modelId']} - tracking: {tracking_enabled}, classes: {node.get('triggerClasses', 'all')}") logger.debug(f"Running detection for {node['modelId']} - tracking: {tracking_enabled}, stability_threshold: {stability_threshold}, classes: {node.get('triggerClasses', 'all')}")
if tracking_enabled and tracking_zone: if tracking_enabled and tracking_zone:
# Use tracking with zone validation # Use tracking with zone validation
@ -614,23 +620,29 @@ def run_detection_with_tracking(frame, node, context=None):
min_confidence = node.get("minConfidence", 0.0) min_confidence = node.get("minConfidence", 0.0)
if res.boxes is None or len(res.boxes) == 0: if res.boxes is None or len(res.boxes) == 0:
logger.debug("No detections found") logger.debug(f"🚫 Camera {camera_id}: YOLO returned no detections")
return [], {}
logger.debug(f"Processing {len(res.boxes)} raw detections") # Update stability tracking even when no detection (to reset counters)
camera_id = context.get("camera_id", "unknown") if context else "unknown"
model_id = node.get("modelId", "unknown")
track_validation_result = update_single_track_stability(node, None, camera_id, frame.shape, stability_threshold)
# Store validation state in context for pipeline decisions
if context is not None:
context["track_validation_result"] = track_validation_result
return [], {}, track_validation_result
logger.debug(f"🔍 Camera {camera_id}: YOLO detected {len(res.boxes)} raw objects - processing with tracking...")
# First pass: collect all valid detections # First pass: collect all valid detections
logger.debug(f"🔍 Camera {camera_id}: === DETECTION ANALYSIS ===")
for i, box in enumerate(res.boxes): for i, box in enumerate(res.boxes):
# Extract detection data # Extract detection data
conf = float(box.cpu().conf[0]) conf = float(box.cpu().conf[0])
cls_id = int(box.cpu().cls[0]) cls_id = int(box.cpu().cls[0])
class_name = node["model"].names[cls_id] class_name = node["model"].names[cls_id]
# Apply confidence filtering
if conf < min_confidence:
logger.debug(f"Detection {i} '{class_name}' rejected: {conf:.3f} < {min_confidence}")
continue
# Extract bounding box # Extract bounding box
xy = box.cpu().xyxy[0] xy = box.cpu().xyxy[0]
x1, y1, x2, y2 = map(int, xy) x1, y1, x2, y2 = map(int, xy)
@ -641,6 +653,13 @@ def run_detection_with_tracking(frame, node, context=None):
if hasattr(box, "id") and box.id is not None: if hasattr(box, "id") and box.id is not None:
track_id = int(box.id.item()) track_id = int(box.id.item())
logger.debug(f"🔍 Camera {camera_id}: Detection {i+1}: class='{class_name}' conf={conf:.3f} track_id={track_id} bbox={bbox}")
# Apply confidence filtering
if conf < min_confidence:
logger.debug(f"❌ Camera {camera_id}: Detection {i+1} REJECTED - confidence {conf:.3f} < {min_confidence}")
continue
# Apply tracking zone validation if enabled # Apply tracking zone validation if enabled
if tracking_enabled and tracking_zone: if tracking_enabled and tracking_zone:
bbox_center_x = (x1 + x2) // 2 bbox_center_x = (x1 + x2) // 2
@ -648,7 +667,7 @@ def run_detection_with_tracking(frame, node, context=None):
# Check if detection center is within tracking zone # Check if detection center is within tracking zone
if not _point_in_polygon((bbox_center_x, bbox_center_y), tracking_zone): if not _point_in_polygon((bbox_center_x, bbox_center_y), tracking_zone):
logger.debug(f"Detection {i} '{class_name}' outside tracking zone") logger.debug(f"❌ Camera {camera_id}: Detection {i+1} REJECTED - outside tracking zone")
continue continue
# Create detection object # Create detection object
@ -661,17 +680,38 @@ def run_detection_with_tracking(frame, node, context=None):
} }
candidate_detections.append(detection) candidate_detections.append(detection)
logger.debug(f"Detection {i} candidate: {class_name} (conf={conf:.3f}, id={track_id}, bbox={bbox})") logger.debug(f"✅ Camera {camera_id}: Detection {i+1} ACCEPTED as candidate: {class_name} (conf={conf:.3f}, track_id={track_id})")
# Second pass: select only the highest confidence detection overall # Second pass: select only the highest confidence detection overall
if not candidate_detections: if not candidate_detections:
logger.debug("No valid candidate detections found") logger.debug(f"🚫 Camera {camera_id}: No valid candidates after filtering - no car will be tracked")
return [], {}
# Update stability tracking even when no detection (to reset counters)
camera_id = context.get("camera_id", "unknown") if context else "unknown"
model_id = node.get("modelId", "unknown")
track_validation_result = update_single_track_stability(node, None, camera_id, frame.shape, stability_threshold)
# Store validation state in context for pipeline decisions
if context is not None:
context["track_validation_result"] = track_validation_result
return [], {}, track_validation_result
logger.debug(f"🏆 Camera {camera_id}: === SELECTING HIGHEST CONFIDENCE CAR ===")
for i, detection in enumerate(candidate_detections):
logger.debug(f"🏆 Camera {camera_id}: Candidate {i+1}: {detection['class']} conf={detection['confidence']:.3f} track_id={detection['id']}")
# Find the single highest confidence detection across all detected classes # Find the single highest confidence detection across all detected classes
best_detection = max(candidate_detections, key=lambda x: x["confidence"]) best_detection = max(candidate_detections, key=lambda x: x["confidence"])
original_class = best_detection["class"] original_class = best_detection["class"]
logger.info(f"Selected highest confidence detection: {original_class} (conf={best_detection['confidence']:.3f})") track_id = best_detection["id"]
logger.info(f"🎯 Camera {camera_id}: SELECTED WINNER: {original_class} (conf={best_detection['confidence']:.3f}, track_id={track_id}, bbox={best_detection['bbox']})")
# Show which cars were NOT selected
for detection in candidate_detections:
if detection != best_detection:
logger.debug(f"🚫 Camera {camera_id}: NOT SELECTED: {detection['class']} (conf={detection['confidence']:.3f}, track_id={detection['id']}) - lower confidence")
# Apply class mapping if configured # Apply class mapping if configured
mapped_class = original_class mapped_class = original_class
@ -683,14 +723,14 @@ def run_detection_with_tracking(frame, node, context=None):
best_detection["class"] = mapped_class best_detection["class"] = mapped_class
best_detection["original_class"] = original_class # Keep original for reference best_detection["original_class"] = original_class # Keep original for reference
# Keep only the best detection with mapped class # Keep only the single best detection with mapped class
all_detections = [best_detection] all_detections = [best_detection]
regions_dict = { regions_dict = {
mapped_class: { mapped_class: {
"bbox": best_detection["bbox"], "bbox": best_detection["bbox"],
"confidence": best_detection["confidence"], "confidence": best_detection["confidence"],
"detection": best_detection, "detection": best_detection,
"track_id": best_detection["id"] "track_id": track_id
} }
} }
@ -709,18 +749,26 @@ def run_detection_with_tracking(frame, node, context=None):
logger.info(f"Multi-class validation passed: {matching_classes} detected") logger.info(f"Multi-class validation passed: {matching_classes} detected")
logger.info(f"Detection completed: {len(all_detections)} detections, {len(regions_dict)} unique classes") logger.info(f"✅ Camera {camera_id}: DETECTION COMPLETE - tracking single car: track_id={track_id}, conf={best_detection['confidence']:.3f}")
logger.debug(f"📊 Camera {camera_id}: Detection summary: {len(res.boxes)} raw → {len(candidate_detections)} candidates → 1 selected")
# Update stability tracking for detections with track IDs (requires camera_id from context) # Update track-based stability tracking for the single selected car
camera_id = context.get("camera_id", "unknown") if context else "unknown" camera_id = context.get("camera_id", "unknown") if context else "unknown"
update_track_stability(node, all_detections, camera_id) model_id = node.get("modelId", "unknown")
return all_detections, regions_dict # Update stability tracking for the single best detection
track_validation_result = update_single_track_stability(node, best_detection, camera_id, frame.shape, stability_threshold)
# Store validation state in context for pipeline decisions
if context is not None:
context["track_validation_result"] = track_validation_result
return all_detections, regions_dict, track_validation_result
except Exception as e: except Exception as e:
logger.error(f"Error in detection_with_tracking for {node.get('modelId', 'unknown')}: {e}") logger.error(f"Error in detection_with_tracking for {node.get('modelId', 'unknown')}: {e}")
logger.debug(f"Detection error traceback: {traceback.format_exc()}") logger.debug(f"Detection error traceback: {traceback.format_exc()}")
return [], {} return [], {}, {"validation_complete": False, "stable_tracks": [], "current_tracks": []}
def _point_in_polygon(point, polygon): def _point_in_polygon(point, polygon):
"""Check if a point is inside a polygon using ray casting algorithm.""" """Check if a point is inside a polygon using ray casting algorithm."""
@ -755,51 +803,270 @@ def get_camera_stability_data(camera_id, model_id):
if model_id not in _camera_stability_tracking[camera_id]: if model_id not in _camera_stability_tracking[camera_id]:
logger.warning(f"🔄 Camera {camera_id}: Creating NEW stability data for {model_id} - this will reset any cooldown!") logger.warning(f"🔄 Camera {camera_id}: Creating NEW stability data for {model_id} - this will reset any cooldown!")
_camera_stability_tracking[camera_id][model_id] = { _camera_stability_tracking[camera_id][model_id] = {
"track_stability_counters": {}, "track_stability_counters": {}, # Track ID -> consecutive frame count
"stable_tracks": set(), "stable_tracks": set(), # Set of track IDs that have reached stability threshold
"session_state": { "session_state": {
"active": True, "active": True,
"waiting_for_backend_session": False, "waiting_for_backend_session": False,
"wait_start_time": 0.0, "wait_start_time": 0.0,
"reset_tracker_on_resume": False "reset_tracker_on_resume": False
},
"occupancy_state": {
"phase": "validation", # "validation", "waiting_for_session", or "occupancy"
"absence_counter": 0, # Count consecutive frames without stable tracks
"max_absence_frames": 3, # Trigger "none" after this many absent frames
"pipeline_completed": False # Track if full pipeline has run
} }
# Removed detection_counter - using only track-based validation now
} }
return _camera_stability_tracking[camera_id][model_id] return _camera_stability_tracking[camera_id][model_id]
def update_track_stability(node, detections, camera_id): def update_single_track_stability(node, detection, camera_id, frame_shape=None, stability_threshold=4):
"""Update stability counters for tracked objects per camera.""" """Update track stability validation for a single highest confidence car."""
stability_threshold = node.get("stabilityThreshold", 1)
model_id = node.get("modelId", "unknown") model_id = node.get("modelId", "unknown")
# Branch nodes should not do validation - only main pipeline should
is_branch_node = node.get("cropClass") is not None or node.get("parallel") is True
if is_branch_node:
logger.debug(f"⏭️ Camera {camera_id}: Skipping validation for branch node {model_id} - validation only done at main pipeline level")
return {"validation_complete": False, "branch_node": True, "stable_tracks": [], "current_tracks": []}
# Get camera-specific stability data # Get camera-specific stability data
stability_data = get_camera_stability_data(camera_id, model_id) stability_data = get_camera_stability_data(camera_id, model_id)
track_counters = stability_data["track_stability_counters"] track_counters = stability_data["track_stability_counters"]
stable_tracks = stability_data["stable_tracks"] stable_tracks = stability_data["stable_tracks"]
occupancy_state = stability_data["occupancy_state"]
# Get current track IDs from detections current_phase = occupancy_state["phase"]
current_track_ids = set() current_track_id = detection.get("id") if detection else None
for detection in detections:
track_id = detection.get("id")
if track_id is not None:
current_track_ids.add(track_id)
# Increment counter for this track if current_phase == "validation":
track_counters[track_id] = track_counters.get(track_id, 0) + 1 # ═══ VALIDATION PHASE: Count consecutive frames for single track ═══
logger.debug(f"📋 Camera {camera_id}: === TRACK VALIDATION ANALYSIS ===")
logger.debug(f"📋 Camera {camera_id}: Current track_id: {current_track_id}")
logger.debug(f"📋 Camera {camera_id}: Existing counters: {dict(track_counters)}")
logger.debug(f"📋 Camera {camera_id}: Stable tracks: {list(stable_tracks)}")
# Check if track becomes stable if current_track_id is not None:
if track_counters[track_id] >= stability_threshold and track_id not in stable_tracks: # Check if this is a different track than we were tracking
stable_tracks.add(track_id) previous_track_ids = list(track_counters.keys())
logger.info(f"Camera {camera_id}: Track ID {track_id} became stable after {track_counters[track_id]} detections (threshold: {stability_threshold})")
# Clean up counters for tracks that disappeared # ALWAYS reset counter if:
disappeared_tracks = set(track_counters.keys()) - current_track_ids # 1. This is a different track ID than before
for track_id in disappeared_tracks: # 2. OR if we had no previous tracking (fresh start)
logger.debug(f"Camera {camera_id}: Track ID {track_id} disappeared, removing from counters") should_reset = (
track_counters.pop(track_id, None) len(previous_track_ids) == 0 or # No previous tracking
current_track_id not in previous_track_ids # Different track ID
)
logger.debug(f"📋 Camera {camera_id}: Previous track_ids: {previous_track_ids}")
logger.debug(f"📋 Camera {camera_id}: Should reset counters: {should_reset} (no_previous={len(previous_track_ids) == 0}, different_id={current_track_id not in previous_track_ids})")
if should_reset and previous_track_ids:
# Clear all previous tracking - different car detected
for old_track_id in previous_track_ids:
old_count = track_counters.pop(old_track_id, 0)
stable_tracks.discard(old_track_id)
logger.info(f"🔄 Camera {camera_id}: Different car detected (track {current_track_id}) - RESET previous track {old_track_id} counter from {old_count} to 0")
logger.debug(f"🔄 Camera {camera_id}: Cleared track {old_track_id} from counters and stable_tracks")
# Set counter to 1 for current track (fresh start each frame)
old_count = track_counters.get(current_track_id, 0)
track_counters[current_track_id] = track_counters.get(current_track_id, 0) + 1
current_count = track_counters[current_track_id]
logger.debug(f"🔢 Camera {camera_id}: Track {current_track_id} counter: {old_count}{current_count}")
logger.info(f"🔍 Camera {camera_id}: Track ID {current_track_id} validation {current_count}/{stability_threshold}")
# Check if track has reached stability threshold
logger.debug(f"📊 Camera {camera_id}: Checking stability: {current_count} >= {stability_threshold}? {current_count >= stability_threshold}")
logger.debug(f"📊 Camera {camera_id}: Already stable: {current_track_id in stable_tracks}")
if current_count >= stability_threshold and current_track_id not in stable_tracks:
stable_tracks.add(current_track_id)
occupancy_state["phase"] = "waiting_for_session"
occupancy_state["pipeline_completed"] = False
logger.info(f"✅ Camera {camera_id}: Track ID {current_track_id} STABLE after {current_count} consecutive frames")
logger.info(f"🎯 Camera {camera_id}: TRACK VALIDATION COMPLETE")
logger.debug(f"🎯 Camera {camera_id}: Phase changed to: waiting_for_session")
logger.debug(f"🎯 Camera {camera_id}: Stable tracks now: {list(stable_tracks)}")
return {
"validation_complete": True,
"send_none_detection": True,
"stable_tracks": [current_track_id],
"newly_stable_tracks": [current_track_id],
"current_tracks": [current_track_id]
}
elif current_count >= stability_threshold:
logger.debug(f"📊 Camera {camera_id}: Track {current_track_id} already stable - not re-adding")
else:
# No car detected - ALWAYS clear all tracking and reset counters
logger.debug(f"🚫 Camera {camera_id}: NO CAR DETECTED - clearing all tracking")
if track_counters:
logger.debug(f"🚫 Camera {camera_id}: Existing counters before reset: {dict(track_counters)}")
for track_id in list(track_counters.keys()):
old_count = track_counters.pop(track_id, 0)
stable_tracks.discard(track_id) stable_tracks.discard(track_id)
logger.info(f"🔄 Camera {camera_id}: No car detected - RESET track {track_id} counter from {old_count} to 0")
logger.debug(f"🚫 Camera {camera_id}: Cleared track {track_id} (was at {old_count}/{stability_threshold})")
track_counters.clear() # Ensure complete reset
stable_tracks.clear() # Clear all stable tracks
logger.debug(f"🚫 Camera {camera_id}: All counters and stable tracks cleared")
else:
logger.debug(f"🚫 Camera {camera_id}: No existing counters to clear")
logger.debug(f"Camera {camera_id}: VALIDATION - no car detected (all counters reset)")
logger.debug(f"Camera {camera_id}: Track stability: active={list(current_track_ids)}, stable={list(stable_tracks)}, counters={track_counters}") elif current_phase == "waiting_for_session":
# ═══ WAITING PHASE: Maintain track stability ═══
logger.debug(f"⏳ Camera {camera_id}: WAITING FOR SESSION - monitoring stable track")
logger.debug(f"⏳ Camera {camera_id}: Current track_id: {current_track_id}, Stable tracks: {list(stable_tracks)}")
if current_track_id is None or current_track_id not in stable_tracks:
# Lost the stable track
logger.debug(f"⏳ Camera {camera_id}: Stable track lost - clearing all tracking")
stable_tracks.clear()
track_counters.clear()
logger.info(f"🔄 Camera {camera_id}: Lost stable track during waiting phase")
else:
logger.debug(f"⏳ Camera {camera_id}: Stable track {current_track_id} still present")
elif current_phase == "occupancy":
# ═══ OCCUPANCY PHASE: Monitor track presence ═══
logger.debug(f"🏢 Camera {camera_id}: OCCUPANCY MONITORING")
logger.debug(f"🏢 Camera {camera_id}: Current track_id: {current_track_id}, Stable tracks: {list(stable_tracks)}")
logger.debug(f"🏢 Camera {camera_id}: Absence counter before: {occupancy_state['absence_counter']}")
if current_track_id is not None and current_track_id in stable_tracks:
old_absence = occupancy_state["absence_counter"]
occupancy_state["absence_counter"] = 0
if old_absence > 0:
logger.debug(f"🏢 Camera {camera_id}: Stable car returned - absence counter reset from {old_absence} to 0")
else:
occupancy_state["absence_counter"] += 1
logger.debug(f"🏢 Camera {camera_id}: Stable car absent - absence counter: {occupancy_state['absence_counter']}")
if occupancy_state["absence_counter"] == 1:
logger.info(f"👻 Camera {camera_id}: Stable car disappeared - absence counter: {occupancy_state['absence_counter']}")
# Final return - validation not complete
result = {
"validation_complete": False,
"stable_tracks": list(stable_tracks),
"current_tracks": [current_track_id] if current_track_id is not None else []
}
logger.debug(f"📋 Camera {camera_id}: Track stability result: {result}")
logger.debug(f"📋 Camera {camera_id}: Final counters: {dict(track_counters)}")
logger.debug(f"📋 Camera {camera_id}: Final stable tracks: {list(stable_tracks)}")
return result
# Keep the old function for backward compatibility but mark as deprecated
def update_track_stability_validation(node, detections, camera_id, frame_shape=None, stability_threshold=4):
"""DEPRECATED: Use update_single_track_stability instead."""
logger.warning(f"update_track_stability_validation called for camera {camera_id} - this function is deprecated, use update_single_track_stability instead")
if detections:
best_detection = max(detections, key=lambda x: x.get("confidence", 0))
return update_single_track_stability(node, best_detection, camera_id, frame_shape, stability_threshold)
else:
return update_single_track_stability(node, None, camera_id, frame_shape, stability_threshold)
def update_detection_stability(node, detections, camera_id, frame_shape=None):
"""Legacy detection-based stability counter - DEPRECATED."""
# This function is deprecated in favor of track-based validation only
logger.warning(f"update_detection_stability called for camera {camera_id} - this function is deprecated, use track-based validation instead")
return {"validation_complete": False, "valid_detections": 0, "deprecated": True}
def update_track_stability(node, detections, camera_id, frame_shape=None):
"""Update stability counters with two-phase detection system: validation → occupancy."""
stability_threshold = node.get("stabilityThreshold", 1)
model_id = node.get("modelId", "unknown")
min_bbox_area_ratio = node.get("minBboxAreaRatio", 0.0)
# Note: This function is deprecated - using detection-based stability now
# Get camera-specific stability data
stability_data = get_camera_stability_data(camera_id, model_id)
track_counters = stability_data["track_stability_counters"]
stable_tracks = stability_data["stable_tracks"]
occupancy_state = stability_data["occupancy_state"]
# Validate detections against confidence + area requirements
valid_detections = []
if frame_shape is not None:
frame_height, frame_width = frame_shape[:2]
frame_area = frame_width * frame_height
for detection in detections:
bbox = detection.get("bbox", [])
if len(bbox) >= 4:
x1, y1, x2, y2 = bbox
bbox_width = abs(x2 - x1)
bbox_height = abs(y2 - y1)
bbox_area = bbox_width * bbox_height
area_ratio = bbox_area / frame_area if frame_area > 0 else 0.0
if area_ratio >= min_bbox_area_ratio:
valid_detections.append(detection)
pass # Valid detection - no debug spam
else:
pass # Small detection - no debug spam
else:
valid_detections = detections
current_phase = occupancy_state["phase"]
if current_phase == "validation":
# ═══ VALIDATION PHASE: Count detections until stable ═══
detection_key = f"camera_{camera_id}_detections"
if valid_detections:
# Valid detection found - increment counter
track_counters[detection_key] = track_counters.get(detection_key, 0) + 1
current_count = track_counters[detection_key]
pass # Validation count - shown in main logs
# Check if we've reached the stability threshold
if current_count >= stability_threshold and detection_key not in stable_tracks:
stable_tracks.add(detection_key)
# Switch to waiting for backend session phase
occupancy_state["phase"] = "waiting_for_session"
occupancy_state["absence_counter"] = 0
occupancy_state["pipeline_completed"] = False
logger.info(f"✅ Camera {camera_id}: VALIDATION COMPLETE after {current_count} detections - READY FOR FULL PIPELINE")
else:
# No valid detections - reset validation counter for consecutive requirement
if detection_key in track_counters:
old_count = track_counters[detection_key]
track_counters.pop(detection_key, None)
stable_tracks.discard(detection_key)
logger.info(f"🔄 Camera {camera_id}: VALIDATION RESET - no valid detection, counter reset from {old_count} to 0 (requires consecutive detections)")
else:
logger.debug(f"Camera {camera_id}: VALIDATION - no valid detection, counter remains 0")
elif current_phase == "waiting_for_session":
# ═══ WAITING FOR BACKEND SESSION PHASE ═══
# Don't do occupancy monitoring yet, just maintain validation of current detections
# The main pipeline will handle sessionId detection and phase transition
pass # Waiting phase - no occupancy logic yet
elif current_phase == "occupancy":
# ═══ OCCUPANCY PHASE: Monitor car presence ═══
if valid_detections:
# Car still present - reset absence counter
if occupancy_state["absence_counter"] > 0:
pass # Car detected - counter reset (no debug spam)
occupancy_state["absence_counter"] = 0
else:
# No car detected - increment absence counter
occupancy_state["absence_counter"] += 1
pass # Absence count - will show in timeout log
pass # Phase summary - excessive debug
# Return occupancy state for pipeline decisions
return occupancy_state
def check_stable_tracks(camera_id, model_id, regions_dict): def check_stable_tracks(camera_id, model_id, regions_dict):
"""Check if any stable tracks match the detected classes for a specific camera.""" """Check if any stable tracks match the detected classes for a specific camera."""
@ -810,8 +1077,9 @@ def check_stable_tracks(camera_id, model_id, regions_dict):
if not stable_tracks: if not stable_tracks:
return False, [] return False, []
# Check if any detection in regions_dict has a stable track ID # Check for track-based stability
stable_detections = [] stable_detections = []
for class_name, region_data in regions_dict.items(): for class_name, region_data in regions_dict.items():
detection = region_data.get("detection", {}) detection = region_data.get("detection", {})
track_id = detection.get("id") track_id = detection.get("id")
@ -868,6 +1136,35 @@ def cleanup_camera_stability(camera_id):
del _camera_stability_tracking[camera_id] del _camera_stability_tracking[camera_id]
logger.info(f"Cleaned up stability tracking data for camera {camera_id}") logger.info(f"Cleaned up stability tracking data for camera {camera_id}")
def occupancy_detector(camera_id, model_id, enable=True):
"""
Temporary function to stop model inference after pipeline completion.
Args:
camera_id (str): Camera identifier
model_id (str): Model identifier
enable (bool): True to enable occupancy mode (stop model after pipeline), False to disable
When enabled:
- Model stops inference after completing full pipeline
- Backend sessionId handling continues in background
Note: This is a temporary function that will be changed in the future.
"""
stability_data = get_camera_stability_data(camera_id, model_id)
session_state = stability_data["session_state"]
if enable:
session_state["occupancy_mode"] = True
session_state["occupancy_enabled_at"] = time.time()
logger.info(f"Camera {camera_id}: 🏢 OCCUPANCY MODE ENABLED - model will stop after pipeline completion")
else:
session_state["occupancy_mode"] = False
session_state.pop("occupancy_enabled_at", None)
logger.info(f"Camera {camera_id}: 🔄 OCCUPANCY MODE DISABLED - model will continue running")
return session_state.get("occupancy_mode", False)
def validate_pipeline_execution(node, regions_dict): def validate_pipeline_execution(node, regions_dict):
""" """
Pre-validate that all required branches will execute successfully before Pre-validate that all required branches will execute successfully before
@ -927,6 +1224,143 @@ def validate_pipeline_execution(node, regions_dict):
logger.info(f"Pipeline pre-validation PASSED: all required branches {list(required_branches)} will execute") logger.info(f"Pipeline pre-validation PASSED: all required branches {list(required_branches)} will execute")
return True, [] return True, []
def run_lightweight_detection_with_validation(frame, node: dict, min_confidence=0.7, min_bbox_area_ratio=0.3):
"""
Run lightweight detection with validation rules for session ID triggering.
Returns detection info only if it passes validation thresholds.
"""
logger.debug(f"Running lightweight detection with validation: {node['modelId']} (conf>={min_confidence}, bbox_area>={min_bbox_area_ratio})")
try:
# Run basic detection only - no branches, no actions
model = node["model"]
trigger_classes = node.get("triggerClasses", [])
trigger_class_indices = node.get("triggerClassIndices")
# Run YOLO inference
res = model(frame, verbose=False)
best_detection = None
frame_height, frame_width = frame.shape[:2]
frame_area = frame_height * frame_width
for r in res:
boxes = r.boxes
if boxes is None or len(boxes) == 0:
continue
for box in boxes:
# Extract detection info
xyxy = box.xyxy[0].cpu().numpy()
conf = box.conf[0].cpu().numpy()
cls_id = int(box.cls[0].cpu().numpy())
class_name = model.names[cls_id]
# Apply confidence threshold
if conf < min_confidence:
continue
# Apply trigger class filtering if specified
if trigger_class_indices and cls_id not in trigger_class_indices:
continue
if trigger_classes and class_name not in trigger_classes:
continue
# Calculate bbox area ratio
x1, y1, x2, y2 = xyxy
bbox_area = (x2 - x1) * (y2 - y1)
bbox_area_ratio = bbox_area / frame_area if frame_area > 0 else 0
# Apply bbox area threshold
if bbox_area_ratio < min_bbox_area_ratio:
logger.debug(f"Detection filtered out: bbox_area_ratio={bbox_area_ratio:.3f} < {min_bbox_area_ratio}")
continue
# Validation passed
if not best_detection or conf > best_detection["confidence"]:
best_detection = {
"class": class_name,
"confidence": float(conf),
"bbox": [int(x) for x in xyxy],
"bbox_area_ratio": float(bbox_area_ratio),
"validation_passed": True
}
if best_detection:
logger.debug(f"Validation PASSED: {best_detection['class']} (conf: {best_detection['confidence']:.3f}, area: {best_detection['bbox_area_ratio']:.3f})")
return best_detection
else:
logger.debug(f"Validation FAILED: No detection meets criteria (conf>={min_confidence}, area>={min_bbox_area_ratio})")
return {"validation_passed": False}
except Exception as e:
logger.error(f"Error in lightweight detection with validation: {str(e)}", exc_info=True)
return {"validation_passed": False}
def run_lightweight_detection(frame, node: dict):
"""
Run lightweight detection for car presence validation only.
Returns basic detection info without running branches or external actions.
"""
logger.debug(f"Running lightweight detection: {node['modelId']}")
try:
# Run basic detection only - no branches, no actions
model = node["model"]
min_confidence = node.get("minConfidence", 0.5)
trigger_classes = node.get("triggerClasses", [])
trigger_class_indices = node.get("triggerClassIndices")
# Run YOLO inference
res = model(frame, verbose=False)
car_detected = False
best_detection = None
for r in res:
boxes = r.boxes
if boxes is None or len(boxes) == 0:
continue
for box in boxes:
# Extract detection info
xyxy = box.xyxy[0].cpu().numpy()
conf = box.conf[0].cpu().numpy()
cls_id = int(box.cls[0].cpu().numpy())
class_name = model.names[cls_id]
# Apply confidence threshold
if conf < min_confidence:
continue
# Apply trigger class filtering if specified
if trigger_class_indices and cls_id not in trigger_class_indices:
continue
if trigger_classes and class_name not in trigger_classes:
continue
# Car detected
car_detected = True
if not best_detection or conf > best_detection["confidence"]:
best_detection = {
"class": class_name,
"confidence": float(conf),
"bbox": [int(x) for x in xyxy]
}
logger.debug(f"Lightweight detection result: car_detected={car_detected}")
if best_detection:
logger.debug(f"Best detection: {best_detection['class']} (conf: {best_detection['confidence']:.3f})")
return {
"car_detected": car_detected,
"best_detection": best_detection
}
except Exception as e:
logger.error(f"Error in lightweight detection: {str(e)}", exc_info=True)
return {"car_detected": False, "best_detection": None}
def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None): def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None):
""" """
Enhanced pipeline that supports: Enhanced pipeline that supports:
@ -943,8 +1377,6 @@ def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None):
if backend_session_id: if backend_session_id:
logger.info(f"🔑 PIPELINE USING BACKEND SESSION_ID: {backend_session_id} for camera {camera_id}") logger.info(f"🔑 PIPELINE USING BACKEND SESSION_ID: {backend_session_id} for camera {camera_id}")
else:
logger.debug(f"❌ No backend session_id in pipeline context for camera {camera_id}")
task = getattr(node["model"], "task", None) task = getattr(node["model"], "task", None)
@ -982,61 +1414,163 @@ def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None):
execute_actions(node, frame, det, context.get("regions_dict") if context else None) execute_actions(node, frame, det, context.get("regions_dict") if context else None)
return (det, None) if return_bbox else det return (det, None) if return_bbox else det
# ─── Occupancy mode check (stop future frames after pipeline completion) ───────────────────────────────────────
# Old occupancy mode logic removed - now using two-phase detection system
# ─── Session management check ─────────────────────────────────────── # ─── Session management check ───────────────────────────────────────
if not is_camera_active(camera_id, model_id): if not is_camera_active(camera_id, model_id):
logger.debug(f"⏰ Camera {camera_id}: Waiting for backend sessionId, skipping pipeline") logger.debug(f"⏰ Camera {camera_id}: Waiting for backend sessionId, sending 'none' detection")
return (None, None) if return_bbox else None none_detection = {
"class": "none",
"confidence": 1.0,
"bbox": [0, 0, 0, 0],
"branch_results": {}
}
return (none_detection, [0, 0, 0, 0]) if return_bbox else none_detection
# ─── Detection stage - Using structured detection function ────────────────── # ─── Detection stage - Using structured detection function ──────────────────
all_detections, regions_dict = run_detection_with_tracking(frame, node, context) all_detections, regions_dict, track_validation_result = run_detection_with_tracking(frame, node, context)
if not all_detections: if not all_detections:
logger.warning("No detections from structured detection function - returning null") logger.debug("No detections from structured detection function - sending 'none' detection")
return (None, None) if return_bbox else None none_detection = {
"class": "none",
"confidence": 1.0,
"bbox": [0, 0, 0, 0],
"branch_results": {}
}
return (none_detection, [0, 0, 0, 0]) if return_bbox else none_detection
# Extract bounding boxes for compatibility # Extract bounding boxes for compatibility
all_boxes = [det["bbox"] for det in all_detections] all_boxes = [det["bbox"] for det in all_detections]
# ─── Stability validation (only for root pipeline node) ──────────────────────── # ─── Track-Based Validation System: Using Track ID Stability ────────────────────────
stability_threshold = node.get("stabilityThreshold", 1) tracking_config = node.get("tracking", {})
if stability_threshold > 1: stability_threshold = tracking_config.get("stabilityThreshold", node.get("stabilityThreshold", 1))
# Extract camera_id for stability check
camera_id = context.get("camera_id", "unknown") if context else "unknown" camera_id = context.get("camera_id", "unknown") if context else "unknown"
if stability_threshold > 1 and tracking_config.get("enabled", True):
# Extract occupancy state from stability data (updated by track validation function)
model_id = node.get("modelId", "unknown") model_id = node.get("modelId", "unknown")
stability_data = get_camera_stability_data(camera_id, model_id)
occupancy_state = stability_data["occupancy_state"]
# Check if we have stable tracks for this specific camera current_phase = occupancy_state.get("phase", "validation")
has_stable_tracks, stable_detections = check_stable_tracks(camera_id, model_id, regions_dict) absence_counter = occupancy_state.get("absence_counter", 0)
max_absence_frames = occupancy_state.get("max_absence_frames", 3)
if current_phase == "validation":
# ═══ TRACK VALIDATION PHASE ═══
# Check if this is a branch node - branches should execute regardless of main validation state
is_branch_node = node.get("cropClass") is not None or node.get("parallel") is True
if is_branch_node:
# This is a branch node - allow normal execution regardless of main pipeline validation
logger.debug(f"🔍 Camera {camera_id}: Branch node {model_id} executing during track validation phase")
else:
# Main pipeline node during track validation - check for stable tracks
stable_tracks = track_validation_result.get("stable_tracks", [])
if not stable_tracks:
# No stable tracks yet - return detection without branches until track validation completes
if all_detections:
# Return the best detection but skip branches during validation
primary_detection = max(all_detections, key=lambda x: x["confidence"])
logger.debug(f"🔍 Camera {camera_id}: TRACK VALIDATION PHASE - returning detection without branches (stable_tracks: {len(stable_tracks)}, sessionId: {backend_session_id or 'none'})")
else:
# No detection - return none
primary_detection = {"class": "none", "confidence": 0.0, "bbox": [0, 0, 0, 0]}
logger.debug(f"🔍 Camera {camera_id}: TRACK VALIDATION PHASE - no detection found (sessionId: {backend_session_id or 'none'})")
if not has_stable_tracks:
logger.info(f"Camera {camera_id}: Track not stable yet (threshold: {stability_threshold}) - validation only, skipping branches")
# Return early with just the detection result, no branch processing
primary_detection = max(all_detections, key=lambda x: x["confidence"]) if all_detections else {"class": "none", "confidence": 0.0, "bbox": [0, 0, 0, 0]}
primary_bbox = primary_detection.get("bbox", [0, 0, 0, 0]) primary_bbox = primary_detection.get("bbox", [0, 0, 0, 0])
return (primary_detection, primary_bbox) if return_bbox else primary_detection return (primary_detection, primary_bbox) if return_bbox else primary_detection
else: else:
logger.info(f"Camera {camera_id}: Stable tracks {[det[1] for det in stable_detections]} detected - checking backend sessionId") # We have stable tracks - validation is complete, proceed with pipeline
logger.info(f"🎯 Camera {camera_id}: STABLE TRACKS DETECTED - proceeding with full pipeline (tracks: {stable_tracks})")
# Check if we need to wait for backend sessionId elif current_phase == "waiting_for_session":
if not backend_session_id: # ═══ WAITING FOR BACKEND SESSION PHASE ═══
logger.info(f"Camera {camera_id}: Stable car detected, waiting for backend sessionId...") if backend_session_id:
# Backend has responded with sessionId - NOW run the full pipeline for the first time
logger.info(f"🎯 Camera {camera_id}: BACKEND SESSION RECEIVED - RUNNING FULL PIPELINE (sessionId: {backend_session_id})")
occupancy_state["phase"] = "occupancy"
occupancy_state["absence_counter"] = 0
# Continue with normal pipeline processing now that we have sessionId
else:
# Still waiting for backend sessionId - send None detection dict to trigger sessionId generation
if not occupancy_state["pipeline_completed"]:
# First time in waiting phase - send empty detection to trigger sessionId
logger.info(f"⚙️ Camera {camera_id}: WAITING PHASE - sending empty detection {{}} for sessionId generation")
occupancy_state["pipeline_completed"] = True
# Return a special detection that signals app.py to send empty detection: {}
none_detection = {
"class": "validation_complete",
"confidence": 1.0,
"bbox": [0, 0, 0, 0],
"send_empty_detection": True
}
return (none_detection, [0, 0, 0, 0]) if return_bbox else none_detection
else:
# Already sent None detection - continue waiting for sessionId
logger.debug(f"⏳ Camera {camera_id}: WAITING FOR BACKEND SESSION - None detection already sent, waiting for sessionId")
waiting_detection = {
"class": "waiting_session_id",
"confidence": 1.0,
"bbox": [0, 0, 0, 0],
"waiting_for_session": True
}
return (waiting_detection, [0, 0, 0, 0]) if return_bbox else waiting_detection
elif current_phase == "occupancy":
# ═══ OCCUPANCY PHASE ═══
stable_tracks = track_validation_result.get("stable_tracks", [])
current_tracks = track_validation_result.get("current_tracks", [])
# Check if any stable tracks are still present
stable_tracks_present = bool(set(stable_tracks) & set(current_tracks))
if absence_counter >= max_absence_frames:
# Stable tracks have been absent for too long - trigger "none" detection and reset
logger.info(f"🕒 Camera {camera_id}: OCCUPANCY TIMEOUT - Stable tracks absent for {absence_counter} frames, resetting to validation (sessionId: {backend_session_id or 'none'})")
# Reset occupancy state to validation phase
stability_data = get_camera_stability_data(camera_id, model_id) stability_data = get_camera_stability_data(camera_id, model_id)
session_state = stability_data["session_state"] stability_data["occupancy_state"]["phase"] = "validation"
stability_data["occupancy_state"]["absence_counter"] = 0
stability_data["track_stability_counters"].clear()
stability_data["stable_tracks"].clear()
if not session_state.get("waiting_for_backend_session", False): logger.info(f"🔄 Camera {camera_id}: RESET TO VALIDATION PHASE - cleared track stability tracking (sessionId should become null)")
# Start waiting for backend sessionId
session_state["waiting_for_backend_session"] = True
session_state["wait_start_time"] = time.time()
logger.info(f"⏳ Camera {camera_id}: WAITING FOR BACKEND SESSION_ID (timeout: {_session_timeout_seconds}s)")
logger.info(f"📡 Stable car detected - sending imageDetection to trigger backend session creation")
# Return detection to signal backend, but don't proceed with pipeline # Return "none" detection to trigger cache clearing in app.py
primary_detection = max(all_detections, key=lambda x: x["confidence"]) if all_detections else {"class": "none", "confidence": 0.0, "bbox": [0, 0, 0, 0]} none_detection = {"class": "none", "confidence": 1.0, "bbox": [0, 0, 0, 0], "occupancy_triggered": True}
primary_bbox = primary_detection.get("bbox", [0, 0, 0, 0]) return (none_detection, [0, 0, 0, 0]) if return_bbox else none_detection
return (primary_detection, primary_bbox) if return_bbox else primary_detection else:
# Still in occupancy phase - check if stable tracks are present
if stable_tracks_present:
# Stable tracks detected - continue with cached result or light processing
logger.debug(f"👁️ Camera {camera_id}: OCCUPANCY PHASE - stable tracks present: {set(stable_tracks) & set(current_tracks)} (sessionId: {backend_session_id or 'none'})")
else:
# No stable tracks - absence counter was already incremented in track validation
logger.debug(f"👁️ Camera {camera_id}: OCCUPANCY PHASE - stable tracks absent {absence_counter}/{max_absence_frames} (sessionId: {backend_session_id or 'none'})")
logger.info(f"🚀 Camera {camera_id}: BACKEND SESSION_ID AVAILABLE ({backend_session_id}) - proceeding with full pipeline") # Continue with normal pipeline processing
pass
# ─── Pre-validate pipeline execution (only proceed if we have stable tracks for main pipeline) ────────────────────────
is_branch_node = node.get("cropClass") is not None or node.get("parallel") is True
if not is_branch_node and stability_threshold > 1 and tracking_config.get("enabled", True):
# Main pipeline node with tracking - check for stable tracks before proceeding
stable_tracks = track_validation_result.get("stable_tracks", [])
if not stable_tracks:
logger.debug(f"🔒 Camera {camera_id}: Main pipeline requires stable tracks - none found, skipping pipeline execution")
none_detection = {"class": "none", "confidence": 1.0, "bbox": [0, 0, 0, 0], "awaiting_stable_tracks": True}
return (none_detection, [0, 0, 0, 0]) if return_bbox else none_detection
# ─── Pre-validate pipeline execution ────────────────────────
pipeline_valid, missing_branches = validate_pipeline_execution(node, regions_dict) pipeline_valid, missing_branches = validate_pipeline_execution(node, regions_dict)
if not pipeline_valid: if not pipeline_valid:
@ -1051,21 +1585,14 @@ def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None):
**(context or {}) **(context or {})
} }
# ─── Check backend sessionId before database operations ──── # ─── Database operations will be handled when backend sessionId is received ────
if node.get("db_manager") and regions_dict: if node.get("db_manager") and regions_dict:
detected_classes = list(regions_dict.keys()) detected_classes = list(regions_dict.keys())
logger.debug(f"Valid detections found - checking for backend sessionId: {detected_classes}") logger.debug(f"Valid detections found: {detected_classes}")
if not backend_session_id: if backend_session_id:
logger.error(f"🚫 Camera {camera_id}: No backend sessionId available - cannot proceed with database operations") # Backend sessionId is available, proceed with database operations
logger.error(f"🚫 Camera {camera_id}: Pipeline requires backend sessionId for Redis/PostgreSQL operations")
# Reset tracking and wait for new stable car
reset_tracking_state(camera_id, model_id, "missing backend sessionId")
return (None, None) if return_bbox else None
# Use backend sessionId for database operations
if detected_classes:
from datetime import datetime from datetime import datetime
display_id = detection_result.get("display_id", "unknown") display_id = detection_result.get("display_id", "unknown")
timestamp = datetime.now().strftime("%Y-%m-%dT%H-%M-%S") timestamp = datetime.now().strftime("%Y-%m-%dT%H-%M-%S")
@ -1073,7 +1600,7 @@ def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None):
inserted_session_id = node["db_manager"].insert_initial_detection( inserted_session_id = node["db_manager"].insert_initial_detection(
display_id=display_id, display_id=display_id,
captured_timestamp=timestamp, captured_timestamp=timestamp,
session_id=backend_session_id # Use backend sessionId session_id=backend_session_id
) )
if inserted_session_id: if inserted_session_id:
@ -1083,8 +1610,12 @@ def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None):
logger.debug(f"Database record: display_id={display_id}, timestamp={timestamp}") logger.debug(f"Database record: display_id={display_id}, timestamp={timestamp}")
else: else:
logger.error(f"Failed to create database record with backend session_id: {backend_session_id}") logger.error(f"Failed to create database record with backend session_id: {backend_session_id}")
reset_tracking_state(camera_id, model_id, "database insertion failed") else:
return (None, None) if return_bbox else None logger.info(f"📡 Camera {camera_id}: Full pipeline completed, detection data will be sent to backend. Database operations will occur when sessionId is received.")
# Store detection info for later database operations when sessionId arrives
detection_result["awaiting_session_id"] = True
from datetime import datetime
detection_result["timestamp"] = datetime.now().strftime("%Y-%m-%dT%H-%M-%S")
# Execute actions for root node only if it doesn't have branches # Execute actions for root node only if it doesn't have branches
# Branch nodes with actions will execute them after branch processing # Branch nodes with actions will execute them after branch processing
@ -1147,9 +1678,18 @@ def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None):
logger.warning(f"Crop class {crop_class} not found in detected regions for {br['modelId']}, skipping branch") logger.warning(f"Crop class {crop_class} not found in detected regions for {br['modelId']}, skipping branch")
continue continue
# Add regions_dict to context for child branches # Add regions_dict and session_id to context for child branches
branch_context = dict(context) if context else {} branch_context = dict(context) if context else {}
branch_context["regions_dict"] = regions_dict branch_context["regions_dict"] = regions_dict
# Pass session_id from detection_result to branch context for Redis actions
if "session_id" in detection_result:
branch_context["session_id"] = detection_result["session_id"]
logger.debug(f"Added session_id to branch context: {detection_result['session_id']}")
elif backend_session_id:
branch_context["session_id"] = backend_session_id
logger.debug(f"Added backend_session_id to branch context: {backend_session_id}")
future = executor.submit(run_pipeline, sub_frame, br, True, branch_context) future = executor.submit(run_pipeline, sub_frame, br, True, branch_context)
futures[future] = br futures[future] = br
@ -1185,9 +1725,18 @@ def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None):
continue continue
try: try:
# Add regions_dict to context for child branches # Add regions_dict and session_id to context for child branches
branch_context = dict(context) if context else {} branch_context = dict(context) if context else {}
branch_context["regions_dict"] = regions_dict branch_context["regions_dict"] = regions_dict
# Pass session_id from detection_result to branch context for Redis actions
if "session_id" in detection_result:
branch_context["session_id"] = detection_result["session_id"]
logger.debug(f"Added session_id to sequential branch context: {detection_result['session_id']}")
elif backend_session_id:
branch_context["session_id"] = backend_session_id
logger.debug(f"Added backend_session_id to sequential branch context: {backend_session_id}")
result, _ = run_pipeline(sub_frame, br, True, branch_context) result, _ = run_pipeline(sub_frame, br, True, branch_context)
if result: if result:
branch_results[br["modelId"]] = result branch_results[br["modelId"]] = result
@ -1206,8 +1755,17 @@ def run_pipeline(frame, node: dict, return_bbox: bool=False, context=None):
if node.get("parallelActions") and "branch_results" in detection_result: if node.get("parallelActions") and "branch_results" in detection_result:
execute_parallel_actions(node, frame, detection_result, regions_dict) execute_parallel_actions(node, frame, detection_result, regions_dict)
# ─── Note: Tracking will be reset when backend sends setSessionId: null ───────────────── # ─── Auto-enable occupancy mode after successful pipeline completion ─────────────────
logger.info(f"Camera {camera_id}: Pipeline completed successfully - waiting for backend to end session") camera_id = context.get("camera_id", "unknown") if context else "unknown"
model_id = node.get("modelId", "unknown")
# Enable occupancy detector automatically after first successful pipeline
logger.info(f"Camera {camera_id}: Pipeline completed successfully - auto-enabling occupancy mode")
occupancy_detector(camera_id, model_id, enable=True)
logger.info(f"✅ Camera {camera_id}: Pipeline completed, detection data will be sent to backend")
logger.info(f"🛑 Camera {camera_id}: Model will stop inference for future frames")
logger.info(f"📡 Backend sessionId will be handled when received via WebSocket")
# ─── Execute actions after successful detection AND branch processing ────────── # ─── Execute actions after successful detection AND branch processing ──────────
# This ensures detection nodes (like frontal_detection_v1) execute their actions # This ensures detection nodes (like frontal_detection_v1) execute their actions

801
websocket_comm.log Normal file
View file

@ -0,0 +1,801 @@
2025-08-27 19:32:11,903 [INFO] WebSocket communication logging started - TX/RX format
2025-08-27 19:32:44,133 [INFO] TX -> {"type":"stateReport","cpuUsage":20.9,"memoryUsage":87.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]}
2025-08-27 19:32:46,136 [INFO] TX -> {"type":"stateReport","cpuUsage":14.2,"memoryUsage":87.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]}
2025-08-27 19:32:48,162 [INFO] TX -> {"type":"stateReport","cpuUsage":13.9,"memoryUsage":87.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]}
2025-08-27 19:32:50,189 [INFO] TX -> {"type":"stateReport","cpuUsage":16.6,"memoryUsage":87.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]}
2025-08-27 19:32:52,182 [INFO] TX -> {"type":"stateReport","cpuUsage":20.2,"memoryUsage":87.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]}
2025-08-27 19:32:54,170 [INFO] TX -> {"type":"stateReport","cpuUsage":14.1,"memoryUsage":87.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]}
2025-08-27 19:32:56,188 [INFO] TX -> {"type":"stateReport","cpuUsage":15.3,"memoryUsage":87.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]}
2025-08-27 19:32:58,195 [INFO] TX -> {"type":"stateReport","cpuUsage":15.1,"memoryUsage":87.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]}
2025-08-27 19:33:00,198 [INFO] TX -> {"type":"stateReport","cpuUsage":17.0,"memoryUsage":87.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]}
2025-08-27 19:33:02,202 [INFO] TX -> {"type":"stateReport","cpuUsage":20.7,"memoryUsage":87.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]}
2025-08-27 19:33:04,206 [INFO] TX -> {"type":"stateReport","cpuUsage":14.2,"memoryUsage":87.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]}
2025-08-27 19:33:06,226 [INFO] TX -> {"type":"stateReport","cpuUsage":17.9,"memoryUsage":86.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]}
2025-08-27 19:33:06,500 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123306Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=df972f271a1a73c1795d984030fefee6a0723be4191bf11ef23eee1079543690","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:33:12,753 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:12Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:12,756 [INFO] TX -> {"type":"stateReport","cpuUsage":19.3,"memoryUsage":88.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:13,587 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:13Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:14,779 [INFO] TX -> {"type":"stateReport","cpuUsage":22.0,"memoryUsage":89.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:14,921 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:14Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:16,783 [INFO] TX -> {"type":"stateReport","cpuUsage":16.1,"memoryUsage":89.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:16,936 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:16Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:18,776 [INFO] TX -> {"type":"stateReport","cpuUsage":16.7,"memoryUsage":89.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:19,022 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:19Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:20,760 [INFO] TX -> {"type":"stateReport","cpuUsage":32.4,"memoryUsage":92.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:21,004 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:21Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:22,768 [INFO] TX -> {"type":"stateReport","cpuUsage":51.0,"memoryUsage":90.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:23,054 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:23Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:24,775 [INFO] TX -> {"type":"stateReport","cpuUsage":24.2,"memoryUsage":90.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:25,133 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:25Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:26,768 [INFO] TX -> {"type":"stateReport","cpuUsage":17.4,"memoryUsage":90.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:27,161 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:27Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:28,768 [INFO] TX -> {"type":"stateReport","cpuUsage":25.3,"memoryUsage":88.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:29,158 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:29Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:30,772 [INFO] TX -> {"type":"stateReport","cpuUsage":20.6,"memoryUsage":87.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:31,194 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:31Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:32,780 [INFO] TX -> {"type":"stateReport","cpuUsage":18.2,"memoryUsage":87.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:33,235 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:33Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:34,786 [INFO] TX -> {"type":"stateReport","cpuUsage":22.8,"memoryUsage":87.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:35,283 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:35Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:36,498 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123336Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=5817dbe7129eb56cdb41d70c10d62049c5b409b11ca300745c4defe96087fc7b","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:33:36,855 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:36Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:36,857 [INFO] TX -> {"type":"stateReport","cpuUsage":21.9,"memoryUsage":87.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:37,478 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:37Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:38,867 [INFO] TX -> {"type":"stateReport","cpuUsage":17.9,"memoryUsage":87.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:39,489 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:39Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:40,883 [INFO] TX -> {"type":"stateReport","cpuUsage":17.6,"memoryUsage":87.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:41,584 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:41Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:42,910 [INFO] TX -> {"type":"stateReport","cpuUsage":18.0,"memoryUsage":87.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:43,507 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:43Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:44,898 [INFO] TX -> {"type":"stateReport","cpuUsage":18.2,"memoryUsage":87.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:45,553 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:45Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:46,924 [INFO] TX -> {"type":"stateReport","cpuUsage":17.2,"memoryUsage":87.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:47,576 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:47Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:48,923 [INFO] TX -> {"type":"stateReport","cpuUsage":20.4,"memoryUsage":87.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:49,094 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:49Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:50,913 [INFO] TX -> {"type":"stateReport","cpuUsage":19.9,"memoryUsage":87.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:51,164 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:51Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:52,942 [INFO] TX -> {"type":"stateReport","cpuUsage":17.2,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:53,192 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:53Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:54,930 [INFO] TX -> {"type":"stateReport","cpuUsage":32.9,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:55,152 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:55Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:56,951 [INFO] TX -> {"type":"stateReport","cpuUsage":27.5,"memoryUsage":87.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:57,200 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:57Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:33:58,971 [INFO] TX -> {"type":"stateReport","cpuUsage":32.6,"memoryUsage":87.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:33:59,355 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:33:59Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:00,963 [INFO] TX -> {"type":"stateReport","cpuUsage":27.7,"memoryUsage":87.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:01,324 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:01Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:02,983 [INFO] TX -> {"type":"stateReport","cpuUsage":20.7,"memoryUsage":87.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:03,401 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:03Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:04,994 [INFO] TX -> {"type":"stateReport","cpuUsage":38.4,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:05,442 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:05Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:06,499 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123406Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=ca980e1e53eb2cc6571314abefbaa675d8addb32ee7773fe4b460850dd752c14","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:34:06,990 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:06Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:06,992 [INFO] TX -> {"type":"stateReport","cpuUsage":30.8,"memoryUsage":85.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:07,682 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:07Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:09,001 [INFO] TX -> {"type":"stateReport","cpuUsage":19.6,"memoryUsage":85.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:09,703 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:09Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:11,021 [INFO] TX -> {"type":"stateReport","cpuUsage":28.0,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:11,629 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:11Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:13,023 [INFO] TX -> {"type":"stateReport","cpuUsage":30.6,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:13,664 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:13Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:15,026 [INFO] TX -> {"type":"stateReport","cpuUsage":31.8,"memoryUsage":86.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:15,190 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:15Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:17,029 [INFO] TX -> {"type":"stateReport","cpuUsage":19.4,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:17,252 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:17Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:19,041 [INFO] TX -> {"type":"stateReport","cpuUsage":19.8,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:19,227 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:19Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:21,040 [INFO] TX -> {"type":"stateReport","cpuUsage":29.2,"memoryUsage":86.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:21,290 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:21Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:23,053 [INFO] TX -> {"type":"stateReport","cpuUsage":28.0,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:23,278 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:23Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:25,080 [INFO] TX -> {"type":"stateReport","cpuUsage":16.0,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:25,322 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:25Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:27,095 [INFO] TX -> {"type":"stateReport","cpuUsage":26.4,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:27,415 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:27Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:29,107 [INFO] TX -> {"type":"stateReport","cpuUsage":24.5,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:29,469 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:29Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:31,090 [INFO] TX -> {"type":"stateReport","cpuUsage":30.8,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:31,508 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:31Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:33,105 [INFO] TX -> {"type":"stateReport","cpuUsage":21.5,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:33,495 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:33Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:35,100 [INFO] TX -> {"type":"stateReport","cpuUsage":15.3,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:35,550 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:35Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:36,501 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123436Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=9506b72d5086fae6a2a6b9c31c4a1d3688177ae0147b37a6519d98b4d6bd81a6","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:34:37,156 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:37Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:37,159 [INFO] TX -> {"type":"stateReport","cpuUsage":22.0,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:37,750 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:37Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:39,156 [INFO] TX -> {"type":"stateReport","cpuUsage":23.0,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:39,744 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:39Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:41,134 [INFO] TX -> {"type":"stateReport","cpuUsage":15.2,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:41,794 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:41Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:43,153 [INFO] TX -> {"type":"stateReport","cpuUsage":17.5,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:43,771 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:43Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:45,139 [INFO] TX -> {"type":"stateReport","cpuUsage":18.2,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:45,813 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:45Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:47,154 [INFO] TX -> {"type":"stateReport","cpuUsage":25.2,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:47,898 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:47Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:49,175 [INFO] TX -> {"type":"stateReport","cpuUsage":15.6,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:49,371 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:49Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:51,173 [INFO] TX -> {"type":"stateReport","cpuUsage":18.4,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:51,421 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:51Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:53,181 [INFO] TX -> {"type":"stateReport","cpuUsage":24.7,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:53,451 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:53Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:55,177 [INFO] TX -> {"type":"stateReport","cpuUsage":25.7,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:55,518 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:55Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:57,183 [INFO] TX -> {"type":"stateReport","cpuUsage":17.5,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:57,525 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:57Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:34:59,197 [INFO] TX -> {"type":"stateReport","cpuUsage":32.5,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:34:59,533 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:34:59Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:01,222 [INFO] TX -> {"type":"stateReport","cpuUsage":26.0,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:01,612 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:01Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:03,232 [INFO] TX -> {"type":"stateReport","cpuUsage":39.7,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:03,555 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:03Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:05,236 [INFO] TX -> {"type":"stateReport","cpuUsage":44.7,"memoryUsage":86.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:05,719 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:05Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:06,506 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123506Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=100ebd94adbb2de5b85719b1c3e199fe6fe6f9ebb87ea415f58cd7c5d6669321","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:35:07,290 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:07Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:07,297 [INFO] TX -> {"type":"stateReport","cpuUsage":28.6,"memoryUsage":87.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:08,023 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:08Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:09,305 [INFO] TX -> {"type":"stateReport","cpuUsage":29.6,"memoryUsage":87.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:10,184 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:10Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:11,327 [INFO] TX -> {"type":"stateReport","cpuUsage":26.1,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:12,114 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:12Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:13,336 [INFO] TX -> {"type":"stateReport","cpuUsage":21.3,"memoryUsage":86.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:13,993 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:13Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:15,351 [INFO] TX -> {"type":"stateReport","cpuUsage":19.3,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:15,967 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:15Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:17,353 [INFO] TX -> {"type":"stateReport","cpuUsage":20.6,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:17,997 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:17Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:19,380 [INFO] TX -> {"type":"stateReport","cpuUsage":27.3,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:19,498 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:19Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:21,393 [INFO] TX -> {"type":"stateReport","cpuUsage":24.9,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:21,642 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:21Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:23,405 [INFO] TX -> {"type":"stateReport","cpuUsage":17.2,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:23,600 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:23Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:25,417 [INFO] TX -> {"type":"stateReport","cpuUsage":20.3,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:25,619 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:25Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:27,438 [INFO] TX -> {"type":"stateReport","cpuUsage":23.8,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:27,732 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:27Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:29,442 [INFO] TX -> {"type":"stateReport","cpuUsage":20.9,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:29,731 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:29Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:31,449 [INFO] TX -> {"type":"stateReport","cpuUsage":24.0,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:31,750 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:31Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:33,444 [INFO] TX -> {"type":"stateReport","cpuUsage":20.7,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:33,769 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:33Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:35,464 [INFO] TX -> {"type":"stateReport","cpuUsage":25.8,"memoryUsage":85.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:35,827 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:35Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:36,504 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123536Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=2f2af3a51acc5abc3593b80e3097ad5dae97d1bc8bea7a0b46e36daad6a4146c","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:35:37,425 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:37Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:37,488 [INFO] TX -> {"type":"stateReport","cpuUsage":26.4,"memoryUsage":85.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:38,034 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:38Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:39,495 [INFO] TX -> {"type":"stateReport","cpuUsage":26.1,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:40,058 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:40Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:41,517 [INFO] TX -> {"type":"stateReport","cpuUsage":34.3,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:42,098 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:42Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:43,535 [INFO] TX -> {"type":"stateReport","cpuUsage":29.8,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:44,089 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:44Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:45,537 [INFO] TX -> {"type":"stateReport","cpuUsage":33.3,"memoryUsage":86.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:46,108 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:46Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:47,693 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:47Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:47,695 [INFO] TX -> {"type":"stateReport","cpuUsage":28.1,"memoryUsage":87.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:49,697 [INFO] TX -> {"type":"stateReport","cpuUsage":35.0,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:50,256 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:50Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:51,779 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:51Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:51,781 [INFO] TX -> {"type":"stateReport","cpuUsage":30.9,"memoryUsage":87.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:53,796 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:53Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:53,798 [INFO] TX -> {"type":"stateReport","cpuUsage":30.9,"memoryUsage":87.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:55,801 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:55Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:55,803 [INFO] TX -> {"type":"stateReport","cpuUsage":27.8,"memoryUsage":86.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:57,752 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:57Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:57,821 [INFO] TX -> {"type":"stateReport","cpuUsage":28.0,"memoryUsage":86.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:35:59,823 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:35:59Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:35:59,824 [INFO] TX -> {"type":"stateReport","cpuUsage":33.1,"memoryUsage":87.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:01,795 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:01Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:01,833 [INFO] TX -> {"type":"stateReport","cpuUsage":31.3,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:03,845 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:03Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:03,846 [INFO] TX -> {"type":"stateReport","cpuUsage":24.7,"memoryUsage":87.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:05,854 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:05Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:05,855 [INFO] TX -> {"type":"stateReport","cpuUsage":14.8,"memoryUsage":87.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:06,505 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123606Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=a4b09295a15145beda38fbfe467db83086b5d13214a040da4a51116cc118c327","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:36:07,529 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:07Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:07,855 [INFO] TX -> {"type":"stateReport","cpuUsage":23.8,"memoryUsage":87.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:08,140 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:08Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:09,882 [INFO] TX -> {"type":"stateReport","cpuUsage":20.9,"memoryUsage":86.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:10,185 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:10Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:11,911 [INFO] TX -> {"type":"stateReport","cpuUsage":20.6,"memoryUsage":86.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:12,242 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:12Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:13,806 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:13Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:13,903 [INFO] TX -> {"type":"stateReport","cpuUsage":26.0,"memoryUsage":86.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:15,779 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:15Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:15,886 [INFO] TX -> {"type":"stateReport","cpuUsage":20.9,"memoryUsage":86.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:17,806 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:17Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:17,896 [INFO] TX -> {"type":"stateReport","cpuUsage":13.6,"memoryUsage":86.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:19,854 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:19Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:19,890 [INFO] TX -> {"type":"stateReport","cpuUsage":18.8,"memoryUsage":86.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:21,915 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:21Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:21,917 [INFO] TX -> {"type":"stateReport","cpuUsage":26.9,"memoryUsage":86.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:23,949 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:23Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:23,950 [INFO] TX -> {"type":"stateReport","cpuUsage":23.7,"memoryUsage":86.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:25,971 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:25Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:25,972 [INFO] TX -> {"type":"stateReport","cpuUsage":22.7,"memoryUsage":86.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:27,986 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:27Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:27,988 [INFO] TX -> {"type":"stateReport","cpuUsage":39.1,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:30,043 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:30,044 [INFO] TX -> {"type":"stateReport","cpuUsage":28.8,"memoryUsage":88.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:32,067 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:32Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:32,069 [INFO] TX -> {"type":"stateReport","cpuUsage":25.0,"memoryUsage":88.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:34,188 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:34Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:34,190 [INFO] TX -> {"type":"stateReport","cpuUsage":31.1,"memoryUsage":88.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:36,143 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:36Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:36,199 [INFO] TX -> {"type":"stateReport","cpuUsage":24.6,"memoryUsage":88.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:36,507 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123636Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=1c57f5567d81679524d29d5937f1d7e1172124d95b5eba45c5fe71adedbb59d5","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:36:37,658 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:37Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:38,377 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:38Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:38,381 [INFO] TX -> {"type":"stateReport","cpuUsage":30.8,"memoryUsage":89.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:40,388 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:40Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:40,390 [INFO] TX -> {"type":"stateReport","cpuUsage":35.4,"memoryUsage":89.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:42,430 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:42Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:42,432 [INFO] TX -> {"type":"stateReport","cpuUsage":36.9,"memoryUsage":90.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:44,447 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:44Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:44,449 [INFO] TX -> {"type":"stateReport","cpuUsage":33.9,"memoryUsage":90.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:46,464 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:46Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:46,465 [INFO] TX -> {"type":"stateReport","cpuUsage":22.8,"memoryUsage":90.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:48,017 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:48Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:48,489 [INFO] TX -> {"type":"stateReport","cpuUsage":19.0,"memoryUsage":89.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:50,070 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:50Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:50,497 [INFO] TX -> {"type":"stateReport","cpuUsage":20.2,"memoryUsage":89.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:52,050 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:52Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:52,513 [INFO] TX -> {"type":"stateReport","cpuUsage":21.6,"memoryUsage":88.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:54,094 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:54Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:54,525 [INFO] TX -> {"type":"stateReport","cpuUsage":18.2,"memoryUsage":88.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:56,116 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:56Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:56,532 [INFO] TX -> {"type":"stateReport","cpuUsage":15.8,"memoryUsage":88.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:36:58,131 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:36:58Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:36:58,543 [INFO] TX -> {"type":"stateReport","cpuUsage":19.7,"memoryUsage":88.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:00,177 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:00Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:00,542 [INFO] TX -> {"type":"stateReport","cpuUsage":21.4,"memoryUsage":88.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:02,189 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:02Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:02,549 [INFO] TX -> {"type":"stateReport","cpuUsage":16.1,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:04,293 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:04Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:04,557 [INFO] TX -> {"type":"stateReport","cpuUsage":26.5,"memoryUsage":90.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:06,272 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:06Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:06,509 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123706Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=86fd5e153da950b378ce9e1e216e92b362ea2c42ed325b458a806fd49e03690a","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:37:07,789 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:07Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:07,793 [INFO] TX -> {"type":"stateReport","cpuUsage":26.3,"memoryUsage":89.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:08,490 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:08Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:09,797 [INFO] TX -> {"type":"stateReport","cpuUsage":28.9,"memoryUsage":88.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:10,490 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:10Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:11,809 [INFO] TX -> {"type":"stateReport","cpuUsage":27.3,"memoryUsage":89.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:12,677 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:12Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:13,831 [INFO] TX -> {"type":"stateReport","cpuUsage":21.5,"memoryUsage":88.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:14,024 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:14Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:15,881 [INFO] TX -> {"type":"stateReport","cpuUsage":19.9,"memoryUsage":88.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:16,068 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:16Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:17,898 [INFO] TX -> {"type":"stateReport","cpuUsage":24.9,"memoryUsage":88.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:18,074 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:18Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:19,897 [INFO] TX -> {"type":"stateReport","cpuUsage":19.4,"memoryUsage":88.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:20,129 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:20Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:21,912 [INFO] TX -> {"type":"stateReport","cpuUsage":32.3,"memoryUsage":89.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:22,155 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:22Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:23,943 [INFO] TX -> {"type":"stateReport","cpuUsage":34.0,"memoryUsage":88.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:24,206 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:24Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:25,950 [INFO] TX -> {"type":"stateReport","cpuUsage":35.1,"memoryUsage":89.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:26,203 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:26Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:27,963 [INFO] TX -> {"type":"stateReport","cpuUsage":33.5,"memoryUsage":89.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:28,235 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:28Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:29,986 [INFO] TX -> {"type":"stateReport","cpuUsage":30.2,"memoryUsage":89.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:30,264 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:31,985 [INFO] TX -> {"type":"stateReport","cpuUsage":30.0,"memoryUsage":89.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:32,324 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:32Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:33,997 [INFO] TX -> {"type":"stateReport","cpuUsage":30.9,"memoryUsage":89.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:34,371 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:34Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:36,018 [INFO] TX -> {"type":"stateReport","cpuUsage":36.5,"memoryUsage":89.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:36,405 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:36Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:36,509 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123736Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=334aeadca2c53bc51ae2425d05062d07fcc34537a280a1c1dfc7663038d99d40","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:37:37,926 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:37Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:38,019 [INFO] TX -> {"type":"stateReport","cpuUsage":36.6,"memoryUsage":89.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:38,557 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:38Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:40,027 [INFO] TX -> {"type":"stateReport","cpuUsage":28.1,"memoryUsage":90.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:40,572 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:40Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:42,030 [INFO] TX -> {"type":"stateReport","cpuUsage":23.4,"memoryUsage":90.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:42,614 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:42Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:44,029 [INFO] TX -> {"type":"stateReport","cpuUsage":10.6,"memoryUsage":90.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:44,221 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:44Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:46,050 [INFO] TX -> {"type":"stateReport","cpuUsage":14.6,"memoryUsage":89.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:46,302 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:46Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:48,059 [INFO] TX -> {"type":"stateReport","cpuUsage":21.4,"memoryUsage":89.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:48,230 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:48Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:50,067 [INFO] TX -> {"type":"stateReport","cpuUsage":17.3,"memoryUsage":89.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:50,310 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:50Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:52,046 [INFO] TX -> {"type":"stateReport","cpuUsage":13.6,"memoryUsage":89.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:52,276 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:52Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:54,067 [INFO] TX -> {"type":"stateReport","cpuUsage":14.9,"memoryUsage":89.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:54,332 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:54Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:56,072 [INFO] TX -> {"type":"stateReport","cpuUsage":14.5,"memoryUsage":89.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:56,371 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:56Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:37:58,095 [INFO] TX -> {"type":"stateReport","cpuUsage":16.8,"memoryUsage":89.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:37:58,426 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:37:58Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:00,104 [INFO] TX -> {"type":"stateReport","cpuUsage":18.7,"memoryUsage":89.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:00,444 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:00Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:02,129 [INFO] TX -> {"type":"stateReport","cpuUsage":14.1,"memoryUsage":89.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:02,466 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:02Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:04,138 [INFO] TX -> {"type":"stateReport","cpuUsage":14.6,"memoryUsage":89.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:04,515 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:04Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:06,152 [INFO] TX -> {"type":"stateReport","cpuUsage":16.4,"memoryUsage":89.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:06,613 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:06Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:06,614 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123806Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=dd9cac91477fd8992e7cd48c314effd2bd800f6b974012a4c5962fabc4e2b7a2","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:38:08,072 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:08Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:08,163 [INFO] TX -> {"type":"stateReport","cpuUsage":15.8,"memoryUsage":89.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:08,670 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:08Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:10,180 [INFO] TX -> {"type":"stateReport","cpuUsage":11.5,"memoryUsage":88.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:10,712 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:10Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:12,327 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:12Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:12,328 [INFO] TX -> {"type":"stateReport","cpuUsage":16.1,"memoryUsage":88.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:14,303 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:14Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:14,325 [INFO] TX -> {"type":"stateReport","cpuUsage":15.3,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:16,372 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:16Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:16,373 [INFO] TX -> {"type":"stateReport","cpuUsage":13.6,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:18,393 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:18Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:18,394 [INFO] TX -> {"type":"stateReport","cpuUsage":16.9,"memoryUsage":88.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:20,405 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:20Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:20,406 [INFO] TX -> {"type":"stateReport","cpuUsage":24.9,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:22,428 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:22Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:22,429 [INFO] TX -> {"type":"stateReport","cpuUsage":15.3,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:24,464 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:24Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:24,465 [INFO] TX -> {"type":"stateReport","cpuUsage":17.9,"memoryUsage":88.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:26,416 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:26Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:26,473 [INFO] TX -> {"type":"stateReport","cpuUsage":14.5,"memoryUsage":88.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:28,518 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:28Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:28,519 [INFO] TX -> {"type":"stateReport","cpuUsage":13.5,"memoryUsage":88.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:30,468 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:30,529 [INFO] TX -> {"type":"stateReport","cpuUsage":16.8,"memoryUsage":88.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:32,574 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:32Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:32,575 [INFO] TX -> {"type":"stateReport","cpuUsage":20.3,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:34,567 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:34Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:34,588 [INFO] TX -> {"type":"stateReport","cpuUsage":12.9,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:36,683 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:36Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:36,683 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123836Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=d2d5a6fe8534d9559ee0a850d32d2bed4f6f11388efc12a6029c82b1a9694049","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:38:38,225 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:38Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:38,227 [INFO] TX -> {"type":"stateReport","cpuUsage":12.6,"memoryUsage":88.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:38,833 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:38Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:40,251 [INFO] TX -> {"type":"stateReport","cpuUsage":20.3,"memoryUsage":89.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:40,364 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:40Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:42,255 [INFO] TX -> {"type":"stateReport","cpuUsage":14.0,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:42,899 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:42Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:44,276 [INFO] TX -> {"type":"stateReport","cpuUsage":16.8,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:44,525 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:44Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:46,300 [INFO] TX -> {"type":"stateReport","cpuUsage":16.3,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:46,530 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:46Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:48,312 [INFO] TX -> {"type":"stateReport","cpuUsage":16.0,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:48,506 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:48Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:50,319 [INFO] TX -> {"type":"stateReport","cpuUsage":12.3,"memoryUsage":88.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:50,555 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:50Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:52,329 [INFO] TX -> {"type":"stateReport","cpuUsage":18.9,"memoryUsage":88.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:52,598 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:52Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:54,321 [INFO] TX -> {"type":"stateReport","cpuUsage":15.9,"memoryUsage":88.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:54,664 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:54Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:56,337 [INFO] TX -> {"type":"stateReport","cpuUsage":24.4,"memoryUsage":88.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:56,715 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:56Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:38:58,361 [INFO] TX -> {"type":"stateReport","cpuUsage":18.8,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:38:58,689 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:38:58Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:00,379 [INFO] TX -> {"type":"stateReport","cpuUsage":21.0,"memoryUsage":88.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:00,715 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:00Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:02,384 [INFO] TX -> {"type":"stateReport","cpuUsage":19.7,"memoryUsage":88.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:02,743 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:02Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:04,399 [INFO] TX -> {"type":"stateReport","cpuUsage":28.2,"memoryUsage":88.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:04,769 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:04Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:06,386 [INFO] TX -> {"type":"stateReport","cpuUsage":28.2,"memoryUsage":87.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:06,516 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123906Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=9b4d9eb8abdf088c03ce1144edbeb095b71a86e043982c504ef78182e18edac5","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:39:08,351 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:08Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:08,397 [INFO] TX -> {"type":"stateReport","cpuUsage":20.1,"memoryUsage":85.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:08,942 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:08Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:10,420 [INFO] TX -> {"type":"stateReport","cpuUsage":23.8,"memoryUsage":85.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:10,937 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:10Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:12,434 [INFO] TX -> {"type":"stateReport","cpuUsage":27.0,"memoryUsage":85.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:13,069 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:13Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:14,544 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:14Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:14,544 [INFO] TX -> {"type":"stateReport","cpuUsage":11.2,"memoryUsage":85.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:16,592 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:16Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:16,593 [INFO] TX -> {"type":"stateReport","cpuUsage":17.8,"memoryUsage":85.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:18,641 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:18Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:18,642 [INFO] TX -> {"type":"stateReport","cpuUsage":19.4,"memoryUsage":85.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:20,697 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:20Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:20,699 [INFO] TX -> {"type":"stateReport","cpuUsage":26.2,"memoryUsage":85.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:22,652 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:22Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:22,717 [INFO] TX -> {"type":"stateReport","cpuUsage":20.7,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:24,664 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:24Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:24,725 [INFO] TX -> {"type":"stateReport","cpuUsage":27.4,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:26,749 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:26Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:26,750 [INFO] TX -> {"type":"stateReport","cpuUsage":19.2,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:28,767 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:28Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:28,768 [INFO] TX -> {"type":"stateReport","cpuUsage":17.7,"memoryUsage":85.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:30,875 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:30,876 [INFO] TX -> {"type":"stateReport","cpuUsage":18.1,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:32,829 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:32Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:32,883 [INFO] TX -> {"type":"stateReport","cpuUsage":21.0,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:34,852 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:34Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:34,891 [INFO] TX -> {"type":"stateReport","cpuUsage":16.6,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:36,518 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T123936Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=a79ce9dd2583e6f1fb7aef013cfd30b00f36098267581d287042addf955d2c70","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:39:38,472 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:38Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:38,476 [INFO] TX -> {"type":"stateReport","cpuUsage":17.8,"memoryUsage":85.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:39,075 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:39Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:40,472 [INFO] TX -> {"type":"stateReport","cpuUsage":13.7,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:40,659 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:40Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:42,484 [INFO] TX -> {"type":"stateReport","cpuUsage":27.0,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:43,137 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:43Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:44,497 [INFO] TX -> {"type":"stateReport","cpuUsage":25.9,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:45,133 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:45Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:46,520 [INFO] TX -> {"type":"stateReport","cpuUsage":12.8,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:46,726 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:46Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:48,528 [INFO] TX -> {"type":"stateReport","cpuUsage":16.4,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:48,721 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:48Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:50,527 [INFO] TX -> {"type":"stateReport","cpuUsage":28.1,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:50,733 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:50Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:52,546 [INFO] TX -> {"type":"stateReport","cpuUsage":20.0,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:52,764 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:52Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:54,560 [INFO] TX -> {"type":"stateReport","cpuUsage":14.4,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:54,799 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:54Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:56,575 [INFO] TX -> {"type":"stateReport","cpuUsage":19.1,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:56,902 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:56Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:39:58,586 [INFO] TX -> {"type":"stateReport","cpuUsage":23.3,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:39:58,804 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:39:58Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:00,611 [INFO] TX -> {"type":"stateReport","cpuUsage":21.7,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:00,887 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:00Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:02,613 [INFO] TX -> {"type":"stateReport","cpuUsage":18.8,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:02,893 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:02Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:04,610 [INFO] TX -> {"type":"stateReport","cpuUsage":14.6,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:04,889 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:04Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:06,518 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124006Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=e4d127d03f79459fe442645b7c5c5b7fa43aac113a80562a77937c0bd9827808","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:40:06,617 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:06Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:06,620 [INFO] TX -> {"type":"stateReport","cpuUsage":24.3,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:06,898 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:06Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:08,634 [INFO] TX -> {"type":"stateReport","cpuUsage":17.9,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:08,925 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:08Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:10,644 [INFO] TX -> {"type":"stateReport","cpuUsage":15.6,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:10,959 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:10Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:12,674 [INFO] TX -> {"type":"stateReport","cpuUsage":11.3,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:12,988 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:12Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:14,678 [INFO] TX -> {"type":"stateReport","cpuUsage":20.3,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:15,008 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:15Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:16,703 [INFO] TX -> {"type":"stateReport","cpuUsage":20.3,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:17,049 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:17Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:18,724 [INFO] TX -> {"type":"stateReport","cpuUsage":14.1,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:19,118 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:19Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:20,729 [INFO] TX -> {"type":"stateReport","cpuUsage":18.3,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:21,205 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:21Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:22,713 [INFO] TX -> {"type":"stateReport","cpuUsage":23.2,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:23,249 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:23Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:24,736 [INFO] TX -> {"type":"stateReport","cpuUsage":20.3,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:25,208 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:25Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:26,723 [INFO] TX -> {"type":"stateReport","cpuUsage":22.8,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:27,271 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:27Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:28,731 [INFO] TX -> {"type":"stateReport","cpuUsage":16.1,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:29,287 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:29Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:30,755 [INFO] TX -> {"type":"stateReport","cpuUsage":18.8,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:31,311 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:31Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:32,779 [INFO] TX -> {"type":"stateReport","cpuUsage":19.0,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:33,350 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:33Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:34,796 [INFO] TX -> {"type":"stateReport","cpuUsage":17.6,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:35,361 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:35Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:36,523 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124036Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=f6a13f3d369875138cd9b3d53d97c6538c1eca61160a0219b892d06cdfe4953f","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:40:36,725 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:36Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:36,816 [INFO] TX -> {"type":"stateReport","cpuUsage":14.5,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:37,368 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:37Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:38,948 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:38Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:38,949 [INFO] TX -> {"type":"stateReport","cpuUsage":21.6,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:40,929 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:40Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:40,950 [INFO] TX -> {"type":"stateReport","cpuUsage":26.8,"memoryUsage":86.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:42,952 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:42Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:42,953 [INFO] TX -> {"type":"stateReport","cpuUsage":16.7,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:45,086 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:45Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:45,087 [INFO] TX -> {"type":"stateReport","cpuUsage":19.1,"memoryUsage":86.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:40:47,086 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:40:47Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:40:47,087 [INFO] TX -> {"type":"stateReport","cpuUsage":16.4,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:44:13,495 [INFO] WebSocket communication logging started - TX/RX format
2025-08-27 19:44:44,784 [INFO] TX -> {"type":"stateReport","cpuUsage":19.1,"memoryUsage":86.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]}
2025-08-27 19:44:46,766 [INFO] TX -> {"type":"stateReport","cpuUsage":13.6,"memoryUsage":86.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]}
2025-08-27 19:44:48,786 [INFO] TX -> {"type":"stateReport","cpuUsage":20.0,"memoryUsage":86.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]}
2025-08-27 19:44:50,783 [INFO] TX -> {"type":"stateReport","cpuUsage":18.7,"memoryUsage":86.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]}
2025-08-27 19:44:52,759 [INFO] TX -> {"type":"stateReport","cpuUsage":15.4,"memoryUsage":86.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]}
2025-08-27 19:44:54,780 [INFO] TX -> {"type":"stateReport","cpuUsage":8.9,"memoryUsage":86.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]}
2025-08-27 19:44:56,767 [INFO] TX -> {"type":"stateReport","cpuUsage":24.4,"memoryUsage":86.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]}
2025-08-27 19:44:58,773 [INFO] TX -> {"type":"stateReport","cpuUsage":11.8,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[]}
2025-08-27 19:44:59,847 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124459Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=8fd479a0828d0edbff1924f42508baba788dbca60d93217e799e461e8bef6f5b","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:45:05,969 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:05Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:45:05,971 [INFO] TX -> {"type":"stateReport","cpuUsage":17.1,"memoryUsage":87.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:06,676 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:06Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:45:07,989 [INFO] TX -> {"type":"stateReport","cpuUsage":19.5,"memoryUsage":85.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:08,616 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:08Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:45:09,991 [INFO] TX -> {"type":"stateReport","cpuUsage":17.4,"memoryUsage":85.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:10,697 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:10Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:45:11,998 [INFO] TX -> {"type":"stateReport","cpuUsage":21.9,"memoryUsage":85.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:12,231 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:12Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:45:14,016 [INFO] TX -> {"type":"stateReport","cpuUsage":18.5,"memoryUsage":85.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:14,195 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:14Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:45:16,030 [INFO] TX -> {"type":"stateReport","cpuUsage":25.3,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:16,238 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:16Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:45:18,046 [INFO] TX -> {"type":"stateReport","cpuUsage":23.4,"memoryUsage":87.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:18,337 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:18Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:45:20,055 [INFO] TX -> {"type":"stateReport","cpuUsage":26.3,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:20,272 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:20Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:45:22,073 [INFO] TX -> {"type":"stateReport","cpuUsage":16.0,"memoryUsage":87.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:22,382 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:22Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:45:24,082 [INFO] TX -> {"type":"stateReport","cpuUsage":17.6,"memoryUsage":87.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:24,369 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:24Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:45:26,085 [INFO] TX -> {"type":"stateReport","cpuUsage":20.4,"memoryUsage":86.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:26,387 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:26Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:45:28,113 [INFO] TX -> {"type":"stateReport","cpuUsage":21.5,"memoryUsage":86.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:28,396 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:28Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:45:29,851 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124529Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=d9d228302554626ef1de3473dbf98dde2b6c0b318ab7f3db0266ca7df6ae41d6","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:45:30,053 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:45:30,111 [INFO] TX -> {"type":"stateReport","cpuUsage":19.1,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:30,455 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:45:32,121 [INFO] TX -> {"type":"stateReport","cpuUsage":18.0,"memoryUsage":86.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:32,436 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:32Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:45:34,131 [INFO] TX -> {"type":"stateReport","cpuUsage":12.7,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:34,529 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:34Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:45:36,132 [INFO] TX -> {"type":"stateReport","cpuUsage":32.3,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:36,504 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:36Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:45:38,156 [INFO] TX -> {"type":"stateReport","cpuUsage":14.5,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:38,567 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:38Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:45:38,598 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":146}}
2025-08-27 19:45:40,170 [INFO] TX -> {"type":"stateReport","cpuUsage":21.1,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:40,619 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:40Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":146}
2025-08-27 19:45:42,182 [INFO] TX -> {"type":"stateReport","cpuUsage":20.7,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:42,644 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:42Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":146}
2025-08-27 19:45:44,170 [INFO] TX -> {"type":"stateReport","cpuUsage":20.0,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:44,662 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:44Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":146}
2025-08-27 19:45:46,173 [INFO] TX -> {"type":"stateReport","cpuUsage":17.9,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:46,696 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:46Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":146}
2025-08-27 19:45:48,188 [INFO] TX -> {"type":"stateReport","cpuUsage":19.3,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:48,740 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:48Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":146}
2025-08-27 19:45:50,188 [INFO] TX -> {"type":"stateReport","cpuUsage":11.6,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:50,781 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:50Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":146}
2025-08-27 19:45:52,177 [INFO] TX -> {"type":"stateReport","cpuUsage":21.1,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:52,323 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:52Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":146}
2025-08-27 19:45:54,174 [INFO] TX -> {"type":"stateReport","cpuUsage":15.2,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:54,358 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:54Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":146}
2025-08-27 19:45:56,192 [INFO] TX -> {"type":"stateReport","cpuUsage":15.8,"memoryUsage":85.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:56,437 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:56Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":146}
2025-08-27 19:45:58,203 [INFO] TX -> {"type":"stateReport","cpuUsage":14.9,"memoryUsage":85.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:45:58,458 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:45:58Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":146}
2025-08-27 19:45:59,855 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124559Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=561e2e1469a5ffa40f3746be2face4cd6f706e957dba86aaaa45ce4ee17cf72d","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:46:00,186 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:00Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:46:00,209 [INFO] TX -> {"type":"stateReport","cpuUsage":20.2,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:00,210 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":null}}
2025-08-27 19:46:00,446 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:00Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:46:02,227 [INFO] TX -> {"type":"stateReport","cpuUsage":22.0,"memoryUsage":85.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:02,565 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:02Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:46:04,241 [INFO] TX -> {"type":"stateReport","cpuUsage":16.7,"memoryUsage":85.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:04,496 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:04Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:46:06,260 [INFO] TX -> {"type":"stateReport","cpuUsage":15.7,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:06,539 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:06Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:46:08,280 [INFO] TX -> {"type":"stateReport","cpuUsage":27.4,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:08,576 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:08Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:46:08,598 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":147}}
2025-08-27 19:46:10,300 [INFO] TX -> {"type":"stateReport","cpuUsage":23.3,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:10,642 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:10Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":147}
2025-08-27 19:46:12,306 [INFO] TX -> {"type":"stateReport","cpuUsage":15.7,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:12,644 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:12Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":147}
2025-08-27 19:46:14,320 [INFO] TX -> {"type":"stateReport","cpuUsage":21.0,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:14,665 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:14Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":147}
2025-08-27 19:46:16,350 [INFO] TX -> {"type":"stateReport","cpuUsage":21.6,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:16,691 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:16Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":147}
2025-08-27 19:46:18,342 [INFO] TX -> {"type":"stateReport","cpuUsage":24.5,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:18,848 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:18Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":147}
2025-08-27 19:46:20,352 [INFO] TX -> {"type":"stateReport","cpuUsage":24.8,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:20,847 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:20Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":147}
2025-08-27 19:46:22,369 [INFO] TX -> {"type":"stateReport","cpuUsage":19.6,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:22,780 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:22Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":147}
2025-08-27 19:46:24,395 [INFO] TX -> {"type":"stateReport","cpuUsage":13.1,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:24,841 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:24Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":147}
2025-08-27 19:46:26,412 [INFO] TX -> {"type":"stateReport","cpuUsage":20.6,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:26,896 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:26Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":147}
2025-08-27 19:46:28,408 [INFO] TX -> {"type":"stateReport","cpuUsage":17.2,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:28,999 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:28Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":147}
2025-08-27 19:46:29,857 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124629Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=8c5e5a2c026dbc63f7e4bdb9f61d5ecbde713dc1371839b72bbf34e784bcfe48","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:46:30,337 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:46:30,371 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":null}}
2025-08-27 19:46:30,414 [INFO] TX -> {"type":"stateReport","cpuUsage":18.7,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:30,939 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:46:32,422 [INFO] TX -> {"type":"stateReport","cpuUsage":16.9,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:33,016 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:33Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:46:34,569 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:34Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:46:34,570 [INFO] TX -> {"type":"stateReport","cpuUsage":25.8,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:36,557 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:36Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:46:36,587 [INFO] TX -> {"type":"stateReport","cpuUsage":20.8,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:38,603 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:38Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:46:38,604 [INFO] TX -> {"type":"stateReport","cpuUsage":18.3,"memoryUsage":86.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:38,621 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":148}}
2025-08-27 19:46:40,606 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:40Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":148}
2025-08-27 19:46:40,608 [INFO] TX -> {"type":"stateReport","cpuUsage":20.8,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:42,631 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:42Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":148}
2025-08-27 19:46:42,632 [INFO] TX -> {"type":"stateReport","cpuUsage":18.5,"memoryUsage":86.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:44,734 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:44Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":148}
2025-08-27 19:46:44,736 [INFO] TX -> {"type":"stateReport","cpuUsage":17.7,"memoryUsage":86.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:46,689 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:46Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":148}
2025-08-27 19:46:46,753 [INFO] TX -> {"type":"stateReport","cpuUsage":21.6,"memoryUsage":86.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:48,762 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:48Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":148}
2025-08-27 19:46:48,763 [INFO] TX -> {"type":"stateReport","cpuUsage":22.8,"memoryUsage":87.7,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:50,758 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:50Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":148}
2025-08-27 19:46:50,759 [INFO] TX -> {"type":"stateReport","cpuUsage":29.7,"memoryUsage":89.5,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:52,967 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:52Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":148}
2025-08-27 19:46:52,970 [INFO] TX -> {"type":"stateReport","cpuUsage":26.0,"memoryUsage":89.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:55,049 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:55Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":148}
2025-08-27 19:46:55,051 [INFO] TX -> {"type":"stateReport","cpuUsage":26.7,"memoryUsage":89.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:57,033 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:57Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":148}
2025-08-27 19:46:57,079 [INFO] TX -> {"type":"stateReport","cpuUsage":21.2,"memoryUsage":89.4,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:58,969 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:46:58Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":148}
2025-08-27 19:46:59,081 [INFO] TX -> {"type":"stateReport","cpuUsage":22.9,"memoryUsage":88.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:46:59,864 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124659Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=2c634b5e97c25f9fcc88782992b7a2754430b33c32483ea18b4c158bf78ee21d","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:47:00,462 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:00Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:47:00,480 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":null}}
2025-08-27 19:47:01,098 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:01Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:47:01,099 [INFO] TX -> {"type":"stateReport","cpuUsage":23.6,"memoryUsage":88.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:47:03,085 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:03Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:47:03,086 [INFO] TX -> {"type":"stateReport","cpuUsage":18.7,"memoryUsage":88.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:47:04,659 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:04Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:47:05,095 [INFO] TX -> {"type":"stateReport","cpuUsage":20.5,"memoryUsage":88.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:47:06,807 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:06Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:47:07,106 [INFO] TX -> {"type":"stateReport","cpuUsage":18.7,"memoryUsage":88.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:47:08,822 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:08Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:47:08,841 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":149}}
2025-08-27 19:47:09,128 [INFO] TX -> {"type":"stateReport","cpuUsage":17.8,"memoryUsage":88.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:47:10,759 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:10Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":149}
2025-08-27 19:47:11,146 [INFO] TX -> {"type":"stateReport","cpuUsage":24.4,"memoryUsage":87.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:47:12,785 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:12Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":149}
2025-08-27 19:47:13,148 [INFO] TX -> {"type":"stateReport","cpuUsage":12.1,"memoryUsage":87.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:47:14,817 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:14Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":149}
2025-08-27 19:47:15,142 [INFO] TX -> {"type":"stateReport","cpuUsage":12.6,"memoryUsage":87.8,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:47:16,879 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:16Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":149}
2025-08-27 19:47:17,156 [INFO] TX -> {"type":"stateReport","cpuUsage":19.9,"memoryUsage":87.9,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:47:18,916 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:18Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":149}
2025-08-27 19:47:19,170 [INFO] TX -> {"type":"stateReport","cpuUsage":20.2,"memoryUsage":88.0,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:47:20,999 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:20Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":149}
2025-08-27 19:47:21,181 [INFO] TX -> {"type":"stateReport","cpuUsage":21.5,"memoryUsage":87.6,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:47:23,005 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:23Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":149}
2025-08-27 19:47:23,205 [INFO] TX -> {"type":"stateReport","cpuUsage":20.8,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:47:25,052 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:25Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":149}
2025-08-27 19:47:25,213 [INFO] TX -> {"type":"stateReport","cpuUsage":17.7,"memoryUsage":87.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:47:27,057 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:27Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":149}
2025-08-27 19:47:27,226 [INFO] TX -> {"type":"stateReport","cpuUsage":16.8,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:47:29,075 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:29Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":149}
2025-08-27 19:47:29,252 [INFO] TX -> {"type":"stateReport","cpuUsage":14.2,"memoryUsage":87.3,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:47:29,865 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124729Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=6fd2f997434a4947ac596b17b36b971ba10b068afd3a4e7ecf333ba3cee583f4","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:47:30,598 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:47:30,627 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":null}}
2025-08-27 19:47:31,192 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:31Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:47:31,263 [INFO] TX -> {"type":"stateReport","cpuUsage":14.4,"memoryUsage":87.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:47:33,244 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:33Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:47:33,275 [INFO] TX -> {"type":"stateReport","cpuUsage":19.2,"memoryUsage":87.2,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:47:35,274 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:47:35Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:47:35,274 [INFO] TX -> {"type":"stateReport","cpuUsage":21.4,"memoryUsage":87.1,"gpuUsage":null,"gpuMemoryUsage":null,"cameraConnections":[{"subscriptionIdentifier":"test2;webcam-local-01","modelId":20,"modelName":"bangchak_full","online":true,"rtspUrl":null,"snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000}]}
2025-08-27 19:48:45,364 [INFO] WebSocket communication logging started - TX/RX format
2025-08-27 19:48:53,127 [INFO] RX <- {"type":"subscribe","payload":{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"","modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124853Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=ee67f7674c24eedefdb9ddca6b0c2aba268ed11063e0601ec2fe00786e73ec37","modelName":"bangchak_full","modelId":20}}
2025-08-27 19:48:59,879 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124859Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=bb6408c8df465a5331f01a1600c1c13f2f52168bdc2b5d636eb80dfe0342199d","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:48:59,880 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:48:59Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:00,525 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:00Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:02,504 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:02Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:04,444 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:04Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:06,468 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:06Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:08,513 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:08Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:08,531 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":150}}
2025-08-27 19:49:10,629 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:10Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":150}
2025-08-27 19:49:12,575 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:12Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":150}
2025-08-27 19:49:14,135 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:14Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":150}
2025-08-27 19:49:16,196 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:16Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":150}
2025-08-27 19:49:18,324 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:18Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":150}
2025-08-27 19:49:20,361 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:20Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":150}
2025-08-27 19:49:22,329 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:22Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":150}
2025-08-27 19:49:24,424 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:24Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":150}
2025-08-27 19:49:26,427 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:26Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":150}
2025-08-27 19:49:28,516 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:28Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":150}
2025-08-27 19:49:29,880 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124929Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=45aaaf27b2756c214e6b930c29e844a4ff450b4b8225889337c5e78492199099","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:49:30,027 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:30,046 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":null}}
2025-08-27 19:49:30,453 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:32,542 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:32Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:34,610 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:34Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:36,593 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:36Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:38,581 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:38Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:40,619 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:40Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:42,643 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:42Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:44,697 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:44Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:46,686 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:46Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:48,813 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:48Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:50,271 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:50Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:52,782 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:52Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:54,786 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:54Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:56,360 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:56Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:58,306 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:49:58Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:49:59,879 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T124959Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=02f629c0b0b6db85781932ad17e5cd7432be9c6d455cd147b52e800b2b01fedc","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:50:00,152 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:00Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:50:00,338 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:00Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:50:02,375 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:02Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:50:04,420 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:04Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:50:06,476 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:06Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:50:08,525 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:08Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:50:10,531 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:10Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:50:12,562 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:12Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:50:14,685 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:14Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:50:16,632 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:16Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:50:16,649 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":151}}
2025-08-27 19:50:18,673 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:18Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":151}
2025-08-27 19:50:20,807 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:20Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":151}
2025-08-27 19:50:22,769 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:22Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":151}
2025-08-27 19:50:24,811 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:24Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":151}
2025-08-27 19:50:26,772 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:26Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":151}
2025-08-27 19:50:28,802 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:28Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":151}
2025-08-27 19:50:29,879 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_full-1756285886566.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250827T125029Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=1349011364def2df06f0498387ef5d0e9fff56e419d077fc3038f36aa6b0ec1f","modelId":20,"modelName":"bangchak_full"}]}
2025-08-27 19:50:30,271 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:50:30,299 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":null}}
2025-08-27 19:50:30,868 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:30Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:50:32,933 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:32Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:50:34,975 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:34Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:50:36,523 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:36Z","data":{"detection":null,"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:50:38,578 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:38Z","data":{"detection":{},"modelId":20,"modelName":"bangchak_full"}}
2025-08-27 19:50:38,595 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":152}}
2025-08-27 19:50:40,706 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:40Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":152}
2025-08-27 19:50:43,416 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:43Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":152}
2025-08-27 19:50:44,846 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:44Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":152}
2025-08-27 19:50:46,727 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-27T12:50:46Z","data":{"detection":{"carModel":null,"carBrand":null,"carYear":null,"bodyType":null,"licensePlateText":null,"licensePlateConfidence":null},"modelId":20,"modelName":"bangchak_full"},"sessionId":152}
2025-08-28 01:41:13,800 [INFO] WebSocket communication logging started - TX/RX format
2025-08-28 01:44:02,219 [INFO] WebSocket communication logging started - TX/RX format
2025-08-28 01:51:20,240 [INFO] WebSocket communication logging started - TX/RX format
2025-08-28 11:20:05,469 [INFO] WebSocket communication logging started - TX/RX format
2025-08-28 11:20:16,810 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_poc-1756312318569.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250828%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250828T042016Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=8fe7abc333e68ed2a7c30710fd8f0b15850a5f2e8631dbdc058b31670c46cb4a","modelId":21,"modelName":"bangchak_poc"}]}
2025-08-28 11:20:24,371 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:24Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:20:31,136 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:31Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:20:31,359 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:31Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:20:31,363 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":null}}
2025-08-28 11:20:32,799 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:32Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:20:34,995 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:34Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:20:36,899 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:36Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:20:38,975 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:38Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:20:40,972 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:40Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:20:43,322 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:43Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:20:45,637 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:45Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:20:46,716 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_poc-1756312318569.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250828%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250828T042046Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=54a8e18cdc4958a8140a48a94eb2fcacf94ee1a66d37270b2984dc223c642382","modelId":21,"modelName":"bangchak_poc"}]}
2025-08-28 11:20:48,472 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:48Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:20:49,241 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:49Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:20:51,452 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:51Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:20:53,377 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:53Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:20:55,270 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:55Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:20:56,793 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:56Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:20:58,745 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:20:58Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:01,530 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:01Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:03,347 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:03Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:05,344 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:05Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:07,551 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:07Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:09,566 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:09Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:10,996 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:10Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:13,125 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:13Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:15,131 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:15Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:16,699 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_poc-1756312318569.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250828%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250828T042116Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=20dc86a7131462dd0bbdf01922ea44c5c272e70fa1fda444b38a6fe5df14968c","modelId":21,"modelName":"bangchak_poc"}]}
2025-08-28 11:21:18,605 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:18Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:19,401 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:19Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:21,422 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:21Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:23,454 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:23Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:25,415 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:25Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:27,449 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:27Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:29,352 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:29Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:31,302 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:31Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:33,402 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:33Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:35,408 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:35Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:37,418 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:37Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:39,512 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:39Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:41,505 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:41Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:43,456 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:43Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:45,473 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:45Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:46,699 [INFO] RX <- {"type":"setSubscriptionList","subscriptions":[{"subscriptionIdentifier":"test2;webcam-local-01","rtspUrl":"rtsp://10.101.1.4:8554/stream","snapshotUrl":"http://10.101.1.4:8080/snapshot","snapshotInterval":2000,"modelUrl":"https://s3.adsist.net/adsist-cms-staging/models/bangchak_poc-1756312318569.mpta?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=cms-1752937116-2480%2F20250828%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250828T042146Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=3ad593cd5ab8dbe843e4acd83843009fdbbfc3492a75a7e6a05e59d5d945b334","modelId":21,"modelName":"bangchak_poc"}]}
2025-08-28 11:21:46,714 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:46Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:47,522 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:47Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:49,073 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:49Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:51,177 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:51Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:53,304 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:53Z","data":{"detection":null,"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:55,221 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:55Z","data":{"detection":{},"modelId":21,"modelName":"bangchak_poc"}}
2025-08-28 11:21:55,249 [INFO] RX <- {"type":"setSessionId","payload":{"displayIdentifier":"test2","sessionId":153}}
2025-08-28 11:21:59,139 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:59Z","data":{"detection":{"carModel":null,"carBrand":"Isuzu","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"},"sessionId":153}
2025-08-28 11:21:59,497 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:21:59Z","data":{"detection":{"carModel":null,"carBrand":"Isuzu","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"},"sessionId":153}
2025-08-28 11:22:01,445 [INFO] TX -> {"type":"imageDetection","subscriptionIdentifier":"test2;webcam-local-01","timestamp":"2025-08-28T04:22:01Z","data":{"detection":{"carModel":null,"carBrand":"Isuzu","carYear":null,"bodyType":"Pickup","licensePlateText":null,"licensePlateConfidence":null},"modelId":21,"modelName":"bangchak_poc"},"sessionId":153}