Reolink Wifi und WLAN Cameras einbinden in Homematic

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Antworten
roland90427
Beiträge: 19
Registriert: 01.08.2016, 19:57
Wohnort: Durmersheim
Danksagung erhalten: 3 Mal

Reolink Wifi und WLAN Cameras einbinden in Homematic

Beitrag von roland90427 » 21.07.2022, 13:12

Hallo an alle,

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

reolink.zip
(2.08 KiB) 53-mal heruntergeladen
Das Script reolink.sh wird z.B. auf der CCU2/CCU3 bzw. wie bei mir auf dem Raspberry PI unter PiVCCU3 installiert, nachdem im Script die IP-Adresse(n) der Camera(s) sowie Userid/Passwort eingetragen wurde:

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
Das Script kann jetzt auf der Kommandozeile ausgeführt werden:

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 Systemvariablen.jpg
HM Systemvariablen.jpg (14.26 KiB) 2495 mal betrachtet


HM-Script um die Reolink zu steuern, ggf. muss die CUXD-Information an Deine CCU angepasst werden:
HM Aussencam.jpg

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 Aussencam An-Abwesenheit.jpg


HM-Script für nachts bei Anwesenheit:
HM Aussencam nachts Anwesenheit.jpg


Dann wünsche ich Euch viel Spass mit meiner Lösung.

Roland
Zuletzt geändert von alchy am 21.07.2022, 15:05, insgesamt 1-mal geändert.
Grund: verschoben aus Homematic Allgemein

adxenom
Beiträge: 24
Registriert: 01.04.2018, 17:16
System: CCU
Wohnort: Aalen

Re: Reolink Wifi und WLAN Cameras einbinden in Homematic

Beitrag von adxenom » 28.12.2022, 21:24

Hallo Roland,

vielen Dank fuer deinen Beitrag und die Anregungen.
Habe mich in den vergangenen Tagen ebenfalls mit dem Thema Ansteuerung meiner Reolink befasst.
Ich steuere diese rein ueber Homematic-Scripts an.
Meine Loesung siehe viewtopic.php?f=19&t=74368&p=749930#p749930.

Gruss,
Alexander

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“