Bewegungserkennung mit Hikvision-Kamera DS-2CD2032-I

lass mal den chatgpt kram weg, so lernst du nix :wink:

Zuerst mal hilft dir das

trag erstmal in dein Webhook-Script diese Zeile ein, am besten nur die

    IPS_LogMessage("WebSocket", file_get_contents("php://input"));

wenn du nun die Linie überquerst siehst Du im Meldungfenster was passiert…

es kommen bspw solche Daten an,

<?xml version="1.0" encoding="UTF-8"?>
<EventNotificationAlert version="1.0" xmlns="urn:psialliance-org">
<portNo>3777</portNo>
<protocolType>HTTP</protocolType>
<channelID>1</channelID>
<dateTime>2024-06-16T12:07:07+01:00</dateTime>
<eventType>VMD</eventType>
<eventState>active</eventState>

nun erweitern wir das Script

$string = file_get_contents("php://input");

$xml = simplexml_load_string($string);

// als beispiel falls wir den Wert in eventState haben wollen 
$eventState=$xml->eventState;

//mit $eventState kannst du bspw eine Variable befüllen
SetValue(12345, $eventState);

@kris

Mein Script hat nur diese Zeile.

<?php
IPS_LogMessage("WebSocket", file_get_contents("php://input"));

Mein Meldungsfenster sieht wie folgt aus.

Nachricht habe ich keine im Log.

Was passiert wenn du die url manuell im browser aufrufst? Du müsstest eine weisse seite bekommen.

http://10.40.2.20:3777/hook/hikvision/Eingang

Falls nicht, ist dein hook falsch, wenn doch, prüfe in der kamera ob du auch bei einem Ereignis den server aufrufst

Wenn ich auf den Link klicke sehe ich eine weiße Seite.

ich sehe das das Script auch ausgelöst wird, wenn ich bei der Kamera vorbeilaufe.

Dann passt soweit der Webhook.

Das scriot wird auch ausgeführt. Bist du sicher, das du das webhookscript bearbeitest? Hast dubaich gespeichert?

Mach in einer weiteren zeile mal

echo "ein Testtext";

IPS_LogMessage("WebSocket", "ein Testtext");

Wenn du den link aufrust müsste statt der leeren seite ein text kommen und eine meldung im log erscheinen.

btw:

ist was anderes als ein webhook.
Michael

Hab ich 1:1 aus der doku :stuck_out_tongue_closed_eyes:

Ah, das Erste Script… das ist auch das für WebSocket Support :wink:

Das Beispiel Script weiter unten für Hooks ist dagegen korrekt und damit würde ich auch testen, da es mehr als nur RAW / PHP-Input enthält :

IPS_LogMessage("WebHook GET", print_r($_GET, true));
IPS_LogMessage("WebHook POST", print_r($_POST, true));
IPS_LogMessage("WebHook IPS", print_r($_IPS, true));
IPS_LogMessage("WebHook RAW", file_get_contents("php://input"));
echo "Meldung: " . $_GET['Meldung'];

Michael

1 „Gefällt mir“

Moin,

Ich habe das script vorher getestet. Das beispielschnipsel stammte von meiner hikvision und entspricht deiner vorletzter Zeile. Ob nun „Webhook“, „Websocket“ oder „Schnitzelbrötchen“ im ersten string steht ist erstmal egal, hauptache im Meldungsfenster kommt was an. :face_with_peeking_eye:

Viele grüße

Ja, richtig.
Ich hatte halt unter Beispiel geschaut. Die Seite ist an der Stelle da leider schlecht strukturiert.
Wenn es bei dir klappt und bei @Kampfwurst nur war leeres im Log kommt, muss aber irgendwas an der Kamera ja anders sein.
Wenn der Log Eintrag kommt, stimmt zumindest der Hook und die Zuordnung zum Script.
Darum die Idee mal alles ausgeben zu lassen, eventuell sieht man dann mehr.
Michael

1 „Gefällt mir“

Hi,

deswegen bat ich Kampfwurst darum das Script zu erweitern um auszuschließen das er evtl das falsche script bearbeitet hat.

→ Kommt nun „eine Testnaricht“ ist das Script korrekt aber an der Kamera was nicht,
→ kommt wieder ein leeres Script ist etwas mit dem hook oder dem script faul.

Irgendwo muss man ja anfangen :man_shrugging:. Wenn ich dann weiß welche Daten er bekommt (und diese evtl sogar identisch sind) können wir das hook verfeinern.

Alles besser als Chat GPT dran zu lassen und nichts dabei zu lernen :joy:

Hier ist mein Script das mit Hilfe des Webhooks funktioniert

<?php

$webhook_data = file_get_contents("php://input");

$data = parseEventNotificationAlert($webhook_data);

IPS_LogMessage("WebhookKamera",print_r($data,true ));

/*
0	Legt eine Variable vom Typ Boolean an
1	Legt eine Variable vom Typ Integer an
2	Legt eine Variable vom Typ Float an
3	Legt eine Variable vom Typ String an

Aggregationstyp	
AGGREGATIONSTYP	DESCRIPTION
0	Standard
1	Counter


*/


$parent = $_IPS['SELF'];

$type = 3;
$profil = "";
$logging =  true;
$aggregation_type = 0;

if (is_array($data))
{
    foreach($data as $key => $value)
    {
        $name = $key;
        if($key != "@attributes")
        {
            $var_id =  manage_variable($parent, $name, $type, $profil, $logging, $aggregation_type);
            SetValueString( $var_id,$value);
        }
    }
}



function parseEventNotificationAlert($xmlString) {
    $xml = simplexml_load_string($xmlString, "SimpleXMLElement", LIBXML_NOCDATA);
    $json = json_encode($xml);
    $array = json_decode($json, TRUE);
    return $array;
}


Wenn ich den Linien Alarm aktiviere kommen Daten nur noch über POST

Die Daten kommen als array an : [linedetection] und der Inhalt des Arrays hat bei der Linien überquerung die folgende Struktur :

Array
(
    [@attributes] => Array
        (
            [version] => 2.0
            [xmlns] => http://www.std-cgi.com/ver20/XMLSchema
        )

    [ipAddress] => 192.168.50.200
    [portNo] => 3777
    [protocol] => HTTP
    [macAddress] => e8:a0:ed:e9:d4:b4
    [channelID] => 1
    [dateTime] => 2024-06-17T12:12:44+02:00
    [activePostCount] => 1
    [eventType] => linedetection
    [eventState] => active
    [eventDescription] => linedetection alarm
    [DetectionRegionList] => Array
        (
            [DetectionRegionEntry] => Array
                (
                    [regionID] => 1
                    [sensitivityLevel] => 100
                    [RegionCoordinatesList] => Array
                        (
                            [RegionCoordinates] => Array
                                (
                                    [0] => Array
                                        (
                                            [positionX] => 550
                                            [positionY] => 987
                                        )

                                    [1] => Array
                                        (
                                            [positionX] => 546
                                            [positionY] => 12
                                        )

                                )

                        )

                    [detectionTarget] => human
                    [TargetRect] => Array
                        (
                            [X] => 526
                            [Y] => 93
                            [width] => 121
                            [height] => 836
                        )

                )

        )

    [channelName] => 119 Middle
    [detectionPictureTransType] => binary
    [detectionPicturesNumber] => 1
    [isDataRetransmission] => false
)

mit dem Script von Michael kommen Daten zum Vorschein.

17.06.2024, 13:02:43 | WebHook POST         | Array
(
    [linedetection] => <EventNotificationAlert version="2.0" xmlns="http://www.hikvision.com/ver20/XMLSchema">
<ipAddress>10.40.80.112</ipAddress>
<portNo>3777</portNo>
<protocol>HTTP</protocol>
<macAddress>4c:f5:dc:84:ad:e8</macAddress>
<channelID>1</channelID>
<dateTime>2024-06-17T13:02:43+02:00</dateTime>
<activePostCount>1</activePostCount>
<eventType>linedetection</eventType>
<eventState>active</eventState>
<eventDescription>linedetection alarm</eventDescription>
<DetectionRegionList>
<DetectionRegionEntry>
<regionID>1</regionID>
<sensitivityLevel>50</sensitivityLevel>
<RegionCoordinatesList>
<RegionCoordinates>
<positionX>457</positionX>
<positionY>0</positionY>
</RegionCoordinates>
<RegionCoordinates>
<positionX>177</positionX>
<positionY>533</positionY>
</RegionCoordinates>
</RegionCoordinatesList>
<detectionTarget>human</detectionTarget>
<TargetRect>
<X>0.572</X>
<Y>0.235</Y>
<width>0.226</width>
<height>0.736</height>
</TargetRect>
</DetectionRegionEntry>
</DetectionRegionList>
<channelName>Camera 01</channelName>
<detectionPictureTransType>binary</detectionPictureTransType>
<detectionPicturesNumber>1</detectionPicturesNumber>
<isDataRetransmission>false</isDataRetransmission>
</EventNotificationAlert>

)

War schon am Zweifeln ob ich das System neu aufsetze weil nie Daten angezeigt wurden :wink:

Hier nochmal die XML Strukturen abhängig vom Bewegungstyp :

Bewegung (Daten kommen als XML über $webhook_data = file_get_contents(„php://input“):wink:

Die folgenden Daten kommen über $webhook_data = $_POST als Array mit XML als Inhalt. Der Array Key ist der Typ der Bewegungsmeldung (z.b. linedetection)

Kann man eigentlich remote events für die Hikvision Kameras aktivieren bzw. Deaktivieren? Falls ja weiss jemand wie?
Ich nutze meine Kameras als intelligente Bewegungsmelder und würde für den Fall das der Gärtner im Urlaub etwas erledigt gerne den Alarm in der Kamera deaktivieren bzw. Die Sirene und das Strobelight ausschalten