From 28dc072172a617adb71488c38fa4693877ae8121 Mon Sep 17 00:00:00 2001 From: nasseeder1 Date: Thu, 10 Jan 2019 19:00:15 +0000 Subject: [PATCH] 49_SSCam: trigger several number of snapshots with alternative text and send it alltogether by email (execute "get versionNotes" for informations) git-svn-id: https://svn.fhem.de/fhem/trunk@18207 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 3 + fhem/FHEM/49_SSCam.pm | 492 +++++++++++++++++++--------- fhem/contrib/DS_Starter/49_SSCam.pm | 24 +- 3 files changed, 352 insertions(+), 167 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index a85babccd..6ee980694 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -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 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 diff --git a/fhem/FHEM/49_SSCam.pm b/fhem/FHEM/49_SSCam.pm index a50f1a9eb..27e7675c5 100644 --- a/fhem/FHEM/49_SSCam.pm +++ b/fhem/FHEM/49_SSCam.pm @@ -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 => , body => ". + "\"]\", 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 => <Betreff-Text>, body => ". + "<Mitteilung-Text>\"]\". 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 => , body => - 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 = ""; my $cmdrecstop = "cmd=set $camname off"; # Aufnahme Stop my $imgrecstop = ""; - 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 = ""; my $cmdrefresh = "cmd=set $camname refresh STRM"; # Refresh in SSCamSTRM-Devices my $imgrefresh = ""; @@ -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 => , body => - 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);
  • Start a Recording
  • Stop a Recording (using command or automatically after the <RecordTime> period
  • -
  • Trigger a Snapshot
  • +
  • Trigger of snapshots and optionally send them alltogether by Email using the integrated Email client
  • Deaktivate a Camera in Synology Surveillance Station
  • Activate a Camera in Synology Surveillance Station
  • Control of the exposure modes day, night and automatic
  • @@ -8324,14 +8496,19 @@ attr <name> genericStrmHtmlTag <video $HTMLATTR controls autoplay>

      -
    • set <name> snap     (valid for CAM)

    • +
    • set <name> snap [<number>] [<time difference>] [snapEmailTxt:"subject => <subject text>, body => <message text>"]     (valid for CAM)

    • - 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.

      + device.
      + The snapshot Email shipping is activated by setting the attribute "snapEmailTxt". If you want + temporary overwrite the message text set in "snapEmailTxt", you can optionally specify the "snapEmailTxt:"-tag as shown + above.

      - Email shipping

      - The snapshot can be sent after creation with Email. For this purpose the module contains its own Email client. + Email shipping preparation

      + + The snapshots can be sent by Email 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 MIME::Lite. On debian systems it can be installed with command:

      @@ -8340,8 +8517,7 @@ attr <name> genericStrmHtmlTag <video $HTMLATTR controls autoplay>

    - The Email shipping is activated by setting the attribute "snapEmailTxt". - There are more attributes must be set or can be used optionally.
    + There are some attributes must be set or can be used optionally.
    At first the Credentials for access the Email outgoing server must be set by command "set <name> smtpcredentials <user> <password>". 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 <name> genericStrmHtmlTag <video $HTMLATTR controls autoplay> snapEmailTxt - Activates the Email shipping. Has the form:
    subject => <subject text>, body => <message text>
    - 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. + defined. $DATE and $TIME are replaced with the current date and time. smtpHost - Hostname of outgoing Email server (e.g. securesmtp.t-online.de) smtpFrom - Return address (<name>@<domain>) smtpTo - Receiving address(es) (<name>@<domain>) @@ -8904,13 +9080,14 @@ attr <name> genericStrmHtmlTag <video $HTMLATTR controls autoplay>
  • snapEmailTxt subject => <subject text>, body => <message text>
    Activates the Email shipping of snapshots after its creation.
    - 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.

      Example:
      - snapEmailTxt subject => Motion alarm $NAME, body => A motion was recognized on $NAME. + snapEmailTxt subject => Motion alarm $CAM, body => A motion was recognized at $CAM.

  • @@ -9087,7 +9264,7 @@ attr <name> genericStrmHtmlTag <video $HTMLATTR controls autoplay>
    • Start einer Aufnahme
    • Stop einer Aufnahme (per Befehl bzw. automatisch nach Ablauf der Aufnahmedauer)
    • -
    • Aufnehmen eines Schnappschusses und Ablage in der Synology Surveillance Station
    • +
    • Auslösen von Schnappschnüssen und optionaler Email-Versand mittels integrierten Email-Client
    • Deaktivieren einer Kamera in Synology Surveillance Station
    • Aktivieren einer Kamera in Synology Surveillance Station
    • Steuerung der Belichtungsmodi Tag, Nacht bzw. Automatisch
    • @@ -9866,15 +10043,20 @@ attr <name> genericStrmHtmlTag <video $HTMLATTR controls autoplay>

        -
      • set <name> snap     (gilt für CAM)

      • +
      • set <name> snap [<Anzahl>] [<Zeitabstand>] [snapEmailTxt:"subject => <Betreff-Text>, body => <Mitteilung-Text>"]     (gilt für CAM)

      • - 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.

        + Readings der Kamera gespeichert.
        + Der Email-Versand wird durch das Setzen des Attributs "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.

        - Email-Versand

        - Der Schnappschuß kann nach der Erstellung per Email versendet werden. Dazu enthält das Modul einen eigenen - Email-Client. Zur Verwendung dieser Funktion muss das Perl-Modul MIME::Lite installiert sein. Auf Debian-System kann + Email-Versand

        + Die Schnappschüsse können nach der Erstellung per Email gemeinsam versendet werden. Dazu enthält das Modul einen + eigenen Email-Client. + Zur Verwendung dieser Funktion muss das Perl-Modul MIME::Lite installiert sein. Auf Debian-System kann es mit

          @@ -9884,8 +10066,7 @@ attr <name> genericStrmHtmlTag <video $HTMLATTR controls autoplay> installiert werden.

          - Der Email-Versand wird durch das Setzen des Attributs "snapEmailTxt" eingeschaltet. - Weitere Attribute müssen gesetzt oder können optional verwendet werden.
          + Für die Verwendung des Email-Versands müssen einige Attribute gesetzt oder können optional genutzt werden.
          Die Credentials für den Zugang zum Email-Server müssen mit dem Befehl "set <name> smtpcredentials <user> <password>" 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 <name> genericStrmHtmlTag <video $HTMLATTR controls autoplay> snapEmailTxt - Aktiviert den Email-Versand. Die Eingabe hat die Form:
          subject => <Betreff-Text>, body => <Mitteilung-Text>
          - 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. + ersetzt falls der Device-Alias nicht gesetzt ist. + $DATE und $TIME werden durch das aktuelle Datum und Zeit ersetzt. smtpHost - Hostname oder IP-Adresse des Postausgangsservers (z.B. securesmtp.t-online.de) smtpFrom - Absenderadresse (<name>@<domain>) smtpTo - Empfängeradresse(n) (<name>@<domain>) @@ -10471,13 +10653,13 @@ attr <name> genericStrmHtmlTag <video $HTMLATTR controls autoplay>
        • snapEmailTxt subject => <Betreff-Text>, body => <Mitteilung-Text>
          Aktiviert den Emailversand von Schnappschüssen nach deren Erstellung.
          - 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.

          + 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.

            Beispiel:
            - snapEmailTxt subject => Bewegungsalarm $NAME, body => Eine Bewegung wurde an der $NAME registriert. + snapEmailTxt subject => Bewegungsalarm $CAM, body => Eine Bewegung wurde an der $CAM registriert.

        • diff --git a/fhem/contrib/DS_Starter/49_SSCam.pm b/fhem/contrib/DS_Starter/49_SSCam.pm index 482e87af6..3fe76bcb2 100644 --- a/fhem/contrib/DS_Starter/49_SSCam.pm +++ b/fhem/contrib/DS_Starter/49_SSCam.pm @@ -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);
          • Start a Recording
          • Stop a Recording (using command or automatically after the <RecordTime> period
          • -
          • Trigger a Snapshot
          • +
          • Trigger of snapshots and optionally send them alltogether by Email using the integrated Email client
          • Deaktivate a Camera in Synology Surveillance Station
          • Activate a Camera in Synology Surveillance Station
          • Control of the exposure modes day, night and automatic
          • @@ -8529,7 +8529,7 @@ attr <name> genericStrmHtmlTag <video $HTMLATTR controls autoplay> snapEmailTxt - Activates the Email shipping. Has the form:
            subject => <subject text>, body => <message text>
            - 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. smtpHost - Hostname of outgoing Email server (e.g. securesmtp.t-online.de) @@ -9080,14 +9080,14 @@ attr <name> genericStrmHtmlTag <video $HTMLATTR controls autoplay>
          • snapEmailTxt subject => <subject text>, body => <message text>
            Activates the Email shipping of snapshots after its creation.
            - 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.

              Example:
              - snapEmailTxt subject => Motion alarm $NAME, body => A motion was recognized on $NAME. + snapEmailTxt subject => Motion alarm $CAM, body => A motion was recognized at $CAM.

          • @@ -9264,7 +9264,7 @@ attr <name> genericStrmHtmlTag <video $HTMLATTR controls autoplay>
            • Start einer Aufnahme
            • Stop einer Aufnahme (per Befehl bzw. automatisch nach Ablauf der Aufnahmedauer)
            • -
            • Aufnehmen eines Schnappschusses und Ablage in der Synology Surveillance Station
            • +
            • Auslösen von Schnappschnüssen und optionaler Email-Versand mittels integrierten Email-Client
            • Deaktivieren einer Kamera in Synology Surveillance Station
            • Aktivieren einer Kamera in Synology Surveillance Station
            • Steuerung der Belichtungsmodi Tag, Nacht bzw. Automatisch
            • @@ -10078,7 +10078,7 @@ attr <name> genericStrmHtmlTag <video $HTMLATTR controls autoplay> snapEmailTxt - Aktiviert den Email-Versand. Die Eingabe hat die Form:
              subject => <Betreff-Text>, body => <Mitteilung-Text>
              - 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. @@ -10653,13 +10653,13 @@ attr <name> genericStrmHtmlTag <video $HTMLATTR controls autoplay>
            • snapEmailTxt subject => <Betreff-Text>, body => <Mitteilung-Text>
              Aktiviert den Emailversand von Schnappschüssen nach deren Erstellung.
              - 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.

                Beispiel:
                - snapEmailTxt subject => Bewegungsalarm $NAME, body => Eine Bewegung wurde an der $NAME registriert. + snapEmailTxt subject => Bewegungsalarm $CAM, body => Eine Bewegung wurde an der $CAM registriert.