#!/bin/bash # unifi-protect-viewport-debug: CLI debug tool # # Commands: # show Turn display on # hide Turn display off # test-display Test display power cycle (on -> 3s -> off) # test-touch List touch devices and capabilities # test-stream Fetch RTSP URL from Protect and play via mpv # test-protect Test Protect API authentication and camera info set -e ENV_FILE="/etc/unifi-protect-viewport/unifi-protect-viewport.env" CMD="${1:-help}" _load_env() { if [ -f "$ENV_FILE" ]; then set -a # shellcheck disable=SC1090 source "$ENV_FILE" set +a else echo "Warning: $ENV_FILE not found" >&2 fi } _display_on() { BACKLIGHT=$(ls /sys/class/backlight/ 2>/dev/null | head -1) if [ -n "$BACKLIGHT" ]; then MAX=$(cat "/sys/class/backlight/$BACKLIGHT/max_brightness") echo "$MAX" > "/sys/class/backlight/$BACKLIGHT/brightness" else echo "No backlight device found" >&2 fi } _display_off() { BACKLIGHT=$(ls /sys/class/backlight/ 2>/dev/null | head -1) if [ -n "$BACKLIGHT" ]; then echo "0" > "/sys/class/backlight/$BACKLIGHT/brightness" else echo "No backlight device found" >&2 fi } cmd_show() { _load_env echo "Turning display on..." _display_on echo "Display on" } cmd_hide() { _load_env echo "Turning display off..." _display_off echo "Display off" } cmd_test_display() { _load_env echo "Testing display power cycle..." echo "ON..." _display_on sleep 3 echo "OFF..." _display_off echo "Done" } cmd_test_touch() { echo "Touch devices:" python3 - <<'PYEOF' import evdev for path in evdev.list_devices(): try: dev = evdev.InputDevice(path) caps = dev.capabilities() has_mt = ( evdev.ecodes.EV_ABS in caps and any( code == evdev.ecodes.ABS_MT_POSITION_X for code, _ in caps[evdev.ecodes.EV_ABS] ) ) has_btn = ( evdev.ecodes.EV_KEY in caps and evdev.ecodes.BTN_TOUCH in [code for code, _ in caps.get(evdev.ecodes.EV_KEY, [])] ) print(f" {path}: {dev.name!r} (multitouch={has_mt}, btn_touch={has_btn})") dev.close() except Exception as e: print(f" {path}: error: {e}") PYEOF echo "" echo "To monitor live touch events interactively:" echo " python3 -m evdev.evtest" } cmd_test_stream() { _load_env if [ -z "$UNIFI_PROTECT_VIEWPORT_PROTECT_HOST" ]; then echo "Error: UNIFI_PROTECT_VIEWPORT_PROTECT_HOST not set" >&2 exit 1 fi echo "Fetching RTSP URL from $UNIFI_PROTECT_VIEWPORT_PROTECT_HOST..." RTSP_URL=$(python3 - <&2 exit 1 fi echo "Playing: $RTSP_URL" echo "(press q to quit)" mpv \ --vo=drm \ "--video-rotate=${UNIFI_PROTECT_VIEWPORT_ORIENTATION:-270}" \ --fullscreen \ --no-border \ --no-osc \ --no-input-default-bindings \ --really-quiet \ "$RTSP_URL" } cmd_test_protect() { _load_env if [ -z "$UNIFI_PROTECT_VIEWPORT_PROTECT_HOST" ]; then echo "Error: UNIFI_PROTECT_VIEWPORT_PROTECT_HOST not set" >&2 exit 1 fi python3 - <" echo "" echo "Commands:" echo " show Turn display on" echo " hide Turn display off" echo " test-display Test display power cycle (on -> 3s -> off)" echo " test-touch List touch devices and capabilities" echo " test-stream Fetch RTSP URL and play via mpv" echo " test-protect Test Protect API connection and camera info" echo "" echo "Config: $ENV_FILE" ;; esac