From 184b3222655e0457a54edc7898a1528d3b48be09 Mon Sep 17 00:00:00 2001 From: nasseeder1 Date: Sat, 9 Feb 2019 07:49:49 +0000 Subject: [PATCH] 49_SSCam: new streaming device type "lastsnap", minor fixes git-svn-id: https://svn.fhem.de/fhem/trunk@18538 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 1 + fhem/FHEM/49_SSCam.pm | 120 +++++++++++++++++++++++----- fhem/FHEM/49_SSCamSTRM.pm | 27 ++++++- fhem/contrib/DS_Starter/49_SSCam.pm | 17 ++-- 4 files changed, 135 insertions(+), 30 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index 9613d4bdf..68162223c 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # 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: new streaming device type "lastsnap", minor fixes - change: 93_Log2Syslog: version numbering - bugfix: 12_HProtocolGateway: PMS-IB checksum calculation corrected - change: 12_HProtocolGateway: move sensorSystem attribute to HProtocolTank diff --git a/fhem/FHEM/49_SSCam.pm b/fhem/FHEM/49_SSCam.pm index ba5bcd20d..c7708477d 100644 --- a/fhem/FHEM/49_SSCam.pm +++ b/fhem/FHEM/49_SSCam.pm @@ -47,6 +47,9 @@ use Encode; # Versions History intern our %SSCam_vNotesIntern = ( + "8.9.2" => "05.02.2019 sub SSCam_sendTelegram changed ", + "8.9.1" => "05.02.2019 sub SSCam_snaplimsize changed ", + "8.9.0" => "05.02.2019 new streaming device type \"lastsnap\" ", "8.8.1" => "04.02.2019 fix need attr snapGalleryBoost / snapGallerySize for ending a snap by telegramBot ", "8.8.0" => "03.02.2019 send snapshots integrated by telegram ", "8.7.2" => "30.01.2019 code change for snapCams (SVS) ", @@ -126,6 +129,8 @@ our %SSCam_vNotesIntern = ( # Versions History extern our %SSCam_vNotesExtern = ( + "8.9.0" => "05.02.2019 A new streaming device type \"lastsnap\" was implemented. You can create such device with \"set ... createStreamDev lastsnap\". ". + "This streaming device shows the newest snapshot which was taken. ", "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. ", @@ -573,7 +578,7 @@ sub SSCam_Attr($$$$) { if($cmd eq "set") { $do = ($aVal eq "Icon")?1:2; } - $do = 0 if($cmd eq "del"); + $do = 0 if($cmd eq "del"); if ($do == 0) { delete($hash->{HELPER}{".SNAPHASH"}) if(AttrVal($name,"snapGalleryBoost",0)); # Snaphash nur löschen wenn Snaps gepollt werden @@ -726,7 +731,7 @@ sub SSCam_Set($@) { (AttrVal($name, "snapGalleryBoost",0)?(AttrVal($name,"snapGalleryNumber",undef) || AttrVal($name,"snapGalleryBoost",0))?"snapGallery:noArg ":"snapGallery:$SSCAM_snum ":" "). "createReadingsGroup ". "createSnapGallery:noArg ". - "createStreamDev:generic,hls,mjpeg,switched ". + "createStreamDev:generic,hls,lastsnap,mjpeg,switched ". ((ReadingsVal("$name", "CapPTZPan", "false") ne "false") ? "createPTZcontrol:noArg ": ""). "enable:noArg ". "disable:noArg ". @@ -828,7 +833,7 @@ 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:/) { @@ -1012,6 +1017,15 @@ sub SSCam_Set($@) { return $ret if($ret); my $c = "The device needs to set attribute \"hlsStrmObject\" in camera device \"$name\" to a valid HLS videostream"; CommandAttr($hash->{CL},"$livedev comment $c"); + } + if($prop =~ /lastsnap/) { + $livedev = "SSCamSTRM.$name.lastsnap"; + $ret = CommandDefine($hash->{CL},"$livedev SSCamSTRM {SSCam_StreamDev('$name','$livedev','lastsnap')}"); + return $ret if($ret); + my $c = "The device shows the last snapshot of camera device \"$name\". \n". + "If you always want to see the newest snapshot, please set attribute \"pollcaminfoall\" in camera device \"$name\".\n". + "Set also attribute \"snapGallerySize = Full\" in camera device \"$name\" to retrieve snapshots in original resolution."; + CommandAttr($hash->{CL},"$livedev comment $c"); } if($prop =~ /switched/) { $livedev = "SSCamSTRM.$name.switched"; @@ -5165,10 +5179,11 @@ sub SSCam_camop_parse ($) { ) { Log3($name, $verbose, "$name - Snapinfos of camera $camname retrieved"); - + $hash->{HELPER}{".LASTSNAP"} = $data->{data}{data}[0]{imageData}; # aktuellster Snap zur Anzeige im StreamDev "lastsnap" + my %snaps = ( 0 => {'createdTm' => 'n.a.', 'fileName' => 'n.a.','snapid' => 'n.a.'} ); # Hilfshash my ($k,$l) = (0,0); - if(exists($data->{data}{data}[0]{createdTm})) { + if(exists($data->{data}{data}[0]{createdTm})) { while ($data->{'data'}{'data'}[$k]) { if($data->{'data'}{'data'}[$k]{'camName'} ne $camname) { $k += 1; @@ -5188,7 +5203,7 @@ sub SSCam_camop_parse ($) { Log3($name,4, "$name - Snap [$l]: ID => $data->{data}{data}[$k]{id}, File => $data->{data}{data}[$k]{fileName}, Created => $createdTm"); $l += 1; $k += 1; - } + } } my @as; @@ -5323,7 +5338,7 @@ sub SSCam_camop_parse ($) { SSCam_closeTrans($hash); # Transaktion beenden delete($hash->{HELPER}{GETSNAPGALLERY}); # Steuerbit getsnapgallery statt getsnapinfo - ##### Fall abhängige Eventgenerierung ##### + ######## fallabhä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 @@ -5335,6 +5350,26 @@ sub SSCam_camop_parse ($) { } else { SSCam_refresh($hash,0,0,0); # kein Room-Refresh, SSCam-state-Event, SSCamSTRM-Event } + # longpoll für alle Streamingdevices v. Typ "lastsnap" + my @lsnapstrms = devspec2array("TYPE=SSCamSTRM:FILTER=PARENT=$name:FILTER=MODEL=lastsnap"); + if(scalar(@lsnapstrms) >= 1) { + foreach (@lsnapstrms) { + if($defs{$_}) { + $hash->{HELPER}{STRMDEV} = $_; + SSCam_refresh($hash,0,0,1); # kein Room-Refresh, kein SSCam-state-Event, SSCamSTRM-Event + } + } + } + # longpoll für alle Streamingdevices v. Typ "snapgallery" + @lsnapstrms = devspec2array("TYPE=SSCamSTRM:FILTER=PARENT=$name:FILTER=MODEL=snapgallery"); + if(scalar(@lsnapstrms) >= 1) { + foreach (@lsnapstrms) { + if($defs{$_}) { + $hash->{HELPER}{STRMDEV} = $_; + SSCam_refresh($hash,0,0,1); # kein Room-Refresh, kein SSCam-state-Event, SSCamSTRM-Event + } + } + } } elsif ($OpMode eq "runliveview" && $hash->{HELPER}{RUNVIEW} =~ m/^live_.*hls$/) { # HLS Streaming wurde aktiviert @@ -6465,7 +6500,7 @@ sub SSCam_refresh($$$$) { my $sr = $hash->{HELPER}{STRMROOM}?$hash->{HELPER}{STRMROOM}:"\"n.a.\""; # Raum aus dem das SSCamSTRM-Device die Funktion aufrief my $sl = $hash->{HELPER}{STRMDETAIL}?$hash->{HELPER}{STRMDETAIL}:"\"n.a.\""; # Name des SSCamSTRM-Devices (wenn Detailansicht) $fpr = AttrVal($hash->{HELPER}{STRMDEV},"forcePageRefresh",0) if($hash->{HELPER}{STRMDEV}); - Log3($name, 4, "$name - SSCam_refresh - caller: $sd, callerroom: $sr, detail: $sl, pload: $pload, forcePageRefresh: $fpr"); + Log3($name, 4, "$name - SSCam_refresh - caller: $sd, callerroom: $sr, detail: $sl, pload: $pload, forcePageRefresh: $fpr, event_STRMdev: $lpoll_strm"); # Page-Reload if($pload && $hash->{HELPER}{STRMROOM} && $hash->{HELPER}{STRMDETAIL}) { @@ -6544,8 +6579,12 @@ sub SSCam_snaplimsize ($) { } 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(AttrVal($name,"snapGallerySize","Icon") eq "Full") { + $ssize = 2; # Full Size + } else { + $ssize = 1; # Icon Size } if($hash->{HELPER}{CANSENDSNAP} || $hash->{HELPER}{CANTELESNAP}) { @@ -6558,6 +6597,11 @@ sub SSCam_snaplimsize ($) { $hash->{HELPER}{GETSNAPGALLERY} = 1; # Steuerbit für Snap-Galerie bzw. Daten mehrerer Schnappschüsse abrufen } + my @strmdevs = devspec2array("TYPE=SSCamSTRM:FILTER=PARENT=$name:FILTER=MODEL=lastsnap"); + if(scalar(@strmdevs) >= 1) { + Log3($name, 4, "$name - Streaming devs of type \"lastsnap\": @strmdevs"); + } + return ($slim,$ssize); } @@ -7012,6 +7056,21 @@ sub SSCam_StreamDev($$$) { $ret .= "" if(AttrVal($camname,"ptzPanel_use",0)); } + } elsif ($fmt =~ /lastsnap/) { + $link = $hash->{HELPER}{".LASTSNAP"}; + my $gattr = (AttrVal($camname,"snapGallerySize","Icon") eq "Full")?$ha:""; + if($link) { + $ret .= "')\">
"; + $ret .= "$imgdosnap "; + $ret .= ""; + $streamHash->{HELPER}{STREAM} = ""; # Stream für "get popupStream" speichern + $streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist + } else { + $cause = "no snapshot available to display"; + $cause = "kein Schnappschuss zur Anzeige vorhanden" if(AttrVal("global","language","EN") =~ /DE/i); + $ret .= "
$cause

"; + } + } elsif ($fmt =~ /generic/) { my $htag = AttrVal($camname,"genericStrmHtmlTag",""); if( $htag =~ m/^\s*(.*)\s*$/s ) { @@ -7373,7 +7432,7 @@ sub SSCam_composegallery ($;$$) { } $header .= $sgbnote; - my $gattr = (AttrVal($name,"snapGallerySize","Icon") eq "Full")?$ha:" "; + my $gattr = (AttrVal($name,"snapGallerySize","Icon") eq "Full")?$ha:""; my @as = sort{$a<=>$b}keys%{$allsnaps}; # Ausgabetabelle erstellen @@ -7689,6 +7748,7 @@ sub SSCam_prepareSendData ($$;$) { 'tac' => $tac, 'telebot' => $telemsg{$tbotk}, 'peers' => $telemsg{$peerk}, + 'MediaStream' => '-1', # Code für MediaStream im TelegramBot (png/jpg = -1) } ); } @@ -7722,6 +7782,7 @@ sub SSCam_sendTelegram ($$) { '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 + 'MediaStream' => { 'default'=>'', 'required'=>0, 'set'=>1}, # Code für MediaStream im TelegramBot (png/jpg = -1) ); my %params = (); @@ -7777,15 +7838,13 @@ sub SSCam_sendTelegram ($$) { no strict "refs"; - my ($msg,$subject); + my ($msg,$subject,$MediaStream); 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, "" ); + ($msg,$subject,$MediaStream) = SSCam_cmdSendTelegram($name,$key); + $ret = TelegramBot_SendIt( $defs{$telebot}, $peers, $msg, $subject, $MediaStream, undef, "" ); if($ret) { readingsSingleUpdate($hash, "sendTeleState", $ret, 1); Log3($name, 2, "$name - ERROR: $ret"); @@ -7810,6 +7869,7 @@ sub SSCam_cmdSendTelegram($$) { my $hash = $defs{$name}; my $paref = $hash->{HELPER}{PAREF}; my $subject = $paref->{subject}; + my $MediaStream = $paref->{MediaStream}; my $ct = $paref->{sdat}{$key}{createdTm}; my $img = $paref->{sdat}{$key}{".imageData"}; @@ -7820,7 +7880,7 @@ sub SSCam_cmdSendTelegram($$) { $subject =~ s/\$FILE/$fname/g; $subject =~ s/\$CTIME/$ct/g; -return ($decoded,$subject); +return ($decoded,$subject,$MediaStream); } ############################################################################################# @@ -8713,7 +8773,7 @@ return ($str); +

+ + Streaming device "lastsnap"

+ + This type of streaming device playback the last (newest) snapshot. + As default the snapshot is retrieved in a reduced resolution. In order to use the original resolution, the attribute + "snapGallerySize = Full" has to be set in the associated camera device (compare Internal PARENT). + There also the attribute "pollcaminfoall" should be set to retrieve the newest snapshot regularly. +


@@ -10401,7 +10471,7 @@ attr <name> genericStrmHtmlTag <video $HTMLATTR controls autoplay> -

+ Streaming Device "lastsnap"

+ + Dieser Typ gibt den neuesten Schnappschuß wieder. Der Schnappschuss wird per default als Icon, d.h. in einer verminderten + Auflösung abgerufen. Um die Originalauflösung zu verwenden, ist im zugehörigen Kameradevice (Internal PARENT) das Attribut + "snapGallerySize = Full" zu setzen. + Dort sollte ebenfalls das Attribut "pollcaminfoall" gesetzt sein, um regelmäßig die neuesten Schnappschußdaten abzurufen. +
+

+ +