From ab46de6b662ffc1d0ec52ff4bb01c2b5978ee17a Mon Sep 17 00:00:00 2001 From: nasseeder1 Date: Fri, 1 Feb 2019 15:00:29 +0000 Subject: [PATCH] 49_SSCam: contrib 8.8.0 git-svn-id: https://svn.fhem.de/fhem/trunk@18478 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/contrib/DS_Starter/49_SSCam.pm | 475 ++++++++++++++++++++++------ 1 file changed, 370 insertions(+), 105 deletions(-) diff --git a/fhem/contrib/DS_Starter/49_SSCam.pm b/fhem/contrib/DS_Starter/49_SSCam.pm index e04ee6043..a9a3ba9bb 100644 --- a/fhem/contrib/DS_Starter/49_SSCam.pm +++ b/fhem/contrib/DS_Starter/49_SSCam.pm @@ -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 # @@ -47,6 +47,9 @@ use Encode; # Versions History intern 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.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 ", @@ -122,6 +125,7 @@ our %SSCam_vNotesIntern = ( # Versions History extern 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 ". "with the integrated Email client. You have to store SMTP credentials with \"smtpcredentials\" before. ", "8.6.2" => "25.01.2019 fix version numbering ", @@ -357,6 +361,7 @@ sub SSCam_Initialize($) { "smtpTo ". "smtpNoUseSSL:1,0 ". "snapEmailTxt ". + "snapTelegramTxt ". "snapGalleryBoost:0,1 ". "snapGallerySize:Icon,Full ". "snapGalleryNumber:$SSCAM_snum ". @@ -811,8 +816,7 @@ 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\"";} - my ($num,$lag,$ncount) = (1,2,1); - my $emtxt = ""; + my ($num,$lag,$ncount) = (1,2,1); if($prop && $prop =~ /^\d+$/) { # Anzahl der Schnappschüsse zu triggern (default: 1) $num = $prop; $ncount = $prop; @@ -824,25 +828,40 @@ sub SSCam_Set($@) { 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 + my $emtxt = AttrVal($name, "snapEmailTxt", ""); my $at = join(" ",@a); if($at =~ /snapEmailTxt:/) { $at =~ m/.*snapEmailTxt:"(.*)".*/i; $emtxt = $1; } - if (AttrVal($name, "snapEmailTxt", "")) { + if ($emtxt) { # Snap soll nach Erstellung per Email versendet werden - # snapEmailTxt muss sein: subject => , body => + # Format $emtxt muss sein: snapEmailTxt:"subject => , body => " 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 => , peers => , subject => " + $hash->{HELPER}{TELEMSG} = $teletxt; + } + + SSCam_camsnap("$name:$num:$lag:$ncount:$emtxt:$teletxt"); } 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\"";} my ($num,$lag,$ncount) = (1,2,1); my $cams = "all"; - my $emtxt = ''; if($prop && $prop =~ /^\d+$/) { # Anzahl der Schnappschüsse zu triggern (default: 1) $num = $prop; $ncount = $prop; @@ -878,6 +897,19 @@ sub SSCam_Set($@) { 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; $hash->{HELPER}{ALLSNAPREF} = $asref; my ($csnap,$cmail) = ("",""); @@ -885,10 +917,12 @@ sub SSCam_Set($@) { if(!AttrVal($key, "snapEmailTxt", "")) { delete $asref->{$key}; # Snap dieser Kamera auslösen aber nicht senden $csnap .= $csnap?", $key":$key; + $emtxt = ""; } else { $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\" "); @@ -1626,7 +1660,7 @@ sub SSCam_FWsummaryFn ($$$$) { my $imgrecendless = ""; my $cmdrecstop = "cmd=set $d off"; # Aufnahme Stop my $imgrecstop = ""; - 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 = ""; my $attr = AttrVal($d, "htmlattr", " "); @@ -2227,7 +2261,7 @@ sub SSCam_cammotdetsc($) { ############################################################################### sub SSCam_camsnap($) { 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 $camname = $hash->{CAMNAME}; my $errorcode; @@ -2264,7 +2298,8 @@ sub SSCam_camsnap($) { # einen Schnappschuß aufnehmen $hash->{OPMODE} = "Snap"; $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}{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) @@ -2275,7 +2310,7 @@ sub SSCam_camsnap($) { } else { $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}"); # prüfen ob Recording als Email versendet werden soll - SSCam_prepareSendEmail ($hash, $OpMode, \%sendrecs); + SSCam_prepareSendData ($hash, $OpMode, \%sendrecs); readingsBeginUpdate($hash); readingsBulkUpdate($hash,"Errorcode","none"); @@ -5095,13 +5130,14 @@ sub SSCam_camop_parse ($) { } - 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 + 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}:""; # Text für Email-Versand + my $teletxt = $hash->{HELPER}{TELEMSG}?$hash->{HELPER}{TELEMSG}:""; # Text für TelegramBot-Versand 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) { 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 ##### 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 my $i = 0; my $sn = 0; @@ -5208,33 +5244,42 @@ sub SSCam_camop_parse ($) { $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; + + # 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; - } - - # prüfen ob Schnappschuß als Email versendet werden soll - SSCam_prepareSendEmail ($hash, $OpMode, \%sendsnaps); + } + + # prüfen ob Schnappschuß versendet werden soll + SSCam_prepareSendData ($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; + # 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 + my @t = split(" ", FmtDateTime($data->{data}{data}[$i]{createdTm})); my @d = split("-", $t[0]); if($lang eq "DE") { @@ -5242,28 +5287,29 @@ sub SSCam_camop_parse ($) { } else { $createdTm = "$d[0]-$d[1]-$d[2] / $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}); - } - } + $allsnaps{$sn}{snapid} = $snapid; + $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}); + } + } } readingsBeginUpdate($hash); @@ -7282,7 +7328,7 @@ sub SSCam_composegallery ($;$$) { my $streamHash = $defs{$strmdev} if($strmdev); # Hash des SSCamSTRM-Devices 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 = ""; 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 # $data = zu versendende Daten, evtl. als Hash Referenz ############################################################################################# -sub SSCam_prepareSendEmail ($$;$) { +sub SSCam_prepareSendData ($$;$) { my ($hash, $OpMode, $data) = @_; my $name = $hash->{NAME}; 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); } - ### Bilddaten als Email versenden wenn Attribut "snapEmailTxt" definiert ist - if($OpMode =~ /^getsnap/ && AttrVal($name, "snapEmailTxt", "")) { - # Attribut snapEmailTxt kann übersteuert werden mit: $hash->{HELPER}{SMTPMSG} - # Extraktion EMail-Texte - # Format in $hash->{HELPER}{SMTPMSG} muss sein: subject => , body => - my $mth = delete $hash->{HELPER}{SMTPMSG}; - my $mt = $mth?$mth:AttrVal($name, "snapEmailTxt", ""); + ### Bilddaten als Email versenden wenn $hash->{HELPER}{CANSENDSNAP} definiert ist + if($OpMode =~ /^getsnap/ && $hash->{HELPER}{CANSENDSNAP}) { + delete $hash->{HELPER}{CANSENDSNAP}; + my $mt = delete $hash->{HELPER}{SMTPMSG}; $mt =~ s/['"]//g; my($subj,$body) = split(",", $mt, 2); @@ -7549,9 +7592,7 @@ sub SSCam_prepareSendEmail ($$;$) { $tac = $hash->{HELPER}{TRANSACTION}; # Code der laufenden Transaktion - $sdat = $data; - delete $hash->{HELPER}{CANSENDSNAP}; - + $sdat = $data; $ret = SSCam_sendEmail($hash, {'subject' => $smtpmsg{subject}, 'part1txt' => $smtpmsg{body}, 'part2type' => 'image/jpeg', @@ -7564,13 +7605,10 @@ sub SSCam_prepareSendEmail ($$;$) { '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}) { - # recEmailTxt aus $hash->{HELPER}{SMTPRECMSG} delete $hash->{HELPER}{CANSENDREC}; my $mt = delete $hash->{HELPER}{SMTPRECMSG}; $mt =~ s/['"]//g; @@ -7603,13 +7641,183 @@ sub SSCam_prepareSendEmail ($$;$) { 'sslfrominit' => $sslfrominit, '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 => , peers => , subject => + 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; } +############################################################################################# +# 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 ############################################################################################# @@ -8243,7 +8451,7 @@ return ($str);
  • Start a recording and send it optionally by Email
  • Stop a recording by command or automatically after an adjustable period
  • -
  • Trigger of snapshots and optionally send them alltogether by Email using the integrated Email client
  • +
  • Trigger of snapshots and optionally send them alltogether by Email/TelegramBot using the integrated Email client
  • Trigger snapshots of all defined cams 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
  • @@ -8271,7 +8479,6 @@ return ($str);
  • Activation / Deactivation of a camera integrated PIR sensor
  • Creation of a readingsGroup device to display an overview of all defined SSCam devices (createReadingsGroup)
  • automatized definition of all in SVS available cameras in FHEM (autocreateCams)
  • -
  • integrated send Email of snapshots
  • save the last recording of camera locally
@@ -9326,15 +9533,18 @@ http(s)://<hostname><port>/webapi/entry.cgi?api=SYNO.SurveillanceSta subject => <subject text>, body => <message text>
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 - defined. $DATE and $TIME are replaced with the current date and time. + 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. recEmailTxt - Activates the Email shipping of recordings. This attribute has the format:
subject => <subject text>, body => <message text>
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 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. - In this case the Email shipping is temporaray activated for the started recording and the tag-text - is used instead of the text defined in the "recEmailTxt"-attribute. + Optionally you can specify the "recEmailTxt:"-tag when start recording with the "on"-command. + 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. smtpHost - Hostname of outgoing Email server (e.g. securesmtp.t-online.de) smtpFrom - Return address (<name>@<domain>) smtpTo - Receiving address(es) (<name>@<domain>) @@ -9665,10 +9875,17 @@ attr <name> genericStrmHtmlTag <video $HTMLATTR controls autoplay>
  • snapEmailTxt subject => <subject text>, body => <message text>
    Activates the Email shipping of snapshots after whose creation.
    - 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. -

    + The attribute has to be definied in the form as described. You can use the placeholder in "subject" and "body".

    + +
      + + + + + +
      $CAM - Device alias respectively the name of the camera in SVS if the device alias isn't set
      $DATE - current date
      $TIME - aktuelle time
      +
    +
      Example:
      @@ -9855,7 +10072,7 @@ attr <name> genericStrmHtmlTag <video $HTMLATTR controls autoplay>
      • Start einer Aufnahme und optionaler Versand per Email
      • Stop einer Aufnahme per Befehl bzw. automatisch nach Ablauf einer einstellbaren Dauer
      • -
      • Auslösen von Schnappschnüssen und optionaler Email-Versand mittels integrierten Email-Client
      • +
      • Auslösen von Schnappschnüssen und optional gemeinsamer Email/TelegramBot-Versand mittels integrierten Email-Client
      • Auslösen von Schnappschnüssen aller definierten Kameras und optionaler gemeinsamer Email-Versand mittels integrierten Email-Client
      • Deaktivieren einer Kamera in Synology Surveillance Station
      • Aktivieren einer Kamera in Synology Surveillance Station
      • @@ -9883,7 +10100,6 @@ attr <name> genericStrmHtmlTag <video $HTMLATTR controls autoplay>
      • Aktivierung / Deaktivierung eines kamerainternen PIR-Sensors
      • Erzeugung einer readingsGroup zur Anzeige aller definierten SSCam-Devices (createReadingsGroup)
      • Automatisiertes Anlegen aller in der SVS vorhandenen Kameras in FHEM (autocreateCams)
      • -
      • integrierter Email-Versand von Schnappschüssen
      • lokales Abspeichern der letzten Kamera-Aufnahme
    @@ -10660,11 +10876,12 @@ attr <name> genericStrmHtmlTag <video $HTMLATTR controls autoplay> Um die Daten der letzen 1-10 Schnappschüsse zu versionieren, kann das Attribut "snapReadingRotate" verwendet werden.

    - Ein Email-Versand der Schnappschüsse kann durch Setzen des Attributs "snapEmailTxt" aktiviert + Ein Email-Versand der Schnappschüsse kann durch Setzen des Attributs "snapEmailTxt" permanent aktiviert werden. Zuvor ist der Email-Versand, wie im Abschnitt Einstellung Email-Versand beschrieben, einzustellen. (Für weitere Informationen "get <name> versionNotes 7" ausführen)
    Der Text im Attribut "snapEmailTxt" kann durch die Spezifikation des optionalen "snapEmailTxt:"-Tags, wie oben - gezeigt, temporär überschrieben bzw. geändert werden.

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

    Beispiele:
    @@ -10983,7 +11200,10 @@ http(s)://<hostname><port>/webapi/entry.cgi?api=SYNO.SurveillanceSta
                                                                       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
                                                                       ersetzt falls der Device-Alias nicht gesetzt ist. 
    -                                                                  $DATE und $TIME werden durch das aktuelle Datum und Zeit ersetzt.
    +                                                                  $DATE und $TIME werden durch das aktuelle Datum und Zeit ersetzt. 
    + 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. recEmailTxt - Aktiviert den Email-Versand von Aufnahmen. Das Attribut hat das Format:
    @@ -10994,8 +11214,10 @@ http(s)://<hostname><port>/webapi/entry.cgi?api=SYNO.SurveillanceSta durch den Device-Namen, 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.
    - Der Email-Versand der letzten Aufnahme wird temporär aktiviert falls der "recEmailTxt:"-Tag beim - On-Kommando verwendet wird. + Der Email-Versand der letzten Aufnahme wird einamlig aktiviert falls der "recEmailTxt:"-Tag beim + "on"-Kommando verwendet wird bzw. der in diesem Tag definierte Text statt des Textes im + Attribut "recEmailTxt" verwendet. + smtpHost - Hostname oder IP-Adresse des Postausgangsservers (z.B. securesmtp.t-online.de) smtpFrom - Absenderadresse (<name>@<domain>) smtpTo - Empfängeradresse(n) (<name>@<domain>) @@ -11333,10 +11555,20 @@ 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 $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.

    + Aktiviert den Emailversand von Schnappschüssen nach deren Erstellung. Wurden mehrere Schnappschüsse ausgelöst, + werden sie gemeinsam in einer Mail versendet.
    + Das Attribut muß in der angegebenen Form definiert werden.
    + Es können die Platzhalter im subject verwendet werden.

    + +
      + + + + + +
      $CAM - Device-Alias bzw. der Name der Kamera in der SVS falls der Device-Alias nicht vorhanden ist
      $DATE - aktuelles Datum
      $TIME - aktuelle Zeit
      +
    +
      Beispiel:
      @@ -11344,6 +11576,39 @@ attr <name> genericStrmHtmlTag <video $HTMLATTR controls autoplay>

  • + + +
  • snapTelegramTxt tbot => <TelegramBot-Device>, peers => [<peer1 peer2 ...>], subject => [<Betreff-Text>]
    + Aktiviert den permanenten Versand von Schnappschüssen nach deren Erstellung per TelegramBot. Wurden mehrere Schnappschüsse ausgelöst, + werden sie sequentiell versendet.
    + 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 TelegramBot-Device muss natürlich + vorhanden und funktionstüchtig sein.
    + 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.
    + Es können die Platzhalter im subject verwendet werden.

    + +
      + + + + + + + +
      $CAM - Device-Alias bzw. den Namen der Kamera in der SVS ersetzt falls der Device-Alias nicht vorhanden ist
      $DATE - aktuelles Datum
      $TIME - aktuelle Zeit
      $FILE - Filename des Schnappschusses
      $CTIME - Erstellungszeit des Schnappschusses
      +
    +
    + +
      + Beispiele:
      + snapTelegramTxt tbot => teleBot, peers => , subject => Bewegungsalarm ($FILE)
      + snapTelegramTxt tbot => teleBot, peers => @nabuko @foo @bar, subject =>
      + snapTelegramTxt tbot => teleBot, peers => , subject =>
      + snapTelegramTxt tbot => teleBot, peers => , subject => Bewegungsalarm bei $CAM. Es wurde $CTIME der Schnappschuss $FILE erstellt
      +
    +
    +

  • snapGalleryBoost