2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-02-26 04:24:53 +00:00

49_SSCam: trigger several number of snapshots with alternative text and send it alltogether by email (execute "get <device> versionNotes" for informations)

git-svn-id: https://svn.fhem.de/fhem/trunk@18207 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2019-01-10 19:00:15 +00:00
parent 231002c56f
commit 28dc072172
3 changed files with 352 additions and 167 deletions
fhem
CHANGED
FHEM
contrib/DS_Starter

@ -1,5 +1,8 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it.
- feature: 49_SSCam: trigger several number of snapshots with alternative
text and send it alltogether by email
(execute "get <device> versionNotes" for informations)
- bugfix: 98_DOIFtools: fixed line break in DOIFtoolsLog
- feature: 72_FB_CALLMONITOR: support for contact images and download of
all available contact images from FritzBox

@ -47,6 +47,10 @@ use Encode;
# Versions History intern
our %SSCam_vNotesIntern = (
"8.4.2" => "10.01.2019 snapEmailTxt can use placeholders \$DATE, \$TIME ",
"8.4.1" => "09.01.2019 Transaction of snap and getsnapinfo implemented, debugactive token verbose level changed ",
"8.4.0" => "07.01.2019 command snap extended to \"snap [number] [lag] [snapEmailTxt:\"subject => <Betreff-Text>, body => ".
"<Mitteilung-Text>\"]\", SID-hash is deleted if attr \"session\" is set ",
"8.3.2" => "03.01.2019 fix Process died prematurely if Can't locate object method \"get_sslversion\" via package \"Net::SMTP::SSL\" ",
"8.3.1" => "02.01.2019 fix SMTP usage for older Net::SMTP, new attribute \"smtpSSLPort\"",
"8.3.0" => "02.01.2019 CAMLASTRECID replaced by Reading CamLastRecId, \"SYNO.SurveillanceStation.Recording\" added, ".
@ -110,6 +114,9 @@ our %SSCam_vNotesIntern = (
# Versions History extern
our %SSCam_vNotesExtern = (
"8.4.0" => "07.01.2019 Command snap is extended to syntax \"snap [number] [lag] [snapEmailTxt:\"subject => &lt;Betreff-Text&gt;, body => ".
"&lt;Mitteilung-Text&gt;\"]\". Now you are able to trigger several number of ".
"snapshots by only one snap-command. The triggered snapshots can be shipped alltogether with the internal email client. ",
"8.3.0" => "02.01.2019 new get command \"saveRecording\"",
"8.2.0" => "02.01.2019 SMTP Email delivery of snapshots implemented. You can send snapshots after it is created subsequentely ".
"with the integrated Email client. You have to store SMTP credentials with \"smtpcredentials\" before. ",
@ -515,6 +522,10 @@ sub SSCam_Attr($$$$) {
# $name is device name
# aName and aVal are Attribute name and value
if ($aName eq "session") {
delete $hash->{HELPER}{SID};
}
if ($aName =~ /hlsNetScript/ && SSCam_IsModelCam($hash)) {
return " The attribute \"$aName\" is only valid for devices of type \"SVS\"! Please set this attribute in a device of this type.";
}
@ -702,7 +713,7 @@ sub SSCam_Set($@) {
"on ".
"off:noArg ".
"motdetsc:disable,camera,SVS ".
"snap:noArg ".
"snap ".
(AttrVal($name, "snapGalleryBoost",0)?(AttrVal($name,"snapGalleryNumber",undef) || AttrVal($name,"snapGalleryBoost",0))?"snapGallery:noArg ":"snapGallery:$SSCAM_snum ":" ").
"createSnapGallery:noArg ".
"createStreamDev:generic,hls,mjpeg,switched ".
@ -736,7 +747,7 @@ sub SSCam_Set($@) {
if ($opt eq "credentials") {
return "Credentials are incomplete, use username password" if (!$prop || !$prop1);
return "Password is too long. It is limited up to and including 20 characters." if (length $prop1 > 20);
delete $hash->{HELPER}{SID} if($hash->{HELPER}{SID});
delete $hash->{HELPER}{SID};
($success) = SSCam_setcredentials($hash,"svs",$prop,$prop1);
$hash->{HELPER}{ACTIVE} = "off";
@ -779,18 +790,31 @@ sub SSCam_Set($@) {
} 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\"";}
$hash->{HELPER}{SNAPBYSTRMDEV} = 1 if ($prop && $prop =~ /STRM/); # $prop wird mitgegeben durch Snap by SSCamSTRM-Device
my ($num,$lag,$ncount) = (1,2,1);
my $emtxt = "";
if($prop && $prop =~ /[\d+]/) { # Anzahl der Schnappschüsse zu triggern (default: 1)
$num = $prop;
$ncount = $prop;
}
if($prop1 && $prop1 =~ /[\d+]/) { # Zeit zwischen zwei Schnappschüssen (default: 2 Sekunden)
$lag = $prop1;
}
$hash->{HELPER}{SNAPBYSTRMDEV} = 1 if ($prop2 && $prop2 =~ /STRM/); # $prop wird mitgegeben durch Snap by SSCamSTRM-Device
my $at = join(" ",@a);
if($at =~ /snapEmailTxt:/) {
$at =~ m/.*snapEmailTxt:"(.*)".*/i;
$emtxt = $1;
}
if (AttrVal($name, "snapEmailTxt", "")) {
# Snap soll nach Erstellung per Email versendet werden
# snapEmailTxt muss sein: subject => <Subject-Text>, body => <Body-Text>
if (!$hash->{CREDENTIALS}) {return "Credentials of $name are not set - make sure you've set it with \"set $name credentials 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\"";
}
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\"";}
}
SSCam_camsnap($hash);
SSCam_camsnap("$name:$num:$lag:$ncount:$emtxt");
} elsif ($opt eq "startTracking" && 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\"";}
@ -2108,14 +2132,21 @@ sub SSCam_cammotdetsc($) {
###############################################################################
# Kamera Schappschuß aufnehmen
# $num = Anzahl der Schnappschüsse
# $lag = Zeit zwischen zwei Schnappschüssen
# $ncount = Anzahl der Schnappschüsse zum rnterzählen
###############################################################################
sub SSCam_camsnap($) {
my ($hash) = @_;
my $camname = $hash->{CAMNAME};
my $name = $hash->{NAME};
my ($str) = @_;
my ($name,$num,$lag,$ncount,$emtxt,$tac) = split(":",$str);
my $hash = $defs{$name};
my $camname = $hash->{CAMNAME};
my $errorcode;
my $error;
$tac = (defined $tac)?$tac:5000;
my $ta = $hash->{HELPER}{TRANSACTION};
RemoveInternalTimer($hash, "SSCam_camsnap");
return if(IsDisabled($name));
@ -2140,17 +2171,22 @@ sub SSCam_camsnap($) {
return;
}
if ($hash->{HELPER}{ACTIVE} eq "off") {
if ($hash->{HELPER}{ACTIVE} eq "off" || ((defined $ta) && $ta == $tac)) {
# einen Schnappschuß aufnehmen
$hash->{OPMODE} = "Snap";
$hash->{HELPER}{LOGINRETRIES} = 0;
$hash->{HELPER}{CANSENDSNAP} = 1; # Versand Schnappschuß darf erfolgen falls gewünscht
$hash->{HELPER}{CANSENDSNAP} = 1 if(AttrVal($name, "snapEmailTxt", "")); # Versand Schnappschüsse soll erfolgen
$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}{SNAPNUMCOUNT} = $ncount if($ncount); # Restzahl der auszulösenden Schnappschüsse (wird runtergezählt)
$hash->{HELPER}{SMTPMSG} = $emtxt if($emtxt); # alternativer Text für Email-Versand
SSCam_setActiveToken($hash);
SSCam_getapisites($hash);
} else {
InternalTimer(gettimeofday()+0.3, "SSCam_camsnap", $hash, 0);
$tac = (defined $tac)?$tac:"";
InternalTimer(gettimeofday()+0.3, "SSCam_camsnap", "$name:$num:$lag:$ncount:$emtxt:$tac", 0);
}
}
@ -3029,14 +3065,17 @@ return;
###########################################################################
sub SSCam_getsnapinfo ($) {
my ($str) = @_;
my ($name,$slim,$ssize) = split(":",$str);
my ($name,$slim,$ssize,$tac) = split(":",$str);
my $hash = $defs{$name};
my $camname = $hash->{CAMNAME};
$tac = (defined $tac)?$tac:5000;
my $ta = $hash->{HELPER}{TRANSACTION};
RemoveInternalTimer("SSCam_getsnapinfo");
return if(IsDisabled($name));
if ($hash->{HELPER}{ACTIVE} eq "off") {
if ($hash->{HELPER}{ACTIVE} eq "off" || ((defined $ta) && $ta == $tac)) {
$hash->{OPMODE} = "getsnapinfo";
$hash->{OPMODE} = "getsnapgallery" if(exists($hash->{HELPER}{GETSNAPGALLERY}));
$hash->{HELPER}{LOGINRETRIES} = 0;
@ -3048,6 +3087,7 @@ sub SSCam_getsnapinfo ($) {
SSCam_getapisites($hash);
} else {
$tac = (defined $tac)?$tac:"";
InternalTimer(gettimeofday()+1.7, "SSCam_getsnapinfo", "$name:$slim:$ssize", 0);
}
}
@ -4868,6 +4908,11 @@ sub SSCam_camop_parse ($) {
# ein Schnapschuß wurde aufgenommen
# falls Aufnahme noch läuft -> state = on setzen
SSCam_refresh($hash,0,1,0); # kein Room-Refresh, SSCam-state-Event, kein SSCamSTRM-Event
my $tac = "";
if($hash->{HELPER}{CANSENDSNAP}) {
$tac = SSCam_openOrgetTrans($hash); # Transaktion starten oder vorhandenen Code holen
}
$snapid = $data->{data}{'id'};
readingsSingleUpdate($hash,"LastSnapId",$snapid, 0) if($snapid);
@ -4880,13 +4925,28 @@ sub SSCam_camop_parse ($) {
# Logausgabe
Log3($name, 3, "$name - Snapshot of Camera $camname has been done successfully");
# Token freigeben vor nächstem Kommando
SSCam_delActiveToken($hash);
my $num = $hash->{HELPER}{SNAPNUM}; # Gesamtzahl der auszulösenden Schnappschüsse
my $ncount = $hash->{HELPER}{SNAPNUMCOUNT}; # Restzahl der auszulösenden Schnappschüsse
$ncount--; # wird vermindert je Snap
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
if($ncount > 0) {
InternalTimer(gettimeofday()+$lag, "SSCam_camsnap", "$name:$num:$lag:$ncount:$emtxt:$tac", 0);
return;
}
# Schnappschußgalerie abrufen (snapGalleryBoost) oder nur Info des letzten Snaps
my ($slim,$ssize) = SSCam_snaplimsize($hash);
RemoveInternalTimer("SSCam_getsnapinfo");
InternalTimer(gettimeofday()+0.6, "SSCam_getsnapinfo", "$name:$slim:$ssize", 0);
# Anzahl und Size für Schnappschußabruf bestimmen
my ($slim,$ssize) = SSCam_snaplimsize($hash);
if(!$hash->{HELPER}{TRANSACTION}) {
# Token freigeben vor nächstem Kommando wenn keine Transaktion läuft
SSCam_delActiveToken($hash);
}
RemoveInternalTimer("SSCam_getsnapinfo");
InternalTimer(gettimeofday()+0.6, "SSCam_getsnapinfo", "$name:$slim:$ssize:$tac", 0);
return;
} elsif ($OpMode eq "getsnapinfo" ||
$OpMode eq "getsnapgallery" ||
@ -4906,7 +4966,8 @@ sub SSCam_camop_parse ($) {
$lstime = "n.a.";
}
Log3($name,4, "$name - Snap [0]: ID => $lsid, File => $lfname, Created => $lstime");
Log3($name, $verbose, "$name - Snapinfos of camera $camname retrieved");
Log3($name,4, "$name - Snap [0]: ID => $lsid, File => $lfname, Created => $lstime");
readingsBeginUpdate($hash);
readingsBulkUpdate($hash,"Errorcode","none");
@ -4916,7 +4977,7 @@ sub SSCam_camop_parse ($) {
readingsBulkUpdate($hash,"LastSnapTime", $lstime);
readingsEndUpdate($hash, 1);
# Schnapschuss soll als liveView angezeigt werden (mindestens 1 Bild vorhanden)
##### ein Schnapschuss soll als liveView angezeigt werden #####
Log3($name, 3, "$name - There is no snapshot of camera $camname to display ! Take one snapshot before.")
if(exists($hash->{HELPER}{RUNVIEW}) && $hash->{HELPER}{RUNVIEW} =~ /snap/ && !exists($data->{'data'}{'data'}[0]{imageData}));
@ -4925,53 +4986,92 @@ sub SSCam_camop_parse ($) {
$hash->{HELPER}{LINK} = $data->{data}{data}[0]{imageData};
}
##### eine Schnapschussgalerie soll angezeigt oder als Bulk versendet werden #####
if($OpMode eq "getsnapgallery") {
# es soll eine Schnappschußgallerie bereitgestellt (Attr snapGalleryBoost=1) bzw. gleich angezeigt werden (Attr snapGalleryBoost=0)
my $i = 0;
my $sn = 0;
my %allsnaps = (); # Schnappschuss Hash wird leer erstellt
$hash->{HELPER}{TOTALCNT} = $data->{data}{total}; # total Anzahl Schnappschüsse
while ($data->{'data'}{'data'}[$i]) {
if($data->{'data'}{'data'}[$i]{'camName'} ne $camname) {
$i += 1;
next;
}
$snapid = $data->{data}{data}[$i]{id};
my $createdTm = $data->{data}{data}[$i]{createdTm};
my $fileName = $data->{data}{data}[$i]{fileName};
my $imageData = $data->{data}{data}[$i]{imageData}; # Image data of snapshot in base64 format
$allsnaps{$sn}{snapid} = $snapid;
my @t = split(" ", FmtDateTime($createdTm));
my @d = split("-", $t[0]);
$createdTm = "$d[2].$d[1].$d[0] / $t[1]";
$allsnaps{$sn}{createdTm} = $createdTm;
$allsnaps{$sn}{fileName} = $fileName;
$allsnaps{$sn}{imageData} = $imageData;
Log3($name,4, "$name - Snap '$sn' added to gallery hash: ID => $allsnaps{$sn}{snapid}, File => $allsnaps{$sn}{fileName}, Created => $allsnaps{$sn}{createdTm}");
$sn += 1;
$i += 1;
}
# Hash der Schnapschüsse erstellen
$hash->{HELPER}{".SNAPHASH"} = \%allsnaps;
# Direktausgabe Snaphash wenn nicht gepollt wird
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");
}
delete($hash->{HELPER}{".SNAPHASH"}); # Snaphash löschen wenn nicht gepollt wird
delete($hash->{HELPER}{CL});
}
if($hash->{HELPER}{CANSENDSNAP}) {
# es sollen die Anzahl "$hash->{HELPER}{SNAPNUM}" Schnappschüsse versendet werden
my $i = 0;
my $sn = 0;
my %sendsnaps = (); # Schnappschuss Hash zum Versand wird leer erstellt
while ($data->{'data'}{'data'}[$i]) {
if($data->{'data'}{'data'}[$i]{'camName'} ne $camname) {
$i += 1;
next;
}
$snapid = $data->{data}{data}[$i]{id};
my $createdTm = $data->{data}{data}[$i]{createdTm};
my $fileName = $data->{data}{data}[$i]{fileName};
my $imageData = $data->{data}{data}[$i]{imageData}; # Image data of snapshot in base64 format
$sendsnaps{$sn}{snapid} = $snapid;
my @t = split(" ", FmtDateTime($createdTm));
my @d = split("-", $t[0]);
$createdTm = "$d[2].$d[1].$d[0] / $t[1]";
$sendsnaps{$sn}{createdTm} = $createdTm;
$sendsnaps{$sn}{fileName} = $fileName;
$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}");
$sn += 1;
$i += 1;
}
delete($hash->{HELPER}{GETSNAPGALLERY}); # Steuerbit getsnapgallery statt getsnapinfo
}
# Schnappschuß soll als Email versendet werden
if(AttrVal($name, "snapEmailTxt", "")) {
SSCam_prepareSendEmail ($hash, $OpMode, \%sendsnaps);
}
} else {
# es soll eine Schnappschußgalerie bereitgestellt (Attr snapGalleryBoost=1) bzw. gleich angezeigt
# werden (Attr snapGalleryBoost=0)
my $i = 0;
my $sn = 0;
my %allsnaps = (); # Schnappschuss Hash wird leer erstellt
$hash->{HELPER}{TOTALCNT} = $data->{data}{total}; # total Anzahl Schnappschüsse
while ($data->{'data'}{'data'}[$i]) {
if($data->{'data'}{'data'}[$i]{'camName'} ne $camname) {
$i += 1;
next;
}
$snapid = $data->{data}{data}[$i]{id};
my $createdTm = $data->{data}{data}[$i]{createdTm};
my $fileName = $data->{data}{data}[$i]{fileName};
my $imageData = $data->{data}{data}[$i]{imageData}; # Image data of snapshot in base64 format
$allsnaps{$sn}{snapid} = $snapid;
my @t = split(" ", FmtDateTime($createdTm));
my @d = split("-", $t[0]);
$createdTm = "$d[2].$d[1].$d[0] / $t[1]";
$allsnaps{$sn}{createdTm} = $createdTm;
$allsnaps{$sn}{fileName} = $fileName;
$allsnaps{$sn}{imageData} = $imageData;
Log3($name,4, "$name - Snap '$sn' added to gallery hash: ID => $allsnaps{$sn}{snapid}, File => $allsnaps{$sn}{fileName}, Created => $allsnaps{$sn}{createdTm}");
$sn += 1;
$i += 1;
}
# Hash der Schnapschüsse erstellen
$hash->{HELPER}{".SNAPHASH"} = \%allsnaps;
# Direktausgabe Snaphash wenn nicht gepollt wird
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");
}
delete($hash->{HELPER}{".SNAPHASH"}); # Snaphash löschen wenn nicht gepollt wird
delete($hash->{HELPER}{CL});
}
}
}
SSCam_closeTrans($hash); # Transaktion beenden
delete($hash->{HELPER}{GETSNAPGALLERY}); # Steuerbit getsnapgallery statt getsnapinfo
##### Fall abhängige Eventgenerierung #####
if ($hash->{HELPER}{SNAPBYSTRMDEV} || $hash->{HELPER}{LSNAPBYSTRMDEV}) {
# Snap durch SSCamSTRM-Device ausgelöst
SSCam_refresh($hash,0,0,1); # kein Room-Refresh, kein SSCam-state-Event, SSCamSTRM-Event
@ -4983,14 +5083,6 @@ sub SSCam_camop_parse ($) {
} else {
SSCam_refresh($hash,0,0,0); # kein Room-Refresh, SSCam-state-Event, SSCamSTRM-Event
}
Log3($name, $verbose, "$name - Snapinfos of camera $camname retrieved");
# Schnappschuß soll als Email versendet werden
if(AttrVal($name, "snapEmailTxt", "") && $hash->{HELPER}{CANSENDSNAP}) {
SSCam_prepareSendEmail ($hash, $OpMode, $data->{data}{data}[0]{imageData});
delete $hash->{HELPER}{CANSENDSNAP};
}
} elsif ($OpMode eq "runliveview" && $hash->{HELPER}{RUNVIEW} =~ m/^live_.*hls$/) {
# HLS Streaming wurde aktiviert
@ -5023,6 +5115,7 @@ sub SSCam_camop_parse ($) {
# Token freigeben vor hlsactivate
SSCam_delActiveToken($hash);
SSCam_hlsactivate($hash);
return;
} elsif ($OpMode eq "activate_hls") {
# HLS Streaming wurde aktiviert, Aktivitätsstatus speichern
@ -5768,7 +5861,7 @@ sub SSCam_login ($$) {
my $lrt = AttrVal($name,"loginRetries",3);
my ($url,$param);
delete $hash->{HELPER}{SID} if($hash->{HELPER}{SID});
delete $hash->{HELPER}{SID};
# Login und SID ermitteln
Log3($name, 4, "$name - --- Begin Function SSCam_login ---");
@ -6179,13 +6272,21 @@ sub SSCam_snaplimsize ($) {
if(!AttrVal($name,"snapGalleryBoost",0)) {
$slim = 1;
$ssize = 0;
$ssize = 2 if(AttrVal($name,"snapEmailTxt","")); # Full Size für EMail-Versand, wird durch "snapGallerySize" überschrieben
} else {
$hash->{HELPER}{GETSNAPGALLERY} = 1;
$slim = AttrVal($name,"snapGalleryNumber",$SSCam_slim); # Anzahl der abzurufenden Snaps
my $sg = AttrVal($name,"snapGallerySize","Icon"); # Auflösung Image
$ssize = ($sg eq "Icon")?1:2;
}
}
if($hash->{HELPER}{CANSENDSNAP}) {
# Versand Schnappschuß darf erfolgen falls gewünscht
# Galerie über "$hash->{HELPER}{SNAPNUM}" Snaps zum Versand abrufen
$hash->{HELPER}{GETSNAPGALLERY} = 1; # Steuerbit für Snap-Galerie
$slim = $hash->{HELPER}{SNAPNUM}; # enthält die Anzahl der zu versendenden Images
$ssize = 2; # Full Size für EMail-Versand
}
return ($slim,$ssize);
}
@ -6540,7 +6641,7 @@ sub SSCam_StreamDev($$$) {
my $imgrecendless = "<img src=\"$FW_ME/www/images/sscam/black_btn_RECSTART.png\">";
my $cmdrecstop = "cmd=set $camname off"; # Aufnahme Stop
my $imgrecstop = "<img src=\"$FW_ME/www/images/sscam/black_btn_RECSTOP.png\">";
my $cmddosnap = "cmd=set $camname snap STRM"; # Snapshot auslösen mit Kennzeichnung "by STRM-Device"
my $cmddosnap = "cmd=set $camname 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 $cmdrefresh = "cmd=set $camname refresh STRM"; # Refresh in SSCamSTRM-Devices
my $imgrefresh = "<img src=\"$FW_ME/www/images/default/Restart.png\">";
@ -7080,49 +7181,62 @@ return ($error);
#############################################################################################
# Vorbereitung SMTP EMail-Versand
# $OpMode = aktueller Operation Mode zur Unterscheidung was versendet werden soll
# $data = zu versendende Daten, evtl. anders bereitgestellt (ReadingsVal)
# $data = zu versendende Daten, evtl. als Hash Referenz
#############################################################################################
sub SSCam_prepareSendEmail ($$;$) {
my ($hash, $OpMode, $data) = @_;
my $name = $hash->{NAME};
my $calias = AttrVal($name,"alias",$hash->{CAMNAME}); # Alias der Kamera wenn gesetzt oder Originalname aus SVS
my ($ret,$sdat,$fname,$snapid,$lsnaptime) = ('','','','','');
my $snapnum = 1;
my $sp = AttrVal($name, "smtpPort", 25);
my $nousessl = AttrVal($name, "smtpNoUseSSL", 0);
my $nousessl = AttrVal($name, "smtpNoUseSSL", 0);
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;
my $date = sprintf "%02d.%02d.%04d" , $mday , $mon+=1 ,$year+=1900;
my $time = sprintf "%02d:%02d:%02d" , $hour , $min , $sec;
# Extraktion EMail-Texte
# Attribut snapEmailTxt kann übersteuert werden mit: $hash->{HELPER}{SMTPMSG}
# Format in $hash->{HELPER}{SMTPMSG} muss sein: subject => <Betreff-Text>, body => <Mitteilung-Text>
my $mt = AttrVal($name, "snapEmailTxt", "");
$mt =~ s/['"]//g;
my $mth = delete $hash->{HELPER}{SMTPMSG};
my $mt = $mth?$mth:AttrVal($name, "snapEmailTxt", "");
$mt =~ s/['"]//g;
my($subj,$body) = split(",", $mt);
my($subj,$body) = split(",", $mt, 2);
my($subjk,$subjt) = split("=>", $subj);
my($bodyk,$bodyt) = split("=>", $body);
$subjk = SSCam_trim($subjk);
$subjt = SSCam_trim($subjt);
$subjt =~ s/\$NAME/$calias/g;
$subjt =~ s/\$CAM/$calias/g;
$subjt =~ s/\$DATE/$date/g;
$subjt =~ s/\$TIME/$time/g;
$bodyk = SSCam_trim($bodyk);
$bodyt = SSCam_trim($bodyt);
$bodyt =~ s/\$NAME/$calias/g;
$bodyt =~ s/\$CAM/$calias/g;
$bodyt =~ s/\$DATE/$date/g;
$bodyt =~ s/\$TIME/$time/g;
my %smtpmsg = ();
$smtpmsg{$subjk} = "$subjt";
$smtpmsg{$bodyk} = "$bodyt";
if($OpMode =~ /^getsnap/) {
$fname = ReadingsVal($name,"LastSnapFilename","");
$snapid = ReadingsVal($name,"LastSnapId","");
$lsnaptime = ReadingsVal($name,"LastSnapTime","");
$sdat = $data;
}
my $sslfrominit = 0;
my $smtpsslport = 465;
if(AttrVal($name,"smtpSSLPort",0)) {
$sslfrominit = 1;
$smtpsslport = AttrVal($name,"smtpSSLPort",0);
}
my $tac = $hash->{HELPER}{TRANSACTION}; # Code der laufenden Transaktion
if($OpMode =~ /^getsnap/) {
$fname = ReadingsVal($name,"LastSnapFilename","");
$snapid = ReadingsVal($name,"LastSnapId","");
$lsnaptime = ReadingsVal($name,"LastSnapTime","");
$sdat = $data;
delete $hash->{HELPER}{CANSENDSNAP};
delete $hash->{HELPER}{SMTPMSG};
$ret = SSCam_sendEmail($hash, {'subject' => $smtpmsg{subject},
'part1txt' => $smtpmsg{body},
'part2type' => 'image/jpeg',
@ -7133,9 +7247,12 @@ sub SSCam_prepareSendEmail ($$;$) {
'opmode' => $OpMode,
'smtpnousessl' => $nousessl,
'sslfrominit' => $sslfrominit,
'smtpsslport' => $smtpsslport,
'smtpsslport' => $smtpsslport,
'tac' => $tac,
}
);
}
return $ret;
}
@ -7209,14 +7326,15 @@ sub SSCam_sendEmail ($$) {
'smtpsslport' => {'attr'=>'smtpSSLPort', 'default'=>'', 'required'=>0, 'set'=>1}, # SSL-Port, verwendet bei direktem SSL-Aufbau
'smtpnousessl' => {'attr'=>'smtpNoUseSSL','default'=>'0', 'required'=>0, 'set'=>1},
'smtpdebug' => {'attr'=>'smtpDebug', 'default'=>'0', 'required'=>0, 'set'=>0},
'sdat' => { 'default'=>'', 'required'=>0, 'set'=>1}, # Daten base64 codiert, wenn gesetzt muss 'part2' auf 'image/jpeg' gesetzt werden
'sdat' => { 'default'=>'', 'required'=>0, 'set'=>1}, # (Hash)Daten base64 codiert, wenn gesetzt muss 'part2' auf 'image/jpeg' gesetzt werden
'image' => { 'default'=>'', 'required'=>0, 'set'=>1}, # Daten als File, wenn gesetzt muss 'part2' auf 'image/jpeg' gesetzt werden
'fname' => { 'default'=>'image.jpg', 'required'=>0, 'set'=>1}, # Filename für "image" oder "sdat"
'lsnaptime' => { 'default'=>'', 'required'=>0, 'set'=>1}, # Zeitstempel des letzten Schnappschusses
'opmode' => { 'default'=>'', 'required'=>1, 'set'=>1}, # OpMode muss gesetzt sein
'sslfb' => { 'default'=>$sslfb, 'required'=>0, 'set'=>1}, # Flag für Verwendung altes Net::SMTP::SSL
'sslfrominit' => { 'default'=>'', 'required'=>0, 'set'=>1}, # SSL soll sofort ! aufgebaut werden
);
'tac' => { 'default'=>'', 'required'=>0, 'set'=>1}, # übermittelter Transaktionscode der ausgewerteten Transaktion
);
my %params = ();
foreach my $key (keys %SSCam_mailparams) {
@ -7270,17 +7388,18 @@ sub SSCam_sendEmailblocking($) {
my $to = $paref->{smtpTo};
my $msgtext = $paref->{msgtext};
my $smtpdebug = $paref->{smtpdebug};
my $sdat = $paref->{sdat}; # base64 kodierte Schnappschußdaten
my $image = $paref->{image}; # image, wenn gesetzt muss 'part2' auf 'image/jpeg' gesetzt sein
my $sdat = $paref->{sdat}; # Image Daten als Hash base64 codiert
my $image = $paref->{image}; # Image, wenn gesetzt muss 'part2' auf 'image/jpeg' gesetzt sein
my $fname = $paref->{fname}; # Filename von "image"
my $lsnaptime = $paref->{lsnaptime}; # Zeit des letzten Schnappschusses wenn gesetzt
my $opmode = $paref->{opmode}; # aktueller Operation Mode
my $sslfb = $paref->{sslfb}; # Flag für Verwendung altes Net::SMTP::SSL
my $sslfrominit = $paref->{sslfrominit}; # SSL soll sofort ! aufgebaut werden
my $tac = $paref->{tac}; # übermittelter Transaktionscode der ausgewerteten Transaktion
my $hash = $defs{$name};
my $sslver = "";
my ($err,$fh,$smtp);
my ($err,$fh,$smtp,@as);
# Credentials abrufen
my ($success, $username, $password) = SSCam_getcredentials($hash,0,"smtp");
@ -7318,28 +7437,37 @@ sub SSCam_sendEmailblocking($) {
);
}
### Add image, Das Image liegt base64-codiert vor und wird dekodiert in ein "in-memory IO" gespeichert (snap)
no strict "refs";
if($sdat) {
my $decoded = MIME::Base64::decode_base64($sdat);
my $mh = '';
if(open ($fh, '>', \$mh)) { # in-memory IO Handle
binmode $fh;
print $fh $decoded;
close($fh);
open ($fh, '<', \$mh);
Log3($name, 4, "$name - image data were saved to memory handle for smtp prepare");
} else {
$err = "Can't open memory handle: $!";
Log3($name, 2, "$name - $err");
$err = encode_base64($err,"");
return "$name|$err|''";
### Images liegen in einem Hash (Ref in $sdat) base64-codiert vor und werden dekodiert in ein "in-memory IO" gespeichert (snap)
my ($ct,$img,$decoded);
@as = sort{$a<=>$b}keys%{$sdat};
foreach my $key (@as) {
$ct = $sdat->{$key}{createdTm};
$img = $sdat->{$key}{imageData};
$fname = $sdat->{$key}{fileName};
$fh = '$fh'.$key;
$decoded = MIME::Base64::decode_base64($img);
my $mh = '';
if(open ($fh, '>', \$mh)) { # in-memory IO Handle
binmode $fh;
print $fh $decoded;
close $fh;
open ($fh, '<', \$mh);
Log3($name, 4, "$name - image data were saved to memory handle for smtp prepare");
} else {
$err = "Can't open memory handle: $!";
Log3($name, 2, "$name - $err");
$err = encode_base64($err,"");
return "$name|$err|''";
}
$mailmsg->attach(
Type => $part2type,
FH => $fh,
Filename => $fname,
Disposition => 'attachment',
);
}
$mailmsg->attach(
Type => $part2type,
FH => $fh,
Filename => $fname,
Disposition => 'attachment',
);
}
$mailmsg->attr('content-type.charset' => 'UTF-8');
@ -7451,10 +7579,17 @@ sub SSCam_sendEmailblocking($) {
return "$name|$err|''";
}
my $ret = "Email successfully sent ".( $sslver?"encoded by $sslver":"" );
my $ret = "Email transaction \"$tac\" successfully sent ".( $sslver?"encoded by $sslver":"" );
Log3($name, 3, "$name - $ret To: $to".(($cc)?", CC: $cc":"") );
close($fh) if($fh);
if($sdat) {
# handles schließen
foreach my $key (@as) {
close '$fh'.$key;
}
}
use strict "refs";
# Daten müssen als Einzeiler zurückgegeben werden
$ret = encode_base64($ret,"");
@ -7517,7 +7652,7 @@ sub SSCam_setActiveToken ($) {
$hash->{HELPER}{ACTIVE} = "on";
if (AttrVal($name,"debugactivetoken",0)) {
Log3($name, 3, "$name - Active-Token set by OPMODE: $hash->{OPMODE}");
Log3($name, 1, "$name - Active-Token set by OPMODE: $hash->{OPMODE}");
}
return;
@ -7532,12 +7667,49 @@ sub SSCam_delActiveToken ($) {
$hash->{HELPER}{ACTIVE} = "off";
if (AttrVal($name,"debugactivetoken",0)) {
Log3($name, 3, "$name - Active-Token deleted by OPMODE: $hash->{OPMODE}");
Log3($name, 1, "$name - Active-Token deleted by OPMODE: $hash->{OPMODE}");
}
return;
}
#############################################################################################
# Transaktion starten oder vorhandenen TA Code zurück liefern
#############################################################################################
sub SSCam_openOrgetTrans ($) {
my ($hash) = @_;
my $name = $hash->{NAME};
my $tac = "";
if(!$hash->{HELPER}{TRANSACTION}) {
$tac = int(rand(4500)); # Transaktionscode erzeugen und speichern
$hash->{HELPER}{TRANSACTION} = $tac;
if (AttrVal($name,"debugactivetoken",0)) {
Log3($name, 1, "$name - Transaction opened, TA-code: $tac");
}
} else {
$tac = $hash->{HELPER}{TRANSACTION}; # vorhandenen Transaktionscode zurück liefern
}
return $tac;
}
#############################################################################################
# Transaktion freigeben
#############################################################################################
sub SSCam_closeTrans ($) {
my ($hash) = @_;
my $name = $hash->{NAME};
return if(!defined $hash->{HELPER}{TRANSACTION});
my $tac = delete $hash->{HELPER}{TRANSACTION}; # Transaktion beenden
if (AttrVal($name,"debugactivetoken",0)) {
Log3($name, 1, "$name - Transaction \"$tac\" closed");
}
return;
}
#############################################################################################
# Leerzeichen am Anfang / Ende eines strings entfernen
#############################################################################################
@ -7565,7 +7737,7 @@ return ($str);
<ul>
<li>Start a Recording</li>
<li>Stop a Recording (using command or automatically after the &lt;RecordTime&gt; period</li>
<li>Trigger a Snapshot </li>
<li>Trigger of snapshots and optionally send them alltogether by Email using the integrated Email client </li>
<li>Deaktivate a Camera in Synology Surveillance Station</li>
<li>Activate a Camera in Synology Surveillance Station</li>
<li>Control of the exposure modes day, night and automatic </li>
@ -8324,14 +8496,19 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
<br><br>
<ul>
<li><b> set &lt;name&gt; snap </b> &nbsp;&nbsp;&nbsp;&nbsp;(valid for CAM)</li> <br>
<li><b> set &lt;name&gt; snap [&lt;number&gt;] [&lt;time difference&gt;] [snapEmailTxt:"subject => &lt;subject text&gt;, body => &lt;message text&gt;"]</b> &nbsp;&nbsp;&nbsp;&nbsp;(valid for CAM)</li> <br>
A snapshot will be triggered.
One or multiple snapshots are triggered. The number of snapshots to trigger and the time difference (in seconds) between
each snapshots can be optionally specified. Without any specification only one snapshot is triggered.
The ID and the filename of the last snapshot will be displayed in Reading "LastSnapId" respectively "LastSnapFilename" of the
device. <br><br>
device. <br>
The snapshot Email shipping is activated by setting the <a href="#SSCamattr">attribute</a> "snapEmailTxt". If you want
temporary overwrite the message text set in "snapEmailTxt", you can optionally specify the "snapEmailTxt:"-tag as shown
above. <br><br>
<b>Email shipping</b> <br><br>
The snapshot can be sent after creation with <b>Email</b>. For this purpose the module contains its own Email client.
<b>Email shipping preparation</b> <br><br>
The snapshots can be sent by <b>Email</b> alltogether after creation. For this purpose the module contains its own Email client.
Before you can use this function you have to install the Perl-module <b>MIME::Lite</b>. On debian systems it can be
installed with command: <br><br>
@ -8340,8 +8517,7 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
</ul>
<br>
The Email shipping is activated by setting the <a href="#SSCamattr">attribute</a> "snapEmailTxt".
There are more attributes must be set or can be used optionally. <br>
There are some attributes must be set or can be used optionally. <br>
At first the Credentials for access the Email outgoing server must be set by command <b>"set &lt;name&gt; smtpcredentials &lt;user&gt; &lt;password&gt;"</b>.
The connection establishment to the server is initially done unencrypted and switches to an encrypted connection if SSL
encryption is available. In that case the transmission of User/Password takes place encrypted too.
@ -8353,9 +8529,9 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
<colgroup> <col width=12%> <col width=88%> </colgroup>
<tr><td style="vertical-align:top"> <b>snapEmailTxt</b> <td>- Activates the Email shipping. Has the form: <br>
<code>subject => &lt;subject text&gt;, body => &lt;message text&gt; </code><br>
The placeholder variable $NAME can be used. $NAME is
The placeholder variables $CAM, $DATE and $TIME can be used. $CAM is
replaced by the device alias or the name of camera in SVS if alias is not
defined. </td></tr>
defined. $DATE and $TIME are replaced with the current date and time. </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>smtpTo</b> </td><td>- Receiving address(es) (&lt;name&gt@&lt;domain&gt) </td></tr>
@ -8904,13 +9080,14 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
<a name="snapEmailTxt"></a>
<li><b>snapEmailTxt subject => &lt;subject text&gt;, body => &lt;message text&gt; </b><br>
Activates the Email shipping of snapshots after its creation. <br>
The attribute has to be definied in the form as described. You can use the placeholder variable $NAME.
The variable $NAME is replaced by the device alias or the name of the camera in SVS if the device alias isn't available.
The attribute has to be definied in the form as described. You can use the placeholder variables $CAM, $DATE and $TIME.
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.
<br><br>
<ul>
<b>Example:</b><br>
snapEmailTxt subject => Motion alarm $NAME, body => A motion was recognized on $NAME.
snapEmailTxt subject => Motion alarm $CAM, body => A motion was recognized at $CAM.
</ul>
<br>
</li>
@ -9087,7 +9264,7 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
<ul>
<li>Start einer Aufnahme</li>
<li>Stop einer Aufnahme (per Befehl bzw. automatisch nach Ablauf der Aufnahmedauer) </li>
<li>Aufnehmen eines Schnappschusses und Ablage in der Synology Surveillance Station </li>
<li>Auslösen von Schnappschnüssen und optionaler Email-Versand mittels integrierten Email-Client </li>
<li>Deaktivieren einer Kamera in Synology Surveillance Station</li>
<li>Aktivieren einer Kamera in Synology Surveillance Station</li>
<li>Steuerung der Belichtungsmodi Tag, Nacht bzw. Automatisch </li>
@ -9866,15 +10043,20 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
<br><br>
<ul>
<li><b> set &lt;name&gt; snap </b> &nbsp;&nbsp;&nbsp;&nbsp;(gilt für CAM)</li> <br>
<li><b> set &lt;name&gt; snap [&lt;Anzahl&gt;] [&lt;Zeitabstand&gt;] [snapEmailTxt:"subject => &lt;Betreff-Text&gt;, body => &lt;Mitteilung-Text&gt;"]</b> &nbsp;&nbsp;&nbsp;&nbsp;(gilt für CAM)</li> <br>
Ein Schnappschuß wird ausgelöst.
Ein oder mehrere Schnappschüsse werden ausgelöst. Es kann die Anzahl der auszulösenden Schnappschüsse und deren zeitlicher
Abstand in Sekunden optional angegeben werden. Ohne Angabe wird ein Schnappschuß getriggert.
Es wird die ID und der Filename des letzten Snapshots als Wert der Variable "LastSnapId" bzw. "LastSnapFilename" in den
Readings der Kamera gespeichert. <br><br>
Readings der Kamera gespeichert. <br>
Der Email-Versand wird durch das Setzen des <a href="#SSCamattr">Attributs</a> "snapEmailTxt" eingeschaltet. 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>
<b>Email-Versand</b> <br><br>
Der Schnappschuß kann nach der Erstellung per <b>Email</b> versendet werden. Dazu enthält das Modul einen eigenen
Email-Client. Zur Verwendung dieser Funktion muss das Perl-Modul <b>MIME::Lite</b> installiert sein. Auf Debian-System kann
<b>Email-Versand </b> <br><br>
Die Schnappschüsse können nach der Erstellung per <b>Email</b> gemeinsam versendet werden. Dazu enthält das Modul einen
eigenen Email-Client.
Zur Verwendung dieser Funktion muss das Perl-Modul <b>MIME::Lite</b> installiert sein. Auf Debian-System kann
es mit <br><br>
<ul>
@ -9884,8 +10066,7 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
installiert werden. <br><br>
Der Email-Versand wird durch das Setzen des <a href="#SSCamattr">Attributs</a> "snapEmailTxt" eingeschaltet.
Weitere Attribute müssen gesetzt oder können optional verwendet werden. <br>
Für die Verwendung des Email-Versands müssen einige Attribute gesetzt oder können optional genutzt werden. <br>
Die Credentials für den Zugang zum Email-Server müssen mit dem Befehl <b>"set &lt;name&gt; smtpcredentials &lt;user&gt; &lt;password&gt;"</b>
gesetzt werden. Der Verbindungsaufbau zum Postausgangsserver erfolgt initial unverschüsselt und wechselt zu einer verschlüsselten
Verbindung wenn SSL zur Verfügung steht. In diesem Fall erfolgt auch die Übermittlung von User/Password verschlüsselt.
@ -9897,9 +10078,10 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
<colgroup> <col width=12%> <col width=88%> </colgroup>
<tr><td style="vertical-align:top"> <b>snapEmailTxt</b> <td>- Aktiviert den Email-Versand. Die Eingabe hat die Form: <br>
<code>subject => &lt;Betreff-Text&gt;, body => &lt;Mitteilung-Text&gt;</code><br>
Es kann der Platzhalter $NAME verwendet werden. $NAME wird
Es können die Platzhalter $CAM, $DATE und $TIME verwendet werden. $CAM wird
durch den Device-Alias bzw. den Namen der Kamera in der SVS
ersetzt falls der Device-Alias nicht gesetzt ist. </td></tr>
ersetzt falls der Device-Alias nicht gesetzt ist.
$DATE und $TIME werden durch das aktuelle Datum und Zeit ersetzt.</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>smtpTo</b> </td><td>- Empfängeradresse(n) (&lt;name&gt@&lt;domain&gt) </td></tr>
@ -10471,13 +10653,13 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
<a name="snapEmailTxt"></a>
<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>
Das Attribut muß in der angegebenen Form definiert werden. Es kann der Platzhalter $NAME verwendet werden.
$NAME wird durch den Device-Alias bzw. den Namen der Kamera in der SVS ersetzt falls der Device-Alias nicht vorhanden
ist. <br><br>
Das Attribut muß in der angegebenen Form definiert werden. Es können die Platzhalter $CAM, $DATE und $TIME verwendet werden.
$CAM wird durch den Device-Alias bzw. den Namen der Kamera in der SVS ersetzt falls der Device-Alias nicht vorhanden
ist. $DATE und $TIME werden durch das aktuelle Datum und Zeit ersetzt. <br><br>
<ul>
<b>Beispiel:</b><br>
snapEmailTxt subject => Bewegungsalarm $NAME, body => Eine Bewegung wurde an der $NAME registriert.
snapEmailTxt subject => Bewegungsalarm $CAM, body => Eine Bewegung wurde an der $CAM registriert.
</ul>
<br>
</li>

@ -7208,12 +7208,12 @@ sub SSCam_prepareSendEmail ($$;$) {
my($bodyk,$bodyt) = split("=>", $body);
$subjk = SSCam_trim($subjk);
$subjt = SSCam_trim($subjt);
$subjt =~ s/\$NAME/$calias/g;
$subjt =~ s/\$CAM/$calias/g;
$subjt =~ s/\$DATE/$date/g;
$subjt =~ s/\$TIME/$time/g;
$bodyk = SSCam_trim($bodyk);
$bodyt = SSCam_trim($bodyt);
$bodyt =~ s/\$NAME/$calias/g;
$bodyt =~ s/\$CAM/$calias/g;
$bodyt =~ s/\$DATE/$date/g;
$bodyt =~ s/\$TIME/$time/g;
my %smtpmsg = ();
@ -7737,7 +7737,7 @@ return ($str);
<ul>
<li>Start a Recording</li>
<li>Stop a Recording (using command or automatically after the &lt;RecordTime&gt; period</li>
<li>Trigger a Snapshot </li>
<li>Trigger of snapshots and optionally send them alltogether by Email using the integrated Email client </li>
<li>Deaktivate a Camera in Synology Surveillance Station</li>
<li>Activate a Camera in Synology Surveillance Station</li>
<li>Control of the exposure modes day, night and automatic </li>
@ -8529,7 +8529,7 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
<colgroup> <col width=12%> <col width=88%> </colgroup>
<tr><td style="vertical-align:top"> <b>snapEmailTxt</b> <td>- Activates the Email shipping. Has the form: <br>
<code>subject => &lt;subject text&gt;, body => &lt;message text&gt; </code><br>
The placeholder variables $NAME, $DATE and $TIME can be used. $NAME is
The placeholder variables $CAM, $DATE and $TIME can be used. $CAM is
replaced by the 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>
<tr><td> <b>smtpHost</b> </td><td>- Hostname of outgoing Email server (e.g. securesmtp.t-online.de) </td></tr>
@ -9080,14 +9080,14 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
<a name="snapEmailTxt"></a>
<li><b>snapEmailTxt subject => &lt;subject text&gt;, body => &lt;message text&gt; </b><br>
Activates the Email shipping of snapshots after its creation. <br>
The attribute has to be definied in the form as described. You can use the placeholder variables $NAME, $DATE and $TIME.
The variable $NAME is replaced by the device alias or the name of the camera in SVS if the device alias isn't available.
The attribute has to be definied in the form as described. You can use the placeholder variables $CAM, $DATE and $TIME.
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.
<br><br>
<ul>
<b>Example:</b><br>
snapEmailTxt subject => Motion alarm $NAME, body => A motion was recognized on $NAME.
snapEmailTxt subject => Motion alarm $CAM, body => A motion was recognized at $CAM.
</ul>
<br>
</li>
@ -9264,7 +9264,7 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
<ul>
<li>Start einer Aufnahme</li>
<li>Stop einer Aufnahme (per Befehl bzw. automatisch nach Ablauf der Aufnahmedauer) </li>
<li>Aufnehmen eines Schnappschusses und Ablage in der Synology Surveillance Station </li>
<li>Auslösen von Schnappschnüssen und optionaler Email-Versand mittels integrierten Email-Client </li>
<li>Deaktivieren einer Kamera in Synology Surveillance Station</li>
<li>Aktivieren einer Kamera in Synology Surveillance Station</li>
<li>Steuerung der Belichtungsmodi Tag, Nacht bzw. Automatisch </li>
@ -10078,7 +10078,7 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
<colgroup> <col width=12%> <col width=88%> </colgroup>
<tr><td style="vertical-align:top"> <b>snapEmailTxt</b> <td>- Aktiviert den Email-Versand. Die Eingabe hat die Form: <br>
<code>subject => &lt;Betreff-Text&gt;, body => &lt;Mitteilung-Text&gt;</code><br>
Es können die Platzhalter $NAME, $DATE und $TIME verwendet werden. $NAME wird
Es können die Platzhalter $CAM, $DATE und $TIME verwendet werden. $CAM wird
durch den Device-Alias bzw. den Namen der Kamera in der SVS
ersetzt falls der Device-Alias nicht gesetzt ist.
$DATE und $TIME werden durch das aktuelle Datum und Zeit ersetzt.</td></tr>
@ -10653,13 +10653,13 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
<a name="snapEmailTxt"></a>
<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>
Das Attribut muß in der angegebenen Form definiert werden. Es können die Platzhalter $NAME, $DATE und $TIME verwendet werden.
$NAME 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. Es können die Platzhalter $CAM, $DATE und $TIME verwendet werden.
$CAM wird durch den Device-Alias bzw. den Namen der Kamera in der SVS ersetzt falls der Device-Alias nicht vorhanden
ist. $DATE und $TIME werden durch das aktuelle Datum und Zeit ersetzt. <br><br>
<ul>
<b>Beispiel:</b><br>
snapEmailTxt subject => Bewegungsalarm $NAME, body => Eine Bewegung wurde an der $NAME registriert.
snapEmailTxt subject => Bewegungsalarm $CAM, body => Eine Bewegung wurde an der $CAM registriert.
</ul>
<br>
</li>