88 lines
2.5 KiB
Bash
88 lines
2.5 KiB
Bash
|
|
#!/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
|