Wie z.B. Scripte für eine VTO4202F-P (Dahua) verarbeiten

DirkMa

Neuer User
Mitglied seit
4 Apr 2016
Beiträge
65
Punkte für Reaktionen
8
Punkte
8
Möchtest Du, wenn ich was neues habe, dass ich es hier melde oder soll ich es einfach bei mir einbauen?
 

riogrande75

Aktives Mitglied
Mitglied seit
30 Okt 2017
Beiträge
1,111
Punkte für Reaktionen
192
Punkte
63
Bitte weiterhin melden, so wie beim letzten Mal. Gleich mit Code-Änderungen wäre perfekt, erspart mir die Arbeit.
Hilft auch den anderen Usern, welche das Script aus Github ziehen.
 
  • Like
Reaktionen: kuzco-ip und DirkMa

DirkMa

Neuer User
Mitglied seit
4 Apr 2016
Beiträge
65
Punkte für Reaktionen
8
Punkte
8
Hi,

dann noch ein paar Events:

Ohne Gewähr in Zeile 381 in Script einfügen:
elseif($eventCode == 'DGSErrorReport'){
logging("Event: DGSErrorReport, Action ".$eventList['Action'].", ErrorCode ".$eventData['ErrorCode'].", LocaleTime ".$eventData['LocaleTime']);
}
elseif($eventCode == 'Upgrade'){
logging("Event: Upgrade, Action ".$eventList['Action'].", with State ".$eventData['State'].", LocaleTime ".$eventData['LocaleTime']);
}
Bitte überprüfe nur die Codes, da ich die Syntax nicht so genau kenne.
Habe beide Events noch einmal abändern müssen. Sorry.
 
Zuletzt bearbeitet:

riogrande75

Aktives Mitglied
Mitglied seit
30 Okt 2017
Beiträge
1,111
Punkte für Reaktionen
192
Punkte
63
Danke - ist drinnen.
 

DirkMa

Neuer User
Mitglied seit
4 Apr 2016
Beiträge
65
Punkte für Reaktionen
8
Punkte
8
Habe das Script erweitert. Ich wollte eine externe Türklingel , möglichst ohne VTH, ansteuern.Da ich den automatischen Türöffner nicht benötige, habe ich diesen dafür verwendet. Da ich überhaupt keine Ahnung von php habe, kann ich nicht für die "Sauberkeit" der Programmierung garantieren, aber es funktioniert.
Habe mir die Snapshot Funktion als Vorbild genommen.
elseif Bedingung erweitert:

elseif($eventCode == 'CallNoAnswered'){
logging("Event Call from VTO");
$this->OpenDoor();
}

Funktion hinzugefügt:

function OpenDoor(){
$url = "http://".$this->host."/cgi-bin/accessControl.cgi?action=openDoor&channel=1&UserID=101&Type=Remote";
$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_exec($ch);
curl_close($ch);
}

In der VTO habe ich die Sprachausgabe für das Türöffnen abgeschaltet.
Wenn jetzt jemand schellt, wird der Türöffnungskontakt kurz geschaltet.
 
  • Like
Reaktionen: riogrande75

kuzco-ip

Mitglied
Mitglied seit
4 Feb 2019
Beiträge
596
Punkte für Reaktionen
42
Punkte
28
Hast Du gut umgesetzt, aber ich frage mich gerade, warum Du überhaupt eine Türklingel hast, wenn Du die Tür automatisch öffenest, wenn jemand klingelt.
Mir erschliesst sich im Moment der Sinn nicht.
 

DirkMa

Neuer User
Mitglied seit
4 Apr 2016
Beiträge
65
Punkte für Reaktionen
8
Punkte
8
....Da ich den automatischen Türöffner nicht benötige, habe ich diesen dafür verwendet. ...
Ich öffne nicht automatisch die Tür. Ich verwende den Kontakt der VTO der normalerweise die Türe öffnet um den externen Gong anzusteuern.
 

kuzco-ip

Mitglied
Mitglied seit
4 Feb 2019
Beiträge
596
Punkte für Reaktionen
42
Punkte
28
Dann habe ich den Satz falsch verstanden. Schön, dass Du eine Lösung gefunden und geteilt hast.
 

fanavity

Neuer User
Mitglied seit
7 Sep 2010
Beiträge
50
Punkte für Reaktionen
4
Punkte
8
Ich öffne nicht automatisch die Tür. Ich verwende den Kontakt der VTO der normalerweise die Türe öffnet um den externen Gong anzusteuern.
Die Idee hatte ich auch schon, aber der Kontakt wird auch automatisch geschaltet wenn jemand mit dem Transponder oder Fingerabdruck die Tür öffnet oder? Somit würde es dann klingeln, das wäre ja auch irgendwie blöd.
Könnte man den Alarmausgang dafür nutzen?
 

DirkMa

Neuer User
Mitglied seit
4 Apr 2016
Beiträge
65
Punkte für Reaktionen
8
Punkte
8
Das weiß ich nicht, da ich das nicht nutze. Muss man die Funktion die mit dem Transponder und Fingerabdruck ausgeführt wird nicht irgendwo parametrieren? Den Alarmausgang kann man meines Wissens nicht auf einen Klingelknopf legen. Man kann nur einen Alarmeingang mit einem zusätzlichen Taster als Klingel dafür verwenden.
 

fanavity

Neuer User
Mitglied seit
7 Sep 2010
Beiträge
50
Punkte für Reaktionen
4
Punkte
8
Ich habe weder den RFID-Reader noch den Finger-Reader bewusst parametrisiert. Ich nutze ebenfalls nur den DahuaEventHandler, daher müsste der bei mir kein Relais schalten. Dann könnte ich das Relais tatsächlich für die Klingel nutzen. Das wäre echt cool.
 
  • Like
Reaktionen: DirkMa

fanavity

Neuer User
Mitglied seit
7 Sep 2010
Beiträge
50
Punkte für Reaktionen
4
Punkte
8
Das mache ich alles über Openhab. Lediglich die Klingel bringt mich gerade noch zum verzweifeln ;) Aber auch das werde ich noch hinbekommen.
 
  • Like
Reaktionen: DirkMa

kuzco-ip

Mitglied
Mitglied seit
4 Feb 2019
Beiträge
596
Punkte für Reaktionen
42
Punkte
28
Hast Du hier schon einen Email-Versand realisiert?
Ich nutze hierfür python (via smtp) und versende nach Gong, FP oder Start eine email mit 2 Snapshots. Dafür übergebe ich aus diesem Script dem python Script genau diese 3 Paramter: Warum (GONG, FP, Start), plus die beiden Snapshots.
Wenn ich mal viel Zeit habe, werde ich mal den phpmailer testen.
 

DirkMa

Neuer User
Mitglied seit
4 Apr 2016
Beiträge
65
Punkte für Reaktionen
8
Punkte
8
Hi,

von python habe habe ich auch nicht mehr Ahnung:). Werde es mal versuchen in php hinzubekommen. Kann natürlich nicht schaden, wenn Du auch mal schaust:).
 

DirkMa

Neuer User
Mitglied seit
4 Apr 2016
Beiträge
65
Punkte für Reaktionen
8
Punkte
8
Hallo,

ich habe es jetzt soweit, dass meine Wünsche grundsätzlich erfüllt sind.

1. Ich kann über den Türöffnerkontakt der VTO meine externe Klingel ansteuern

function OpenDoor(){
$url = "http://".$this->host."/cgi-bin/accessControl.cgi?action=openDoor&channel=1&UserID=101&Type=Remote";
$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_exec($ch);
curl_close($ch);
}

2. Ich kann beim Klingeln zwei "snapshots" im Abstand von einer Sekunde aufnehmen und speichern ("DahuaEventHandler.php" von @riogrande75 angepasst)

function SaveSnapshot($path="/snapshots")
{
$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_1.jpg");
sleep(1);
copy($filename, $path."/Doorbell_2.jpg");
}

3. Ich kann beim Klingeln einen "Stream" von 20 Sekunden aufnehmen und speichern

function RecordStream($path="/snapshots")
{
set_time_limit(0);
$filename = $path."/DoorBell_".date("Y-m-d_H-i-s").".mp4";
$fp = fopen($filename, 'wb');
$url = "http://".$this->host."/cgi-bin/mjpg/video.cgi?channel=1&subtype=1";
$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_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec($ch);
curl_close($ch);
fclose($fp);
}

4. Ich kann mir die zwei "snapshots" per Email senden. Hierzu habe ich den PHPMailer von hier PHPMailer verwendet und angepasst. SMTP habe ich nicht verwendet, da ich immer eine Fehlermeldung bekommen habe. Es funktioniert bei mir auch ohne.

function SendMail(){
require_once('PHPMailer/class.phpmailer.php');
require_once('PHPMailer/class.smtp.php');

//$mailsmtpauth = true;
//$mailhost = "xxxx"; //SMTP Host name
//$mailusername = "xxxx"; // SMTP Login
//$mailpassword = "xxxx"; // SMTP Password

$mail = new PHPMailer();

//$mail->CharSet = 'UTF-8';
//$mail->IsSMTP();
//$mail->Host = $mailhost;
$mail->SMTPDebug = 2; // Kann man zu debug Zwecken aktivieren
//$mail->SMTPAuth = true;
//$mail->SMTPSecure = "tls"; // sets the prefix to the servier
//$mail->Port = 587; // set the SMTP port for the GMAIL
//$mail->Username = $mailusername;
//$mail->Password = mailpassword;
$mail->addAttachment("/snapshots/Doorbell_1.jpg");
$mail->addAttachment("/snapshots/Doorbell_2.jpg");

$frommail = "[email protected]";
$fromname = "[email protected]";
$mail->SetFrom($frommail, $fromname);

$address = "Empfä[email protected]";
$adrname = "Empfä[email protected]";
$mail->AddAddress($address, $adrname);

$mail->Subject = "Tuersprechstelle";
$mail->Body = "Es hat geklingelt";

if(!$mail->Send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
echo "\n";
} else {
echo "Message sent!\n";
}

Wie ich schon geschrieben habe bin ich mehr als neu in der php-Programmierung. Es kann also durchaus sein, dass meine Programmierung nicht optimal ist. Aber, Sie funktioniert. Gerne kann/darf man "meinen" Code anpassen und @riogrande75 in deinen "DahuaEventHandler.php" aufnehmen.

Nicht vergessen

$this->OpenDoor();
$this->SaveSnapshot();
$this->RecordStream();
$this->SendMail();

an den entsprechenen Stellen im "DahuaEventHandler.php" einzufügen. Pfade für die Speicherung der "snapshots" und "Streams" müssen natürlich angepasst werden.

Dirk
 
Zuletzt bearbeitet:
  • Like
Reaktionen: fanavity und kuzco-ip

kuzco-ip

Mitglied
Mitglied seit
4 Feb 2019
Beiträge
596
Punkte für Reaktionen
42
Punkte
28
Das sieht doch ganz ordentlich auch.
Wollte nun auch einmal mein python ablösen und durch PHPMailer unter Debian9 ersetzen, scheitere aber irgendwie an der Definiton der Variablen. Den Mailer habe ich über "composer require phpmailer/phpmailer" installiert.
Laut github soll man die
Code:
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
ganz am Anfang der php setzen und nicht i einer Funktion. Gesagt getan - steht ganz oben. In meiner funcction für das Senden der email ist:
Code:
require $store_s."/PHPMailer/PHPMailer.php";
require $store_s."/PHPMailer/Exception.php";
(wobei die Variable $store_s in der Funktion als global definiert ist und das Verz. angibt in der die php-Skripte liegen).

Ein Aufruf von:
Code:
$mail = new PHPMailer;
führt jedoch immer zu "PHP Fatal error: Uncaught Error: Class 'PHPMailer' not found in ...."

Es ändert auch nichts, wenn ich in der php.ini (für CLI) den include_path setze.

Ich denke, dass die "use" in der Funktion nicht übernommen werden.
 

DirkMa

Neuer User
Mitglied seit
4 Apr 2016
Beiträge
65
Punkte für Reaktionen
8
Punkte
8
Hi,

wie schon geschrieben habe ich da wenig Ahnung. Meine Vorgehensweise war, erst einmal ein php Script nur für den Mailer zu erstellen und alles möglichst in einem Verzeichnis. Bei mir läuft das ja alles über php7.3 auf einer Synolgy NAS.
Mein Aufruf sieht ja eher so aus $mail = new PHPMailer();
Es sieht ja bei dir so aus, als wenn da wirklich etwas mit den Pfadangaben nicht stimmt.
 

kuzco-ip

Mitglied
Mitglied seit
4 Feb 2019
Beiträge
596
Punkte für Reaktionen
42
Punkte
28
Irgendwie schon. Ich werde es über ein ext. php-Script lösen. habe es schon getestet, muss es nur noch anpassen.
 
  • Like
Reaktionen: DirkMa

DirkMa

Neuer User
Mitglied seit
4 Apr 2016
Beiträge
65
Punkte für Reaktionen
8
Punkte
8
Hi,

@kuzco-ip bist Du weiter gekommen?

Vielleicht kannst Du mir helfen. Ich versuche gerade über das php-Script die aufgenommenen Bilder bzw. Streams die älter als z.B. 31 Tage sind zu löschen. Finde aber nicht die Stelle, wo ich meine
if(time() == strtotime("00:00:00")){
$this->DelSnapshot();
$this->DelRecordStream();}
unterbringen kann, damit meine erstellten Funktionen um 0Uhr aufrufen werden.

Dirk
 

Erhalten Sie 3CX für 1 Jahr kostenlos!

Gehostet, in Ihrer privaten Cloud oder on-Premise! Ganz ohne Haken. Geben Sie Ihren Namen und Ihre E-Mail an und los geht´s:

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.
oder via