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;