1
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-05-04 22:19:38 +00:00

73_DoorBird: Images can be stored as JPGs

git-svn-id: https://svn.fhem.de/fhem/trunk@19351 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
Sailor 2019-05-08 19:36:58 +00:00
parent 75735589bc
commit f521f7f8bd

View File

@ -51,6 +51,7 @@ use utf8;
use JSON;
use HttpUtils;
use Encode;
use Cwd;
use MIME::Base64 qw();
use Crypt::NaCl::Sodium qw( :utils );
use Crypt::Argon2 qw/argon2i_pass argon2i_verify argon2id_pass argon2id_verify/;
@ -78,7 +79,6 @@ sub DoorBird_Undefine($$);
# }
# END
###START###### Initialize module ##############################################################################START####
sub DoorBird_Initialize($)
{
@ -102,6 +102,7 @@ sub DoorBird_Initialize($)
"UdpPort:6524,35344 " .
"SipDevice:" . join(",", devspec2array("TYPE=SIP")) . " " .
"SipNumber " .
"ImageFileDir " .
"SessionIdSec:slider,0,10,600 " .
"disable:1,0 " .
"debug:1,0 " .
@ -191,6 +192,7 @@ sub DoorBird_Define($$)
$hash->{helper}{HistoryTime} = "????-??-?? ??:??";
$hash->{helper}{UdpPort} = AttrVal($name, "UdpPort", 6524);
$hash->{helper}{SessionIdSec} = AttrVal($name, "SessionIdSec", 540);
$hash->{helper}{ImageFileDir} = AttrVal($name, "ImageFileDir", 0);
$hash->{helper}{SessionId} = 0;
$hash->{helper}{UdpMessageId} = 0;
@{$hash->{helper}{RelayAdresses}} = (0);
@ -427,6 +429,18 @@ sub DoorBird_Attr(@)
InternalTimer(gettimeofday()+$hash->{helper}{SessionIdSec}, "DoorBird_RenewSessionID", $hash, 0);
}
}
### Check whether ImageFileSave attribute has been provided
elsif ($a[2] eq "ImageFileDir") {
### Check whether ImageFileSave is defined
if (defined($a[3])) {
### Set helper in hash
$hash->{helper}{ImageFileDir} = $a[3];
}
else {
### Set helper in hash
$hash->{helper}{ImageFileDir} = "";
}
}
### If no attributes of the above known ones have been selected
else {
# Do nothing
@ -550,6 +564,7 @@ sub DoorBird_Set($@)
}
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_Set _______________________________________________________________________";
Log3 $name, 5, $name. " : DoorBird_Set - name : " . $name;
Log3 $name, 5, $name. " : DoorBird_Set - command : " . $command;
Log3 $name, 5, $name. " : DoorBird_Set - option : " . $optionString;
@ -1753,16 +1768,17 @@ sub DoorBird_Image_Request($$) {
my ($hash, $option) = @_;
### Obtain values from hash
my $name = $hash->{NAME};
my $username = DoorBird_credential_decrypt($hash->{helper}{".USER"});
my $password = DoorBird_credential_decrypt($hash->{helper}{".PASSWORD"});
my $url = $hash->{helper}{URL};
my $command = "image.cgi";
my $method = "GET";
my $header = "Accept: application/json";
my $err = " ";
my $data = " ";
my $json = " ";
my $name = $hash->{NAME};
my $username = DoorBird_credential_decrypt($hash->{helper}{".USER"});
my $password = DoorBird_credential_decrypt($hash->{helper}{".PASSWORD"});
my $url = $hash->{helper}{URL};
my $command = "image.cgi";
my $method = "GET";
my $header = "Accept: application/json";
my $err = " ";
my $data = " ";
my $json = " ";
my $ImageFileName;
### Create complete command URL for DoorBird
my $UrlPrefix = "https://" . $url . "/bha-api/";
@ -1770,6 +1786,7 @@ sub DoorBird_Image_Request($$) {
my $ImageURL = $UrlPrefix . $command . $UrlPostfix;
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_Image_Request _____________________________________________________________";
# Log3 $name, 5, $name. " : DoorBird_Image_Request - ImageURL : " . $ImageURL ;
### Update Reading
@ -1792,11 +1809,91 @@ sub DoorBird_Image_Request($$) {
### Create Timestamp
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
my $ImageTimeStamp = sprintf ( "%04d-%02d-%02d %02d:%02d:%02d",$year+1900, $mon+1, $mday, $hour, $min, $sec);
my $ImageTimeStamp = sprintf ( "%04d-%02d-%02d %02d:%02d:%02d",$year+1900, $mon+1, $mday, $hour, $min, $sec);
my $ImageFileTimeStamp = sprintf ( "%04d%02d%02d-%02d%02d%02d" ,$year+1900, $mon+1, $mday, $hour, $min, $sec);
### Save picture and timestamp into hash
$hash->{helper}{Images}{Individual}{Data} = $ImageData;
$hash->{helper}{Images}{Individual}{Timestamp} = $ImageTimeStamp;
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_Image_Request - hash - ImageFileDir : " . $hash->{helper}{ImageFileDir};
### If pictures supposed to be saved as files
if ($hash->{helper}{ImageFileDir} ne "0") {
### Get current working directory
my $cwd = getcwd();
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_Image_Request - working directory : " . $cwd;
### If the path is given as UNIX file system format
if ($cwd =~ /\//) {
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_Image_Request - file system format : LINUX";
### Find out whether it is an absolute path or an relative one (leading "/")
if ($hash->{helper}{ImageFileDir} =~ /^\//) {
$ImageFileName = $hash->{helper}{ImageFileDir};
}
else {
$ImageFileName = $cwd . "/" . $hash->{helper}{ImageFileDir};
}
### Check whether the last "/" at the end of the path has been given otherwise add it an create complete path
if ($hash->{helper}{ImageFileDir} =~ /\/\z/) {
$ImageFileName .= $ImageFileTimeStamp . "_Snapshot.jpg";
}
else {
$ImageFileName .= "/" . $ImageFileTimeStamp . "_Snapshot.jpg";
}
}
### If the path is given as Windows file system format
if ($hash->{helper}{ImageFileDir} =~ /\\/) {
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_Image_Request - file system format : WINDOWS";
### Find out whether it is an absolute path or an relative one (containing ":\")
if ($hash->{helper}{ImageFileDir} != /^.:\//) {
$ImageFileName = $cwd . $hash->{helper}{ImageFileDir};
}
else {
$ImageFileName = $hash->{helper}{ImageFileDir};
}
### Check whether the last "/" at the end of the path has been given otherwise add it an create complete path
if ($hash->{helper}{ImageFileDir} =~ /\\\z/) {
$ImageFileName .= $ImageFileTimeStamp . "_Snapshot.jpg";
}
else {
$ImageFileName .= "\\" . $ImageFileTimeStamp . "_Snapshot.jpg";
}
}
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_Image_Request - ImageFileName : " . $ImageFileName;
### Open file or write error message in log
open my $fh, ">", $ImageFileName or do {
### Log Entry
Log3 $name, 2, $name. " : DoorBird_Image_Request - open file error : " . $! . " - ". $ImageFileName;
};
### Write the base64 decoded data in file
print $fh decode_base64($ImageData) if defined($fh);
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_Image_Request - write file : Successfully written " . $ImageFileName;
### Close file or write error message in log
close $fh or do {
### Log Entry
Log3 $name, 2, $name. " : DoorBird_Image_Request - close file error : " . $! . " - ". $ImageFileName;
}
}
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_Image_Request - ImageData size : " . length($ImageData);
@ -2072,7 +2169,8 @@ sub DoorBird_History_Request($$) {
### Create Timestamp
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
my $ImageTimeStamp = sprintf ( "%04d-%02d-%02d %02d:%02d:%02d",$year+1900, $mon+1, $mday, $hour, $min, $sec);
my $ImageTimeStamp = sprintf ( "%04d-%02d-%02d %02d:%02d:%02d",$year+1900, $mon+1, $mday, $hour, $min, $sec);
### Create first part command URL for DoorBird
my $UrlPrefix = "https://" . $url . "/bha-api/";
@ -2154,7 +2252,7 @@ sub DoorBird_History_Request_Parse($) {
my $name = $hash->{NAME};
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_History_Request -----------------------------------------------------------";
Log3 $name, 5, $name. " : DoorBird_History_Request ___________________________________________________________";
Log3 $name, 5, $name. " : DoorBird_History_Request - Download Index : " . $hash->{helper}{HistoryDownloadCount};
Log3 $name, 5, $name. " : DoorBird_History_Request - err : " . $err if (defined($err ));
Log3 $name, 5, $name. " : DoorBird_History_Request - length data : " . length($data) if (defined($data ));
@ -2174,6 +2272,8 @@ sub DoorBird_History_Request_Parse($) {
### Predefine Image Data and Image-hash and hash - reference
my $ImageData;
my $ImageTimeStamp;
my $ImageFileTimeStamp;
my $ImageFileName;
my %ImageDataHash;
my $ref_ImageDataHash = \%ImageDataHash;
@ -2188,7 +2288,8 @@ sub DoorBird_History_Request_Parse($) {
$httpHeader =~ s/^[^_]*X-Timestamp: //;
$httpHeader =~ s/\n.*//g;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($httpHeader);
$ImageTimeStamp = sprintf ( "%04d-%02d-%02d %02d:%02d:%02d",$year+1900, $mon+1, $mday, $hour, $min, $sec);
$ImageTimeStamp = sprintf ( "%04d-%02d-%02d %02d:%02d:%02d",$year+1900, $mon+1, $mday, $hour, $min, $sec);
$ImageFileTimeStamp = sprintf ( "%04d%02d%02d-%02d%02d%02d" ,$year+1900, $mon+1, $mday, $hour, $min, $sec);
}
### If http response code is 204 = Nno permission to download the event history
elsif ($param->{code} == 204) {
@ -2225,6 +2326,85 @@ sub DoorBird_History_Request_Parse($) {
### Save image hash into array of hashes
push (@{$hash->{helper}{Images}{History}{doorbell}}, $ref_ImageDataHash);
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_History_Request - hash - ImageFileDir : " . $hash->{helper}{ImageFileDir};
### If pictures supposed to be saved as files
if ($hash->{helper}{ImageFileDir} ne "0") {
### Get current working directory
my $cwd = getcwd();
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_History_Request - working directory : " . $cwd;
### If the path is given as UNIX file system format
if ($cwd =~ /\//) {
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_History_Request - file system format : LINUX";
### Find out whether it is an absolute path or an relative one (leading "/")
if ($hash->{helper}{ImageFileDir} =~ /^\//) {
$ImageFileName = $hash->{helper}{ImageFileDir};
}
else {
$ImageFileName = $cwd . "/" . $hash->{helper}{ImageFileDir};
}
### Check whether the last "/" at the end of the path has been given otherwise add it an create complete path
if ($hash->{helper}{ImageFileDir} =~ /\/\z/) {
$ImageFileName .= $ImageFileTimeStamp . "_Doorbell.jpg";
}
else {
$ImageFileName .= "/" . $ImageFileTimeStamp . "_Doorbell.jpg";
}
}
### If the path is given as Windows file system format
if ($hash->{helper}{ImageFileDir} =~ /\\/) {
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_History_Request - file system format : WINDOWS";
### Find out whether it is an absolute path or an relative one (containing ":\")
if ($hash->{helper}{ImageFileDir} != /^.:\//) {
$ImageFileName = $cwd . $hash->{helper}{ImageFileDir};
}
else {
$ImageFileName = $hash->{helper}{ImageFileDir};
}
### Check whether the last "/" at the end of the path has been given otherwise add it an create complete path
if ($hash->{helper}{ImageFileDir} =~ /\\\z/) {
$ImageFileName .= $ImageFileTimeStamp . "_Doorbell.jpg";
}
else {
$ImageFileName .= "\\" . $ImageFileTimeStamp . "_Doorbell.jpg";
}
}
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_History_Request - ImageFileName : " . $ImageFileName;
### Open file or write error message in log
open my $fh, ">", $ImageFileName or do {
### Log Entry
Log3 $name, 2, $name. " : DoorBird_History_Request - open file error : " . $! . " - ". $ImageFileName;
};
### Write the base64 decoded data in file
print $fh decode_base64($ImageData) if defined($fh);
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_History_Request - write file : Successfully written " . $ImageFileName;
### Close file or write error message in log
close $fh or do {
### Log Entry
Log3 $name, 2, $name. " : DoorBird_History_Request - close file error : " . $! . " - ". $ImageFileName;
}
}
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_History_Request - Index - doorbell : " . $UrlIndex;
Log3 $name, 5, $name. " : DoorBird_History_Request - ImageData - doorbell : " . length($ImageData);
@ -2242,6 +2422,85 @@ sub DoorBird_History_Request_Parse($) {
### Save image hash into array of hashes
push (@{$hash->{helper}{Images}{History}{motionsensor}}, $ref_ImageDataHash);
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_History_Request - hash - ImageFileDir : " . $hash->{helper}{ImageFileDir};
### If pictures supposed to be saved as files
if ($hash->{helper}{ImageFileDir} ne "0") {
### Get current working directory
my $cwd = getcwd();
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_History_Request - working directory : " . $cwd;
### If the path is given as UNIX file system format
if ($cwd =~ /\//) {
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_History_Request - file system format : LINUX";
### Find out whether it is an absolute path or an relative one (leading "/")
if ($hash->{helper}{ImageFileDir} =~ /^\//) {
$ImageFileName = $hash->{helper}{ImageFileDir};
}
else {
$ImageFileName = $cwd . "/" . $hash->{helper}{ImageFileDir};
}
### Check whether the last "/" at the end of the path has been given otherwise add it an create complete path
if ($hash->{helper}{ImageFileDir} =~ /\/\z/) {
$ImageFileName .= $ImageFileTimeStamp . "_Motion.jpg";
}
else {
$ImageFileName .= "/" . $ImageFileTimeStamp . "_Motion.jpg";
}
}
### If the path is given as Windows file system format
if ($hash->{helper}{ImageFileDir} =~ /\\/) {
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_History_Request - file system format : WINDOWS";
### Find out whether it is an absolute path or an relative one (containing ":\")
if ($hash->{helper}{ImageFileDir} != /^.:\//) {
$ImageFileName = $cwd . $hash->{helper}{ImageFileDir};
}
else {
$ImageFileName = $hash->{helper}{ImageFileDir};
}
### Check whether the last "/" at the end of the path has been given otherwise add it an create complete path
if ($hash->{helper}{ImageFileDir} =~ /\\\z/) {
$ImageFileName .= $ImageFileTimeStamp . "_Motion.jpg";
}
else {
$ImageFileName .= "\\" . $ImageFileTimeStamp . "_Motion.jpg";
}
}
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_History_Request - ImageFileName : " . $ImageFileName;
### Open file or write error message in log
open my $fh, ">", $ImageFileName or do {
### Log Entry
Log3 $name, 2, $name. " : DoorBird_History_Request - open file error : " . $! . " - ". $ImageFileName;
};
### Write the base64 decoded data in file
print $fh decode_base64($ImageData) if defined($fh);
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_History_Request - write file : Successfully written " . $ImageFileName;
### Close file or write error message in log
close $fh or do {
### Log Entry
Log3 $name, 2, $name. " : DoorBird_History_Request - close file error : " . $! . " - ". $ImageFileName;
}
}
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_History_Request - Index - motionsensor : " . $UrlIndex;
@ -2744,12 +3003,11 @@ sub DoorBird_BlockGet($$$$) {
<li>sudo apt-get install sox </li>
<li>sudo apt-get install libsox-fmt-all </li>
<li>sudo apt-get install libsodium-dev </li>
<li>sudo cpanm HTTP::Request::StreamingUpload </li>
<li>sudo cpanm LWP::UserAgent </li>
<li>sudo cpanm Alien::Base::ModuleBuild </li>
<li>sudo cpanm Alien::Sodium </li>
<li>sudo cpanm Crypt::NaCl::Sodium </li>
<li>sudo cpanm MIME::Base64 </li>
<li>sudo cpan LWP::UserAgent </li>
<li>sudo cpan Alien::Base::ModuleBuild </li>
<li>sudo cpan Alien::Sodium </li>
<li>sudo cpan Crypt::NaCl::Sodium </li>
<li>sudo cpan MIME::Base64 </li>
</code>
</td>
</tr>
@ -2881,6 +3139,12 @@ sub DoorBird_BlockGet($$$$) {
The default value is <code>**620</code><BR>
</td>
</tr>
<tr>
<td>
<code>ImageFileDir</code> : </td><td>The relative (e.g. "images") or absolute (e.g. "/mnt/NAS/images") with or without trailing "/" directory path to which the image files supposed to be stored.<BR>
The default value is <code>0</code> = disabled<BR>
</td>
</tr>
</table>
</ul>
</ul>
@ -2903,12 +3167,11 @@ sub DoorBird_BlockGet($$$$) {
<li>sudo apt-get install sox </li>
<li>sudo apt-get install libsox-fmt-all </li>
<li>sudo apt-get install libsodium-dev </li>
<li>sudo cpanm HTTP::Request::StreamingUpload </li>
<li>sudo cpanm LWP::UserAgent </li>
<li>sudo cpanm Alien::Base::ModuleBuild </li>
<li>sudo cpanm Alien::Sodium </li>
<li>sudo cpanm Crypt::NaCl::Sodium </li>
<li>sudo cpanm MIME::Base64 </li>
<li>sudo cpan LWP::UserAgent </li>
<li>sudo cpan Alien::Base::ModuleBuild </li>
<li>sudo cpan Alien::Sodium </li>
<li>sudo cpan Crypt::NaCl::Sodium </li>
<li>sudo cpan MIME::Base64 </li>
</code>
</td>
</tr>
@ -3029,6 +3292,12 @@ sub DoorBird_BlockGet($$$$) {
<code>SipNumber</code> : </td><td>Die Telefonnummer unter der die DoorBird / Anlage registriert und erreicht werden kann.<BR>
Der Default Wert ist <code>**620</code><BR>
</td>
</tr>
<tr>
<td>
<code>ImageFileDir</code> : </td><td>Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<BR>
The Default Wert ist <code>0</code> = deaktiviert<BR>
</td>
</tr>
</table>
</ul>