diff --git a/contrib/DS_Starter/49_SSCam.pm b/contrib/DS_Starter/49_SSCam.pm index 46b59354e..ab154c2f4 100644 --- a/contrib/DS_Starter/49_SSCam.pm +++ b/contrib/DS_Starter/49_SSCam.pm @@ -47,6 +47,8 @@ use Encode; # Versions History intern our %SSCam_vNotesIntern = ( + "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 +128,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 +577,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 +730,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 +832,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 +1016,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 +5178,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 +5202,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 +5337,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 +5349,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 +6499,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 +6578,14 @@ 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; + # 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 +6598,12 @@ 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"); + # $ssize = 2; # Full Size für Darstellung in SSCamSTRM Typ "lastsnap" + } + return ($slim,$ssize); } @@ -7012,6 +7058,21 @@ sub SSCam_StreamDev($$$) { $ret .= "