#!/bin/bash # Start / stop the Litter Box Camera Analyzer service. # This script manages the Python analyzer as a background process. # # Usage: # ./litter_box_analyzer.sh start # ./litter_box_analyzer.sh stop # ./litter_box_analyzer.sh status # # Configuration (edit or set env vars): # MQTT_BROKER - MQTT broker hostname/IP (default: localhost) # MQTT_PORT - MQTT port (default: 1883) # MQTT_USERNAME - MQTT username (default: none) # MQTT_PASSWORD - MQTT password (default: none) # DEBUG_DIR - Save annotated debug images (default: none) set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" ANALYZER="${SCRIPT_DIR}/litter_box_analyzer.py" PIDFILE="${SCRIPT_DIR}/.litter_box_analyzer.pid" LOGFILE="${SCRIPT_DIR}/litter_box_analyzer.log" MQTT_BROKER="${MQTT_BROKER:-localhost}" MQTT_PORT="${MQTT_PORT:-1883}" MOTION_THRESHOLD="${MOTION_THRESHOLD:-15}" BOX_STATE_THRESHOLD="${BOX_STATE_THRESHOLD:-30}" STUCK_FRAMES="${STUCK_FRAMES:-10}" CALIBRATION_FRAMES="${CALIBRATION_FRAMES:-10}" start() { if [ -f "$PIDFILE" ] && kill -0 "$(cat "$PIDFILE")" 2>/dev/null; then echo "Analyzer is already running (PID $(cat "$PIDFILE"))" return 1 fi local extra_args=() [ -n "${DEBUG_DIR:-}" ] && extra_args+=(--debug-dir "$DEBUG_DIR") echo "Starting Litter Box Analyzer..." python3 "$ANALYZER" \ --broker "$MQTT_BROKER" \ --port "$MQTT_PORT" \ --motion-threshold "$MOTION_THRESHOLD" \ --box-state-threshold "$BOX_STATE_THRESHOLD" \ --stuck-frames "$STUCK_FRAMES" \ --calibration-frames "$CALIBRATION_FRAMES" \ "${extra_args[@]}" \ >> "$LOGFILE" 2>&1 & echo $! > "$PIDFILE" echo "Started (PID $!). Log: $LOGFILE" } stop() { if [ ! -f "$PIDFILE" ]; then echo "No PID file found. Analyzer may not be running." return 1 fi PID=$(cat "$PIDFILE") if kill "$PID" 2>/dev/null; then echo "Stopped analyzer (PID $PID)" rm -f "$PIDFILE" else echo "Process $PID not found. Removing stale PID file." rm -f "$PIDFILE" fi } status() { if [ -f "$PIDFILE" ] && kill -0 "$(cat "$PIDFILE")" 2>/dev/null; then echo "Analyzer is running (PID $(cat "$PIDFILE"))" else echo "Analyzer is NOT running" [ -f "$PIDFILE" ] && echo "(stale PID file exists)" && rm -f "$PIDFILE" fi } case "${1:-}" in start) start ;; stop) stop ;; restart) stop; sleep 1; start ;; status) status ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 ;; esac