per CURL die Webcam steuern

Hallo,

ich möchte gerne meine neue Webcam (HIKVISION DS-2CD2032-I) aus IPS heraus steuern.

Soll meinen:
wenn die Terassentür offen ist, soll die Bewegungserkennung der Kamera ausgeschaltet werden.

Jetzt kann man laut Doku die Kamera per CURL konfiguririeren. Ich schaffe es auch die aktuelle Konfig auszulesen, einen PUT Befehl bekomme ich aber nicht hin…

Hat jemand schon so etwas gemacht?

Vielen Dank
Andreas

Hallo,

ja, ich mache das so mit meinen Cams. Ich kenne jetzt allerdings nicht den Befehlssatz, den Deine verwenden. Hier mal ein Beispiel (Motion Detect der Cam ausschalten):


$erg="0";
$pw=GetValue(48271 /*[Garten\Kamera\Stammdaten\Passwort]*/);
$cam=trim(GetValue(51245 /*[Garten\Kamera\Stammdaten\IP-Adresse]*/)).":2012";
$ch=curl_init("http://$cam/set_alarm.cgi?motion_armed=$erg&user=admin&pwd=$pw");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$command=curl_exec($ch);
SetValue(50770 /*[Alarmanlage & Sensoren\Garten\Bewegungsmelder_1\Parameter\Auslöser aktiv?]*/,FALSE);

Bild „knipsen“ :


$ip=GetValue(51245 /*[Garten\Kamera\Stammdaten\IP-Adresse]*/);
$pw=GetValue(48271 /*[Garten\Kamera\Stammdaten\Passwort]*/);
$url = "http://$ip:2012/snapshot.cgi?user=admin&pwd=$pw"; // Image-Datei
$time=date("Y").date("m").date("d")."-".date("His");
$file = "c:\\ip-symcon\\webfront\\user\GartenBilder\\M_".$time.".jpg";
$ch = curl_init($url);
$fp = fopen($file, 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);

Helligkeit steuern über ein Variable im Webfront :

<?
IF ( $_IPS['SENDER']=="WebFront")
{
		SetValue($_IPS['VARIABLE'],$_IPS['VALUE']);
		cam_motion($_IPS['VALUE']);
}
function cam_motion($nummer)
{
	$val=16*$nummer;
	$pw=GetValue(48271 /*[Garten\Kamera\Stammdaten\Passwort]*/);
	$cam=trim(GetValue(51245 /*[Garten\Kamera\Stammdaten\IP-Adresse]*/)).":2012";
	$ch=curl_init("http://$cam/camera_control.cgi?param=1&value=$val&user=admin&pwd=$pw");
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	$command=curl_exec($ch);
	return($command);
}
?>

Gruß
Walter

Hi,

hier al ein Auszug aus der Doku zu meiner Camera:

8.4.13 /ISAPI/System/Video/inputs/channels/<ID>/motionDetection

/ISAPI/System/Video/inputs/channels/ID
/MotionDetection

GET
Description It is used to get the motion detection configuration for all video input channels.
Query None
Inbound Data None
Success Return MotionDetection

PUT
Description It is used to udpate the motion detection configuration for a video input channel.
Query None
Inbound Data MotionDetection
Success Return ResponseStatus

Notes:
If motion detection is supported by the device, a motion detection ID will be allocated for
each video input channel ID. The motion detection ID must correspond to the video input
channel ID.

MotionDetection XML Block

<MotionDetection version=“2.0” xmlns=“http://www.isapi.org/ver20/XMLSchema”>
<enabled> <!-- req, xs:boolean --> </enabled>
<enableHighlight> <!-- opt, xs:boolean --> </enableHighlight>
<samplingInterval> <!-- opt, xs:integer, number of frames --> </samplingInterval>
<startTriggerTime> <!-- opt, xs:integer, milliseconds --> </startTriggerTime>
<endTriggerTime> <!-- opt, xs:integer, milliseconds --> </endTriggerTime>
<regionType> <!-- ro, req, xs:string, “grid, roi, none” --> </regionType>
<Grid> <!-- dep -->
<rowGranularity> <!-- ro, req, xs:integer --> </rowGranularity>
<columnGranularity> <!-- ro, req, xs:integer --> </columnGranularity>
</Grid>
<ROI> <!-- dep -->
<normalizedScreenWidth> <!-- ro, req, xs:integer --></normalizedScreenWidth>
<normalizedScreenHeight> <!-- ro, req, xs:integer --></normalizedScreenHeight>
</ROI>
<MotionDetectionLayout/> <!-- req -->
</MotionDetection>

Den GET bekomme ich so hin:

$out =„http://admin:12345@192.168.178.166/ISAPI/System/Video/inputs/channels/1/motionDetection“;
$ch = curl_init($out);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$ergebnis = curl_exec($ch);
$fehler = curl_error($ch);
echo $ergebnis;
echo $fehler;
curl_close($ch);

Ich bekomme dann folgendes zurück:

<?xml version=„1.0“ encoding=„UTF-8“?>
<MotionDetection version=„2.0“ xmlns=„http://www.isapi.org/ver20/XMLSchema“>
<enabled>true</enabled>
<enableHighlight>true</enableHighlight>
<samplingInterval>2</samplingInterval>
<startTriggerTime>500</startTriggerTime>
<endTriggerTime>500</endTriggerTime>
<regionType>grid</regionType>
<Grid>
<rowGranularity>15</rowGranularity>
<columnGranularity>22</columnGranularity>
</Grid>
<MotionDetectionLayout version=„2.0“ xmlns=„http://www.isapi.org/ver20/XMLSchema“>
<sensitivityLevel>60</sensitivityLevel>
<layout>
<gridMap>7ffff87ffff8fffffcfffffcfffffcfffffcfffffcfffffcfffffcfffffcfffffcfffffcfffffcfffffcfffffc</gridMap>
</layout>
</MotionDetectionLayout>
</MotionDetection>

Davon möchte ich <enabled>true</enabled> in <enabled>false</enabled> ändern.

Nur beim senden der geänderten Einstellungen haperts…
So wie ich es verstanden habe, muss ich eigentlich „nur“ das manipulierte Ergebnis des GET wieder an die Kamera senden.

Gruß
Andreas

Moin,

vielleicht hilft dashier weiter

Gruß
Walter

Hi,

die Anleitung habe ich natürlich bereits gelesen.
Theoretisch ist mir auch alles klar, aber ich bekomme es halt in IPS nicht hin…

Vielen Dank
Andreas

Hi,

was passiert denn, wenn Du folgendes machst?


$xml="<hier den gewünschten Code einsetzen>"
$out ="http://admin:12345@192.168.178.166/ISAPI/System/Video/inputs/channels/1/motionDetection $xml";
$ch = curl_init($out);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$ergebnis = curl_exec($ch);
$fehler = curl_error($ch);
echo $ergebnis;
echo $fehler;
curl_close($ch);

Hier wird das (allerdings mit Unix-Commands ähnlich gemacht)

Gruß
Walter

Hi,

dann bekomme ich einen Fehler zurück:

<statusCode>4</statusCode><statusString>Invalid Operation</statusString><subStatusCode>invalidOperation</subStatusCode>

Ich verstehe halt noch nicht so ganz, wie denn das schreiben aussehehn soll.
Auf der von Dir verlinkten Seite (habe ich schon geschaut) wird ja einfach das Ergebnis vom GET modifiziert wieder hochgeladen. Wenn ich die HIKVISION Anleitung aber richtig verstehe, muss ich ds ja als PUT abschicken.
Fragen über Fragen…

Hallo,

habe mir nun mal cygwin installiert, damit ich wenigstens so tun kann, als hätte ich Linux…
Und was soll ich sagen, es geht:

mit
curl http://admin:12345@192.168.178.166//ISAPI/System/Video/inputs/channels/1/motionDetection >resp.xml
bekomme ich den aktuellen Status in die Datei resp.xml. Dann editiere ich die Datei und setze lediglich true (bei enabled) auf false.

dann schicke ich es mit
curl -T resp.xml http://admin:12345@192.168.178.166//ISAPI/System/Video/inputs/channels/1/motionDetection
wieder hoch und die Änderung ist da.

Das müsste ich doch auch „nur“ mit IPS Mitteln hinbekommen.

Gruß aus Köln
Andreas

jetzt habe ich eine .bat Datei erzeugt, die mit cURL das korrekte Komando absetzt.
Wenn ich diese nun aus IPS aufrufe, funktieniert es aber nicht.

IPS_ExecuteEx("C:\cygwin64\bin\murks.bat", "", true, true, 0);

jetzt habe ich eine .bat Datei erzeugt, die mit cURL das korrekte Komando absetzt.
Wenn ich diese nun aus IPS aufrufe, funktieniert es aber nicht.

IPS_ExecuteEx("C:\cygwin64\bin\murks.bat", "", true, true, 0);

Beitrag wurde entnommen da hier unpassend

Beitrag wurde entnommen da hier unpassend

Hallo,

probier es mal damit. In Abhängigkeit von dem was du willst. Entweder true oder false

<?php
$xml_data = '<MotionDetection version="2.0" xmlns="http://www.isapi.org/ver20/XMLSchema">		
<enabled>true</enabled>		
<enableHighlight>true</enableHighlight>		
<samplingInterval>2</samplingInterval>		
<startTriggerTime>500</startTriggerTime>		
<endTriggerTime>500</endTriggerTime>		
<regionType>grid</regionType>		
<Grid>		
<rowGranularity>18</rowGranularity>		
<columnGranularity>22</columnGranularity>		
</Grid>		
<MotionDetectionLayout version="2.0" xmlns="http://www.isapi.org/ver20/XMLSchema">		
<sensitivityLevel>0</sensitivityLevel>		
<layout>		
<gridMap>0000000000000fffe00fffe00fffe00fffe00fffe00fffe00fffe00fffe00fffe00fffe00fffe00fffe00fffe00fffe0000000000000</gridMap>		
</layout>		
</MotionDetectionLayout>		
</MotionDetection>'."
";
 
  $user = "admin";
  $pass = "12345";

$host = '192.168.xxx.xxx';
$path = '/ISAPI/System/Video/inputs/channels/1/motionDetection';
 
//Socket öffnen
$fp = @fsockopen("tcp://".$host, 80, $errno, $errstr, 10);
if (!$fp)
{
    die($errstr.':'.$errno);
}
else
{
        $header  = "PUT $path HTTP/1.1
";
        $header .= "Authorization: Basic ".base64_encode("$user:$pass")."
";
        $header .= "User-Agent: php-script
";
        $header .= "Host: $host
";
        $header .= "Accept: */*
";
        $header .= "Content-Length: ".strlen($xml_data)."

";
 
    //senden von Daten
    fwrite($fp, $header.$xml_data);
 
    $headers='';
 
    //Header lesen
    while ($str = trim(fgets($fp, 4096)))
    $headers .= "$str
";
 
    $body='';
 
    //Antwort lesen
    while (!feof($fp))
    $body.= fgets($fp, 4096);
 
    //Soket schliessen
    fclose($fp);
}
 
//Daten ausgeben
echo $headers.'<hr/>'.$body;
 
?>

Beste Grüße
Alfred