2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-07 19:04:20 +00:00

49_SSCam: contrib 8.8.0

git-svn-id: https://svn.fhem.de/fhem/trunk@18478 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2019-02-01 15:00:29 +00:00
parent 83dc388bcc
commit ab46de6b66

View File

@ -1,5 +1,5 @@
######################################################################################################################## ########################################################################################################################
# $Id: 49_SSCam.pm 18411 2019-01-25 13:17:13Z DS_Starter $ # $Id: 49_SSCam.pm 18452 2019-01-29 22:39:55Z DS_Starter $
######################################################################################################################### #########################################################################################################################
# 49_SSCam.pm # 49_SSCam.pm
# #
@ -47,6 +47,9 @@ use Encode;
# Versions History intern # Versions History intern
our %SSCam_vNotesIntern = ( our %SSCam_vNotesIntern = (
"8.8.0" => "01.02.2019 send snapshots by telegram ",
"8.7.2" => "30.01.2019 code change for snapCams (SVS) ",
"8.7.1" => "30.01.2019 fix refresh snapgallery device if snap was done by itself ",
"8.7.0" => "27.01.2019 send recording by email ", "8.7.0" => "27.01.2019 send recording by email ",
"8.6.2" => "25.01.2019 fix version numbering ", "8.6.2" => "25.01.2019 fix version numbering ",
"8.6.1" => "21.01.2019 time format in readings and galleries depends from global language attribute, minor bug fixes ", "8.6.1" => "21.01.2019 time format in readings and galleries depends from global language attribute, minor bug fixes ",
@ -122,6 +125,7 @@ our %SSCam_vNotesIntern = (
# Versions History extern # Versions History extern
our %SSCam_vNotesExtern = ( our %SSCam_vNotesExtern = (
"8.8.0" => "01.02.2019 Snapshots can now be sent by telegramBot ",
"8.7.0" => "27.01.2019 SMTP Email delivery of recordings implemented. You can send a recording after it was created subsequentely ". "8.7.0" => "27.01.2019 SMTP Email delivery of recordings implemented. You can send a recording after it was created subsequentely ".
"with the integrated Email client. You have to store SMTP credentials with \"smtpcredentials\" before. ", "with the integrated Email client. You have to store SMTP credentials with \"smtpcredentials\" before. ",
"8.6.2" => "25.01.2019 fix version numbering ", "8.6.2" => "25.01.2019 fix version numbering ",
@ -357,6 +361,7 @@ sub SSCam_Initialize($) {
"smtpTo ". "smtpTo ".
"smtpNoUseSSL:1,0 ". "smtpNoUseSSL:1,0 ".
"snapEmailTxt ". "snapEmailTxt ".
"snapTelegramTxt ".
"snapGalleryBoost:0,1 ". "snapGalleryBoost:0,1 ".
"snapGallerySize:Icon,Full ". "snapGallerySize:Icon,Full ".
"snapGalleryNumber:$SSCAM_snum ". "snapGalleryNumber:$SSCAM_snum ".
@ -811,8 +816,7 @@ sub SSCam_Set($@) {
} elsif ($opt eq "snap" && SSCam_IsModelCam($hash)) { } elsif ($opt eq "snap" && SSCam_IsModelCam($hash)) {
if (!$hash->{CREDENTIALS}) {return "Credentials of $name are not set - make sure you've set it with \"set $name credentials username password\"";} if (!$hash->{CREDENTIALS}) {return "Credentials of $name are not set - make sure you've set it with \"set $name credentials username password\"";}
my ($num,$lag,$ncount) = (1,2,1); my ($num,$lag,$ncount) = (1,2,1);
my $emtxt = "";
if($prop && $prop =~ /^\d+$/) { # Anzahl der Schnappschüsse zu triggern (default: 1) if($prop && $prop =~ /^\d+$/) { # Anzahl der Schnappschüsse zu triggern (default: 1)
$num = $prop; $num = $prop;
$ncount = $prop; $ncount = $prop;
@ -824,25 +828,40 @@ sub SSCam_Set($@) {
Log3($name, 4, "$name - Trigger snapshots - Number: $num, Lag: $lag"); Log3($name, 4, "$name - Trigger snapshots - Number: $num, Lag: $lag");
$hash->{HELPER}{SNAPBYSTRMDEV} = 1 if ($prop2 && $prop2 =~ /STRM/); # $prop wird mitgegeben durch Snap by SSCamSTRM-Device $hash->{HELPER}{SNAPBYSTRMDEV} = 1 if ($prop2 && $prop2 =~ /STRM/); # $prop wird mitgegeben durch Snap by SSCamSTRM-Device
my $emtxt = AttrVal($name, "snapEmailTxt", "");
my $at = join(" ",@a); my $at = join(" ",@a);
if($at =~ /snapEmailTxt:/) { if($at =~ /snapEmailTxt:/) {
$at =~ m/.*snapEmailTxt:"(.*)".*/i; $at =~ m/.*snapEmailTxt:"(.*)".*/i;
$emtxt = $1; $emtxt = $1;
} }
if (AttrVal($name, "snapEmailTxt", "")) { if ($emtxt) {
# Snap soll nach Erstellung per Email versendet werden # Snap soll nach Erstellung per Email versendet werden
# snapEmailTxt muss sein: subject => <Subject-Text>, body => <Body-Text> # Format $emtxt muss sein: snapEmailTxt:"subject => <Subject-Text>, body => <Body-Text>"
if (!$hash->{SMTPCREDENTIALS}) {return "Due to attribute \"snapEmailTxt\" is set, you want to send snapshots by email but SMTP credentials are not set - make sure you've set credentials with \"set $name smtpcredentials username password\"";} if (!$hash->{SMTPCREDENTIALS}) {return "Due to attribute \"snapEmailTxt\" is set, you want to send snapshots by email but SMTP credentials are not set - make sure you've set credentials with \"set $name smtpcredentials username password\"";}
$hash->{HELPER}{SMTPMSG} = $emtxt;
} }
SSCam_camsnap("$name:$num:$lag:$ncount:$emtxt");
my $teletxt = AttrVal($name, "snapTelegramTxt", "");
my $bt = join(" ",@a);
if($bt =~ /snapTelegramTxt:/) {
$bt =~ m/.*snapTelegramTxt:"(.*)".*/i;
$teletxt = $1;
}
if ($teletxt) {
# Snap soll nach Erstellung per TelegramBot versendet werden
# Format $teletxt muss sein: snapTelegramTxt:"tbot => <teleBot Device>, peers => <peer1 peer2 ..>, subject => <Beschreibungstext>"
$hash->{HELPER}{TELEMSG} = $teletxt;
}
SSCam_camsnap("$name:$num:$lag:$ncount:$emtxt:$teletxt");
} elsif ($opt eq "snapCams" && !SSCam_IsModelCam($hash)) { } elsif ($opt eq "snapCams" && !SSCam_IsModelCam($hash)) {
if (!$hash->{CREDENTIALS}) {return "Credentials of $name are not set - make sure you've set it with \"set $name credentials username password\"";} if (!$hash->{CREDENTIALS}) {return "Credentials of $name are not set - make sure you've set it with \"set $name credentials username password\"";}
my ($num,$lag,$ncount) = (1,2,1); my ($num,$lag,$ncount) = (1,2,1);
my $cams = "all"; my $cams = "all";
my $emtxt = '';
if($prop && $prop =~ /^\d+$/) { # Anzahl der Schnappschüsse zu triggern (default: 1) if($prop && $prop =~ /^\d+$/) { # Anzahl der Schnappschüsse zu triggern (default: 1)
$num = $prop; $num = $prop;
$ncount = $prop; $ncount = $prop;
@ -878,6 +897,19 @@ sub SSCam_Set($@) {
return "No valid camera devices are specified for trigger snapshots" if(!%snapac); return "No valid camera devices are specified for trigger snapshots" if(!%snapac);
my $emtxt;
my $teletxt = "";
my $rawet = AttrVal($name, "snapEmailTxt", "");
my $bt = join(" ",@a);
if($bt =~ /snapEmailTxt:/) {
$bt =~ m/.*snapEmailTxt:"(.*)".*/i;
$rawet = $1;
}
if($rawet) {
$hash->{HELPER}{CANSENDSNAP} = 1; # zentraler Schnappschußversand wird aktiviert
$hash->{HELPER}{SMTPMSG} = $rawet;
}
my $asref = \%snapac; my $asref = \%snapac;
$hash->{HELPER}{ALLSNAPREF} = $asref; $hash->{HELPER}{ALLSNAPREF} = $asref;
my ($csnap,$cmail) = ("",""); my ($csnap,$cmail) = ("","");
@ -885,10 +917,12 @@ sub SSCam_Set($@) {
if(!AttrVal($key, "snapEmailTxt", "")) { if(!AttrVal($key, "snapEmailTxt", "")) {
delete $asref->{$key}; # Snap dieser Kamera auslösen aber nicht senden delete $asref->{$key}; # Snap dieser Kamera auslösen aber nicht senden
$csnap .= $csnap?", $key":$key; $csnap .= $csnap?", $key":$key;
$emtxt = "";
} else { } else {
$cmail .= $cmail?", $key":$key; $cmail .= $cmail?", $key":$key;
$emtxt = $rawet;
} }
SSCam_camsnap("$key:$num:$lag:$ncount:$emtxt"); SSCam_camsnap("$key:$num:$lag:$ncount:$emtxt:$teletxt");
} }
Log3($name, 4, "$name - Trigger snapshots by SVS - Number: $num, Lag: $lag, Snap only: \"$csnap\", Snap and send: \"$cmail\" "); Log3($name, 4, "$name - Trigger snapshots by SVS - Number: $num, Lag: $lag, Snap only: \"$csnap\", Snap and send: \"$cmail\" ");
@ -1626,7 +1660,7 @@ sub SSCam_FWsummaryFn ($$$$) {
my $imgrecendless = "<img src=\"$FW_ME/www/images/sscam/black_btn_RECSTART.png\">"; my $imgrecendless = "<img src=\"$FW_ME/www/images/sscam/black_btn_RECSTART.png\">";
my $cmdrecstop = "cmd=set $d off"; # Aufnahme Stop my $cmdrecstop = "cmd=set $d off"; # Aufnahme Stop
my $imgrecstop = "<img src=\"$FW_ME/www/images/sscam/black_btn_RECSTOP.png\">"; my $imgrecstop = "<img src=\"$FW_ME/www/images/sscam/black_btn_RECSTOP.png\">";
my $cmddosnap = "cmd=set $d snap STRM"; # Snapshot auslösen mit Kennzeichnung "by STRM-Device" my $cmddosnap = "cmd=set $d snap 1 2 STRM"; # Snapshot auslösen mit Kennzeichnung "by STRM-Device"
my $imgdosnap = "<img src=\"$FW_ME/www/images/sscam/black_btn_DOSNAP.png\">"; my $imgdosnap = "<img src=\"$FW_ME/www/images/sscam/black_btn_DOSNAP.png\">";
my $attr = AttrVal($d, "htmlattr", " "); my $attr = AttrVal($d, "htmlattr", " ");
@ -2227,7 +2261,7 @@ sub SSCam_cammotdetsc($) {
############################################################################### ###############################################################################
sub SSCam_camsnap($) { sub SSCam_camsnap($) {
my ($str) = @_; my ($str) = @_;
my ($name,$num,$lag,$ncount,$emtxt,$tac) = split(":",$str); my ($name,$num,$lag,$ncount,$emtxt,$teletxt,$tac) = split(":",$str);
my $hash = $defs{$name}; my $hash = $defs{$name};
my $camname = $hash->{CAMNAME}; my $camname = $hash->{CAMNAME};
my $errorcode; my $errorcode;
@ -2264,7 +2298,8 @@ sub SSCam_camsnap($) {
# einen Schnappschuß aufnehmen # einen Schnappschuß aufnehmen
$hash->{OPMODE} = "Snap"; $hash->{OPMODE} = "Snap";
$hash->{HELPER}{LOGINRETRIES} = 0; $hash->{HELPER}{LOGINRETRIES} = 0;
$hash->{HELPER}{CANSENDSNAP} = 1 if(AttrVal($name, "snapEmailTxt", "")); # Versand Schnappschüsse soll erfolgen $hash->{HELPER}{CANSENDSNAP} = 1 if($emtxt); # Versand Schnappschüsse soll per Email erfolgen
$hash->{HELPER}{CANTELESNAP} = 1 if($teletxt); # Versand Schnappschüsse soll per TelegramBot erfolgen
$hash->{HELPER}{SNAPNUM} = $num if($num); # Gesamtzahl der auszulösenden Schnappschüsse $hash->{HELPER}{SNAPNUM} = $num if($num); # Gesamtzahl der auszulösenden Schnappschüsse
$hash->{HELPER}{SNAPLAG} = $lag if($lag); # Zeitverzögerung zwischen zwei Schnappschüssen $hash->{HELPER}{SNAPLAG} = $lag if($lag); # Zeitverzögerung zwischen zwei Schnappschüssen
$hash->{HELPER}{SNAPNUMCOUNT} = $ncount if($ncount); # Restzahl der auszulösenden Schnappschüsse (wird runtergezählt) $hash->{HELPER}{SNAPNUMCOUNT} = $ncount if($ncount); # Restzahl der auszulösenden Schnappschüsse (wird runtergezählt)
@ -2275,7 +2310,7 @@ sub SSCam_camsnap($) {
} else { } else {
$tac = (defined $tac)?$tac:""; $tac = (defined $tac)?$tac:"";
InternalTimer(gettimeofday()+0.3, "SSCam_camsnap", "$name:$num:$lag:$ncount:$emtxt:$tac", 0); InternalTimer(gettimeofday()+0.3, "SSCam_camsnap", "$name:$num:$lag:$ncount:$emtxt:$teletxt:$tac", 0);
} }
} }
@ -4842,7 +4877,7 @@ sub SSCam_camop_parse ($) {
Log3($name,4, "$name - Snap '$sn' added to send recording hash: ID => $sendrecs{$sn}{recid}, File => $sendrecs{$sn}{fileName}, Created => $sendrecs{$sn}{createdTm}"); Log3($name,4, "$name - Snap '$sn' added to send recording hash: ID => $sendrecs{$sn}{recid}, File => $sendrecs{$sn}{fileName}, Created => $sendrecs{$sn}{createdTm}");
# prüfen ob Recording als Email versendet werden soll # prüfen ob Recording als Email versendet werden soll
SSCam_prepareSendEmail ($hash, $OpMode, \%sendrecs); SSCam_prepareSendData ($hash, $OpMode, \%sendrecs);
readingsBeginUpdate($hash); readingsBeginUpdate($hash);
readingsBulkUpdate($hash,"Errorcode","none"); readingsBulkUpdate($hash,"Errorcode","none");
@ -5095,13 +5130,14 @@ sub SSCam_camop_parse ($) {
} }
my $num = $hash->{HELPER}{SNAPNUM}; # Gesamtzahl der auszulösenden Schnappschüsse my $num = $hash->{HELPER}{SNAPNUM}; # Gesamtzahl der auszulösenden Schnappschüsse
my $ncount = $hash->{HELPER}{SNAPNUMCOUNT}; # Restzahl der auszulösenden Schnappschüsse my $ncount = $hash->{HELPER}{SNAPNUMCOUNT}; # Restzahl der auszulösenden Schnappschüsse
$ncount--; # wird vermindert je Snap $ncount--; # wird vermindert je Snap
my $lag = $hash->{HELPER}{SNAPLAG}; # Zeitverzögerung zwischen zwei Schnappschüssen my $lag = $hash->{HELPER}{SNAPLAG}; # Zeitverzögerung zwischen zwei Schnappschüssen
my $emtxt = $hash->{HELPER}{SMTPMSG}?$hash->{HELPER}{SMTPMSG}:""; # alternativer Text für Email-Versand my $emtxt = $hash->{HELPER}{SMTPMSG}?$hash->{HELPER}{SMTPMSG}:""; # Text für Email-Versand
my $teletxt = $hash->{HELPER}{TELEMSG}?$hash->{HELPER}{TELEMSG}:""; # Text für TelegramBot-Versand
if($ncount > 0) { if($ncount > 0) {
InternalTimer(gettimeofday()+$lag, "SSCam_camsnap", "$name:$num:$lag:$ncount:$emtxt:$tac", 0); InternalTimer(gettimeofday()+$lag, "SSCam_camsnap", "$name:$num:$lag:$ncount:$emtxt:$teletxt:$tac", 0);
if(!$tac) { if(!$tac) {
SSCam_delActiveToken($hash); # Token freigeben wenn keine Transaktion läuft SSCam_delActiveToken($hash); # Token freigeben wenn keine Transaktion läuft
} }
@ -5180,7 +5216,7 @@ sub SSCam_camop_parse ($) {
##### eine Schnapschussgalerie soll angezeigt oder als Bulk versendet werden ##### ##### eine Schnapschussgalerie soll angezeigt oder als Bulk versendet werden #####
if($OpMode eq "getsnapgallery") { if($OpMode eq "getsnapgallery") {
if($hash->{HELPER}{CANSENDSNAP}) { if($hash->{HELPER}{CANSENDSNAP} || $hash->{HELPER}{CANTELESNAP}) {
# es sollen die Anzahl "$hash->{HELPER}{SNAPNUM}" Schnappschüsse versendet werden # es sollen die Anzahl "$hash->{HELPER}{SNAPNUM}" Schnappschüsse versendet werden
my $i = 0; my $i = 0;
my $sn = 0; my $sn = 0;
@ -5208,33 +5244,42 @@ sub SSCam_camop_parse ($) {
$sendsnaps{$sn}{fileName} = $fileName; $sendsnaps{$sn}{fileName} = $fileName;
$sendsnaps{$sn}{".imageData"} = $imageData; $sendsnaps{$sn}{".imageData"} = $imageData;
Log3($name,4, "$name - Snap '$sn' added to send gallery hash: ID => $sendsnaps{$sn}{snapid}, File => $sendsnaps{$sn}{fileName}, Created => $sendsnaps{$sn}{createdTm}"); Log3($name,4, "$name - Snap '$sn' added to send gallery hash: ID => $sendsnaps{$sn}{snapid}, File => $sendsnaps{$sn}{fileName}, Created => $sendsnaps{$sn}{createdTm}");
$sn += 1;
# Snaphash um die neuen Snaps ergänzen wenn existent
if($hash->{HELPER}{".SNAPHASH"}{$sn}) {
$hash->{HELPER}{".SNAPHASH"}{$sn}{snapid} = $snapid;
$hash->{HELPER}{".SNAPHASH"}{$sn}{createdTm} = $createdTm;
$hash->{HELPER}{".SNAPHASH"}{$sn}{fileName} = $fileName;
$hash->{HELPER}{".SNAPHASH"}{$sn}{imageData} = $imageData;
Log3($name,4, "$name - Snap '$sn' added to gallery hash: ID => $snapid, File => $fileName, Created => $createdTm");
}
$sn += 1;
$i += 1; $i += 1;
} }
# prüfen ob Schnappschuß als Email versendet werden soll # prüfen ob Schnappschuß versendet werden soll
SSCam_prepareSendEmail ($hash, $OpMode, \%sendsnaps); SSCam_prepareSendData ($hash, $OpMode, \%sendsnaps);
} else { } else {
# es soll eine Schnappschußgalerie bereitgestellt (Attr snapGalleryBoost=1) bzw. gleich angezeigt # es soll eine Schnappschußgalerie bereitgestellt (Attr snapGalleryBoost=1) bzw. gleich angezeigt
# werden (Attr snapGalleryBoost=0) # werden (Attr snapGalleryBoost=0)
my $i = 0; my $i = 0;
my $sn = 0; my $sn = 0;
my %allsnaps = (); # Schnappschuss Hash wird leer erstellt my %allsnaps = (); # Schnappschuss Hash wird leer erstellt
$hash->{HELPER}{TOTALCNT} = $data->{data}{total}; # total Anzahl Schnappschüsse $hash->{HELPER}{TOTALCNT} = $data->{data}{total}; # total Anzahl Schnappschüsse
while ($data->{'data'}{'data'}[$i]) { while ($data->{'data'}{'data'}[$i]) {
if($data->{'data'}{'data'}[$i]{'camName'} ne $camname) { if($data->{'data'}{'data'}[$i]{'camName'} ne $camname) {
$i += 1; $i += 1;
next; next;
} }
$snapid = $data->{data}{data}[$i]{id}; $snapid = $data->{data}{data}[$i]{id};
my $createdTm = $data->{data}{data}[$i]{createdTm}; my $createdTm = $data->{data}{data}[$i]{createdTm};
my $fileName = $data->{data}{data}[$i]{fileName}; my $fileName = $data->{data}{data}[$i]{fileName};
my $imageData = $data->{data}{data}[$i]{imageData}; # Image data of snapshot in base64 format my $imageData = $data->{data}{data}[$i]{imageData}; # Image data of snapshot in base64 format
$allsnaps{$sn}{snapid} = $snapid;
my @t = split(" ", FmtDateTime($data->{data}{data}[$i]{createdTm})); my @t = split(" ", FmtDateTime($data->{data}{data}[$i]{createdTm}));
my @d = split("-", $t[0]); my @d = split("-", $t[0]);
if($lang eq "DE") { if($lang eq "DE") {
@ -5242,28 +5287,29 @@ sub SSCam_camop_parse ($) {
} else { } else {
$createdTm = "$d[0]-$d[1]-$d[2] / $t[1]"; $createdTm = "$d[0]-$d[1]-$d[2] / $t[1]";
} }
$allsnaps{$sn}{createdTm} = $createdTm; $allsnaps{$sn}{snapid} = $snapid;
$allsnaps{$sn}{fileName} = $fileName; $allsnaps{$sn}{createdTm} = $createdTm;
$allsnaps{$sn}{imageData} = $imageData; $allsnaps{$sn}{fileName} = $fileName;
Log3($name,4, "$name - Snap '$sn' added to gallery hash: ID => $allsnaps{$sn}{snapid}, File => $allsnaps{$sn}{fileName}, Created => $allsnaps{$sn}{createdTm}"); $allsnaps{$sn}{imageData} = $imageData;
$sn += 1; Log3($name,4, "$name - Snap '$sn' added to gallery hash: ID => $allsnaps{$sn}{snapid}, File => $allsnaps{$sn}{fileName}, Created => $allsnaps{$sn}{createdTm}");
$i += 1; $sn += 1;
} $i += 1;
}
# Hash der Schnapschüsse erstellen
$hash->{HELPER}{".SNAPHASH"} = \%allsnaps; # Hash der Schnapschüsse erstellen
$hash->{HELPER}{".SNAPHASH"} = \%allsnaps;
# Direktausgabe Snaphash wenn nicht gepollt wird
if(!AttrVal($name, "snapGalleryBoost",0)) { # Direktausgabe Snaphash wenn nicht gepollt wird
my $htmlCode = SSCam_composegallery($name); if(!AttrVal($name, "snapGalleryBoost",0)) {
my $htmlCode = SSCam_composegallery($name);
for (my $k=1; (defined($hash->{HELPER}{CL}{$k})); $k++ ) {
asyncOutput($hash->{HELPER}{CL}{$k},"$htmlCode"); for (my $k=1; (defined($hash->{HELPER}{CL}{$k})); $k++ ) {
} asyncOutput($hash->{HELPER}{CL}{$k},"$htmlCode");
delete($hash->{HELPER}{".SNAPHASH"}); # Snaphash löschen wenn nicht gepollt wird }
delete($hash->{HELPER}{CL}); delete($hash->{HELPER}{".SNAPHASH"}); # Snaphash löschen wenn nicht gepollt wird
} delete($hash->{HELPER}{CL});
} }
}
} }
readingsBeginUpdate($hash); readingsBeginUpdate($hash);
@ -7282,7 +7328,7 @@ sub SSCam_composegallery ($;$$) {
my $streamHash = $defs{$strmdev} if($strmdev); # Hash des SSCamSTRM-Devices my $streamHash = $defs{$strmdev} if($strmdev); # Hash des SSCamSTRM-Devices
delete $streamHash->{HELPER}{STREAM}; delete $streamHash->{HELPER}{STREAM};
my $cmddosnap = "cmd=set $name snap STRM"; # Snapshot auslösen mit Kennzeichnung "by STRM-Device" my $cmddosnap = "cmd=set $name snap 1 2 STRM"; # Snapshot auslösen mit Kennzeichnung "by STRM-Device"
my $imgdosnap = "<img src=\"$FW_ME/www/images/sscam/black_btn_DOSNAP.png\">"; my $imgdosnap = "<img src=\"$FW_ME/www/images/sscam/black_btn_DOSNAP.png\">";
my $ha = AttrVal($name, "snapGalleryHtmlAttr", AttrVal($name, "htmlattr", 'width="500" height="325"')); my $ha = AttrVal($name, "snapGalleryHtmlAttr", AttrVal($name, "htmlattr", 'width="500" height="325"'));
@ -7463,7 +7509,7 @@ return;
# $OpMode = aktueller Operation Mode zur Unterscheidung was versendet werden soll # $OpMode = aktueller Operation Mode zur Unterscheidung was versendet werden soll
# $data = zu versendende Daten, evtl. als Hash Referenz # $data = zu versendende Daten, evtl. als Hash Referenz
############################################################################################# #############################################################################################
sub SSCam_prepareSendEmail ($$;$) { sub SSCam_prepareSendData ($$;$) {
my ($hash, $OpMode, $data) = @_; my ($hash, $OpMode, $data) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $calias = AttrVal($name,"alias",$hash->{CAMNAME}); # Alias der Kamera wenn gesetzt oder Originalname aus SVS my $calias = AttrVal($name,"alias",$hash->{CAMNAME}); # Alias der Kamera wenn gesetzt oder Originalname aus SVS
@ -7521,13 +7567,10 @@ sub SSCam_prepareSendEmail ($$;$) {
$smtpsslport = AttrVal($name,"smtpSSLPort",0); $smtpsslport = AttrVal($name,"smtpSSLPort",0);
} }
### Bilddaten als Email versenden wenn Attribut "snapEmailTxt" definiert ist ### Bilddaten als Email versenden wenn $hash->{HELPER}{CANSENDSNAP} definiert ist
if($OpMode =~ /^getsnap/ && AttrVal($name, "snapEmailTxt", "")) { if($OpMode =~ /^getsnap/ && $hash->{HELPER}{CANSENDSNAP}) {
# Attribut snapEmailTxt kann übersteuert werden mit: $hash->{HELPER}{SMTPMSG} delete $hash->{HELPER}{CANSENDSNAP};
# Extraktion EMail-Texte my $mt = delete $hash->{HELPER}{SMTPMSG};
# Format in $hash->{HELPER}{SMTPMSG} muss sein: subject => <Betreff-Text>, body => <Mitteilung-Text>
my $mth = delete $hash->{HELPER}{SMTPMSG};
my $mt = $mth?$mth:AttrVal($name, "snapEmailTxt", "");
$mt =~ s/['"]//g; $mt =~ s/['"]//g;
my($subj,$body) = split(",", $mt, 2); my($subj,$body) = split(",", $mt, 2);
@ -7549,9 +7592,7 @@ sub SSCam_prepareSendEmail ($$;$) {
$tac = $hash->{HELPER}{TRANSACTION}; # Code der laufenden Transaktion $tac = $hash->{HELPER}{TRANSACTION}; # Code der laufenden Transaktion
$sdat = $data; $sdat = $data;
delete $hash->{HELPER}{CANSENDSNAP};
$ret = SSCam_sendEmail($hash, {'subject' => $smtpmsg{subject}, $ret = SSCam_sendEmail($hash, {'subject' => $smtpmsg{subject},
'part1txt' => $smtpmsg{body}, 'part1txt' => $smtpmsg{body},
'part2type' => 'image/jpeg', 'part2type' => 'image/jpeg',
@ -7564,13 +7605,10 @@ sub SSCam_prepareSendEmail ($$;$) {
'tac' => $tac, 'tac' => $tac,
} }
); );
return $ret;
} }
### Recordings als Email versenden wenn Attribut "recEmailTxt" definiert ist ### Recordings als Email versenden wenn $hash->{HELPER}{CANSENDREC} definiert ist
if($OpMode =~ /^GetRec/ && $hash->{HELPER}{CANSENDREC}) { if($OpMode =~ /^GetRec/ && $hash->{HELPER}{CANSENDREC}) {
# recEmailTxt aus $hash->{HELPER}{SMTPRECMSG}
delete $hash->{HELPER}{CANSENDREC}; delete $hash->{HELPER}{CANSENDREC};
my $mt = delete $hash->{HELPER}{SMTPRECMSG}; my $mt = delete $hash->{HELPER}{SMTPRECMSG};
$mt =~ s/['"]//g; $mt =~ s/['"]//g;
@ -7603,13 +7641,183 @@ sub SSCam_prepareSendEmail ($$;$) {
'sslfrominit' => $sslfrominit, 'sslfrominit' => $sslfrominit,
'smtpsslport' => $smtpsslport, 'smtpsslport' => $smtpsslport,
} }
); );
return $ret;
} }
### Bilddaten mit Telegram versenden
if($OpMode =~ /^getsnap/ && $hash->{HELPER}{CANTELESNAP}) {
# snapTelegramTxt aus $hash->{HELPER}{TELEMSG}
# Format in $hash->{HELPER}{TELEMSG} muss sein: tbot => <teleBot Device>, peers => <peer1 peer2 ..>, subject => <Beschreibungstext>
delete $hash->{HELPER}{CANTELESNAP};
my $mt = delete $hash->{HELPER}{TELEMSG};
$mt =~ s/['"]//g;
my($telebot,$peers,$subj) = split(",", $mt, 3);
my($tbotk,$tbott) = split("=>", $telebot) if($telebot);
my($peerk,$peert) = split("=>", $peers) if($peers);
my($subjk,$subjt) = split("=>", $subj) if($subj);
$tbotk = SSCam_trim($tbotk) if($tbotk);
$tbott = SSCam_trim($tbott) if($tbott);
$peerk = SSCam_trim($peerk) if($peerk);
$peert = SSCam_trim($peert) if($peert);
$subjk = SSCam_trim($subjk) if($subjk);
if($subjt) {
$subjt = SSCam_trim($subjt);
$subjt =~ s/\$CAM/$calias/g;
$subjt =~ s/\$DATE/$date/g;
$subjt =~ s/\$TIME/$time/g;
}
my %telemsg = ();
$telemsg{$tbotk} = "$tbott" if($tbott);
$telemsg{$peerk} = "$peert" if($peert);
$telemsg{$subjk} = "$subjt" if($subjt);
$tac = $hash->{HELPER}{TRANSACTION}; # Code der laufenden Transaktion
$sdat = $data;
$ret = SSCam_sendTelegram($hash, {'subject' => $telemsg{subject},
'part2type' => 'image/jpeg',
'sdat' => $sdat,
'opmode' => $OpMode,
'tac' => $tac,
'telebot' => $telemsg{$tbotk},
'peers' => $telemsg{$peerk},
}
);
}
return; return;
} }
#############################################################################################
# Telegram-Versand
#############################################################################################
sub SSCam_sendTelegram ($$) {
my ($hash, $extparamref) = @_;
my $name = $hash->{NAME};
my $ret;
Log3($name, 4, "$name - ####################################################");
Log3($name, 4, "$name - ### start send snapshot by TelegramBot ");
Log3($name, 4, "$name - ####################################################");
my %SSCam_teleparams = (
'subject' => { 'default'=>'', 'required'=>0, 'set'=>1},
'part1type' => { 'default'=>'text/plain; charset=UTF-8', 'required'=>1, 'set'=>1},
'part1txt' => { 'default'=>'', 'required'=>0, 'set'=>1},
'part2type' => { 'default'=>'', 'required'=>0, 'set'=>1},
'sdat' => { 'default'=>'', 'required'=>0, 'set'=>1}, # (Hash)Daten base64 codiert, wenn gesetzt muss 'part2type' auf 'image/jpeg' gesetzt sein
'image' => { 'default'=>'', 'required'=>0, 'set'=>1}, # Daten als File, wenn gesetzt muss 'part2type' auf 'image/jpeg' gesetzt sein
'fname' => { 'default'=>'image.jpg', 'required'=>0, 'set'=>1}, # Filename für "image"
'lsnaptime' => { 'default'=>'', 'required'=>0, 'set'=>1}, # Zeitstempel der Bilddaten
'opmode' => { 'default'=>'', 'required'=>1, 'set'=>1}, # OpMode muss gesetzt sein
'tac' => { 'default'=>'', 'required'=>0, 'set'=>1}, # übermittelter Transaktionscode der ausgewerteten Transaktion
'vdat' => { 'default'=>'', 'required'=>0, 'set'=>1}, # Videodaten, wenn gesetzt muss 'part2type' auf 'video/mpeg' gesetzt sein
'telebot' => { 'default'=>'', 'required'=>1, 'set'=>1}, # TelegramBot-Device welches zum Senden verwendet werden soll
'peers' => { 'default'=>'', 'required'=>0, 'set'=>1}, # TelegramBot Peers
);
my %params = ();
foreach my $key (keys %SSCam_teleparams) {
$params{$key} = AttrVal($name, $SSCam_teleparams{$key}->{attr}, $SSCam_teleparams{$key}->{default})
if(exists $SSCam_teleparams{$key}->{attr});
if($SSCam_teleparams{$key}->{set}) {
$params{$key} = $extparamref->{$key} if (exists $extparamref->{$key});
$params{$key} = $SSCam_teleparams{$key}->{default} if (!$extparamref->{$key} && !$SSCam_teleparams{$key}->{attr});
}
Log3($name, 4, "$name - param $key is now \"".$params{$key}."\" ") if($key !~ /sdat/);
Log3($name, 4, "$name - param $key is set") if($key =~ /sdat/ && $params{$key} ne '');
}
$params{name} = $name;
my @err = ();
foreach my $key (keys(%SSCam_teleparams)) {
push(@err, $key) if ($SSCam_teleparams{$key}->{required} && !$params{$key});
}
if ($#err >= 0) {
$ret = "Missing at least one required parameter or attribute: ".join(', ',@err);
Log3($name, 2, "$name - $ret");
readingsBeginUpdate($hash);
readingsBulkUpdate($hash,"sendTeleState",$ret);
readingsEndUpdate($hash, 1);
return $ret;
}
my $telebot = $params{telebot};
my $peers = $params{peers};
my $sdat = $params{sdat}; # Hash von Imagedaten base64 codiert
if(!$defs{$telebot}) {
$ret = "No TelegramBot device \"$telebot\" available";
readingsSingleUpdate($hash, "sendTeleState", $ret, 1);
Log3($name, 2, "$name - $ret");
return;
}
$hash->{HELPER}{PAREF} = \%params;
if(!$peers) {
$peers = AttrVal($telebot,"defaultPeer", "");
if(!$peers) {
$ret = "No peers of TelegramBot device \"$telebot\" found";
readingsSingleUpdate($hash, "sendTeleState", $ret, 1);
Log3($name, 2, "$name - $ret");
return;
}
}
no strict "refs";
my ($msg,$subject);
if($sdat) {
### Images liegen in einem Hash (Ref in $sdat) base64-codiert vor
my @as = sort{$b<=>$a}keys%{$sdat};
foreach my $key (@as) {
($msg,$subject) = SSCam_cmdSendTelegram($name,$key);
my $isMediaStream = 0;
( $isMediaStream ) = TelegramBot_IdentifyStream( $defs{$telebot}, $msg ) if ( defined( $msg ) );
$ret = TelegramBot_SendIt( $defs{$telebot}, $peers, $msg, $subject, $isMediaStream, undef, "" );
if($ret) {
readingsSingleUpdate($hash, "sendTeleState", $ret, 1);
Log3($name, 2, "$name - ERROR: $ret");
} else {
$ret = "Telegram message successfully sent to \"$peers\" by \"$telebot\" ";
readingsSingleUpdate($hash, "sendTeleState", $ret, 1);
Log3($name, 3, "$name - $ret");
}
}
}
use strict "refs";
%params = (); # erstellten Versandhash löschen
return;
}
####################################################################################################
# Bilddaten extrahieren für Telegram Versand
####################################################################################################
sub SSCam_cmdSendTelegram($$) {
my ($name,$key) = @_;
my $hash = $defs{$name};
my $paref = $hash->{HELPER}{PAREF};
my $subject = $paref->{subject};
my $ct = $paref->{sdat}{$key}{createdTm};
my $img = $paref->{sdat}{$key}{".imageData"};
my $fname = SSCam_trim($paref->{sdat}{$key}{fileName});
my $decoded = MIME::Base64::decode_base64($img);
Log3($name, 4, "$name - image data were decoded for TelegramBot prepare");
$subject =~ s/\$FILE/$fname/g;
$subject =~ s/\$CTIME/$ct/g;
return ($decoded,$subject);
}
############################################################################################# #############################################################################################
# SMTP EMail-Versand # SMTP EMail-Versand
############################################################################################# #############################################################################################
@ -8243,7 +8451,7 @@ return ($str);
<ul> <ul>
<li>Start a recording and send it optionally by Email </li> <li>Start a recording and send it optionally by Email </li>
<li>Stop a recording by command or automatically after an adjustable period </li> <li>Stop a recording by command or automatically after an adjustable period </li>
<li>Trigger of snapshots and optionally send them alltogether by Email using the integrated Email client </li> <li>Trigger of snapshots and optionally send them alltogether by Email/TelegramBot using the integrated Email client </li>
<li>Trigger snapshots of all defined cams and optionally send them alltogether by Email using the integrated Email client </li> <li>Trigger snapshots of all defined cams and optionally send them alltogether by Email using the integrated Email client </li>
<li>Deaktivate a Camera in Synology Surveillance Station</li> <li>Deaktivate a Camera in Synology Surveillance Station</li>
<li>Activate a Camera in Synology Surveillance Station</li> <li>Activate a Camera in Synology Surveillance Station</li>
@ -8271,7 +8479,6 @@ return ($str);
<li>Activation / Deactivation of a camera integrated PIR sensor </li> <li>Activation / Deactivation of a camera integrated PIR sensor </li>
<li>Creation of a readingsGroup device to display an overview of all defined SSCam devices (createReadingsGroup) </li> <li>Creation of a readingsGroup device to display an overview of all defined SSCam devices (createReadingsGroup) </li>
<li>automatized definition of all in SVS available cameras in FHEM (autocreateCams) </li> <li>automatized definition of all in SVS available cameras in FHEM (autocreateCams) </li>
<li>integrated send Email of snapshots </li>
<li>save the last recording of camera locally </li> <li>save the last recording of camera locally </li>
</ul> </ul>
</ul> </ul>
@ -9326,15 +9533,18 @@ http(s)://&lt;hostname&gt;&lt;port&gt;/webapi/entry.cgi?api=SYNO.SurveillanceSta
<b>subject => &lt;subject text&gt;, body => &lt;message text&gt; </b><br> <b>subject => &lt;subject text&gt;, body => &lt;message text&gt; </b><br>
The placeholder $CAM, $DATE and $TIME can be used. $CAM is The placeholder $CAM, $DATE and $TIME can be used. $CAM is
replaced by the device name, device alias or the name of camera in SVS if alias is not replaced by the device name, device alias or the name of camera in SVS if alias is not
defined. $DATE and $TIME are replaced with the current date and time. </td></tr> defined. $DATE and $TIME are replaced with the current date and time.
Optionally you can specify the "snapEmailTxt:"-tag when trigger snap shot with the "snap"-command.
In this case the Email shipping is activated one-time for the snapshot or the tag-text
is used instead of the text defined in the "snapEmailTxt"-attribute. </td></tr>
<tr><td style="vertical-align:top"> <b>recEmailTxt</b> <td>- <b>Activates the Email shipping of recordings.</b> This attribute has the format: <br> <tr><td style="vertical-align:top"> <b>recEmailTxt</b> <td>- <b>Activates the Email shipping of recordings.</b> This attribute has the format: <br>
<b>subject => &lt;subject text&gt;, body => &lt;message text&gt; </b><br> <b>subject => &lt;subject text&gt;, body => &lt;message text&gt; </b><br>
The placeholder $CAM, $DATE and $TIME can be used. $CAM is The placeholder $CAM, $DATE and $TIME can be used. $CAM is
replaced by the device name, device alias or the name of camera in SVS if alias is not replaced by the device name, device alias or the name of camera in SVS if alias is not
defined. $DATE and $TIME are replaced with the current date and time. defined. $DATE and $TIME are replaced with the current date and time.
Alternatively you can specify the "recEmailTxt:"-tag when start recording with the "On"-command. Optionally you can specify the "recEmailTxt:"-tag when start recording with the "on"-command.
In this case the Email shipping is temporaray activated for the started recording and the tag-text In this case the Email shipping is activated one-time for the started recording or the tag-text
is used instead of the text defined in the "recEmailTxt"-attribute.</td></tr> is used instead of the text defined in the "recEmailTxt"-attribute. </td></tr>
<tr><td> <b>smtpHost</b> </td><td>- Hostname of outgoing Email server (e.g. securesmtp.t-online.de) </td></tr> <tr><td> <b>smtpHost</b> </td><td>- Hostname of outgoing Email server (e.g. securesmtp.t-online.de) </td></tr>
<tr><td> <b>smtpFrom</b> </td><td>- Return address (&lt;name&gt@&lt;domain&gt) </td></tr> <tr><td> <b>smtpFrom</b> </td><td>- Return address (&lt;name&gt@&lt;domain&gt) </td></tr>
<tr><td> <b>smtpTo</b> </td><td>- Receiving address(es) (&lt;name&gt@&lt;domain&gt) </td></tr> <tr><td> <b>smtpTo</b> </td><td>- Receiving address(es) (&lt;name&gt@&lt;domain&gt) </td></tr>
@ -9665,10 +9875,17 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
<a name="snapEmailTxt"></a> <a name="snapEmailTxt"></a>
<li><b>snapEmailTxt subject => &lt;subject text&gt;, body => &lt;message text&gt; </b><br> <li><b>snapEmailTxt subject => &lt;subject text&gt;, body => &lt;message text&gt; </b><br>
Activates the Email shipping of snapshots after whose creation. <br> Activates the Email shipping of snapshots after whose creation. <br>
The attribute has to be definied in the form as described. You can use the placeholder variables $CAM, $DATE and $TIME. The attribute has to be definied in the form as described. You can use the placeholder in "subject" and "body". <br><br>
The variable $CAM is replaced by the device alias or the name of the camera in SVS if the device alias isn't available.
$DATE and $TIME are replaced with the current date and time. <ul>
<br><br> <table>
<colgroup> <col width=10%> <col width=90%> </colgroup>
<tr><td> $CAM </td><td>- Device alias respectively the name of the camera in SVS if the device alias isn't set </td></tr>
<tr><td> $DATE </td><td>- current date </td></tr>
<tr><td> $TIME </td><td>- aktuelle time </td></tr>
</table>
</ul>
<br>
<ul> <ul>
<b>Example:</b><br> <b>Example:</b><br>
@ -9855,7 +10072,7 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
<ul> <ul>
<li>Start einer Aufnahme und optionaler Versand per Email </li> <li>Start einer Aufnahme und optionaler Versand per Email </li>
<li>Stop einer Aufnahme per Befehl bzw. automatisch nach Ablauf einer einstellbaren Dauer </li> <li>Stop einer Aufnahme per Befehl bzw. automatisch nach Ablauf einer einstellbaren Dauer </li>
<li>Auslösen von Schnappschnüssen und optionaler Email-Versand mittels integrierten Email-Client </li> <li>Auslösen von Schnappschnüssen und optional gemeinsamer Email/TelegramBot-Versand mittels integrierten Email-Client </li>
<li>Auslösen von Schnappschnüssen aller definierten Kameras und optionaler gemeinsamer Email-Versand mittels integrierten Email-Client </li> <li>Auslösen von Schnappschnüssen aller definierten Kameras und optionaler gemeinsamer Email-Versand mittels integrierten Email-Client </li>
<li>Deaktivieren einer Kamera in Synology Surveillance Station</li> <li>Deaktivieren einer Kamera in Synology Surveillance Station</li>
<li>Aktivieren einer Kamera in Synology Surveillance Station</li> <li>Aktivieren einer Kamera in Synology Surveillance Station</li>
@ -9883,7 +10100,6 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
<li>Aktivierung / Deaktivierung eines kamerainternen PIR-Sensors </li> <li>Aktivierung / Deaktivierung eines kamerainternen PIR-Sensors </li>
<li>Erzeugung einer readingsGroup zur Anzeige aller definierten SSCam-Devices (createReadingsGroup) </li> <li>Erzeugung einer readingsGroup zur Anzeige aller definierten SSCam-Devices (createReadingsGroup) </li>
<li>Automatisiertes Anlegen aller in der SVS vorhandenen Kameras in FHEM (autocreateCams) </li> <li>Automatisiertes Anlegen aller in der SVS vorhandenen Kameras in FHEM (autocreateCams) </li>
<li>integrierter Email-Versand von Schnappschüssen </li>
<li>lokales Abspeichern der letzten Kamera-Aufnahme </li> <li>lokales Abspeichern der letzten Kamera-Aufnahme </li>
</ul> </ul>
</ul> </ul>
@ -10660,11 +10876,12 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
Um die Daten der letzen 1-10 Schnappschüsse zu versionieren, kann das <a href="#SSCamattr">Attribut</a> "snapReadingRotate" Um die Daten der letzen 1-10 Schnappschüsse zu versionieren, kann das <a href="#SSCamattr">Attribut</a> "snapReadingRotate"
verwendet werden. verwendet werden.
<br><br> <br><br>
Ein <b>Email-Versand</b> der Schnappschüsse kann durch Setzen des <a href="#SSCamattr">Attributs</a> "snapEmailTxt" aktiviert Ein <b>Email-Versand</b> der Schnappschüsse kann durch Setzen des <a href="#SSCamattr">Attributs</a> "snapEmailTxt" permanent aktiviert
werden. Zuvor ist der Email-Versand, wie im Abschnitt <a href="#SSCamEmail">Einstellung Email-Versand</a> beschrieben, werden. Zuvor ist der Email-Versand, wie im Abschnitt <a href="#SSCamEmail">Einstellung Email-Versand</a> beschrieben,
einzustellen. (Für weitere Informationen "<b>get &lt;name&gt; versionNotes 7</b>" ausführen) <br> einzustellen. (Für weitere Informationen "<b>get &lt;name&gt; versionNotes 7</b>" ausführen) <br>
Der Text im Attribut "snapEmailTxt" kann durch die Spezifikation des optionalen "snapEmailTxt:"-Tags, wie oben Der Text im Attribut "snapEmailTxt" kann durch die Spezifikation des optionalen "snapEmailTxt:"-Tags, wie oben
gezeigt, temporär überschrieben bzw. geändert werden. <br><br> gezeigt, temporär überschrieben bzw. geändert werden. Sollte das Attribut "snapEmailTxt" nicht gesetzt sein, wird durch Angabe dieses Tags
der Email-Versand einmalig aktiviert. <br><br>
<b>Beispiele:</b> <b>Beispiele:</b>
<pre> <pre>
@ -10983,7 +11200,10 @@ http(s)://&lt;hostname&gt;&lt;port&gt;/webapi/entry.cgi?api=SYNO.SurveillanceSta
Es können die Platzhalter $CAM, $DATE und $TIME verwendet werden. $CAM wird Es können die Platzhalter $CAM, $DATE und $TIME verwendet werden. $CAM wird
durch den Device-Namen, Device-Alias bzw. den Namen der Kamera in der SVS durch den Device-Namen, Device-Alias bzw. den Namen der Kamera in der SVS
ersetzt falls der Device-Alias nicht gesetzt ist. ersetzt falls der Device-Alias nicht gesetzt ist.
$DATE und $TIME werden durch das aktuelle Datum und Zeit ersetzt.</td></tr> $DATE und $TIME werden durch das aktuelle Datum und Zeit ersetzt. <br>
Der Email-Versand des letzten Schnappschusses wird einmalig aktiviert falls der "recEmailTxt:"-Tag
beim "snap"-Kommando verwendet wird bzw. der in diesem Tag definierte Text statt des Textes im
Attribut "recEmailTxt" verwendet. </td></tr>
<tr><td style="vertical-align:top"> <b>recEmailTxt</b> <td>- <b>Aktiviert den Email-Versand von Aufnahmen</b>. <tr><td style="vertical-align:top"> <b>recEmailTxt</b> <td>- <b>Aktiviert den Email-Versand von Aufnahmen</b>.
Das Attribut hat das Format: <br> Das Attribut hat das Format: <br>
@ -10994,8 +11214,10 @@ http(s)://&lt;hostname&gt;&lt;port&gt;/webapi/entry.cgi?api=SYNO.SurveillanceSta
durch den Device-Namen, Device-Alias bzw. den Namen der Kamera in der SVS durch den Device-Namen, Device-Alias bzw. den Namen der Kamera in der SVS
ersetzt falls der Device-Alias nicht gesetzt ist. ersetzt falls der Device-Alias nicht gesetzt ist.
$DATE und $TIME werden durch das aktuelle Datum und Zeit ersetzt. <br> $DATE und $TIME werden durch das aktuelle Datum und Zeit ersetzt. <br>
Der Email-Versand der letzten Aufnahme wird temporär aktiviert falls der "recEmailTxt:"-Tag beim Der Email-Versand der letzten Aufnahme wird einamlig aktiviert falls der "recEmailTxt:"-Tag beim
On-Kommando verwendet wird. </td></tr> "on"-Kommando verwendet wird bzw. der in diesem Tag definierte Text statt des Textes im
Attribut "recEmailTxt" verwendet. </td></tr>
<tr><td> <b>smtpHost</b> </td><td>- Hostname oder IP-Adresse des Postausgangsservers (z.B. securesmtp.t-online.de) </td></tr> <tr><td> <b>smtpHost</b> </td><td>- Hostname oder IP-Adresse des Postausgangsservers (z.B. securesmtp.t-online.de) </td></tr>
<tr><td> <b>smtpFrom</b> </td><td>- Absenderadresse (&lt;name&gt@&lt;domain&gt) </td></tr> <tr><td> <b>smtpFrom</b> </td><td>- Absenderadresse (&lt;name&gt@&lt;domain&gt) </td></tr>
<tr><td> <b>smtpTo</b> </td><td>- Empfängeradresse(n) (&lt;name&gt@&lt;domain&gt) </td></tr> <tr><td> <b>smtpTo</b> </td><td>- Empfängeradresse(n) (&lt;name&gt@&lt;domain&gt) </td></tr>
@ -11333,10 +11555,20 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
<a name="snapEmailTxt"></a> <a name="snapEmailTxt"></a>
<li><b>snapEmailTxt subject => &lt;Betreff-Text&gt;, body => &lt;Mitteilung-Text&gt; </b><br> <li><b>snapEmailTxt subject => &lt;Betreff-Text&gt;, body => &lt;Mitteilung-Text&gt; </b><br>
Aktiviert den Emailversand von Schnappschüssen nach deren Erstellung. <br> Aktiviert den Emailversand von Schnappschüssen nach deren Erstellung. Wurden mehrere Schnappschüsse ausgelöst,
Das Attribut muß in der angegebenen Form definiert werden. Es können die Platzhalter $CAM, $DATE und $TIME verwendet werden. werden sie gemeinsam in einer Mail versendet. <br>
$CAM wird durch den Device-Alias bzw. den Namen der Kamera in der SVS ersetzt falls der Device-Alias nicht vorhanden Das Attribut muß in der angegebenen Form definiert werden. <br>
ist. $DATE und $TIME werden durch das aktuelle Datum und Zeit ersetzt. <br><br> Es können die Platzhalter im subject verwendet werden. <br><br>
<ul>
<table>
<colgroup> <col width=10%> <col width=90%> </colgroup>
<tr><td> $CAM </td><td>- Device-Alias bzw. der Name der Kamera in der SVS falls der Device-Alias nicht vorhanden ist </td></tr>
<tr><td> $DATE </td><td>- aktuelles Datum </td></tr>
<tr><td> $TIME </td><td>- aktuelle Zeit </td></tr>
</table>
</ul>
<br>
<ul> <ul>
<b>Beispiel:</b><br> <b>Beispiel:</b><br>
@ -11344,6 +11576,39 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
</ul> </ul>
<br> <br>
</li> </li>
<a name="snapTelegramTxt"></a>
<li><b>snapTelegramTxt tbot => &lt;TelegramBot-Device&gt;, peers => [&lt;peer1 peer2 ...&gt;], subject => [&lt;Betreff-Text&gt;] </b><br>
Aktiviert den permanenten Versand von Schnappschüssen nach deren Erstellung per TelegramBot. Wurden mehrere Schnappschüsse ausgelöst,
werden sie sequentiell versendet.<br>
Das Attribut muß in der angegebenen Form definiert werden. Im Schlüssel "tbot" ist das TelegramBot-Device anzugeben, welches für
den Versand der Daten verwendet werden soll. Das <a href="http://fhem.de/commandref_DE.html#TelegramBot">TelegramBot-Device</a> muss natürlich
vorhanden und funktionstüchtig sein. <br>
Die Angabe von "peers" und "subject" ist optional, jedoch muß der Schlüssel (leer) angegeben werden.
Wurde "peer" nicht angegeben, wird der Default-Peer des TelegramBot verwendet. <br>
Es können die Platzhalter im subject verwendet werden. <br><br>
<ul>
<table>
<colgroup> <col width=10%> <col width=90%> </colgroup>
<tr><td> $CAM </td><td>- Device-Alias bzw. den Namen der Kamera in der SVS ersetzt falls der Device-Alias nicht vorhanden ist </td></tr>
<tr><td> $DATE </td><td>- aktuelles Datum </td></tr>
<tr><td> $TIME </td><td>- aktuelle Zeit </td></tr>
<tr><td> $FILE </td><td>- Filename des Schnappschusses </td></tr>
<tr><td> $CTIME </td><td>- Erstellungszeit des Schnappschusses </td></tr>
</table>
</ul>
<br>
<ul>
<b>Beispiele:</b><br>
snapTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; Bewegungsalarm ($FILE) <br>
snapTelegramTxt tbot =&gt; teleBot, peers =&gt; @nabuko @foo @bar, subject =&gt; <br>
snapTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; <br>
snapTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; Bewegungsalarm bei $CAM. Es wurde $CTIME der Schnappschuss $FILE erstellt <br>
</ul>
<br>
</li><br>
<a name="snapGalleryBoost"></a> <a name="snapGalleryBoost"></a>
<li><b>snapGalleryBoost</b><br> <li><b>snapGalleryBoost</b><br>