[Info] VTO Event Empfänger

Hi, vielleicht bin ich hier richtig.

Ich verwende zur Hausautomatisierung HomeAssistant. Ich weiß, dass es hier vor allem um ioBroker geht.
Ich verwende eine AV-VTA05-22AV2 von Dahua, gekauft bei Goliath. Firmware ist die 4.600.001P000.0.R.20221129.

Das Pythonkonsolenscript läuft bei mir und ich kann mich einloggen. Für HomeAssistant habe ich die DAHUA-Integration installiert. https://github.com/rroller/dahua Zugriff auf die Kamera habe ich nun darüber. Ich möchte allerdings gerne den Klick auf die Klingeltaste abfangen. Kann mir hier jemand weiterhelfen?

Es handelt sich um die Sprechanlage mit zwei Klingeln (Zweifamilienhaus).

Wäre über jeden Tipp dankbar, falls es hier nicht passen sollte, kann ich auch gerne einen neuen Thread öffnen.

FROHES NEUES JAHR 2024
 
Zuletzt bearbeitet:
Du musst auf den Event triggern. Wenn Du klingelst, gibt es einen Invite Event. Am besten schaust Du dir das log an und wenn Du mit Knopf 1 klingelst, wird ein bestimmtes Event ausgelöst...
 
Das PHP Script läuft und ist auch in machen Belangen für mich schon angepasst.
ABER, wo und wie kann ich denn im logging die beiden Schlossöffnungen differenziert abfangen? Also wenn an der Innenstation Schloss 1 oder Schloss 2 freigegeben wird. In den Logs kann ich kein differenzierbares Merkmal erkennen. Jemand eine Idee oder übersehe ich einen Eventcode?

Zum Hintergrund: Ich möchte mein NUKI Türöffner darüber ansteuern. Klappt auch, nur eben nicht selektiv.

Meine Anlage ist eine 2 Parteienanlge AV-VTA05-22AV2 (Goliath)
 
Ich habe leider nur die 1-Button Anlage... und kann somit nicht helfen
 
  • Like
Reaktionen: stranger0x
[Edit Novize: Überflüssiges Fullquote des Beitrags direkt darüber gelöscht - siehe Forumsregeln]
Aber du kannst doch auch 2 schlösser schalten, einmal direkt und einmal über RS485,oder nicht?
 
@stranger0x Poste mal ein komplettes Log von beiden Tastendrucken. Dann sieht man vielleicht einen Parameter, um die beiden Tasten zu differenzieren.
 
Also ich sehe leider nichts. Reihenfolge: Schloss 1, Schloss 2
Code:
2024-01-30 15:14:36.000000: Empfange Daten...
2024-01-30 15:14:40.000000: Verarbeite Ereignis...
2024-01-30 15:14:40.000000: Event BackKeyLight with State 8 
2024-01-30 15:14:40.000000: Empfange Daten...
2024-01-30 15:14:40.000000: Verarbeite Ereignis...
2024-01-30 15:14:40.000000: Event: AccessControl, Name OpenDoor Method 4, ReaderID 1, UserID 
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(13) "AccessControl"
        ["Data"]=>
        array(14) {
          ["CardNo"]=>
          string(0) ""
          ["CardType"]=>
          NULL
          ["ErrorCode"]=>
          int(0)
          ["LocaleTime"]=>
          string(19) "2024-01-30 15:14:40"
          ["Method"]=>
          int(4)
          ["Name"]=>
          string(8) "OpenDoor"
          ["Password"]=>
          string(0) ""
          ["ReaderID"]=>
          string(1) "1"
          ["RecNo"]=>
          int(448)
          ["SnapURL"]=>
          string(0) ""
          ["Status"]=>
          int(1)
          ["Type"]=>
          string(5) "Entry"
          ["UTC"]=>
          float(1706624080)
          ["UserID"]=>
          string(0) ""
        }
        ["Index"]=>
        int(0)
      }
    }
  }
  ["session"]=>
  int(1555983589)
}
2024-01-30 15:14:40.000000: 
2024-01-30 15:14:40.000000: Empfange Daten...
2024-01-30 15:14:42.000000: Verarbeite Ereignis...
2024-01-30 15:14:42.000000: Event: DoorStatus, Action Pulse, Status: Close, LocaleTime 2024-01-30 15:14:42
2024-01-30 15:14:42.000000: Empfange Daten...
2024-01-30 15:14:47.000000: Empfange Daten...
2024-01-30 15:14:49.000000: Verarbeite Ereignis...
2024-01-30 15:14:49.000000: Event BackKeyLight with State 8 
2024-01-30 15:14:49.000000: Empfange Daten...
2024-01-30 15:14:49.000000: Verarbeite Ereignis...
2024-01-30 15:14:49.000000: Event: AccessControl, Name OpenDoor Method 4, ReaderID 1, UserID 
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(13) "AccessControl"
        ["Data"]=>
        array(14) {
          ["CardNo"]=>
          string(0) ""
          ["CardType"]=>
          NULL
          ["ErrorCode"]=>
          int(0)
          ["LocaleTime"]=>
          string(19) "2024-01-30 15:14:49"
          ["Method"]=>
          int(4)
          ["Name"]=>
          string(8) "OpenDoor"
          ["Password"]=>
          string(0) ""
          ["ReaderID"]=>
          string(1) "1"
          ["RecNo"]=>
          int(449)
          ["SnapURL"]=>
          string(0) ""
          ["Status"]=>
          int(1)
          ["Type"]=>
          string(5) "Entry"
          ["UTC"]=>
          float(1706624089)
          ["UserID"]=>
          string(0) ""
        }
        ["Index"]=>
        int(1)
      }
    }
  }
  ["session"]=>
  int(1555983589)
}
2024-01-30 15:14:49.000000: 
2024-01-30 15:14:49.000000: Empfange Daten...
[Edit Novize: Log in Code-tags gesetzt]
 
Zuletzt bearbeitet von einem Moderator:
Code:
["RecNo"]=>

int(449)

ist das eine fortlaufende Nummer? Oder kommt das immer wenn Du Knopf 2 drückst.

Ich kann beide Schlößer schalten, aber du möchtest ja auf den Klingelevent reagieren?!
 
Die Nummer läuft mit jedem Event hoch. Und nein, nicht auf den Klingelevent.
Eigenständiges auslösen an der VTH Schloss 1/Schloss 2.
An Schloss 2 habe ich einen Funksender für mein Garagentor, dass öffnet, wenn ich das Schloss 2 auslöse (Schloss 2 Ist der RS485 Bus).
Nun soll über das Event des Schlosses 1 via http das Nuki getriggert werden. Geht wie gesagt ja auch, aber es wird eben auch geschaltet, wenn Schloss 2 geschaltet wird.
Es soll also nicht wirklich das Schloss geschaltet werden, ich benötige nur ein Klares und abrenzbares Event um darauf weiter zu prozessen.
Mit den Fingerabdrücken habe ich das im Code geregelt. Also von außen reinkommen klappt schonmal, nur eben nicht von innen, aus dem 1. OG die Haustür, öffnen geht nicht :(
 
Würde mich mal darauf konzentrieren:

Code:
["Index"]=>
        int(1)
Da kommt einmal 0 (Lock 1?) und einmal 1 (Lock 2?).

Kann's leider selbst nicht testen.
 
Hatte nun endlich die Zeit das Thema weiter zu treiben und bedanke mich bei @riogrande75 für den absolut richtigen Tipp.
Die Bedingung
PHP:
$eventData['Method']==4 && $eventList['Index']==0
gewährleistet, dass der Impuls vom Schloss 1 Button der VTH erkannt wird. Ist der Wert von Index = 1 wäre es der Button für Schloss 2 den ich bei mir aber mit einem Sender für das Garagentor belegt habe.
"Index" befindet sich übrigens im "eventList" Array, nicht in "Data".

Ich kann nun im Accesscontrol- Event sauber aussteuern, was passieren soll. (Mit einer weiteren Bedingung auf die UserID könnte ich auch noch nach VTH differenzeiren, aber in meinem Fall genügt mir das so wie oben beschrieben.)

Da das Öffnen des NUKI Schlosses über einen direkten HTTP-Aufruf zu unzuverlässig war, habe ich das nun über CURL gelöst, was bisher ohne Fehler funktioniert.

Im Ergebnis kann ich nun also von den Innenstationen über Schloss 1 die Treppenhaustür und über Schloss 2 die Garage öffnen, wobei "Schloss 1" ein NUKI Schloss mit einer NUKI Bridge ohne physische Verbindung zur Anlage und "Schloss 2" ein potenzialfreies Sendemodul am RS485 Bus ist.

Den Fingerabdrucksensor an der VTO nutze ich um die Finger im Code (
PHP:
$eventCode == 'FingerPrintCheck'
für eine Öffnung der Treppenhaustür mit dem NUKI (Schloss 1) zu autorisieren.

Mittels eines Arrays ($erlaubteFinger) kann ich auch einzelne registrierte Finger zulassen oder nicht zulassen.

Long Story short, hier die angepassten Codeteile:
Deklarationen:

PHP:
<?PHP

$debug = true;

echo "<** Dahua VTO Eventempfaenger START **>\n";

$Dahua = new Dahua_Functions("192.168.xxx.xxx", "admin", "xxxxxxx"); # VTO's IP and user/pwd

$Nukibridge_ip = "192.168.xxx.xxx";  // Ersetze dies mit der IP deiner Nuki Bridge

$Nukitoken = "xxxxxx";              // Ersetze dies mit deinem API-Token

$Nukilock_id = "xxxxxxxxx";         // Ersetze dies mit der ID deines Nuki Schlosses

$erlaubteFinger =array(0, 2, 3, 4, 5);    // Finger IDs die Nuki öffnen dürfen

$finger=-1;                // Rücksetzen der Variablen

$status = $Dahua->Main();


Url fetching mit CURL. Vor bzw. außerhalb der Klasse einfügen:

PHP:
function fetchUrlWithCurl($url) {

    $ch = curl_init($url);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); // Timeout nach x Sekunden

    curl_setopt($ch, CURLOPT_TIMEOUT, 15); // Gesamtzeit für Anfrage und Antwort

    $response = curl_exec($ch);

    if ($response === false) {

        logging("cURL Fehler: " . curl_error($ch));

        return false;

    }

    curl_close($ch);

    return $response;

    }

Neue Funktion "openNuki" in die Klasse schreiben. Action=3 ist hierbei die Öffnung analog des öffnens eines nicht verschlossenen Schlosses. Also "halbe Drehung":
PHP:
function OpenNuki() {

    global $Nukibridge_ip, $Nukitoken, $Nukilock_id;

    $url = "http://" . $Nukibridge_ip . ":8080/lockAction?nukiId=" . $Nukilock_id . "&action=3&token=" . $Nukitoken;

    $response = fetchUrlWithCurl($url);

    if ($response) {

        $responseDecoded = json_decode($response);

        if ($responseDecoded && $responseDecoded->success == true) {

            logging("Nuki Lock opened");

        } else {

            logging("failed to open Nuki Lock");

        }

        } else {

        logging("error calling Nuki open URL: " . $url);

        }

    }

Zu guter letzt mein angepasster Code für "Accesscontrol" im Eventhandler:
PHP:
elseif($eventCode == 'AccessControl'){

        #Method:4=Remote/WebIf/SIPext,6=FingerPrint; UserID: from VTO FingerprintManager/Room Number or SIPext;

        logging("Event: AccessControl, Name ".$eventData['Name']." Method ".$eventData['Method'].", ReaderID ".$eventData['ReaderID'].", UserID ".$eventData['UserID']);

        if ($eventData['Method']==6){

            if (in_array($finger, $erlaubteFinger)){

                $this->OpenNuki();      

            } else logging("Nicht authorsierter Finger für Nuki");  

    }

    if ($eventData['Method']==4 && $eventList['Index']==0){

        $this->OpenNuki();
     
        } else logging("Keine autorisierte Oeffnung für Nuki");  

}

Zu Beginn der Funktion nicht die Deklarationen vergessen:
PHP:
global $debug, $erlaubteFinger, $finger;
 
  • Like
Reaktionen: Pseudoreal
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.