2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-03 16:56:54 +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
#
@ -156,7 +156,8 @@ BEGIN {
# Versions History intern
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.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 ",
@ -473,6 +474,14 @@ my %zd = ( # Ha
"--." => {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
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
@ -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_wname); # Web instance
# sub FW_pH(@); # add href
# use vars qw(%vHintsExt_en);
# use vars qw(%vHintsExt_de);
#sub SSChatBot_formString;
#sub SSChatBot_addQueue($$$$$$$$);
@ -1201,8 +1208,8 @@ sub Set {
my $spec = join(" ",@a);
if($spec =~ /STRM:/x) {
$spec =~ m/STRM:(.*)/ix; # Aufnahme durch SSCamSTRM-Device
$hash->{HELPER}{INFORM} = $1;
my ($inf) = $spec =~ m/STRM:(.*)/ix; # Aufnahme durch SSCamSTRM-Device
$hash->{HELPER}{INFORM} = $inf;
}
my $emtxt = AttrVal($name, "recEmailTxt", "");
@ -7790,13 +7797,11 @@ sub ptzPanel {
}
$ptz_ret .= "</tr>\n";
}
# $ptz_ret .= "</table>";
### Zoom
###############################
if(IsCapZoom($hash)) { # wenn Zoom Eigenschaft
# $ptz_ret .= '<table class="rc_body defsize">';
$ptz_ret .= "<tr>";
$ptz_ret .= "<td style='text-align:center' colspan=10><hr /></td>";
$ptz_ret .= "</tr>";
@ -7818,12 +7823,17 @@ sub ptzPanel {
$img = FW_makeImage($img, $cmd, "rc-button");
} 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) {
$img = "<img src=\"$FW_ME/$FW_icondir/$iPath\" height=\"$pbsf%\" width=\"$pbsf%\">";
$img = "<img src=\"$iPath\" height=\"$pbsf%\" width=\"$pbsf%\">";
} 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 .= "</table>";
}
$ptz_ret .= "</table>";
@ -7982,13 +7991,12 @@ return;
#
# $camname = Name der Kamaera (Parent-Device)
# $strmdev = Name des Streaming-Devices
# $fmt = Streaming Format
# $fmt = Streaming Format (Vergleich auf "eq" !)
#
######################################################################################
sub streamDev {
my ($camname,$strmdev,$fmt,$ftui) = @_;
my $hash = $defs{$camname};
my $wltype = $hash->{HELPER}{WLTYPE};
my $serveraddr = $hash->{SERVERADDR};
my $serverport = $hash->{SERVERPORT};
my $apivideostm = $hash->{HELPER}{APIVIDEOSTM};
@ -8005,17 +8013,18 @@ sub streamDev {
my $proto = $hash->{PROTOCOL};
$ftui = ($ftui && $ftui eq "ftui") ? 1 : 0;
my $hdrAlign = "center";
my ($show,$cause,$ret,$link,$audiolink,$devWlink,$wlhash,$wlalias);
# Kontext des SSCamSTRM-Devices speichern für roomRefresh
$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}{STRMDETAIL} = $FW_detail?$FW_detail:""; # Name des SSCamSTRM-Devices (wenn Detailansicht)
# $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}{STRMDETAIL} = $FW_detail?$FW_detail:""; # Name des SSCamSTRM-Devices (wenn Detailansicht)
my $streamHash = $defs{$strmdev}; # Hash des SSCamSTRM-Devices
my $uuid = $streamHash->{FUUID}; # eindeutige UUID des Streamingdevices
delete $streamHash->{HELPER}{STREAM};
delete $streamHash->{HELPER}{STREAMACTIVE}; # Statusbit ob ein Stream aktiviert ist
my ($show,$cause,$ret);
# Definition Tasten
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
@ -8059,32 +8068,12 @@ sub streamDev {
$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
my $calias = $hash->{CAMNAME}; # Alias der Kamera
my $ttjs = "/fhem/pgm2/sscam_tooltip.js";
my ($ttrefresh, $ttrecstart, $ttrecstop, $ttsnap, $ttcmdstop, $tthlsreact, $ttmjpegrun, $tthlsrun, $ttlrrun, $tth264run, $ttlmjpegrun, $ttlsnaprun);
# Hinweis Popups
if(AttrVal("global","language","EN") =~ /EN/x) {
$ttrefresh = $ttips_en{"ttrefresh"}; $ttrefresh =~ s/§NAME§/$calias/gx;
$ttrecstart = $ttips_en{"ttrecstart"}; $ttrecstart =~ s/§NAME§/$calias/gx;
@ -8113,6 +8102,85 @@ sub streamDev {
$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 .= "<script type=\"text/javascript\" src=\"$ttjs\"></script>";
$ret .= '<table class="block wide internals" style="margin-left:auto;margin-right:auto">';
@ -8137,9 +8205,67 @@ sub streamDev {
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/) {
$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 {
if($apivideostmsmaxver) {
$link = "$proto://$serveraddr:$serverport/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsmaxver&method=Stream&cameraId=$camid&format=mjpeg&_sid=$sid";
@ -8184,10 +8310,36 @@ sub streamDev {
$ret .= "<td></td>" if(AttrVal($camname,"ptzPanel_use",0));
}
} elsif ($fmt =~ /lastsnap/x) {
# $link = $hash->{HELPER}{".LASTSNAP"};
Log3($strmdev, 4, "$strmdev - Link called: $link") if($link);
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
Log3($camname, 1, "$camname - Fall back to internal Cache due to preceding failure.") if(!$cache);
if(!$cache || $cache eq "internal" ) {
$link = $data{SSCam}{$camname}{LASTSNAP};
} else {
@ -8195,25 +8347,67 @@ sub streamDev {
}
my $gattr = (AttrVal($camname,"snapGallerySize","Icon") eq "Full") ? $ha : "";
if($link) {
if(!$ftui) {
$ret .= "<td><img src='data:image/jpeg;base64,$link' $gattr onClick=\"FW_okDialog('<img src=data:image/jpeg;base64,$link $pws>')\"><br>";
} else {
$ret .= "<td><img src='data:image/jpeg;base64,$link' $gattr><br>";
}
if(!$hb) {
$ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
}
$ret .= "</td>";
$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
} else {
$cause = "no snapshot available to display";
$cause = "kein Schnappschuss zur Anzeige vorhanden" if(AttrVal("global","language","EN") =~ /DE/ix);
$ret .= "<td> <br> <b> $cause </b> <br><br></td>";
}
} elsif ($fmt =~ /generic/x) {
Log3($strmdev, 4, "$strmdev - Link called: $link") if($link);
undef $link;
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) {
@ -8231,8 +8425,10 @@ sub streamDev {
$ret .= '</div>';
return $ret;
}
$ret .= "<td>";
$ret .= "$htag";
if($htag) {
# Popup-Tag um den Popup-Teil bereinigen
my $ptag = $htag;
@ -8243,21 +8439,25 @@ sub streamDev {
$streamHash->{HELPER}{STREAM} =~ s/\s+/ /gx;
$streamHash->{HELPER}{STREAMACTIVE} = 1; # Statusbit wenn ein Stream aktiviert ist
}
$ret .= "<br>";
Log3($strmdev, 4, "$strmdev - generic Stream params:\n$htag");
if(!$hb) {
$ret .= "<a onClick=\"$cmdrefresh\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>";
$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>";
} else {
# Aufnahmebutton Stop
} else { # Aufnahmebutton Stop
$ret .= "<a onClick=\"$cmdrecstop\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>";
}
$ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
}
$ret .= "</td>";
if(AttrVal($camname,"ptzPanel_use",1)) {
my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui);
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
my $cam = AttrVal($camname, "alias", $camname);
my $m3u8 = AttrVal($camname, "hlsStrmObject", "");
@ -8274,6 +8509,7 @@ sub streamDev {
$m3u8 = $1;
$m3u8 =~ s/\$NAME/$camname/gx;
}
my $d = $camname;
$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}{STREAMACTIVE} = 1; # Statusbit wenn ein Stream aktiviert ist
if(!$hb) {
$ret .= "<a onClick=\"$cmdrefresh\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>";
$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>";
} else {
# Aufnahmebutton Stop
} else { # Aufnahmebutton Stop
$ret .= "<a onClick=\"$cmdrecstop\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>";
}
$ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
}
$ret .= "</td>";
if(AttrVal($camname,"ptzPanel_use",1)) {
my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui);
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};
$link = $hash->{HELPER}{LINK};
@ -8326,28 +8625,33 @@ sub streamDev {
} else {
$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}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist
}
$ret .= "<a onClick=\"$cmdstop\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>";
$ret .= $imgblank;
if($hash->{HELPER}{RUNVIEW} =~ /live_fw/x) {
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>";
} else {
# Aufnahmebutton Stop
} else { # Aufnahmebutton Stop
$ret .= "<a onClick=\"$cmdrecstop\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>";
}
$ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
}
$ret .= "</td>";
if(AttrVal($camname,"ptzPanel_use",1) && $hash->{HELPER}{RUNVIEW} =~ /live_fw/x) {
my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui);
if($ptz_ret) {
$ret .= "<td>$ptz_ret</td>";
}
}
if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/ && !$hau) {
$ret .= "</tr>";
$ret .= '<tr class="odd">';
@ -8360,21 +8664,23 @@ sub streamDev {
} elsif ($wltype =~ /iframe/x) {
if(!$ftui) {
$ret .= "<td><iframe src=$link $ha controls autoplay onClick=\"FW_okDialog('<img src=$link $pws>')\">
Iframes disabled
</iframe><br>" if($link);
$ret .= "<td><iframe src=$link $ha controls autoplay onClick=\"FW_okDialog('<img src=$link $pws>')\">".
"Iframes disabled".
"</iframe><br>" if($link);
} else {
$ret .= "<td><iframe src=$link $ha controls autoplay>
Iframes disabled
</iframe><br>" if($link);
$ret .= "<td><iframe src=$link $ha controls autoplay>".
"Iframes disabled".
"</iframe><br>" if($link);
}
$streamHash->{HELPER}{STREAM} = "<iframe src=$link $pws controls autoplay>".
"Iframes disabled".
"</iframe>"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern
$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=\"$cmdrefresh\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>";
$ret .= "</td>";
if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/ && !$hau) {
$ret .= '</tr>';
$ret .= '<tr class="odd">';
@ -8392,15 +8698,19 @@ sub streamDev {
<source src=$link type=\"video/webm\">
Your browser does not support the video tag
</video><br>";
$streamHash->{HELPER}{STREAM} = "<video $pws controls autoplay>".
"<source src=$link type=\"video/mp4\">".
"<source src=$link type=\"video/ogg\">".
"<source src=$link type=\"video/webm\">".
"Your browser does not support the video tag".
"</video>"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern
$streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist
$ret .= "<a onClick=\"$cmdstop\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>";
$ret .= "</td>";
if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/ && !$hau) {
$ret .= '</tr>';
$ret .= '<tr class="odd">';
@ -8410,6 +8720,7 @@ sub streamDev {
$ret .= "</td>";
$ret .= "<td></td>" if(AttrVal($camname,"ptzPanel_use",0));
}
} elsif($wltype =~ /base64img/x) {
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);
@ -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}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist
$ret .= "<a onClick=\"$cmdstop\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>";
$ret .= $imgblank;
$ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
@ -8438,32 +8750,35 @@ sub streamDev {
<source src=$link type=\"video/MP2T\">
Your browser does not support the video tag
</video><br>";
$streamHash->{HELPER}{STREAM} = "<video $pws controls autoplay>".
"<source src=$link type=\"application/x-mpegURL\">".
"<source src=$link type=\"video/MP2T\">".
"Your browser does not support the video tag".
"</video>"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern
$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=\"$cmdrefresh\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>";
$ret .= "<a onClick=\"$cmdhlsreact\" onmouseover=\"Tip('$tthlsreact')\" onmouseout=\"UnTip()\">$imghlsreact </a>";
$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>";
} else {
# Aufnahmebutton Stop
} else { # Aufnahmebutton Stop
$ret .= "<a onClick=\"$cmdrecstop\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>";
}
$ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
$ret .= "</td>";
if(AttrVal($camname,"ptzPanel_use",1)) {
my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui);
if($ptz_ret) {
$ret .= "<td>$ptz_ret</td>";
}
}
}
} else {
@ -8478,16 +8793,8 @@ sub streamDev {
$ret .= "<a onClick=\"$cmdlsnaprun\" onmouseover=\"Tip('$ttlsnaprun')\" onmouseout=\"UnTip()\">$imglsnaprun </a>";
$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);
undef $link;
return $ret;
@ -10881,12 +11188,12 @@ sub setVersionInfo {
if($modules{$type}{META}{x_prereqs_src} && !$hash->{HELPER}{MODMETAABSENT}) {
# META-Daten sind vorhanden
$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;
} else {
$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) {
# es wird mit Packages gearbeitet -> Perl übliche Modulversion setzen
# 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>save the last recording of camera locally </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>
<br>
@ -10998,9 +11306,13 @@ return;
<br>
The PTZ panel (only PTZ cameras) in SSCam use its own icons.
Thereby the system find the icons, in FHEMWEB device the attribute "iconPath" has to be completed by "sscam"
(e.g. "attr WEB iconPath default:fhemSVG:openautomation:sscam").
SSCam uses its own icons.
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>
<ul>
<b>Example</b> <br>
attr WEB iconPath default:fhemSVG:openautomation:sscam
</ul>
<br><br>
</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>lokales Abspeichern der letzten Kamera-Aufnahme </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>
<br>
@ -12924,16 +13237,20 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
<tr><td>Meta </td><td>(FHEM-Modul) </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>CHI </td><td>(wenn Cache verwendet) </td></tr>
<tr><td>CHI::Driver::Redis </td><td>(wenn Cache verwendet) </td></tr>
<tr><td>Cache::Cache </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 wird) </td></tr>
<tr><td>Cache::Cache </td><td>(wenn Cache verwendet wird) </td></tr>
</table>
<br>
Das PTZ-Paneel (nur PTZ Kameras) in SSCam benutzt einen eigenen Satz Icons.
Damit das System sie findet, ist im FHEMWEB Device das Attribut "iconPath" um "sscam" zu ergänzen
(z.B. "attr WEB iconPath default:fhemSVG:openautomation:sscam").
SSCam benutzt einen eigenen Satz Icons.
Damit das System sie findet, ist im FHEMWEB Device das Attribut <b>iconPath</b> um <b>sscam</b> zu ergänzen. <br><br>
<ul>
<b>Beispiel</b> <br>
attr WEB iconPath default:fhemSVG:openautomation:sscam
</ul>
<br><br>
</ul>