Ich habe mich mit dem Ein bzw. Ausschalten der verschiedenen Alarme auseinandergesetzt. Die genaue Beschreibung der API ist in dem folgenden Dokument zu finden : https://www.docdroid.net/wlD2i8v/hikvision-isapi-26-ipmd-service-pdf#page=5
Die Sache ist etwas komplex da die enable Tags je nach Event Type unterschiedlich sein können.
Im folgenden ist ein PHP Programm das es dir ermöglicht alle Event Typen einer Kamera ein bzw auszuschalten :
<?php
function callMotionDetectionAPI($ip, $username, $password, $path) {
$url = "http://$ip/ISAPI/$path";
//echo $url."\n";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close($ch);
return $response;
}
function convertXMLToArray($xmlString) {
$xmlObject = simplexml_load_string($xmlString);
$json = json_encode($xmlObject);
return json_decode($json, true);
}
function updateDetectionEnabled($xmlString, $detectionType, $id, $newEnabledValue) {
// Load the XML string into a DOMDocument
$doc = new DOMDocument();
$doc->preserveWhiteSpace = false;
$doc->formatOutput = true;
$doc->loadXML($xmlString);
// Create a DOMXPath object
$xpath = new DOMXPath($doc);
// Extract the namespace URI from the root element
$rootNamespace = $doc->documentElement->namespaceURI;
// Register the default namespace with a prefix
$xpath->registerNamespace('ns', $rootNamespace);
// Build the XPath expression dynamically based on the detection type
$xpathExpression = "/ns:{$detectionType}List/ns:{$detectionType}[ns:id='{$id}']/ns:enabled";
// Query for the <enabled> node
$enabledNodeList = $xpath->query($xpathExpression);
// Check if the node exists and update its value
if ($enabledNodeList->length > 0) {
$enabledNode = $enabledNodeList->item(0);
$enabledNode->nodeValue = $newEnabledValue;
} else {
// Optionally handle the case where the <id> is not found
throw new Exception("{$detectionType} with id {$id} not found or does not have an <enabled> tag.");
}
// Return the modified XML as a string
return $doc->saveXML();
}
function getStringAfterSmart($inputString) {
// Use strpos to find the position of "Smart/" in the string
$position = strpos($inputString, 'Smart/');
// Check if "Smart/" is found in the string
if ($position !== false) {
// Calculate the starting position of the substring after "Smart/"
$startPosition = $position + strlen('Smart/');
// Use substr to extract the substring from the starting position to the end
return substr($inputString, $startPosition);
} else {
// If "Smart/" is not found, return the original string or handle as needed
return $inputString;
}
}
function sendModifiedXML($ip, $username, $password, $path, $modifiedXml) {
$url = "http://$ip/ISAPI/$path";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/xml'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $modifiedXml);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close($ch);
return $response;
}
// Example usage:
$username = "admin";
$password = "XXXXXX";
//$path = "System/Video/inputs/channels/1/motionDetection";
$path_array = ["Smart/FieldDetection","Smart/LineDetection","Smart/RegionEntrance","Smart/RegionExiting"];
$newEnabledValue = 'true';
$search = array("192.168.50.");
$location = 'ProcessCameraEvents';
$type = 2; // Object Type (0: Category, 1: Instance, 2: Variable, 3: Script, 4: Event, 5: Media, 6: Link)
$gesuchte_objekte = array_filter(IPS_GetObjectList(), function ($object) use ($search, $location, $type) {
$name = IPS_GetName($object);
$locationStr = IPS_GetLocation($object);
$objectType = IPS_GetObject($object)['ObjectType'];
// Check if any of the search terms are present in the name
$nameMatch = false;
foreach ($search as $searchStr) {
if (strpos($name, $searchStr) !== false) {
$nameMatch = true;
break;
}
}
// Check if the location matches
$locationMatch = strpos($locationStr, $location) !== false;
// Return true if all conditions are met
return $nameMatch && $locationMatch && ($objectType == $type);
});
foreach($gesuchte_objekte as $key => $ip_var_id)
{
$ip = GetValueString($ip_var_id);
echo $ip."\n";
foreach($path_array as $key => $path)
{
//echo $ip." ". $username." ".$password." ".$path."\n";
$response = callMotionDetectionAPI($ip, $username, $password, $path);
//echo $response;
//$newEnabledValue = 'false';
try {
// Update FieldDetection with id=1
$modifiedXml= updateDetectionEnabled($response, getStringAfterSmart($path), 1,$newEnabledValue );
} catch (Exception $e) {
echo 'Error: ' . $e->getMessage();
}
// Send modified XML back to the API
$sendResponse = sendModifiedXML($ip, $username, $password, $path, $modifiedXml);
echo $sendResponse;
}
}
?>
Ich werde längere Zeit benötigen um diese Funktion wie auch die anderen von dir genannten in das Modul zu integrieren. Ab nächster Woche bin ich für 4 Wochen auf Reisen und kann nicht weiter am Modul arbeiten. Danach bin ich für 6 Monate in Florida und muss mir erst ein HIKVISION Kamera besorgen. Bis ich das Modul fertig habe solltest du in der Lage sein deine Kameras mit dem oben beigefügten Code zu aktivieren oder zu deaktivieren.
User Name, Password und Subnet müssen gesetzt werden. Das Programm aktiviert bzw deaktiviert alle Kameras die unterhalb des Moduls liegen. Soll nur eine Kamera geschaltet werden dann einfach die komplette IP Adresse eingeben