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.
Kommentare