[Info] VTO Event Empfänger

riogrande75

Aktives Mitglied
Mitglied seit
30 Okt 2017
Beiträge
1,400
Punkte für Reaktionen
277
Punkte
83
Habe beim Suchen nach eine besseren Lösung für den Empfang und die Bearbeitung von Events (Anläuten, FingerPrint, Türöffnen, etc.) meiner VTO2000A die Dahua-JSON-Debug-Console entdeckt.
Nach einigen Anpassungen des Entwicklers (Vielen Dank an bashis) funktioniert das Script auch an VTO's mit aktueller Firmware 4.3.
Auf Basis dessen startet ich meine Forschungen und konnte schnell einen Erfolg verbuchen. User philipp900 programmierte das Script dann in PHP nach und passte es unseren Wünschen an - Vielen Dank Philipp!
Ich habe noch einige kleine Erweiterungen vorgenommen, rausgekommen ist das hier: DahuaEventHandler.php

Jeder kann nun recht einfach Aktionen starten (z.b. Email schicken, Relais Schalten, etc.).
 
Wenn jemand noch "Unknown event received" empfängt, bitte um Debug Ausgabe des Scripts, werde das dann noch einbauen.
 
An Alle ein grosses Lob für dieses Script !!

Hier ein unknown Event beim Klingeln an meiner VTO2000A-c.
Es kommt vorher:
2020-01-26 11:47:09.000000: Event Call from VTO
2020-01-26 11:47:09.000000: Unknown event received

Code:
array(4) {
  ["id"]=>
  int(2)
  ["method"]=>
  string(24) "client.notifyEventStream"
  ["params"]=>
  array(2) {
    ["SID"]=>
    int(513)
    ["eventList"]=>
    array(1) {
      [0]=>
      array(4) {
        ["Action"]=>
        string(5) "Pulse"
        ["Code"]=>
        string(6) "Invite"
        ["Data"]=>
        array(7) {
          ["CallID"]=>
          string(1) "3"
          ["IsEncryptedStream"]=>
          bool(false)
          ["LocaleTime"]=>
          string(19) "2020-01-26 11:47:04"
          ["LockNum"]=>
          int(2)
          ["SupportPaas"]=>
          bool(false)
          ["TCPPort"]=>
          int(37777)
          ["UTC"]=>
          float(1580035624)
        }
        ["Index"]=>
        int(0)
      }
    }
  }
  ["session"]=>
  int(2147483147)
}
 
Ist drinnen.
 
  • Like
Reaktionen: kuzco-ip
Ich hatte gestern noch einen Fall bei dem sich das Script in Zeile 137 in einer Endlosschleife verfangen hatte.
Das empfangene Packet war unvollständig und es könnte keine Länge ermittelt werden.
Wenn man LEN_RECVED und LEN_EXPECT jeweils mit 1 statt 0 initialisiert, dürfte das nicht mehr auftreten.
 
Ok danke, werde das anpassen.
 
@kuzco-ip
Hier noch der Code für die von dir gewünschte Snapshot Funktion.
Einfach bei 'CallNoAnswered' mit $this->SaveSnapshot(); aufrufen.

PHP:
function SaveSnapshot($path="/tmp/")
{
    $filename = $path."/DoorBell_".date("Y-m-d_H-i-s").".jpg";
    $fp = fopen($filename, 'wb');
    $url = "http://".$this->host."/cgi-bin/snapshot.cgi";

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
    curl_setopt($ch, CURLOPT_USERPWD, $this->username . ":" . $this->password);
    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_HTTPGET, 1);
    curl_exec($ch);
    curl_close($ch);
    fclose($fp);
    copy($filename, $path."/Doorbell.jpg");
}
 
  • Like
Reaktionen: kuzco-ip
Super Arbeit. Funktioniert mit der neuen VTO4202F sehr gut. Zwei Sachen hätte ich allerdings noch gefunden:

1. Auf dem Banana PI (Debian Buster, Armbian Linux, Little Endian) funktioniert die Version nicht. Der Fehler liegt beim PHP Befehl Pack()

PHP Warning: pack(): 64-bit format codes are not available for 32-bit versions of PHP in DahuaEventHandler.php on line 82

Ausgabe lscpu

Architecture: armv7l
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
Vendor ID: ARM
Model: 5
Model name: Cortex-A7

Hier jemand einen Tipp? PHP in 64Bit scheint nicht für die Version verfügbar zu sein.

2. Ein neues Event beim Tamper Alarm

Code:
2020-01-26 21:27:05.000000: Unknown event received

array(4) {

  ["id"]=>

  int(2)

  ["method"]=>

  string(24) "client.notifyEventStream"

  ["params"]=>

  array(2) {

    ["SID"]=>

    int(513)

    ["eventList"]=>

    array(1) {

      [0]=>

      array(4) {

        ["Action"]=>

        string(5) "Start"

        ["Code"]=>

        string(20) "ProfileAlarmTransmit"

        ["Data"]=>

        array(6) {

          ["AlarmType"]=>

          string(13) "PreventRemove"

          ["DevSrcType"]=>

          string(5) "Digit"

          ["LocaleTime"]=>

          string(19) "2020-01-26 21:27:04"

          ["SenseMethod"]=>

          string(13) "PreventRemove"

          ["UTC"]=>

          int(1580074024)

          ["UserID"]=>

          string(4) "Door"

        }

        ["Index"]=>

        int(1)

      }

    }

  }

  ["session"]=>

  int(2147483639)

}

20
 
Kleine Ergänzung: Auch auf dem Raspberry PI (3) im Docker Container hab ich das selbe Problem. Umstellen der Pack Funktion von J auf P hat leider auch nicht geholfen:
  • J - unsigned long long (always 64 bit, big endian byte order)
  • P - unsigned long long (always 64 bit, little endian byte order)
Das Problem scheint die 32 Bit Version von PHP zu sein, die die 64 Bit Codes nicht integriert hat:
 
Zuletzt bearbeitet:
Ich denke ihr müsst die HEX Zahl in 2 32Bit Zahlen aufteilen und dann "N" statt "J" verwenden.

Habe auch noch 2 Events gefunden welche bei der Verwendung der App auftreten.
1. Stream in der App anzeigen. 2. Stream bzw. App wieder schließen

Code:
{"id":2,"method":"client.notifyEventStream","params":{"SID":513,"eventList":[{"Action":"Start","Code":"RequestCallState","Data":{"LocaleTime":"2020-01-26 17:48:54","UTC":1580057334},"Index":0}]},"session":26748672}
{"id":2,"method":"client.notifyEventStream","params":{"SID":513,"eventList":[{"Action":"Pulse","Code":"PassiveHungup","Data":{"LocaleTime":"2020-01-26 17:49:32","UTC":1580057372},"Index":0}]},"session":26748672}
 
Hab die fehlenden Events noch eingebaut. Wenn jemand spezielle Wünsche bzgl. Anzeige/Aufschlüsselung der Events hat, bitte ich um Info dazu.
 
  • Like
Reaktionen: kuzco-ip
Hallo,
hört sich interessant an. Könnt ihr mir als Laie mal ein paar Anwendungsbeispiele nennen, was ihr so damit anstellt?
Lieben Dank.
 
Könnt ihr mir als Laie mal ein paar Anwendungsbeispiele nennen, was ihr so damit anstellt?
z.B. sich eine email mit Snapshots der VTO und/oder anderen Kameras senden lassen wenn jemand klingelt oder den FP benutzt.
 
Zuletzt bearbeitet:
Habs nun auch auf dem Raspberry hinbekommen. Dazu hab ich die Zeile 82 durch folgenden Code ersetzt:
PHP:
        $header = pack("N",536870912);
        $header .= pack("N",1145588048);

Desweiteren habe ich die Zeile 138 angepasst und prüfe nur noch auf den Text "DI" (Vergleich ab substr, da mir die Forensoftware hier eine Fehlermeldung wirft:
PHP:
 ($data,0,4) == pack("N",536870912)){ # DH
Damit läuft das Script nun auch beim mir. Evtl. sind die zwei Änderungen für alle gut, denke die müssten auf 64 Bit System auch laufen (habs aber noch nicht ausprobiert)
 
Zuletzt bearbeitet:
Ich habe das Script heute Nachmittag schon angepasst damit es für alle läuft und noch 2 kleine Fehlerbehebungen gemacht.
Rio wird es vermutlich morgen auf dem GIT updaten.
 
  • Like
Reaktionen: kuzco-ip
32Bit Fixes sind eingearbeitet - müsste also nun auch auf RPi&Co. laufen.
 
Ja, läuft nun auch ohne Änderung am RPI :) Danke!
 
Hallo, hätte mal eine ganz blöde Frag, wie bekomme ich das Script auf dem RPI zum laufen?

Ich habe aktuell auf dem RPI lighthttpd und PHP 7.3 installiert. Dann habe ich eine Testdatei mit <?php phpinfo(); ?> abgelegt und die funktioniert soweit. Wenn ich nun das Dahua Script ablege (IP und Zugangsdaten natürlich angepasst), dann bleibt beim Aufruf die Seite leer und das Ladesymbol läuft für immer. Woran könnte das liegen?
 
Das Script ist nicht für einen Webserver gedacht, sondern nur für die CmdLine.
 
Wie funktioniert der Skript genau? wird der per cron regelmäßig gestartet und guckt der ob events ankommen?
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.