Unifi Video: Aufnahmemodus per API ändern

Damit die meine Unif Video Überwachungskameras automatisch mit der Aufzeichnung beginnen, wenn wir nicht zuhause sind, habe ich nach einer Möglichkeit gesucht die Aufnahmefunktion der Kameras über Home Assistant steuern zu können. Bei der Recherche bin ich über die API der Unifi Video Controller Software gestolpert, die vergleichsaweise einfach zu nutzen ist.

Auf Basis der inoffiziellen API-Dokumentation ist schnell ein Bash-Script geschrieben, mit dem der Aufnahmemodus der Kamera per Kommandozeile gesteuert werden kann:

#!/bin/bash

function usage {
        echo
        echo "Usage: $0  <always|motion|off>"
        echo
        echo "Example: $0 cam-wohn off"
        echo
}

function is_cam_name {
        [[ "$1" =~ ^[0-9a-zA-Z_-]+$ ]] && return 0 || return 1
}

function valid_action {
        [[ "${1,,}" =~ ^always|motion|off|status$ ]] && return 0 || return 1
}

# check if camera name provided is plausible
if ! is_cam_name "$1"; then
       usage
       echo -e "ERROR:  must be a valid camera name!\n"
       exit 1
fi

# check if valid action was provided
if ! valid_action "$2"; then
       usage
       echo -e "ERROR: action must be always, motion or off!\n"
       exit 2
fi

# curl setup 
curl="/usr/bin/curl -s --cacert <Pfad-zum-CA_Zertifkat.pem "

# Unifi-video config
base_url="https://<YourVideoControllerIP>:7443/api/2.0/camera/"
apiKey="?apiKey=<YourAPI-Key>"

cameras="$($curl $base_url$apiKey)"

cam_id=$(echo $cameras | /usr/bin/jq ".data[] | select(.name == \"$1\") | ._id")
if [ -z "$cam_id" ]; then
        echo -e "\nFehler: Kamera \"$1\" nicht gefunden. Folgende Kameras wurden ermittelt:"
        cams="$(echo $cameras | jq '.data[] | { (.name): ._id }')"
        echo "${cams//[\"\{\}]}" | sed 's/[^:] //g; /^$/d; s/^/    - /; s/: / (/; s/$/)/'
        echo
        exit 3
fi

cam_id="${cam_id//[\"]}"
JSON="{
        \"name\": \"${1}\",
        \"recordingSettings\": {
                \"motionRecordEnabled\": __motion__,
                \"fullTimeRecordEnabled\": __always__,
                \"channel\": \"0\"
        }
}"

case "${2,,}" in
        always)
                JSON=${JSON/__motion__/false}
                JSON=${JSON/__always__/true}
                ;;

        motion)
                JSON=${JSON/__motion__/true}
                JSON=${JSON/__always__/false}
                ;;

        off)
                JSON=${JSON/__motion__/false}
                JSON=${JSON/__always__/false}
                ;;

        status)
                if ! /bin/ping -c 2 $1 &> /dev/null; then
                        echo "offline"
                        exit 0
                fi
                motion=$(echo $cameras | jq ".data[] | select(.name == \"$1\") | .recordingSettings.motionRecordEnabled")
                always=$(echo $cameras | jq ".data[] | select(.name == \"$1\") | .recordingSettings.fullTimeRecordEnabled")

                if [[ $motion == true && $always == false ]]; then
                        echo "motion"
                elif [[ $motion == false && $always == true ]]; then
                        echo "always"
                elif [[ $motion == false && $always == false ]]; then
                        echo "off"
                fi

                exit 0
                ;;

        *)
                usage
                exit 2
                ;;
esac

$curl --include --request PUT --header "Content-Type: application/json"  \
      --data-binary "$JSON" "$base_url$cam_id$apiKey" &> /dev/null

 Damit das Script funktioniert muss das Kommandozeilen-Tool jq installiert werden, damit die Antworten im JSON-Format einfach ausgewertet und weiterverwendet werden können.

Außerdem muss natürlich in Zeile 37 und 38 natürlich die IP-Adresse des Unifi Video Controllers und der API-Key für den Zugriff angepasst werden. Der API-KEy kann in den Account-Einstellungen der Unifi Video Controller Software angelegt werden.

In Zeile 36 wird in dem Parameter --cacert festgelegt, welches CA-Zertifikat von curl zur überprüfung der SSL_Verbindung verwendet werden soll. Da ich ein Zertifikat meiner eigenen CA-verwende, muss ich hier mein CA-Zertifikat im PEM-Format angeben. Alternativ kann mit dem Parameter -k die Zertifikatsprüfung komplett deaktiviert werden. Das hat aber den Nachteil, dass der Datenverkehr potentiell mitgelesen werden kann.

Nachdem mit dem Script der Aufnahmemodus per Kommandozeile einfach geändert werden kann, kann das Kommando jetzt in Home Assistant eingebunden werden.  werden.

Quellen

[1] Inoffizielle Video Controller API Dokumentation

Kommentare

PostadresseE-MailadresseFestnetzMobiltelefonSMS/SignalThreemaTwitter DirektnachrichtFAXWeb Page