2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-07 12:58:13 +00:00

49_SSCam: contrib 8.8.0

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

View File

@ -1,5 +1,5 @@
########################################################################################################################
# $Id: 49_SSCam.pm 18411 2019-01-25 13:17:13Z DS_Starter $
# $Id: 49_SSCam.pm 18452 2019-01-29 22:39:55Z DS_Starter $
#########################################################################################################################
# 49_SSCam.pm
#
@ -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 => <Subject-Text>, body => <Body-Text>
# Format $emtxt muss sein: snapEmailTxt:"subject => <Subject-Text>, body => <Body-Text>"
if (!$hash->{SMTPCREDENTIALS}) {return "Due to attribute \"snapEmailTxt\" is set, you want to send snapshots by email but SMTP credentials are not set - make sure you've set credentials with \"set $name smtpcredentials username password\"";}
$hash->{HELPER}{SMTPMSG} = $emtxt;
}
SSCam_camsnap("$name:$num:$lag:$ncount:$emtxt");
my $teletxt = AttrVal($name, "snapTelegramTxt", "");
my $bt = join(" ",@a);
if($bt =~ /snapTelegramTxt:/) {
$bt =~ m/.*snapTelegramTxt:"(.*)".*/i;
$teletxt = $1;
}
if ($teletxt) {
# Snap soll nach Erstellung per TelegramBot versendet werden
# Format $teletxt muss sein: snapTelegramTxt:"tbot => <teleBot Device>, peers => <peer1 peer2 ..>, subject => <Beschreibungstext>"
$hash->{HELPER}{TELEMSG} = $teletxt;
}
SSCam_camsnap("$name:$num:$lag:$ncount:$emtxt:$teletxt");
} elsif ($opt eq "snapCams" && !SSCam_IsModelCam($hash)) {
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 = "<img src=\"$FW_ME/www/images/sscam/black_btn_RECSTART.png\">";
my $cmdrecstop = "cmd=set $d off"; # Aufnahme Stop
my $imgrecstop = "<img src=\"$FW_ME/www/images/sscam/black_btn_RECSTOP.png\">";
my $cmddosnap = "cmd=set $d snap STRM"; # Snapshot auslösen mit Kennzeichnung "by STRM-Device"
my $cmddosnap = "cmd=set $d snap 1 2 STRM"; # Snapshot auslösen mit Kennzeichnung "by STRM-Device"
my $imgdosnap = "<img src=\"$FW_ME/www/images/sscam/black_btn_DOSNAP.png\">";
my $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 = "<img src=\"$FW_ME/www/images/sscam/black_btn_DOSNAP.png\">";
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 => <Betreff-Text>, body => <Mitteilung-Text>
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 => <teleBot Device>, peers => <peer1 peer2 ..>, subject => <Beschreibungstext>
delete $hash->{HELPER}{CANTELESNAP};
my $mt = delete $hash->{HELPER}{TELEMSG};
$mt =~ s/['"]//g;
my($telebot,$peers,$subj) = split(",", $mt, 3);
my($tbotk,$tbott) = split("=>", $telebot) if($telebot);
my($peerk,$peert) = split("=>", $peers) if($peers);
my($subjk,$subjt) = split("=>", $subj) if($subj);
$tbotk = SSCam_trim($tbotk) if($tbotk);
$tbott = SSCam_trim($tbott) if($tbott);
$peerk = SSCam_trim($peerk) if($peerk);
$peert = SSCam_trim($peert) if($peert);
$subjk = SSCam_trim($subjk) if($subjk);
if($subjt) {
$subjt = SSCam_trim($subjt);
$subjt =~ s/\$CAM/$calias/g;
$subjt =~ s/\$DATE/$date/g;
$subjt =~ s/\$TIME/$time/g;
}
my %telemsg = ();
$telemsg{$tbotk} = "$tbott" if($tbott);
$telemsg{$peerk} = "$peert" if($peert);
$telemsg{$subjk} = "$subjt" if($subjt);
$tac = $hash->{HELPER}{TRANSACTION}; # Code der laufenden Transaktion
$sdat = $data;
$ret = SSCam_sendTelegram($hash, {'subject' => $telemsg{subject},
'part2type' => 'image/jpeg',
'sdat' => $sdat,
'opmode' => $OpMode,
'tac' => $tac,
'telebot' => $telemsg{$tbotk},
'peers' => $telemsg{$peerk},
}
);
}
return;
}
#############################################################################################
# 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);
<ul>
<li>Start a recording and send it optionally by Email </li>
<li>Stop a recording by command or automatically after an adjustable period </li>
<li>Trigger of snapshots and optionally send them alltogether by Email using the integrated Email client </li>
<li>Trigger of snapshots and optionally send them alltogether by Email/TelegramBot using the integrated Email client </li>
<li>Trigger snapshots of all defined cams and optionally send them alltogether by Email using the integrated Email client </li>
<li>Deaktivate a Camera in Synology Surveillance Station</li>
<li>Activate a Camera in Synology Surveillance Station</li>
@ -8271,7 +8479,6 @@ return ($str);
<li>Activation / Deactivation of a camera integrated PIR sensor </li>
<li>Creation of a readingsGroup device to display an overview of all defined SSCam devices (createReadingsGroup) </li>
<li>automatized definition of all in SVS available cameras in FHEM (autocreateCams) </li>
<li>integrated send Email of snapshots </li>
<li>save the last recording of camera locally </li>
</ul>
</ul>
@ -9326,15 +9533,18 @@ http(s)://&lt;hostname&gt;&lt;port&gt;/webapi/entry.cgi?api=SYNO.SurveillanceSta
<b>subject => &lt;subject text&gt;, body => &lt;message text&gt; </b><br>
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. </td></tr>
defined. $DATE and $TIME are replaced with the current date and time.
Optionally you can specify the "snapEmailTxt:"-tag when trigger snap shot with the "snap"-command.
In this case the Email shipping is activated one-time for the snapshot or the tag-text
is used instead of the text defined in the "snapEmailTxt"-attribute. </td></tr>
<tr><td style="vertical-align:top"> <b>recEmailTxt</b> <td>- <b>Activates the Email shipping of recordings.</b> This attribute has the format: <br>
<b>subject => &lt;subject text&gt;, body => &lt;message text&gt; </b><br>
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.</td></tr>
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. </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>
@ -9665,10 +9875,17 @@ 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 whose creation. <br>
The attribute has to be definied in the form as described. You can use the placeholder variables $CAM, $DATE and $TIME.
The 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>
The attribute has to be definied in the form as described. You can use the placeholder in "subject" and "body". <br><br>
<ul>
<table>
<colgroup> <col width=10%> <col width=90%> </colgroup>
<tr><td> $CAM </td><td>- Device alias respectively the name of the camera in SVS if the device alias isn't set </td></tr>
<tr><td> $DATE </td><td>- current date </td></tr>
<tr><td> $TIME </td><td>- aktuelle time </td></tr>
</table>
</ul>
<br>
<ul>
<b>Example:</b><br>
@ -9855,7 +10072,7 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
<ul>
<li>Start einer Aufnahme und optionaler Versand per Email </li>
<li>Stop einer Aufnahme per Befehl bzw. automatisch nach Ablauf einer einstellbaren Dauer </li>
<li>Auslösen von Schnappschnüssen und optionaler Email-Versand mittels integrierten Email-Client </li>
<li>Auslösen von Schnappschnüssen und optional gemeinsamer Email/TelegramBot-Versand mittels integrierten Email-Client </li>
<li>Auslösen von Schnappschnüssen aller definierten Kameras und optionaler gemeinsamer Email-Versand mittels integrierten Email-Client </li>
<li>Deaktivieren einer Kamera in Synology Surveillance Station</li>
<li>Aktivieren einer Kamera in Synology Surveillance Station</li>
@ -9883,7 +10100,6 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
<li>Aktivierung / Deaktivierung eines kamerainternen PIR-Sensors </li>
<li>Erzeugung einer readingsGroup zur Anzeige aller definierten SSCam-Devices (createReadingsGroup) </li>
<li>Automatisiertes Anlegen aller in der SVS vorhandenen Kameras in FHEM (autocreateCams) </li>
<li>integrierter Email-Versand von Schnappschüssen </li>
<li>lokales Abspeichern der letzten Kamera-Aufnahme </li>
</ul>
</ul>
@ -10660,11 +10876,12 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
Um die Daten der letzen 1-10 Schnappschüsse zu versionieren, kann das <a href="#SSCamattr">Attribut</a> "snapReadingRotate"
verwendet werden.
<br><br>
Ein <b>Email-Versand</b> der Schnappschüsse kann durch Setzen des <a href="#SSCamattr">Attributs</a> "snapEmailTxt" aktiviert
Ein <b>Email-Versand</b> der Schnappschüsse kann durch Setzen des <a href="#SSCamattr">Attributs</a> "snapEmailTxt" permanent aktiviert
werden. Zuvor ist der Email-Versand, wie im Abschnitt <a href="#SSCamEmail">Einstellung Email-Versand</a> beschrieben,
einzustellen. (Für weitere Informationen "<b>get &lt;name&gt; versionNotes 7</b>" ausführen) <br>
Der Text im Attribut "snapEmailTxt" kann durch die Spezifikation des optionalen "snapEmailTxt:"-Tags, wie oben
gezeigt, temporär überschrieben bzw. geändert werden. <br><br>
gezeigt, temporär überschrieben bzw. geändert werden. Sollte das Attribut "snapEmailTxt" nicht gesetzt sein, wird durch Angabe dieses Tags
der Email-Versand einmalig aktiviert. <br><br>
<b>Beispiele:</b>
<pre>
@ -10983,7 +11200,10 @@ http(s)://&lt;hostname&gt;&lt;port&gt;/webapi/entry.cgi?api=SYNO.SurveillanceSta
Es können die Platzhalter $CAM, $DATE und $TIME verwendet werden. $CAM wird
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.</td></tr>
$DATE und $TIME werden durch das aktuelle Datum und Zeit ersetzt. <br>
Der Email-Versand des letzten Schnappschusses wird einmalig aktiviert falls der "recEmailTxt:"-Tag
beim "snap"-Kommando verwendet wird bzw. der in diesem Tag definierte Text statt des Textes im
Attribut "recEmailTxt" verwendet. </td></tr>
<tr><td style="vertical-align:top"> <b>recEmailTxt</b> <td>- <b>Aktiviert den Email-Versand von Aufnahmen</b>.
Das Attribut hat das Format: <br>
@ -10994,8 +11214,10 @@ http(s)://&lt;hostname&gt;&lt;port&gt;/webapi/entry.cgi?api=SYNO.SurveillanceSta
durch den Device-Namen, Device-Alias bzw. den Namen der Kamera in der SVS
ersetzt falls der Device-Alias nicht gesetzt ist.
$DATE und $TIME werden durch das aktuelle Datum und Zeit ersetzt. <br>
Der Email-Versand der letzten Aufnahme wird temporär aktiviert falls der "recEmailTxt:"-Tag beim
On-Kommando verwendet wird. </td></tr>
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. </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>
@ -11333,10 +11555,20 @@ 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 $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>
Aktiviert den Emailversand von Schnappschüssen nach deren Erstellung. Wurden mehrere Schnappschüsse ausgelöst,
werden sie gemeinsam in einer Mail versendet. <br>
Das Attribut muß in der angegebenen Form definiert werden. <br>
Es können die Platzhalter im subject verwendet werden. <br><br>
<ul>
<table>
<colgroup> <col width=10%> <col width=90%> </colgroup>
<tr><td> $CAM </td><td>- Device-Alias bzw. der Name der Kamera in der SVS falls der Device-Alias nicht vorhanden ist </td></tr>
<tr><td> $DATE </td><td>- aktuelles Datum </td></tr>
<tr><td> $TIME </td><td>- aktuelle Zeit </td></tr>
</table>
</ul>
<br>
<ul>
<b>Beispiel:</b><br>
@ -11344,6 +11576,39 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
</ul>
<br>
</li>
<a name="snapTelegramTxt"></a>
<li><b>snapTelegramTxt tbot => &lt;TelegramBot-Device&gt;, peers => [&lt;peer1 peer2 ...&gt;], subject => [&lt;Betreff-Text&gt;] </b><br>
Aktiviert den permanenten Versand von Schnappschüssen nach deren Erstellung per TelegramBot. Wurden mehrere Schnappschüsse ausgelöst,
werden sie sequentiell versendet.<br>
Das Attribut muß in der angegebenen Form definiert werden. Im Schlüssel "tbot" ist das TelegramBot-Device anzugeben, welches für
den Versand der Daten verwendet werden soll. Das <a href="http://fhem.de/commandref_DE.html#TelegramBot">TelegramBot-Device</a> muss natürlich
vorhanden und funktionstüchtig sein. <br>
Die Angabe von "peers" und "subject" ist optional, jedoch muß der Schlüssel (leer) angegeben werden.
Wurde "peer" nicht angegeben, wird der Default-Peer des TelegramBot verwendet. <br>
Es können die Platzhalter im subject verwendet werden. <br><br>
<ul>
<table>
<colgroup> <col width=10%> <col width=90%> </colgroup>
<tr><td> $CAM </td><td>- Device-Alias bzw. den Namen der Kamera in der SVS ersetzt falls der Device-Alias nicht vorhanden ist </td></tr>
<tr><td> $DATE </td><td>- aktuelles Datum </td></tr>
<tr><td> $TIME </td><td>- aktuelle Zeit </td></tr>
<tr><td> $FILE </td><td>- Filename des Schnappschusses </td></tr>
<tr><td> $CTIME </td><td>- Erstellungszeit des Schnappschusses </td></tr>
</table>
</ul>
<br>
<ul>
<b>Beispiele:</b><br>
snapTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; Bewegungsalarm ($FILE) <br>
snapTelegramTxt tbot =&gt; teleBot, peers =&gt; @nabuko @foo @bar, subject =&gt; <br>
snapTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; <br>
snapTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; Bewegungsalarm bei $CAM. Es wurde $CTIME der Schnappschuss $FILE erstellt <br>
</ul>
<br>
</li><br>
<a name="snapGalleryBoost"></a>
<li><b>snapGalleryBoost</b><br>