ich besitze eine Reolink Wifi-Camera RLC-511WA und suchte eine Möglichkeit diese in meine Homematic einzubinden. Konkret wollte ich die Camera nur dann aktivieren (bei Erkennen von Personen usw, Aufzeichnung, Email, Push, FTP an NAS) wenn niemand zu Hause ist, bzw. über Nacht.
Geht doch easy per Handy via Reolink App, so würden manche sagen. Aber das ist nicht mein Anspruch, daß jedesmal von mir bzw. einem Familienmitglied die Reolink aktiviert/deaktiviert wird. Würde das vergessen, so wäre die Reolink nutzlos im Einbruchsfall bzw. würde jedesmal eine Flut von Infos per Pushes/Mails senden wenn jemand von uns im Erkennungsbereich der Reolink herumtappt.
Da ich bereits eine Modifikation eines Tür-Fensterkontakts mit Microschalter an meiner Haustüre bereits u.a. für Anwesenheits- und Abwesenheitssteuerung nutze, so muss die Reolink darüber auch automatisierbar sein.
Dazu gibt es eine Camera HTTP API, welche umfangreiche Funktionen bietet, u.a. auch die von mir notwendigen. Diese API ist lt. meinen umfangreichen Internet-Recherchen offensichtlich defacto-Standart nicht nur von Reolink sondern auch von anderen Camera-Herstellern.
Die wesentliche Inspiration dazu bekam ich von https://www.domoticz.com/forum/viewtopic.php?t=28721
Einen Link zur Camera HTTP API Doku entweder von vorheriger URL oder https://www.domoticz.com/forum/download ... 9e7740648e
Ggf. kann man auch eine Phyton Library von obiger URL für die von mir angestrebte Automatisation nutzen.
Sicherlich gibt es möglicherweise in Node Red oder anderen solchen Tools eine Anbindung dafür. Allerdings wollte ich nicht nur für die Reolink so ein Tool einsetzen, sondern die Standarts von der CCU2 bzw. CCU3 nutzen. Allerdings kann ich kein Phyton und war daher etwas hilflos vor der Phyton Library gestanden.
Deshalb besteht meine Lösung aus einem Shell-Script, welches die von mir benötigen HTTP-APIs beinhaltet und über Funktionalitäten des CUX-Daemons mit entsprechend einfachen Aufruf-Parametern aufgerufen wird.
Code: Alles auswählen
#!/bin/sh
#
# Aufruf: reolink.sh check/status/enable/disable/audioalarm cam[1-9]
#
# Version 1.2 24.06.2022 Roland Striegl
send_camera () {
cam_cmd=$1
json=$2
json=`echo $json | sed s/\'/\"/g`
[ $debug ] && echo "§§§ json=$json"
timeout=5
curl_cmd="curl -m $timeout -kfsSL -H 'Content-Type:application/json' -d $json -X POST $cam_url?cmd=$cam_cmd&user=$username&password=$password"
[ $debug ] && echo "§§§ curl_cmd=$curl_cmd"
# echo "$curl_cmd"
resp=`$curl_cmd`
rc=$?
[ $debug ] && echo "§§§ rc=$rc, resp=$resp"
if [ $rc -ne 0 ]; then
errtxt="Error"
[ $rc -eq 7 -o $rc -eq 28 ] && errtxt="Camera nicht erreichbar"
logmsg "+++ ${errtxt}: curl rc=$rc; cmd=$cam_cmd; curl=$curl_cmd"
return $rc
fi
echo "$resp" > ${cam_cmd}.response.json
resp_code=`echo $resp | jq '.[].code'`
if [ $resp_code -ne 0 ]; then
logmsg "+++ Error: cmd=$cam_cmd --> $curl_cmd"
logmsg "+++ resp=$resp"
return 8
fi
if [ "$cam_cmd" = "GetDevInfo" ]; then
cam_name=`echo $resp | jq '.[].value.DevInfo.name'`
if [ "$cam_name" = "null" ]; then
logmsg "+++ 'value.DevInfo.name' unknown in JSON string returned"
return 8
fi
logmsg "... Camera $cam_name online"
return
fi
cmdx=`echo $cam_cmd | cut -c1-3`
if [ "$cmdx" = "Get" ]; then
if [ "$cam_cmd" = "GetAbility" ]; then
value=`echo $resp | jq '.[].value.Ability.abilityChn[].aiTrack.permit'`
if [ $value -eq 0 ]; then
aiTrack=
logmsg "... aiTrack: not permitted"
else
aiTrack=1
logmsg "... aiTrack: permitted"
fi
return
fi
if [ "$cam_cmd" = "GetAiCfg" ]; then
jq_value=".value.aiTrack"
value=`echo $resp | jq ".[] $jq_value"`
if [ "$value" = "null" ]; then
logmsg "+++ '$jq_value' unknown in JSON string returned"
return 8
fi
status="unknown"
[ $value -eq 1 ] && status="enabled"
[ $value -eq 0 ] && status="disabled"
logmsg "... $cam_cmd: aiTrack=$status"
return
fi
[ "$cmd" = "GetRecV20" ] && temp="Rec"
[ "$cmd" = "GetFtpV20" ] && temp="Ftp"
[ "$cmd" = "GetEmailV20" ] && temp="Email"
[ "$cmd" = "GetPushV20" ] && temp="Push"
jq_value=".value.${temp}.enable"
value=`echo $resp | jq ".[] $jq_value"`
if [ "$value" = "null" ]; then
logmsg "+++ '$jq_value' unknown in JSON string returned"
return 8
fi
status="unknown"
[ $value -eq 1 ] && status="enabled"
[ $value -eq 0 ] && status="disabled"
logmsg "... $cam_cmd: $status"
return
fi
cmdx=`echo $cam_cmd | cut -c1-3`
if [ "$cmdx" = "Set" ]; then
status="disabled"
# [ "$cam_cmd" = "SetAiCfg" ] && enable=0
[ $enable -eq 1 ] && status="enabled"
logmsg "... $cam_cmd: $status"
return
fi
logmsg "... $cam_cmd ok"
}
logmsg () {
msg=$1
date=`date '+%F %T'`
echo "$msg"
echo "$date $msg" >> $logfile
}
PATH="$PATH:/usr/local/addons/cuxd/extra/" # curl + jq auf pivccu3
camera_all="192.168.x.y 192.168.x.z 192.168.x.w" # <-- anpassen 1-n Camera IPs getrennt per space
username="XXXXX" # <-- anpassen
password="XXXXXXXX" # <-- anpassen
alarm_times=5 # <-- Anzahl Audioalarm-Wiederholungen
setAiCfg= # <-- 1 = anpassen
setRec=1 # <-- 1 = anpassen
setEmail=1 # <-- 1 = anpassen
setFtp=1 # <-- 1 = anpassen
setPush=1 # <-- 1 = anpassen
debug= # <-- 1 = debug oder debug=
action=0 # Get: 0 = nur value; 1 = intitial, range + value
scriptname=${0%.*}
scriptname=${scriptname#./}
logfile="${scriptname}.log"
mode=$1
if ! [ "$mode" = "check" -o "$mode" = "status" -o "$mode" = "enable" -o "$mode" = "disable" -o "$mode" = "audioalarm" ]; then
echo "+++ Aufruf: $0 check/status/enable/disable/audioalarm cam[1-9]"
exit 4
fi
parm=$2
[ "$parm" = "" ] && parm="cam1"
cam=`echo $parm | tr [A-Z] [a-z]`
cam_number=${cam#cam}
`echo $cam_number | grep -Eq '^[1-9]$'`
rc=$?
if [ "$cam" = "$cam_number" -o $rc -ne 0 ]; then
echo "+++ invalid Camera '$cam' - must bei cam[1-9]"
exit 4
fi
set -- $camera_all
eval cam_ip='$'$cam_number
if [ "$cam_ip" = "" ]; then
echo "+++ IP-Adress missing for $cam in \$camera_all; specified are only $# cameras"
exit 4
fi
logmsg "... connecting $cam ($cam_ip)"
cam_url="https://$cam_ip/cgi-bin/api.cgi"
exit_rc=0
if ! [ "$mode" = "check" -o "$mode" = "audioalarm" ]; then
cmd='GetAbility'
send_camera $cmd "[{'cmd':'$cmd','param':{'user':{'userName':'null'}}}]"
fi
if [ "$mode" = "check" ]; then
cmd='GetDevInfo'
send_camera $cmd "[{'cmd':'$cmd','action':0}]"
rc=$?
if [ $rc -ne 0 ]; then
exit_rc=8
logmsg "+++ $mode failed"
fi
elif [ "$mode" = "audioalarm" ]; then
cmd='AudioAlarmPlay'
send_camera $cmd "[{'cmd':'$cmd','action':0,'param':{'alarm_mode':'times','manual_switch':0,'times':$alarm_times}}]"
elif [ "$mode" = "status" ]; then
if [ $aiTrack ]; then
cmd='GetAiCfg'
[ $setAiCfg ] && send_camera $cmd "[{'cmd':'$cmd','action':$action}]"
else
cmd='GetRecV20'
[ $setRec ] && send_camera $cmd "[{'cmd':'$cmd','action':$action}]"
cmd='GetEmailV20'
[ $setEmail ] && send_camera $cmd "[{'cmd':'$cmd','action':$action}]"
cmd='GetFtpV20'
[ $setFtp ] && send_camera $cmd "[{'cmd':'$cmd','action':$action}]"
cmd='GetPushV20';
[ $setPush ] && send_camera $cmd "[{'cmd':'$cmd','action':$action}]"
fi
else
enable=0
[ "$mode" = "enable" ] && enable=1
if [ $aiTrack ]; then
# cmd='SetAiCfg'
# send_camera $cmd "[{'cmd':'$cmd','action':0,'param':{'AiDetectType':{'people':$enable,'vehicle':$enable,'dog_cat':$enable,'face':$enable}}}]"
# cmd='SetAiCfg'
# send_camera $cmd "[{'cmd':'$cmd','action':0,'param':{'trackType':{'people':$enable,'vehicle':$enable,'dog_cat':$enable,'face':$enable}}}]"
cmd='SetAiCfg'
[ $setAiCfg ] && send_camera $cmd "[{'cmd':'$cmd','action':0,'param':{'aiTrack':$enable}}]"
else
cmd='SetRecV20'
[ $setRec ] && send_camera $cmd "[{'cmd':'$cmd','param':{'Rec':{'enable':$enable}}}]"
cmd='SetEmailV20'
[ $setEmail ] && send_camera $cmd "[{'cmd':'$cmd','param':{'Email':{'enable':$enable}}}]"
cmd='SetFtpV20'
[ $setFtp ] && send_camera $cmd "[{'cmd':'$cmd','param':{'Ftp':{'enable':$enable}}}]"
cmd='SetPushV20'
[ $setPush ] && send_camera $cmd "[{'cmd':'$cmd','param':{'Push':{'enable':$enable}}}]"
fi
fi
exit $exit_rc
Code: Alles auswählen
cd
mkdir -P /usr/local/addons/reolink
(dorthin das angepasste Script kopieren)
cd /usr/local/addons/reolink
chmod a+x reolink.sh
Code: Alles auswählen
cd /usr/local/addons/reolink
./reolink.sh (zeigt Aufrufparameter)
./reolink.sh check (oder "check cam1", "check cam2" ....)
Wenn der Aufruf per Parameter "check" keine Fehler bringt sondern den Camera-Namen, so wird die Camera von der API unterstützt. Bei Fehlern bitte prüfen auf korrekte IP-Adresse(n),Userid/Password.
Es funktioniert auch die Camera Reolink RLC-823A vom Stefan - siehe viewtopic.php?f=19&t=74368&p=722806&hil ... nk#p719841
benötigte HM-Variablen:
HM-Script um die Reolink zu steuern, ggf. muss die CUXD-Information an Deine CCU angepasst werden:
Code: Alles auswählen
! Aussen Cam steuern
string status = "";
string cam_cmd = dom.GetObject("AussenCam_Cmd").Variable();
WriteLine("Aufruf: reolink.sh " + cam_cmd);
dom.GetObject("CUxD.CUX2801001:3.CMD_SETS").State("/usr/local/addons/reolink/reolink.sh " + cam_cmd);
dom.GetObject("CUxD.CUX2801001:3.CMD_QUERY_RET").State(1);
string stdout = dom.GetObject("CUxD.CUX2801001:3.CMD_RETS").State();
WriteLine(stdout);
if ( (cam_cmd.Find("enable") > -1) || (cam_cmd.Find("disable") > -1) ) { status = cam_cmd.StrValueByIndex(" ", 0); }
if ( stdout.Find("+++") > -1 ) {
WriteLine("Fehler: " + stdout);
dom.GetObject("Pushover_Info").State("info_roland;Fehler bei " + cam_cmd + ", Camera: " + stdout);
status = "error";
}
if ( status != "" ) {
dom.GetObject("AussenCam_Status").State(status);
WriteLine("neuer Status=" + status);
}
HM-Script für An- und Abwesenheit:
HM-Script für nachts bei Anwesenheit:
Dann wünsche ich Euch viel Spass mit meiner Lösung.
Roland