# ============================================================================= # ZenAI KTC — sack feeder zone counter (ByteTrack + N named zones) # Shared config for: counter_live_rknn.py + counter_dashboard.py # Copy to .env on device: cp env.example .env && nano .env # ============================================================================= # --- Core paths --- OUTPUT_DIR=/opt/zenai-ktc-counter DB_PATH=/opt/zenai-ktc-counter/counter.db STATE_FILE=/opt/zenai-ktc-counter/current_counter.json # --- Input source --- #SOURCE=rtsp://user:pass@192.168.0.100:554/stream1 SOURCE=rtsp://10.38.30.64:8554/my_stream OPENCV_FFMPEG_CAPTURE_OPTIONS=rtsp_transport;tcp|fflags;nobuffer|flags;low_delay # --- RKNN model --- MODEL_PATH=/opt/models/zenai_kac_sukawarna_20260716.rknn IMGSZ=320 HALF=false CORE_MASK=1 DEVICE=0 # --- YOLO decoder --- NUM_CLASSES=4 SCORE_SIGMOID=false # --- Detection --- CONF=0.5 # --- ByteTrack tracking --- TRACK_HIGH_THRESH=0.5 TRACK_LOW_THRESH=0.3 TRACK_MATCH_THRESH=0.7 TRACK_BUFFER=60 TRACK_MIN_HITS=3 # --- Display --- SITE_NAME=ZenAi # --- Object class names --- CAMERA_NAME=ZenAi OBJECT_LABEL=karung CLASS_OBJECT=karung OBJECT_CLASS_ID=0 # Verbose tracking debug (inherit / dup / cooldown / per-frame dets) DEBUG_TRACKING=false # --- Counting zones (1…N) --- # ZONE_COUNT=1 uses only ZONE_1_*. Add ZONE_2_* (etc.) when ZONE_COUNT>=2. # Absolute pixels (ZONE_i_X1…) win over fractions when set. # A sack is counted once after dwelling in a zone. ZONE_COUNT=1 ZONE_1_NAME=kandang_bawah_feeder ZONE_1_X1_FRAC=0.10 ZONE_1_Y1_FRAC=0.10 ZONE_1_X2_FRAC=0.90 ZONE_1_Y2_FRAC=1.00 ZONE_1_COOLDOWN_SEC=15 ZONE_1_DWELL_SEC=2 # Example two-zone setup: # ZONE_COUNT=2 # ZONE_1_NAME=kandang_bawah_feeder_kiri # ZONE_1_X1_FRAC=0.02 # ZONE_1_Y1_FRAC=0.10 # ZONE_1_X2_FRAC=0.440 # ZONE_1_Y2_FRAC=1.00 # ZONE_1_COOLDOWN_SEC=15 # ZONE_1_DWELL_SEC=2 # ZONE_2_NAME=kandang_bawah_feeder_kanan # ZONE_2_X1_FRAC=0.490 # ZONE_2_Y1_FRAC=0.10 # ZONE_2_X2_FRAC=0.98 # ZONE_2_Y2_FRAC=1.00 # ZONE_2_COOLDOWN_SEC=15 # ZONE_2_DWELL_SEC=2 # --- Counting day management --- DAILY_CUTOFF_TIME=17:00 CUTOFF_TIME=17:00 # --- CSV export --- EXPORT_CSV=false CROSS_CSV=/tmp/ktc_crossings.csv # --- Rate / performance --- MOTION_DETECTION_ENABLED=true MOTION_THRESHOLD=5.0 RATE_WINDOW_SEC=60 WARMUP_FRAMES=30 RECONNECT_DELAY_SEC=3 MAX_RECONNECT_ATTEMPTS=0 # Max stream-error logs per outage; resets when stream recovers. 0 = unlimited. STREAM_ERROR_LOG_MAX=3 TRACKED_PRUNE_SEC=300 # --- ID-switch counting guards --- DEDUP_FRAMES=15 DEDUP_PX=60 INHERIT_SEC=1.0 INHERIT_PX=60 # --- Video recording --- RECORD_VIDEO=false VIDEO_SEGMENT_SEC=3600 OUTPUT_FPS=15 # --- Live stream snapshot --- LIVE_STREAM_ENABLED=true LIVE_STREAM_FRAME_PATH=/dev/shm/zenai-ktc-counter/live_frame.jpg LIVE_STREAM_QUALITY=75 LIVE_STREAM_EVERY_N=2 # --- Dashboard --- SECRET_KEY=change-me-in-production DASHBOARD_HOST=0.0.0.0 DASHBOARD_PORT=5000 FLASK_DEBUG=false CURRENT_COUNTER_PATH=/tmp/ktc_current_counter.json SAVE_CROSS_SNAPSHOT=true CROSS_SNAPSHOT_DIR=/opt/zenai-ktc-snaps/snapshots CROSS_SNAPSHOT_CLEANUP_SEC=3600 CROSS_SNAPSHOT_MAX_AGE_DAYS=7