2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-03 23:06:37 +00:00

49_SSCam: contrib 9.4.3

git-svn-id: https://svn.fhem.de/fhem/trunk@22391 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2020-07-12 12:31:21 +00:00
parent a511b09e31
commit 4e9b9c9b2c

View File

@ -1,5 +1,5 @@
######################################################################################################################## ########################################################################################################################
# $Id: 49_SSCam.pm 22363 2020-07-06 21:38:30Z DS_Starter $ # $Id: 49_SSCam.pm 22382 2020-07-10 20:25:50Z DS_Starter $
######################################################################################################################### #########################################################################################################################
# 49_SSCam.pm # 49_SSCam.pm
# #
@ -156,7 +156,8 @@ BEGIN {
# Versions History intern # Versions History intern
my %vNotesIntern = ( my %vNotesIntern = (
"9.4.2" => "10.07.2020 more changes according PBP level 3, headline PTZ Control ", "9.4.3" => "12.07.2020 streamDev refactored ",
"9.4.2" => "11.07.2020 more changes according PBP level 3, headline PTZ Control, revised comref ",
"9.4.1" => "05.07.2020 new Zoom icons ", "9.4.1" => "05.07.2020 new Zoom icons ",
"9.4.0" => "01.07.2020 switch to packages, much more changes according PBP ", "9.4.0" => "01.07.2020 switch to packages, much more changes according PBP ",
"9.3.0" => "21.06.2020 SVS device 'inctive' if disabled, add zoom capability, much more internal code changes ", "9.3.0" => "21.06.2020 SVS device 'inctive' if disabled, add zoom capability, much more internal code changes ",
@ -473,6 +474,14 @@ my %zd = ( # Ha
"--." => {dir => "out", sttime => 6, moveType => "Start", panimg => "Zoom_out_wide_w.png", } "--." => {dir => "out", sttime => 6, moveType => "Start", panimg => "Zoom_out_wide_w.png", }
); );
my %sdfn = ( # Funktionshash Streamingdevices
"mjpeg" => {fn => "_streamDevMJPEG" },
"lastsnap" => {fn => "_streamDevLASTSNAP" },
"generic" => {fn => "_streamDevGENERIC" },
"hls" => {fn => "_streamDevHLS" },
"switched" => {fn => "_streamDevSWITCHED" },
);
# Standardvariablen und Forward-Deklaration # Standardvariablen und Forward-Deklaration
my $defSlim = 3; # default Anzahl der abzurufenden Schnappschüsse mit snapGallery my $defSlim = 3; # default Anzahl der abzurufenden Schnappschüsse mit snapGallery
my $defSnum = "1,2,3,4,5,6,7,8,9,10"; # mögliche Anzahl der abzurufenden Schnappschüsse mit snapGallery my $defSnum = "1,2,3,4,5,6,7,8,9,10"; # mögliche Anzahl der abzurufenden Schnappschüsse mit snapGallery
@ -485,8 +494,6 @@ my $valZoom = ".++,+,stop,-,--."; # Inhalt des Setters "
#use vars qw($FW_detail); # currently selected device for detail view #use vars qw($FW_detail); # currently selected device for detail view
#use vars qw($FW_wname); # Web instance #use vars qw($FW_wname); # Web instance
# sub FW_pH(@); # add href # sub FW_pH(@); # add href
# use vars qw(%vHintsExt_en);
# use vars qw(%vHintsExt_de);
#sub SSChatBot_formString; #sub SSChatBot_formString;
#sub SSChatBot_addQueue($$$$$$$$); #sub SSChatBot_addQueue($$$$$$$$);
@ -1201,8 +1208,8 @@ sub Set {
my $spec = join(" ",@a); my $spec = join(" ",@a);
if($spec =~ /STRM:/x) { if($spec =~ /STRM:/x) {
$spec =~ m/STRM:(.*)/ix; # Aufnahme durch SSCamSTRM-Device my ($inf) = $spec =~ m/STRM:(.*)/ix; # Aufnahme durch SSCamSTRM-Device
$hash->{HELPER}{INFORM} = $1; $hash->{HELPER}{INFORM} = $inf;
} }
my $emtxt = AttrVal($name, "recEmailTxt", ""); my $emtxt = AttrVal($name, "recEmailTxt", "");
@ -7790,13 +7797,11 @@ sub ptzPanel {
} }
$ptz_ret .= "</tr>\n"; $ptz_ret .= "</tr>\n";
} }
# $ptz_ret .= "</table>";
### Zoom ### Zoom
############################### ###############################
if(IsCapZoom($hash)) { # wenn Zoom Eigenschaft if(IsCapZoom($hash)) { # wenn Zoom Eigenschaft
# $ptz_ret .= '<table class="rc_body defsize">';
$ptz_ret .= "<tr>"; $ptz_ret .= "<tr>";
$ptz_ret .= "<td style='text-align:center' colspan=10><hr /></td>"; $ptz_ret .= "<td style='text-align:center' colspan=10><hr /></td>";
$ptz_ret .= "</tr>"; $ptz_ret .= "</tr>";
@ -7818,12 +7823,17 @@ sub ptzPanel {
$img = FW_makeImage($img, $cmd, "rc-button"); $img = FW_makeImage($img, $cmd, "rc-button");
} else { # $FW_ME = URL-Pfad unter dem der FHEMWEB-Server via HTTP erreichbar ist, z.B. /fhem } else { # $FW_ME = URL-Pfad unter dem der FHEMWEB-Server via HTTP erreichbar ist, z.B. /fhem
my $iPath = FW_iconPath($img); my $iPath = FW_iconPath($img); # automatisches Suchen der Icons im FHEMWEB iconPath
if($iPath) {
$iPath = "$FW_ME/$FW_icondir/$iPath";
} else {
$iPath = "$FW_ME/$iconpath/$img";
}
if($ftui) { if($ftui) {
$img = "<img src=\"$FW_ME/$FW_icondir/$iPath\" height=\"$pbsf%\" width=\"$pbsf%\">"; $img = "<img src=\"$iPath\" height=\"$pbsf%\" width=\"$pbsf%\">";
} else { } else {
$img = "<img src=\"$FW_ME/$FW_icondir/$iPath\" height=\"$pbs%\" width=\"$pbs%\">"; $img = "<img src=\"$iPath\" height=\"$pbs%\" width=\"$pbs%\">";
} }
} }
@ -7836,7 +7846,6 @@ sub ptzPanel {
} }
$ptz_ret .= "</tr>"; $ptz_ret .= "</tr>";
# $ptz_ret .= "</table>";
} }
$ptz_ret .= "</table>"; $ptz_ret .= "</table>";
@ -7982,13 +7991,12 @@ return;
# #
# $camname = Name der Kamaera (Parent-Device) # $camname = Name der Kamaera (Parent-Device)
# $strmdev = Name des Streaming-Devices # $strmdev = Name des Streaming-Devices
# $fmt = Streaming Format # $fmt = Streaming Format (Vergleich auf "eq" !)
# #
###################################################################################### ######################################################################################
sub streamDev { sub streamDev {
my ($camname,$strmdev,$fmt,$ftui) = @_; my ($camname,$strmdev,$fmt,$ftui) = @_;
my $hash = $defs{$camname}; my $hash = $defs{$camname};
my $wltype = $hash->{HELPER}{WLTYPE};
my $serveraddr = $hash->{SERVERADDR}; my $serveraddr = $hash->{SERVERADDR};
my $serverport = $hash->{SERVERPORT}; my $serverport = $hash->{SERVERPORT};
my $apivideostm = $hash->{HELPER}{APIVIDEOSTM}; my $apivideostm = $hash->{HELPER}{APIVIDEOSTM};
@ -8003,19 +8011,20 @@ sub streamDev {
my $camid = $hash->{CAMID}; my $camid = $hash->{CAMID};
my $sid = $hash->{HELPER}{SID}; my $sid = $hash->{HELPER}{SID};
my $proto = $hash->{PROTOCOL}; my $proto = $hash->{PROTOCOL};
$ftui = ($ftui && $ftui eq "ftui")?1:0; $ftui = ($ftui && $ftui eq "ftui") ? 1 : 0;
my $hdrAlign = "center"; my $hdrAlign = "center";
my ($show,$cause,$ret,$link,$audiolink,$devWlink,$wlhash,$wlalias);
# Kontext des SSCamSTRM-Devices speichern für roomRefresh # Kontext des SSCamSTRM-Devices speichern für roomRefresh
$hash->{HELPER}{STRMDEV} = $strmdev; # Name des aufrufenden SSCamSTRM-Devices # $hash->{HELPER}{STRMDEV} = $strmdev; # Name des aufrufenden SSCamSTRM-Devices
$hash->{HELPER}{STRMROOM} = $FW_room?$FW_room:""; # Raum aus dem das SSCamSTRM-Device die Funktion aufrief # $hash->{HELPER}{STRMROOM} = $FW_room?$FW_room:""; # Raum aus dem das SSCamSTRM-Device die Funktion aufrief
$hash->{HELPER}{STRMDETAIL} = $FW_detail?$FW_detail:""; # Name des SSCamSTRM-Devices (wenn Detailansicht) # $hash->{HELPER}{STRMDETAIL} = $FW_detail?$FW_detail:""; # Name des SSCamSTRM-Devices (wenn Detailansicht)
my $streamHash = $defs{$strmdev}; # Hash des SSCamSTRM-Devices my $streamHash = $defs{$strmdev}; # Hash des SSCamSTRM-Devices
my $uuid = $streamHash->{FUUID}; # eindeutige UUID des Streamingdevices my $uuid = $streamHash->{FUUID}; # eindeutige UUID des Streamingdevices
delete $streamHash->{HELPER}{STREAM}; delete $streamHash->{HELPER}{STREAM};
delete $streamHash->{HELPER}{STREAMACTIVE}; # Statusbit ob ein Stream aktiviert ist delete $streamHash->{HELPER}{STREAMACTIVE}; # Statusbit ob ein Stream aktiviert ist
my ($show,$cause,$ret);
# Definition Tasten # Definition Tasten
my $imgblank = "<img src=\"$FW_ME/www/images/sscam/black_btn_CAMBLANK.png\">"; # nicht sichtbare Leertaste my $imgblank = "<img src=\"$FW_ME/www/images/sscam/black_btn_CAMBLANK.png\">"; # nicht sichtbare Leertaste
my $cmdstop = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $camname stopView STRM:$uuid')"; # Stream deaktivieren my $cmdstop = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $camname stopView STRM:$uuid')"; # Stream deaktivieren
@ -8059,32 +8068,12 @@ sub streamDev {
$cmdrefresh = "ftui.setFhemStatus('set $camname refresh STRM:$uuid')"; $cmdrefresh = "ftui.setFhemStatus('set $camname refresh STRM:$uuid')";
} }
my $ha = AttrVal($camname, "htmlattr", 'width="500" height="325"'); # HTML Attribute der Cam
$ha = AttrVal($strmdev, "htmlattr", $ha); # htmlattr mit htmlattr Streaming-Device übersteuern
if($ftui) {
$ha = AttrVal($strmdev, "htmlattrFTUI", $ha); # wenn aus FTUI aufgerufen divers setzen
}
my $hb = AttrVal($strmdev, "hideButtons", 0); # Drucktasten im Footer ausblenden ?
my $hau = AttrVal($strmdev, "hideAudio", 0); # Audio Steuerblock im Footer ausblenden ?
my $pws = AttrVal($strmdev, "popupWindowSize", ""); # Größe eines Popups
$pws =~ s/"//gx if($pws);
$show = $defs{$streamHash->{PARENT}}->{HELPER}{ACTSTRM} if($streamHash->{MODEL} =~ /switched/x);
$show = $show ? "($show)" : "";
my $alias = AttrVal($strmdev, "alias", $strmdev); # Linktext als Aliasname oder Devicename setzen
my $dlink = "<a href=\"/fhem?detail=$strmdev\">$alias</a>";
$dlink = $alias if(AttrVal($strmdev, "noLink", 0)); # keine Links im Stream-Dev generieren
my $StmKey = ReadingsVal($camname,"StmKey",undef);
# Javascript Bibliothek für Tooltips (http://www.walterzorn.de/tooltip/tooltip.htm#download) und Texte # Javascript Bibliothek für Tooltips (http://www.walterzorn.de/tooltip/tooltip.htm#download) und Texte
my $calias = $hash->{CAMNAME}; # Alias der Kamera my $calias = $hash->{CAMNAME}; # Alias der Kamera
my $ttjs = "/fhem/pgm2/sscam_tooltip.js"; my $ttjs = "/fhem/pgm2/sscam_tooltip.js";
my ($ttrefresh, $ttrecstart, $ttrecstop, $ttsnap, $ttcmdstop, $tthlsreact, $ttmjpegrun, $tthlsrun, $ttlrrun, $tth264run, $ttlmjpegrun, $ttlsnaprun); my ($ttrefresh, $ttrecstart, $ttrecstop, $ttsnap, $ttcmdstop, $tthlsreact, $ttmjpegrun, $tthlsrun, $ttlrrun, $tth264run, $ttlmjpegrun, $ttlsnaprun);
# Hinweis Popups
if(AttrVal("global","language","EN") =~ /EN/x) { if(AttrVal("global","language","EN") =~ /EN/x) {
$ttrefresh = $ttips_en{"ttrefresh"}; $ttrefresh =~ s/§NAME§/$calias/gx; $ttrefresh = $ttips_en{"ttrefresh"}; $ttrefresh =~ s/§NAME§/$calias/gx;
$ttrecstart = $ttips_en{"ttrecstart"}; $ttrecstart =~ s/§NAME§/$calias/gx; $ttrecstart = $ttips_en{"ttrecstart"}; $ttrecstart =~ s/§NAME§/$calias/gx;
@ -8096,7 +8085,7 @@ sub streamDev {
$tthlsrun = $ttips_en{"tthlsrun"}; $tthlsrun =~ s/§NAME§/$calias/gx; $tthlsrun = $ttips_en{"tthlsrun"}; $tthlsrun =~ s/§NAME§/$calias/gx;
$ttlrrun = $ttips_en{"ttlrrun"}; $ttlrrun =~ s/§NAME§/$calias/gx; $ttlrrun = $ttips_en{"ttlrrun"}; $ttlrrun =~ s/§NAME§/$calias/gx;
$tth264run = $ttips_en{"tth264run"}; $tth264run =~ s/§NAME§/$calias/gx; $tth264run = $ttips_en{"tth264run"}; $tth264run =~ s/§NAME§/$calias/gx;
$ttlmjpegrun= $ttips_en{"ttlmjpegrun"}; $ttlmjpegrun =~ s/§NAME§/$calias/gx; $ttlmjpegrun = $ttips_en{"ttlmjpegrun"}; $ttlmjpegrun =~ s/§NAME§/$calias/gx;
$ttlsnaprun = $ttips_en{"ttlsnaprun"}; $ttlsnaprun =~ s/§NAME§/$calias/gx; $ttlsnaprun = $ttips_en{"ttlsnaprun"}; $ttlsnaprun =~ s/§NAME§/$calias/gx;
} else { } else {
$ttrefresh = $ttips_de{"ttrefresh"}; $ttrefresh =~ s/§NAME§/$calias/gx; $ttrefresh = $ttips_de{"ttrefresh"}; $ttrefresh =~ s/§NAME§/$calias/gx;
@ -8109,10 +8098,89 @@ sub streamDev {
$tthlsrun = $ttips_de{"tthlsrun"}; $tthlsrun =~ s/§NAME§/$calias/gx; $tthlsrun = $ttips_de{"tthlsrun"}; $tthlsrun =~ s/§NAME§/$calias/gx;
$ttlrrun = $ttips_de{"ttlrrun"}; $ttlrrun =~ s/§NAME§/$calias/gx; $ttlrrun = $ttips_de{"ttlrrun"}; $ttlrrun =~ s/§NAME§/$calias/gx;
$tth264run = $ttips_de{"tth264run"}; $tth264run =~ s/§NAME§/$calias/gx; $tth264run = $ttips_de{"tth264run"}; $tth264run =~ s/§NAME§/$calias/gx;
$ttlmjpegrun= $ttips_de{"ttlmjpegrun"}; $ttlmjpegrun =~ s/§NAME§/$calias/gx; $ttlmjpegrun = $ttips_de{"ttlmjpegrun"}; $ttlmjpegrun =~ s/§NAME§/$calias/gx;
$ttlsnaprun = $ttips_de{"ttlsnaprun"}; $ttlsnaprun =~ s/§NAME§/$calias/gx; $ttlsnaprun = $ttips_de{"ttlsnaprun"}; $ttlsnaprun =~ s/§NAME§/$calias/gx;
} }
my $ha = AttrVal($camname, "htmlattr", 'width="500" height="325"'); # HTML Attribute der Cam
$ha = AttrVal($strmdev, "htmlattr", $ha); # htmlattr mit htmlattr Streaming-Device übersteuern
$ha = AttrVal($strmdev, "htmlattrFTUI", $ha) if($ftui); # wenn aus FTUI aufgerufen divers setzen
my $hb = AttrVal($strmdev, "hideButtons", 0); # Drucktasten im Footer ausblenden ?
my $hau = AttrVal($strmdev, "hideAudio", 0); # Audio Steuerblock im Footer ausblenden ?
my $pws = AttrVal($strmdev, "popupWindowSize", ""); # Größe eines Popups
$pws =~ s/"//gx if($pws);
$show = $defs{$streamHash->{PARENT}}->{HELPER}{ACTSTRM} if($streamHash->{MODEL} =~ /switched/x);
$show = $show ? "($show)" : "";
my $alias = AttrVal($strmdev, "alias", $strmdev); # Linktext als Aliasname oder Devicename setzen
my $dlink = "<a href=\"/fhem?detail=$strmdev\">$alias</a>";
$dlink = $alias if(AttrVal($strmdev, "noLink", 0)); # keine Links im Stream-Dev generieren
my $StmKey = ReadingsVal($camname,"StmKey",undef);
my %params = (
camname => $camname,
strmdev => $strmdev,
ftui => $ftui,
uuid => $uuid,
ha => $ha,
hb => $hb,
hau => $hau,
pws => $pws,
serveraddr => $serveraddr,
serverport => $serverport,
apivideostm => $apivideostm,
apivideostmpath => $apivideostmpath,
apivideostmmaxver => $apivideostmmaxver,
apiaudiostm => $apiaudiostm,
apiaudiostmpath => $apiaudiostmpath,
apiaudiostmmaxver => $apiaudiostmmaxver,
apivideostms => $apivideostms,
apivideostmspath => $apivideostmspath,
apivideostmsmaxver => $apivideostmsmaxver,
camid => $camid,
sid => $sid,
proto => $proto,
cmdstop => $cmdstop,
cmdhlsreact => $cmdhlsreact,
cmdmjpegrun => $cmdmjpegrun,
cmdhlsrun => $cmdhlsrun,
cmdlrirun => $cmdlrirun,
cmdlh264run => $cmdlh264run,
cmdlmjpegrun => $cmdlmjpegrun,
cmdlsnaprun => $cmdlsnaprun,
cmdrecendless => $cmdrecendless,
cmdrecstop => $cmdrecstop,
cmddosnap => $cmddosnap,
cmdrefresh => $cmdrefresh,
imgblank => $imgblank,
imgstop => $imgstop,
imghlsreact => $imghlsreact,
imgmjpegrun => $imgmjpegrun,
imghlsrun => $imghlsrun,
imglrirun => $imglrirun,
imglh264run => $imglh264run,
imglmjpegrun => $imglmjpegrun,
imglsnaprun => $imglsnaprun,
imgrecendless => $imgrecendless,
imgrecstop => $imgrecstop,
imgdosnap => $imgdosnap,
imgrefresh => $imgrefresh,
ttrefresh => $ttrefresh,
ttrecstart => $ttrecstart,
ttrecstop => $ttrecstop,
ttsnap => $ttsnap,
ttcmdstop => $ttcmdstop,
tthlsreact => $tthlsreact,
ttmjpegrun => $ttmjpegrun,
tthlsrun => $tthlsrun,
ttlrrun => $ttlrrun,
tth264run => $tth264run,
ttlmjpegrun => $ttlmjpegrun,
ttlsnaprun => $ttlsnaprun,
);
$ret = ""; $ret = "";
$ret .= "<script type=\"text/javascript\" src=\"$ttjs\"></script>"; $ret .= "<script type=\"text/javascript\" src=\"$ttjs\"></script>";
$ret .= '<table class="block wide internals" style="margin-left:auto;margin-right:auto">'; $ret .= '<table class="block wide internals" style="margin-left:auto;margin-right:auto">';
@ -8137,9 +8205,67 @@ sub streamDev {
return $ret; return $ret;
} }
if ($fmt =~ /mjpeg/x) { # Streaming ausführen
no strict "refs"; ## no critic 'NoStrict'
if(defined &{$sdfn{$fmt}{fn}}) {
$ret .= &{$sdfn{$fmt}{fn}} (\%params);
} else {
$cause = qq{Streaming of format "$fmt" is not supported};
$ret .= "<td> <br> <b> $cause </b> <br><br></td>";
}
use strict "refs";
$ret .= '</tr>';
$ret .= '</tbody>';
$ret .= '</table>';
return $ret;
}
######################################################################################
# Streaming Device Typ: mjpeg
sub _streamDevMJPEG {
my $params = shift;
my $camname = $params->{camname};
my $strmdev = $params->{strmdev};
my $hash = $defs{$camname};
my $streamHash = $defs{$strmdev};
my $ftui = $params->{ftui};
my $camid = $params->{camid};
my $proto = $params->{proto};
my $sid = $params->{sid};
my $pws = $params->{pws};
my $ha = $params->{ha};
my $hb = $params->{hb};
my $hau = $params->{hau};
my $serveraddr = $params->{serveraddr};
my $serverport = $params->{serverport};
my $apivideostms = $params->{apivideostms};
my $apivideostmspath = $params->{apivideostmspath};
my $apivideostmsmaxver = $params->{apivideostmsmaxver};
my $apiaudiostm = $params->{apiaudiostm};
my $apiaudiostmpath = $params->{apiaudiostmpath};
my $apiaudiostmmaxver = $params->{apiaudiostmmaxver};
my $cmdrecendless = $params->{cmdrecendless};
my $ttrecstart = $params->{ttrecstart};
my $imgrecendless = $params->{imgrecendless};
my $cmdrecstop = $params->{cmdrecstop};
my $ttrecstop = $params->{ttrecstop};
my $imgrecstop = $params->{imgrecstop};
my $cmddosnap = $params->{cmddosnap};
my $ttsnap = $params->{ttsnap};
my $imgdosnap = $params->{imgdosnap};
my ($link,$audiolink);
my $ret = "";
if(ReadingsVal($camname, "SVSversion", "8.2.3-5828") eq "8.2.3-5828" && ReadingsVal($camname, "CamVideoType", "") !~ /MJPEG/) { if(ReadingsVal($camname, "SVSversion", "8.2.3-5828") eq "8.2.3-5828" && ReadingsVal($camname, "CamVideoType", "") !~ /MJPEG/) {
$ret .= "<td> <br> <b> Because SVS version 8.2.3-5828 is running you cannot see the MJPEG-Stream. Please upgrade to a higher SVS version ! </b> <br><br>"; $ret .= "<td> <br> <b> Because SVS version 8.2.3-5828 is running you cannot see the MJPEG-Stream. Please upgrade to a higher SVS version ! </b> <br><br>";
} else { } else {
if($apivideostmsmaxver) { if($apivideostmsmaxver) {
$link = "$proto://$serveraddr:$serverport/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsmaxver&method=Stream&cameraId=$camid&format=mjpeg&_sid=$sid"; $link = "$proto://$serveraddr:$serverport/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsmaxver&method=Stream&cameraId=$camid&format=mjpeg&_sid=$sid";
@ -8184,39 +8310,107 @@ sub streamDev {
$ret .= "<td></td>" if(AttrVal($camname,"ptzPanel_use",0)); $ret .= "<td></td>" if(AttrVal($camname,"ptzPanel_use",0));
} }
} elsif ($fmt =~ /lastsnap/x) { Log3($strmdev, 4, "$strmdev - Link called: $link") if($link);
# $link = $hash->{HELPER}{".LASTSNAP"}; undef $link;
return $ret;
}
######################################################################################
# Streaming Device Typ: lastsnap
sub _streamDevLASTSNAP {
my $params = shift;
my $camname = $params->{camname};
my $strmdev = $params->{strmdev};
my $hash = $defs{$camname};
my $streamHash = $defs{$strmdev};
my $ftui = $params->{ftui};
my $pws = $params->{pws};
my $ha = $params->{ha};
my $hb = $params->{hb};
my $cmddosnap = $params->{cmddosnap};
my $ttsnap = $params->{ttsnap};
my $imgdosnap = $params->{imgdosnap};
my ($link,$cause,$ret) = ("","","");
my $cache = cache($camname, "c_init"); # Cache initialisieren my $cache = cache($camname, "c_init"); # Cache initialisieren
Log3($camname, 1, "$camname - Fall back to internal Cache due to preceding failure.") if(!$cache); Log3($camname, 1, "$camname - Fall back to internal Cache due to preceding failure.") if(!$cache);
if(!$cache || $cache eq "internal" ) { if(!$cache || $cache eq "internal" ) {
$link = $data{SSCam}{$camname}{LASTSNAP}; $link = $data{SSCam}{$camname}{LASTSNAP};
} else { } else {
$link = cache($camname, "c_read", "{LASTSNAP}"); $link = cache($camname, "c_read", "{LASTSNAP}");
} }
my $gattr = (AttrVal($camname,"snapGallerySize","Icon") eq "Full")?$ha:""; my $gattr = (AttrVal($camname,"snapGallerySize","Icon") eq "Full") ? $ha : "";
if($link) { if($link) {
if(!$ftui) { if(!$ftui) {
$ret .= "<td><img src='data:image/jpeg;base64,$link' $gattr onClick=\"FW_okDialog('<img src=data:image/jpeg;base64,$link $pws>')\"><br>"; $ret .= "<td><img src='data:image/jpeg;base64,$link' $gattr onClick=\"FW_okDialog('<img src=data:image/jpeg;base64,$link $pws>')\"><br>";
} else { } else {
$ret .= "<td><img src='data:image/jpeg;base64,$link' $gattr><br>"; $ret .= "<td><img src='data:image/jpeg;base64,$link' $gattr><br>";
} }
if(!$hb) { if(!$hb) {
$ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>"; $ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
} }
$ret .= "</td>"; $ret .= "</td>";
$streamHash->{HELPER}{STREAM} = "<img src=data:image/jpeg;base64,$link $pws>"; # Stream für "get <SSCamSTRM-Device> popupStream" speichern $streamHash->{HELPER}{STREAM} = "<img src=data:image/jpeg;base64,$link $pws>"; # Stream für "get <SSCamSTRM-Device> popupStream" speichern
$streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist $streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist
} else { } else {
$cause = "no snapshot available to display"; $cause = "no snapshot available to display";
$cause = "kein Schnappschuss zur Anzeige vorhanden" if(AttrVal("global","language","EN") =~ /DE/ix); $cause = "kein Schnappschuss zur Anzeige vorhanden" if(AttrVal("global","language","EN") =~ /DE/ix);
$ret .= "<td> <br> <b> $cause </b> <br><br></td>"; $ret .= "<td> <br> <b> $cause </b> <br><br></td>";
} }
} elsif ($fmt =~ /generic/x) { Log3($strmdev, 4, "$strmdev - Link called: $link") if($link);
my $htag = AttrVal($strmdev,"genericStrmHtmlTag",AttrVal($camname,"genericStrmHtmlTag","")); undef $link;
if( $htag =~ m/^\s*(.*)\s*$/s ) { return $ret;
}
######################################################################################
# Streaming Device Typ: generic
sub _streamDevGENERIC {
my $params = shift;
my $camname = $params->{camname};
my $strmdev = $params->{strmdev};
my $hash = $defs{$camname};
my $streamHash = $defs{$strmdev};
my $ftui = $params->{ftui};
my $pws = $params->{pws};
my $ha = $params->{ha};
my $hb = $params->{hb};
my $cmdrefresh = $params->{cmdrefresh};
my $cmdrecendless = $params->{cmdrecendless};
my $cmdrecstop = $params->{cmdrecstop};
my $cmddosnap = $params->{cmddosnap};
my $imgrecendless = $params->{imgrecendless};
my $imgrecstop = $params->{imgrecstop};
my $imgdosnap = $params->{imgdosnap};
my $imgrefresh = $params->{imgrefresh};
my $imgblank = $params->{imgblank};
my $ttrefresh = $params->{ttrefresh};
my $ttsnap = $params->{ttsnap};
my $ttrecstop = $params->{ttrecstop};
my $ttrecstart = $params->{ttrecstart};
my $ret = "";
my $htag = AttrVal( $strmdev, "genericStrmHtmlTag", AttrVal($camname, "genericStrmHtmlTag", "") );
if($htag =~ m/^\s*(.*)\s*$/s) {
$htag = $1; $htag = $1;
$htag =~ s/\$NAME/$camname/xg; $htag =~ s/\$NAME/$camname/xg;
$htag =~ s/\$HTMLATTR/$ha/g; $htag =~ s/\$HTMLATTR/$ha/g;
@ -8231,33 +8425,39 @@ sub streamDev {
$ret .= '</div>'; $ret .= '</div>';
return $ret; return $ret;
} }
$ret .= "<td>"; $ret .= "<td>";
$ret .= "$htag"; $ret .= "$htag";
if($htag) { if($htag) {
# Popup-Tag um den Popup-Teil bereinigen # Popup-Tag um den Popup-Teil bereinigen
my $ptag = $htag; my $ptag = $htag;
$ptag =~ m/^(\s+)?(?<b><)(\s+)?(?<heart>.*)(\s+)?(?<nh>onClick=.*)(\s+)?(?<e>>)(\s+)?$/s; $ptag =~ m/^(\s+)?(?<b><)(\s+)?(?<heart>.*)(\s+)?(?<nh>onClick=.*)(\s+)?(?<e>>)(\s+)?$/s;
$ptag = $+{heart}?$+{b}.$+{heart}.$+{e}:$ptag; $ptag = $+{heart} ? $+{b}.$+{heart}.$+{e} : $ptag;
$streamHash->{HELPER}{STREAM} = "$ptag"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern $streamHash->{HELPER}{STREAM} = "$ptag"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern
$streamHash->{HELPER}{STREAM} =~ s/["']//gx; $streamHash->{HELPER}{STREAM} =~ s/["']//gx;
$streamHash->{HELPER}{STREAM} =~ s/\s+/ /gx; $streamHash->{HELPER}{STREAM} =~ s/\s+/ /gx;
$streamHash->{HELPER}{STREAMACTIVE} = 1; # Statusbit wenn ein Stream aktiviert ist $streamHash->{HELPER}{STREAMACTIVE} = 1; # Statusbit wenn ein Stream aktiviert ist
} }
$ret .= "<br>"; $ret .= "<br>";
Log3($strmdev, 4, "$strmdev - generic Stream params:\n$htag"); Log3($strmdev, 4, "$strmdev - generic Stream params:\n$htag");
if(!$hb) { if(!$hb) {
$ret .= "<a onClick=\"$cmdrefresh\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>"; $ret .= "<a onClick=\"$cmdrefresh\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>";
$ret .= $imgblank; $ret .= $imgblank;
if(ReadingsVal($camname, "Record", "Stop") eq "Stop") {
# Aufnahmebutton endlos Start if(ReadingsVal($camname, "Record", "Stop") eq "Stop") { # Aufnahmebutton endlos Start
$ret .= "<a onClick=\"$cmdrecendless\" onmouseover=\"Tip('$ttrecstart')\" onmouseout=\"UnTip()\">$imgrecendless </a>"; $ret .= "<a onClick=\"$cmdrecendless\" onmouseover=\"Tip('$ttrecstart')\" onmouseout=\"UnTip()\">$imgrecendless </a>";
} else { } else { # Aufnahmebutton Stop
# Aufnahmebutton Stop
$ret .= "<a onClick=\"$cmdrecstop\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>"; $ret .= "<a onClick=\"$cmdrecstop\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>";
} }
$ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>"; $ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
} }
$ret .= "</td>"; $ret .= "</td>";
if(AttrVal($camname,"ptzPanel_use",1)) { if(AttrVal($camname,"ptzPanel_use",1)) {
my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui); my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui);
if($ptz_ret) { if($ptz_ret) {
@ -8265,7 +8465,42 @@ sub streamDev {
} }
} }
} elsif ($fmt =~ /hls/x) { return $ret;
}
######################################################################################
# Streaming Device Typ: hls
sub _streamDevHLS {
my $params = shift;
my $camname = $params->{camname};
my $strmdev = $params->{strmdev};
my $hash = $defs{$camname};
my $streamHash = $defs{$strmdev};
my $ftui = $params->{ftui};
my $pws = $params->{pws};
my $ha = $params->{ha};
my $hb = $params->{hb};
my $cmdrefresh = $params->{cmdrefresh};
my $cmdrecendless = $params->{cmdrecendless};
my $cmdrecstop = $params->{cmdrecstop};
my $cmddosnap = $params->{cmddosnap};
my $imgrecendless = $params->{imgrecendless};
my $imgrecstop = $params->{imgrecstop};
my $imgdosnap = $params->{imgdosnap};
my $imgrefresh = $params->{imgrefresh};
my $imgblank = $params->{imgblank};
my $ttrefresh = $params->{ttrefresh};
my $ttsnap = $params->{ttsnap};
my $ttrecstop = $params->{ttrecstop};
my $ttrecstart = $params->{ttrecstart};
my ($cause,$ret) = ("","");
# es ist ein .m3u8-File bzw. ein Link dorthin zu übergeben # es ist ein .m3u8-File bzw. ein Link dorthin zu übergeben
my $cam = AttrVal($camname, "alias", $camname); my $cam = AttrVal($camname, "alias", $camname);
my $m3u8 = AttrVal($camname, "hlsStrmObject", ""); my $m3u8 = AttrVal($camname, "hlsStrmObject", "");
@ -8274,6 +8509,7 @@ sub streamDev {
$m3u8 = $1; $m3u8 = $1;
$m3u8 =~ s/\$NAME/$camname/gx; $m3u8 =~ s/\$NAME/$camname/gx;
} }
my $d = $camname; my $d = $camname;
$d =~ s/\./_/x; # Namensableitung zur javascript Codeanpassung $d =~ s/\./_/x; # Namensableitung zur javascript Codeanpassung
@ -8292,19 +8528,22 @@ sub streamDev {
$streamHash->{HELPER}{STREAM} = "<video $pws id=video_$d></video>"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern $streamHash->{HELPER}{STREAM} = "<video $pws id=video_$d></video>"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern
$streamHash->{HELPER}{STREAMACTIVE} = 1; # Statusbit wenn ein Stream aktiviert ist $streamHash->{HELPER}{STREAMACTIVE} = 1; # Statusbit wenn ein Stream aktiviert ist
if(!$hb) { if(!$hb) {
$ret .= "<a onClick=\"$cmdrefresh\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>"; $ret .= "<a onClick=\"$cmdrefresh\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>";
$ret .= $imgblank; $ret .= $imgblank;
if(ReadingsVal($camname, "Record", "Stop") eq "Stop") {
# Aufnahmebutton endlos Start if(ReadingsVal($camname, "Record", "Stop") eq "Stop") { # Aufnahmebutton endlos Start
$ret .= "<a onClick=\"$cmdrecendless\" onmouseover=\"Tip('$ttrecstart')\" onmouseout=\"UnTip()\">$imgrecendless </a>"; $ret .= "<a onClick=\"$cmdrecendless\" onmouseover=\"Tip('$ttrecstart')\" onmouseout=\"UnTip()\">$imgrecendless </a>";
} else { } else { # Aufnahmebutton Stop
# Aufnahmebutton Stop
$ret .= "<a onClick=\"$cmdrecstop\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>"; $ret .= "<a onClick=\"$cmdrecstop\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>";
} }
$ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>"; $ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
} }
$ret .= "</td>"; $ret .= "</td>";
if(AttrVal($camname,"ptzPanel_use",1)) { if(AttrVal($camname,"ptzPanel_use",1)) {
my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui); my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui);
if($ptz_ret) { if($ptz_ret) {
@ -8312,7 +8551,67 @@ sub streamDev {
} }
} }
} elsif ($fmt =~ /switched/x) { return $ret;
}
######################################################################################
# Streaming Device Typ: switched
sub _streamDevSWITCHED {
my $params = shift;
my $camname = $params->{camname};
my $strmdev = $params->{strmdev};
my $hash = $defs{$camname};
my $streamHash = $defs{$strmdev};
my $ftui = $params->{ftui};
my $pws = $params->{pws};
my $ha = $params->{ha};
my $hb = $params->{hb};
my $hau = $params->{hau};
my $cmdrefresh = $params->{cmdrefresh};
my $cmdrecendless = $params->{cmdrecendless};
my $cmdrecstop = $params->{cmdrecstop};
my $cmddosnap = $params->{cmddosnap};
my $cmdstop = $params->{cmdstop};
my $cmdmjpegrun = $params->{cmdmjpegrun};
my $cmdhlsrun = $params->{cmdhlsrun};
my $cmdlrirun = $params->{cmdlrirun};
my $cmdlh264run = $params->{cmdlh264run};
my $cmdlsnaprun = $params->{cmdlsnaprun};
my $cmdhlsreact = $params->{cmdhlsreact};
my $cmdlmjpegrun = $params->{cmdlmjpegrun};
my $imgrecendless = $params->{imgrecendless};
my $imgrecstop = $params->{imgrecstop};
my $imgdosnap = $params->{imgdosnap};
my $imgrefresh = $params->{imgrefresh};
my $imgblank = $params->{imgblank};
my $imgstop = $params->{imgstop};
my $imghlsreact = $params->{imghlsreact};
my $imgmjpegrun = $params->{imgmjpegrun};
my $imghlsrun = $params->{imghlsrun};
my $imglh264run = $params->{imglh264run};
my $imglmjpegrun = $params->{imglmjpegrun};
my $imglsnaprun = $params->{imglsnaprun};
my $ttrefresh = $params->{ttrefresh};
my $ttsnap = $params->{ttsnap};
my $ttrecstop = $params->{ttrecstop};
my $ttrecstart = $params->{ttrecstart};
my $ttcmdstop = $params->{ttcmdstop};
my $tthlsreact = $params->{tthlsreact};
my $ttmjpegrun = $params->{ttmjpegrun};
my $tthlsrun = $params->{tthlsrun};
my $ttlrrun = $params->{ttlrrun};
my $imglrirun = $params->{imglrirun};
my $tth264run = $params->{tth264run};
my $ttlmjpegrun = $params->{ttlmjpegrun};
my $ttlsnaprun = $params->{ttlsnaprun};
my ($link,$cause,$ret) = ("","","");
my $wltype = $hash->{HELPER}{WLTYPE}; my $wltype = $hash->{HELPER}{WLTYPE};
$link = $hash->{HELPER}{LINK}; $link = $hash->{HELPER}{LINK};
@ -8326,28 +8625,33 @@ sub streamDev {
} else { } else {
$ret .= "<td><img src=$link $ha><br>" if($link); $ret .= "<td><img src=$link $ha><br>" if($link);
} }
$streamHash->{HELPER}{STREAM} = "<img src=$link $pws>"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern $streamHash->{HELPER}{STREAM} = "<img src=$link $pws>"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern
$streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist $streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist
} }
$ret .= "<a onClick=\"$cmdstop\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>"; $ret .= "<a onClick=\"$cmdstop\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>";
$ret .= $imgblank; $ret .= $imgblank;
if($hash->{HELPER}{RUNVIEW} =~ /live_fw/x) { if($hash->{HELPER}{RUNVIEW} =~ /live_fw/x) {
if(ReadingsVal($camname, "Record", "Stop") eq "Stop") { if(ReadingsVal($camname, "Record", "Stop") eq "Stop") { # Aufnahmebutton endlos Start
# Aufnahmebutton endlos Start
$ret .= "<a onClick=\"$cmdrecendless\" onmouseover=\"Tip('$ttrecstart')\" onmouseout=\"UnTip()\">$imgrecendless </a>"; $ret .= "<a onClick=\"$cmdrecendless\" onmouseover=\"Tip('$ttrecstart')\" onmouseout=\"UnTip()\">$imgrecendless </a>";
} else { } else { # Aufnahmebutton Stop
# Aufnahmebutton Stop
$ret .= "<a onClick=\"$cmdrecstop\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>"; $ret .= "<a onClick=\"$cmdrecstop\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>";
} }
$ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>"; $ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
} }
$ret .= "</td>"; $ret .= "</td>";
if(AttrVal($camname,"ptzPanel_use",1) && $hash->{HELPER}{RUNVIEW} =~ /live_fw/x) { if(AttrVal($camname,"ptzPanel_use",1) && $hash->{HELPER}{RUNVIEW} =~ /live_fw/x) {
my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui); my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui);
if($ptz_ret) { if($ptz_ret) {
$ret .= "<td>$ptz_ret</td>"; $ret .= "<td>$ptz_ret</td>";
} }
} }
if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/ && !$hau) { if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/ && !$hau) {
$ret .= "</tr>"; $ret .= "</tr>";
$ret .= '<tr class="odd">'; $ret .= '<tr class="odd">';
@ -8360,21 +8664,23 @@ sub streamDev {
} elsif ($wltype =~ /iframe/x) { } elsif ($wltype =~ /iframe/x) {
if(!$ftui) { if(!$ftui) {
$ret .= "<td><iframe src=$link $ha controls autoplay onClick=\"FW_okDialog('<img src=$link $pws>')\"> $ret .= "<td><iframe src=$link $ha controls autoplay onClick=\"FW_okDialog('<img src=$link $pws>')\">".
Iframes disabled "Iframes disabled".
</iframe><br>" if($link); "</iframe><br>" if($link);
} else { } else {
$ret .= "<td><iframe src=$link $ha controls autoplay> $ret .= "<td><iframe src=$link $ha controls autoplay>".
Iframes disabled "Iframes disabled".
</iframe><br>" if($link); "</iframe><br>" if($link);
} }
$streamHash->{HELPER}{STREAM} = "<iframe src=$link $pws controls autoplay>". $streamHash->{HELPER}{STREAM} = "<iframe src=$link $pws controls autoplay>".
"Iframes disabled". "Iframes disabled".
"</iframe>"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern "</iframe>"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern
$streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist $streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist
$ret .= "<a onClick=\"$cmdstop\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>"; $ret .= "<a onClick=\"$cmdstop\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>";
$ret .= "<a onClick=\"$cmdrefresh\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>"; $ret .= "<a onClick=\"$cmdrefresh\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>";
$ret .= "</td>"; $ret .= "</td>";
if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/ && !$hau) { if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/ && !$hau) {
$ret .= '</tr>'; $ret .= '</tr>';
$ret .= '<tr class="odd">'; $ret .= '<tr class="odd">';
@ -8392,15 +8698,19 @@ sub streamDev {
<source src=$link type=\"video/webm\"> <source src=$link type=\"video/webm\">
Your browser does not support the video tag Your browser does not support the video tag
</video><br>"; </video><br>";
$streamHash->{HELPER}{STREAM} = "<video $pws controls autoplay>". $streamHash->{HELPER}{STREAM} = "<video $pws controls autoplay>".
"<source src=$link type=\"video/mp4\">". "<source src=$link type=\"video/mp4\">".
"<source src=$link type=\"video/ogg\">". "<source src=$link type=\"video/ogg\">".
"<source src=$link type=\"video/webm\">". "<source src=$link type=\"video/webm\">".
"Your browser does not support the video tag". "Your browser does not support the video tag".
"</video>"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern "</video>"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern
$streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist $streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist
$ret .= "<a onClick=\"$cmdstop\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>"; $ret .= "<a onClick=\"$cmdstop\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>";
$ret .= "</td>"; $ret .= "</td>";
if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/ && !$hau) { if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/ && !$hau) {
$ret .= '</tr>'; $ret .= '</tr>';
$ret .= '<tr class="odd">'; $ret .= '<tr class="odd">';
@ -8410,6 +8720,7 @@ sub streamDev {
$ret .= "</td>"; $ret .= "</td>";
$ret .= "<td></td>" if(AttrVal($camname,"ptzPanel_use",0)); $ret .= "<td></td>" if(AttrVal($camname,"ptzPanel_use",0));
} }
} elsif($wltype =~ /base64img/x) { } elsif($wltype =~ /base64img/x) {
if(!$ftui) { if(!$ftui) {
$ret .= "<td><img src='data:image/jpeg;base64,$link' $ha onClick=\"FW_okDialog('<img src=data:image/jpeg;base64,$link $pws>')\"><br>" if($link); $ret .= "<td><img src='data:image/jpeg;base64,$link' $ha onClick=\"FW_okDialog('<img src=data:image/jpeg;base64,$link $pws>')\"><br>" if($link);
@ -8418,6 +8729,7 @@ sub streamDev {
} }
$streamHash->{HELPER}{STREAM} = "<img src=data:image/jpeg;base64,$link $pws>"; # Stream für "get <SSCamSTRM-Device> popupStream" speichern $streamHash->{HELPER}{STREAM} = "<img src=data:image/jpeg;base64,$link $pws>"; # Stream für "get <SSCamSTRM-Device> popupStream" speichern
$streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist $streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist
$ret .= "<a onClick=\"$cmdstop\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>"; $ret .= "<a onClick=\"$cmdstop\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>";
$ret .= $imgblank; $ret .= $imgblank;
$ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>"; $ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
@ -8438,32 +8750,35 @@ sub streamDev {
<source src=$link type=\"video/MP2T\"> <source src=$link type=\"video/MP2T\">
Your browser does not support the video tag Your browser does not support the video tag
</video><br>"; </video><br>";
$streamHash->{HELPER}{STREAM} = "<video $pws controls autoplay>". $streamHash->{HELPER}{STREAM} = "<video $pws controls autoplay>".
"<source src=$link type=\"application/x-mpegURL\">". "<source src=$link type=\"application/x-mpegURL\">".
"<source src=$link type=\"video/MP2T\">". "<source src=$link type=\"video/MP2T\">".
"Your browser does not support the video tag". "Your browser does not support the video tag".
"</video>"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern "</video>"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern
$streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist $streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist
$ret .= "<a onClick=\"$cmdstop\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>"; $ret .= "<a onClick=\"$cmdstop\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>";
$ret .= "<a onClick=\"$cmdrefresh\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>"; $ret .= "<a onClick=\"$cmdrefresh\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>";
$ret .= "<a onClick=\"$cmdhlsreact\" onmouseover=\"Tip('$tthlsreact')\" onmouseout=\"UnTip()\">$imghlsreact </a>"; $ret .= "<a onClick=\"$cmdhlsreact\" onmouseover=\"Tip('$tthlsreact')\" onmouseout=\"UnTip()\">$imghlsreact </a>";
$ret .= $imgblank; $ret .= $imgblank;
if(ReadingsVal($camname, "Record", "Stop") eq "Stop") {
# Aufnahmebutton endlos Start if(ReadingsVal($camname, "Record", "Stop") eq "Stop") { # Aufnahmebutton endlos Start
$ret .= "<a onClick=\"$cmdrecendless\" onmouseover=\"Tip('$ttrecstart')\" onmouseout=\"UnTip()\">$imgrecendless </a>"; $ret .= "<a onClick=\"$cmdrecendless\" onmouseover=\"Tip('$ttrecstart')\" onmouseout=\"UnTip()\">$imgrecendless </a>";
} else { } else { # Aufnahmebutton Stop
# Aufnahmebutton Stop
$ret .= "<a onClick=\"$cmdrecstop\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>"; $ret .= "<a onClick=\"$cmdrecstop\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>";
} }
$ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>"; $ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
$ret .= "</td>"; $ret .= "</td>";
if(AttrVal($camname,"ptzPanel_use",1)) { if(AttrVal($camname,"ptzPanel_use",1)) {
my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui); my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui);
if($ptz_ret) { if($ptz_ret) {
$ret .= "<td>$ptz_ret</td>"; $ret .= "<td>$ptz_ret</td>";
} }
} }
} }
} else { } else {
@ -8478,16 +8793,8 @@ sub streamDev {
$ret .= "<a onClick=\"$cmdlsnaprun\" onmouseover=\"Tip('$ttlsnaprun')\" onmouseout=\"UnTip()\">$imglsnaprun </a>"; $ret .= "<a onClick=\"$cmdlsnaprun\" onmouseover=\"Tip('$ttlsnaprun')\" onmouseout=\"UnTip()\">$imglsnaprun </a>";
$ret .= "</td>"; $ret .= "</td>";
} }
} else {
$cause = "Videoformat not supported";
$ret .= "<td> <br> <b> $cause </b> <br><br></td>";
}
$ret .= '</tr>';
$ret .= '</tbody>';
$ret .= '</table>';
Log3($strmdev, 4, "$strmdev - Link called: $link") if($link); Log3($strmdev, 4, "$strmdev - Link called: $link") if($link);
undef $link; undef $link;
return $ret; return $ret;
@ -10881,12 +11188,12 @@ sub setVersionInfo {
if($modules{$type}{META}{x_prereqs_src} && !$hash->{HELPER}{MODMETAABSENT}) { if($modules{$type}{META}{x_prereqs_src} && !$hash->{HELPER}{MODMETAABSENT}) {
# META-Daten sind vorhanden # META-Daten sind vorhanden
$modules{$type}{META}{version} = "v".$v; # Version aus META.json überschreiben, Anzeige mit {Dumper $modules{SMAPortal}{META}} $modules{$type}{META}{version} = "v".$v; # Version aus META.json überschreiben, Anzeige mit {Dumper $modules{SMAPortal}{META}}
if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id: 49_SSCam.pm 22363 2020-07-06 21:38:30Z DS_Starter $ im Kopf komplett! vorhanden ) if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id: 49_SSCam.pm 22382 2020-07-10 20:25:50Z DS_Starter $ im Kopf komplett! vorhanden )
$modules{$type}{META}{x_version} =~ s/1.1.1/$v/g; $modules{$type}{META}{x_version} =~ s/1.1.1/$v/g;
} else { } else {
$modules{$type}{META}{x_version} = $v; $modules{$type}{META}{x_version} = $v;
} }
return $@ unless (FHEM::Meta::SetInternals($hash)); # FVERSION wird gesetzt ( nur gesetzt wenn $Id: 49_SSCam.pm 22363 2020-07-06 21:38:30Z DS_Starter $ im Kopf komplett! vorhanden ) return $@ unless (FHEM::Meta::SetInternals($hash)); # FVERSION wird gesetzt ( nur gesetzt wenn $Id: 49_SSCam.pm 22382 2020-07-10 20:25:50Z DS_Starter $ im Kopf komplett! vorhanden )
if(__PACKAGE__ eq "FHEM::$type" || __PACKAGE__ eq $type) { if(__PACKAGE__ eq "FHEM::$type" || __PACKAGE__ eq $type) {
# es wird mit Packages gearbeitet -> Perl übliche Modulversion setzen # es wird mit Packages gearbeitet -> Perl übliche Modulversion setzen
# mit {<Modul>->VERSION()} im FHEMWEB kann Modulversion abgefragt werden # mit {<Modul>->VERSION()} im FHEMWEB kann Modulversion abgefragt werden
@ -10948,6 +11255,7 @@ return;
<li>automatized definition of all in SVS available cameras in FHEM (autocreateCams) </li> <li>automatized definition of all in SVS available cameras in FHEM (autocreateCams) </li>
<li>save the last recording of camera locally </li> <li>save the last recording of camera locally </li>
<li>Selection of several cache types for image data storage (attribute cacheType) </li> <li>Selection of several cache types for image data storage (attribute cacheType) </li>
<li>execute Zoom actions (only if PTZ camera supports Zoom) </li>
</ul> </ul>
</ul> </ul>
<br> <br>
@ -10998,9 +11306,13 @@ return;
<br> <br>
The PTZ panel (only PTZ cameras) in SSCam use its own icons. SSCam uses its own icons.
Thereby the system find the icons, in FHEMWEB device the attribute "iconPath" has to be completed by "sscam" In order for the system to find the icons, the attribute <b>iconPath</b> must be supplemented with <b>sscam</b> in the FHEMWEB device. <br><br>
(e.g. "attr WEB iconPath default:fhemSVG:openautomation:sscam").
<ul>
<b>Example</b> <br>
attr WEB iconPath default:fhemSVG:openautomation:sscam
</ul>
<br><br> <br><br>
</ul> </ul>
@ -12874,6 +13186,7 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
<li>Automatisiertes Anlegen aller in der SVS vorhandenen Kameras in FHEM (autocreateCams) </li> <li>Automatisiertes Anlegen aller in der SVS vorhandenen Kameras in FHEM (autocreateCams) </li>
<li>lokales Abspeichern der letzten Kamera-Aufnahme </li> <li>lokales Abspeichern der letzten Kamera-Aufnahme </li>
<li>Auswahl unterschiedlicher Cache-Typen zur Bilddatenspeicherung (Attribut cacheType) </li> <li>Auswahl unterschiedlicher Cache-Typen zur Bilddatenspeicherung (Attribut cacheType) </li>
<li>ausführen von Zoom-Aktionen (bei PTZ-Kameras die Zoom unterstützen) </li>
</ul> </ul>
</ul> </ul>
<br> <br>
@ -12924,16 +13237,20 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
<tr><td>Meta </td><td>(FHEM-Modul) </td></tr> <tr><td>Meta </td><td>(FHEM-Modul) </td></tr>
<tr><td>Net::SMTP </td><td>(wenn Bilddaten-Versand verwendet) </td></tr> <tr><td>Net::SMTP </td><td>(wenn Bilddaten-Versand verwendet) </td></tr>
<tr><td>MIME::Lite </td><td>(wenn Bilddaten-Versand verwendet) </td></tr> <tr><td>MIME::Lite </td><td>(wenn Bilddaten-Versand verwendet) </td></tr>
<tr><td>CHI </td><td>(wenn Cache verwendet) </td></tr> <tr><td>CHI </td><td>(wenn Cache verwendet wird) </td></tr>
<tr><td>CHI::Driver::Redis </td><td>(wenn Cache verwendet) </td></tr> <tr><td>CHI::Driver::Redis </td><td>(wenn Cache verwendet wird) </td></tr>
<tr><td>Cache::Cache </td><td>(wenn Cache verwendet) </td></tr> <tr><td>Cache::Cache </td><td>(wenn Cache verwendet wird) </td></tr>
</table> </table>
<br> <br>
Das PTZ-Paneel (nur PTZ Kameras) in SSCam benutzt einen eigenen Satz Icons. SSCam benutzt einen eigenen Satz Icons.
Damit das System sie findet, ist im FHEMWEB Device das Attribut "iconPath" um "sscam" zu ergänzen Damit das System sie findet, ist im FHEMWEB Device das Attribut <b>iconPath</b> um <b>sscam</b> zu ergänzen. <br><br>
(z.B. "attr WEB iconPath default:fhemSVG:openautomation:sscam").
<ul>
<b>Beispiel</b> <br>
attr WEB iconPath default:fhemSVG:openautomation:sscam
</ul>
<br><br> <br><br>
</ul> </ul>