49_SSCam.pm: contrib 8.17.0

git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@20140 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2019-09-09 22:24:51 +00:00
parent c4cd3e308b
commit dfa62e2f11
2 changed files with 193 additions and 138 deletions

View File

@ -1,5 +1,5 @@
######################################################################################################################## ########################################################################################################################
# $Id: 49_SSCam.pm 19750 2019-06-30 20:34:25Z DS_Starter $ # $Id: 49_SSCam.pm 19996 2019-08-13 21:21:54Z DS_Starter $
######################################################################################################################### #########################################################################################################################
# 49_SSCam.pm # 49_SSCam.pm
# #
@ -48,6 +48,10 @@ eval "use FHEM::Meta;1" or my $modMetaAbsent = 1;
# Versions History intern # Versions History intern
our %SSCam_vNotesIntern = ( our %SSCam_vNotesIntern = (
"8.17.0" => "09.09.2019 fix warnings, suport hide buttons in streaming device ",
"8.16.3" => "13.08.2019 commandref revised ",
"8.16.2" => "17.07.2019 change function SSCam_ptzpanel using css stylesheet ",
"8.16.1" => "16.07.2019 fix warnings ",
"8.16.0" => "14.07.2019 change detail link generation from SSCamSTRM to SSCam ", "8.16.0" => "14.07.2019 change detail link generation from SSCamSTRM to SSCam ",
"8.15.2" => "14.07.2019 fix order of snaps in snapgallery when adding new snaps, fix english date formating in composegallery, ". "8.15.2" => "14.07.2019 fix order of snaps in snapgallery when adding new snaps, fix english date formating in composegallery, ".
"align center of FTUI table, set compatibility to 8.2.5 ", "align center of FTUI table, set compatibility to 8.2.5 ",
@ -953,7 +957,6 @@ sub SSCam_Set($@) {
if($spec =~ /STRM:/) { if($spec =~ /STRM:/) {
$spec =~ m/.*STRM:(.*).*/i; # Snap by SSCamSTRM-Device $spec =~ m/.*STRM:(.*).*/i; # Snap by SSCamSTRM-Device
$hash->{HELPER}{INFORM} = $1; $hash->{HELPER}{INFORM} = $1;
$hash->{HELPER}{SNAPBYSTRMDEV} = 1;
} }
my $emtxt = AttrVal($name, "snapEmailTxt", ""); my $emtxt = AttrVal($name, "snapEmailTxt", "");
@ -1948,7 +1951,7 @@ sub SSCam_FWdetailFn ($$$$) {
$ret .= $hash->{".setup"}; $ret .= $hash->{".setup"};
} }
$hash->{".ptzhtml"} = SSCam_ptzpanel($d) if($hash->{".ptzhtml"} eq ""); $hash->{".ptzhtml"} = SSCam_ptzpanel($d,$d) if($hash->{".ptzhtml"} eq "");
if($hash->{".ptzhtml"} ne "" && AttrVal($d,"ptzPanel_use",1)) { if($hash->{".ptzhtml"} ne "" && AttrVal($d,"ptzPanel_use",1)) {
$ret .= $hash->{".ptzhtml"}; $ret .= $hash->{".ptzhtml"};
@ -6950,19 +6953,24 @@ return ($ret);
############################################################################### ###############################################################################
sub SSCam_ptzpanel(@) { sub SSCam_ptzpanel(@) {
my ($name,$ptzcdev,$ptzcontrol,$ftui) = @_; my ($name,$ptzcdev,$ptzcontrol,$ftui) = @_;
my $hash = $defs{$name}; my $hash = $defs{$name};
my $iconpath = AttrVal("$name","ptzPanel_iconPath","www/images/sscam"); my $iconpath = AttrVal("$name","ptzPanel_iconPath","www/images/sscam");
my $iconprefix = AttrVal("$name","ptzPanel_iconPrefix","black_btn_"); my $iconprefix = AttrVal("$name","ptzPanel_iconPrefix","black_btn_");
my $valPresets = ReadingsVal("$name","Presets",""); my $valPresets = ReadingsVal("$name","Presets","");
my $valPatrols = ReadingsVal("$name","Patrols",""); my $valPatrols = ReadingsVal("$name","Patrols","");
my $rowisset = 0; my $rowisset = 0;
my $ptz_ret; my ($pbs,$pbsf) = ("","");
my $row; my ($row,$ptz_ret);
return "" if(SSCam_myVersion($hash) <= 71); return "" if(SSCam_myVersion($hash) <= 71);
$ptz_ret = "<div class=\"ptzpanel\">"; $pbs = AttrVal($ptzcdev,"ptzButtonSize", 100); # Größe der Druckbuttons in %
$ptz_ret.= '<table class="rc_body">'; $pbsf = AttrVal($ptzcdev,"ptzButtonSizeFTUI", 100); # Größe der Druckbuttons im FTUI in %
$ptz_ret = "";
$ptz_ret .= "<style>TD.ptzcontrol {padding: 5px 7px;}</style>";
$ptz_ret .= "<style>.defsize { font-size:16px; } </style>";
$ptz_ret .= '<table class="rc_body defsize">';
foreach my $rownr (0..9) { foreach my $rownr (0..9) {
$rownr = sprintf("%2.2d",$rownr); $rownr = sprintf("%2.2d",$rownr);
@ -6970,27 +6978,31 @@ sub SSCam_ptzpanel(@) {
next if (!$row); next if (!$row);
$rowisset = 1; $rowisset = 1;
$ptz_ret .= "<tr>"; $ptz_ret .= "<tr>";
my @btn = split (",",$row); # die Anzahl Buttons in einer Reihe my @btn = split (",",$row); # die Anzahl Buttons in einer Reihe
foreach my $btnnr (0..$#btn) { foreach my $btnnr (0..$#btn) {
$ptz_ret .= '<td class="rc_button">'; $ptz_ret .= '<td class="ptzcontrol">';
if ($btn[$btnnr] ne "") { if ($btn[$btnnr] ne "") {
my $cmd; my $cmd;
my $img; my $img;
if ($btn[$btnnr] =~ /(.*?):(.*)/) { # enthält Komando -> <command>:<image> if ($btn[$btnnr] =~ /(.*?):(.*)/) { # enthält Komando -> <command>:<image>
$cmd = $1; $cmd = $1;
$img = $2; $img = $2;
} else { # button has format <command> or is empty } else { # button has format <command> or is empty
$cmd = $btn[$btnnr]; $cmd = $btn[$btnnr];
$img = $btn[$btnnr]; $img = $btn[$btnnr];
} }
if ($img =~ m/\.svg/) { # Verwendung für SVG's if ($img =~ m/\.svg/) { # Verwendung für SVG's
$img = FW_makeImage($img, $cmd, "rc-button"); $img = FW_makeImage($img, $cmd, "rc-button");
} else { } else { # $FW_ME = URL-Pfad unter dem der FHEMWEB-Server via HTTP erreichbar ist, z.B. /fhem
$img = "<img src=\"$FW_ME/$iconpath/$iconprefix$img\">"; # $FW_ME = URL-Pfad unter dem der FHEMWEB-Server via HTTP erreichbar ist, z.B. /fhem if($ftui) {
} $img = "<img src=\"$FW_ME/$iconpath/$iconprefix$img\" height=\"$pbsf%\" width=\"$pbsf%\">";
} else {
$img = "<img src=\"$FW_ME/$iconpath/$iconprefix$img\" height=\"$pbs%\" width=\"$pbs%\">";
}
}
if ($cmd || $cmd eq "0") { if ($cmd || $cmd eq "0") {
my $cmd1 = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $name $cmd')"; # $FW_subdir = Sub-path in URL, used by FLOORPLAN/weblink my $cmd1 = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $name $cmd')"; # $FW_subdir = Sub-path in URL, used by FLOORPLAN/weblink
$cmd1 = "ftui.setFhemStatus('set $name $cmd')" if($ftui); $cmd1 = "ftui.setFhemStatus('set $name $cmd')" if($ftui);
$ptz_ret .= "<a onClick=\"$cmd1\">$img</a>"; $ptz_ret .= "<a onClick=\"$cmd1\">$img</a>";
} else { } else {
@ -7002,9 +7014,7 @@ sub SSCam_ptzpanel(@) {
} }
$ptz_ret .= "</tr>\n"; $ptz_ret .= "</tr>\n";
} }
$ptz_ret .= "</table>"; $ptz_ret .= "</table>";
$ptz_ret .= "</div>";
######################## ########################
# add Preset & Patrols # add Preset & Patrols
@ -7021,7 +7031,6 @@ sub SSCam_ptzpanel(@) {
} }
if($Presets) { if($Presets) {
$Presets =~ s,^<td[^>]*>(.*)</td>$,$1,; $Presets =~ s,^<td[^>]*>(.*)</td>$,$1,;
# Log3($name, 1, "$name - commandArgs: $Presets");
} else { } else {
$Presets = FW_pH "cmd.$name=set $name $cmdPreset", $cmdPreset, 0, "", 1, 1; $Presets = FW_pH "cmd.$name=set $name $cmdPreset", $cmdPreset, 0, "", 1, 1;
} }
@ -7033,33 +7042,24 @@ sub SSCam_ptzpanel(@) {
last if(defined($Patrols)); last if(defined($Patrols));
} }
# Rahmenklasse if($Patrols) {
$ptz_ret .= "<div class=\"ptzpanel\">"; $Patrols =~ s,^<td[^>]*>(.*)</td>$,$1,;
$ptz_ret .= "<table class=\"rc_body\">"; } else {
$Patrols = FW_pH "cmd.$name=set $name $cmdPatrol", $cmdPatrol, 0, "", 1, 1;
}
$ptz_ret .= '<table class="rc_body defsize">';
$ptz_ret .= "<tr>"; $ptz_ret .= "<tr>";
$ptz_ret .= '<td class="rc_button">'; $ptz_ret .= "<td>Preset: </td><td>$Presets</td>";
$ptz_ret .= "</tr>";
# Dropdown Klasse
$ptz_ret .= "<table class=\"webcmd\">";
$ptz_ret .= "<tr>"; $ptz_ret .= "<tr>";
$ptz_ret .= "<td style=\"font-size:250%;\">Preset: </td><td><div class='col3'>$Presets</div></td>"; $ptz_ret .= "<td>Patrol: </td><td>$Patrols</td>";
$ptz_ret .= "</tr>"; $ptz_ret .= "</tr>";
$ptz_ret .= "</table>";
$ptz_ret .= "<table class=\"webcmd\">";
$ptz_ret .= "<tr>";
$ptz_ret .= "<td style=\"font-size:250%;\">Patrol: </td><td><div class='col3'>$Patrols</div></td>";
$ptz_ret .= "</tr>";
$ptz_ret .= "</table>"; $ptz_ret .= "</table>";
}
# Rahmenklasse end
$ptz_ret .= "</td>";
$ptz_ret .= "</tr>";
$ptz_ret .= "</table>";
$ptz_ret .= "</div>";
#####################
}
if ($rowisset) { if ($rowisset) {
return $ptz_ret; return $ptz_ret;
@ -7224,19 +7224,21 @@ sub SSCam_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 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, "htmlattr", $ha); # htmlattr mit htmlattr Streaming-Device übersteuern
if($ftui) { if($ftui) {
$ha = AttrVal($strmdev, "htmlattrFTUI", $ha); # wenn aus FTUI aufgerufen divers setzen $ha = AttrVal($strmdev, "htmlattrFTUI", $ha); # wenn aus FTUI aufgerufen divers setzen
} }
my $pws = AttrVal($strmdev, "popupWindowSize", ""); # Größe eines Popups my $hf = AttrVal($strmdev, "hideButtons", 0); # Drucktasten im unteren Bereich ausblenden ?
$pws =~ s/"//g if($pws);
my $pws = AttrVal($strmdev, "popupWindowSize", ""); # Größe eines Popups
$pws =~ s/"//g if($pws);
my $show = $defs{$streamHash->{PARENT}}->{HELPER}{ACTSTRM} if($streamHash->{MODEL} =~ /switched/); my $show = $defs{$streamHash->{PARENT}}->{HELPER}{ACTSTRM} if($streamHash->{MODEL} =~ /switched/);
$show = $show?"($show)":""; $show = $show?"($show)":"";
my $alias = AttrVal($strmdev, "alias", $strmdev); # Linktext als Aliasname oder Devicename setzen my $alias = AttrVal($strmdev, "alias", $strmdev); # Linktext als Aliasname oder Devicename setzen
my $dlink = "<a href=\"/fhem?detail=$strmdev\">$alias</a>"; my $dlink = "<a href=\"/fhem?detail=$strmdev\">$alias</a>";
my $StmKey = ReadingsVal($camname,"StmKey",undef); my $StmKey = ReadingsVal($camname,"StmKey",undef);
@ -7317,18 +7319,19 @@ sub SSCam_StreamDev($$$;$) {
$streamHash->{HELPER}{STREAM} = "<img src=$link $pws>"; # Stream für "get <SSCamSTRM-Device> popupStream" speichern $streamHash->{HELPER}{STREAM} = "<img src=$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
} }
if(!$hf) {
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)) { if(AttrVal($camname,"ptzPanel_use",1)) {
my $ptz_ret = SSCam_ptzpanel($camname,'','',$ftui); my $ptz_ret = SSCam_ptzpanel($camname,$strmdev,'',$ftui);
if($ptz_ret) { if($ptz_ret) {
$ret .= "<td>$ptz_ret</td>"; $ret .= "<td>$ptz_ret</td>";
} }
@ -7352,7 +7355,9 @@ sub SSCam_StreamDev($$$;$) {
} else { } else {
$ret .= "<td><img src='data:image/jpeg;base64,$link' $gattr><br>"; $ret .= "<td><img src='data:image/jpeg;base64,$link' $gattr><br>";
} }
$ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>"; if(!$hf) {
$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
@ -7394,19 +7399,21 @@ sub SSCam_StreamDev($$$;$) {
} }
$ret .= "<br>"; $ret .= "<br>";
Log3($strmdev, 4, "$strmdev - generic Stream params:\n$htag"); Log3($strmdev, 4, "$strmdev - generic Stream params:\n$htag");
$ret .= "<a onClick=\"$cmdrefresh\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>"; if(!$hf) {
$ret .= $imgblank; $ret .= "<a onClick=\"$cmdrefresh\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>";
if(ReadingsVal($camname, "Record", "Stop") eq "Stop") { $ret .= $imgblank;
# Aufnahmebutton endlos Start if(ReadingsVal($camname, "Record", "Stop") eq "Stop") {
$ret .= "<a onClick=\"$cmdrecendless\" onmouseover=\"Tip('$ttrecstart')\" onmouseout=\"UnTip()\">$imgrecendless </a>"; # Aufnahmebutton endlos Start
} else { $ret .= "<a onClick=\"$cmdrecendless\" onmouseover=\"Tip('$ttrecstart')\" onmouseout=\"UnTip()\">$imgrecendless </a>";
# Aufnahmebutton Stop } else {
$ret .= "<a onClick=\"$cmdrecstop\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>"; # 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 .= "<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 = SSCam_ptzpanel($camname,'','',$ftui); my $ptz_ret = SSCam_ptzpanel($camname,$strmdev,'',$ftui);
if($ptz_ret) { if($ptz_ret) {
$ret .= "<td>$ptz_ret</td>"; $ret .= "<td>$ptz_ret</td>";
} }
@ -7439,20 +7446,21 @@ sub SSCam_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(!$hf) {
$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") { 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)) { if(AttrVal($camname,"ptzPanel_use",1)) {
my $ptz_ret = SSCam_ptzpanel($camname,'','',$ftui); my $ptz_ret = SSCam_ptzpanel($camname,$strmdev,'',$ftui);
if($ptz_ret) { if($ptz_ret) {
$ret .= "<td>$ptz_ret</td>"; $ret .= "<td>$ptz_ret</td>";
} }
@ -7489,7 +7497,7 @@ sub SSCam_StreamDev($$$;$) {
} }
$ret .= "</td>"; $ret .= "</td>";
if(AttrVal($camname,"ptzPanel_use",1) && $hash->{HELPER}{RUNVIEW} =~ /live_fw/) { if(AttrVal($camname,"ptzPanel_use",1) && $hash->{HELPER}{RUNVIEW} =~ /live_fw/) {
my $ptz_ret = SSCam_ptzpanel($camname,'','',$ftui); my $ptz_ret = SSCam_ptzpanel($camname,$strmdev,'',$ftui);
if($ptz_ret) { if($ptz_ret) {
$ret .= "<td>$ptz_ret</td>"; $ret .= "<td>$ptz_ret</td>";
} }
@ -7604,7 +7612,7 @@ sub SSCam_StreamDev($$$;$) {
$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 = SSCam_ptzpanel($camname,'','',$ftui); my $ptz_ret = SSCam_ptzpanel($camname,$strmdev,'',$ftui);
if($ptz_ret) { if($ptz_ret) {
$ret .= "<td>$ptz_ret</td>"; $ret .= "<td>$ptz_ret</td>";
} }
@ -7705,6 +7713,7 @@ sub SSCam_composegallery ($;$$$) {
? ReadingsTimestamp($name,"LastSnapTime"," ") ? ReadingsTimestamp($name,"LastSnapTime"," ")
: ReadingsTimestamp($name,"LastUpdateTime"," ")); # letzte Aktualisierung : ReadingsTimestamp($name,"LastUpdateTime"," ")); # letzte Aktualisierung
$lupt =~ s/ / \/ /; $lupt =~ s/ / \/ /;
my ($alias,$dlink,$hf) = ("","","");
# Kontext des SSCamSTRM-Devices speichern für SSCam_refresh # Kontext des SSCamSTRM-Devices speichern für SSCam_refresh
$hash->{HELPER}{STRMDEV} = $strmdev; # Name des aufrufenden SSCamSTRM-Devices $hash->{HELPER}{STRMDEV} = $strmdev; # Name des aufrufenden SSCamSTRM-Devices
@ -7715,6 +7724,8 @@ sub SSCam_composegallery ($;$$$) {
my $streamHash = $defs{$strmdev}; # Hash des SSCamSTRM-Devices my $streamHash = $defs{$strmdev}; # Hash des SSCamSTRM-Devices
$uuid = $streamHash->{FUUID}; # eindeutige UUID des Streamingdevices $uuid = $streamHash->{FUUID}; # eindeutige UUID des Streamingdevices
delete $streamHash->{HELPER}{STREAM}; delete $streamHash->{HELPER}{STREAM};
$alias = AttrVal($strmdev, "alias", $strmdev); # Linktext als Aliasname oder Devicename setzen
$dlink = "<a href=\"/fhem?detail=$strmdev\">$alias</a>";
} }
my $cmddosnap = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $name snap 1 2 STRM:$uuid')"; # Snapshot auslösen mit Kennzeichnung "by STRM-Device" my $cmddosnap = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $name snap 1 2 STRM:$uuid')"; # Snapshot auslösen mit Kennzeichnung "by STRM-Device"
@ -7727,15 +7738,13 @@ sub SSCam_composegallery ($;$$$) {
my $ha = AttrVal($name, "snapGalleryHtmlAttr", AttrVal($name, "htmlattr", 'width="500" height="325"')); my $ha = AttrVal($name, "snapGalleryHtmlAttr", AttrVal($name, "htmlattr", 'width="500" height="325"'));
my $alias = AttrVal($strmdev, "alias", $strmdev); # Linktext als Aliasname oder Devicename setzen
my $dlink = "<a href=\"/fhem?detail=$strmdev\">$alias</a>";
# falls "SSCam_composegallery" durch ein SSCamSTRM-Device aufgerufen wird # falls "SSCam_composegallery" durch ein SSCamSTRM-Device aufgerufen wird
my $pws = ""; my $pws = "";
if ($strmdev) { if ($strmdev) {
$pws = AttrVal($strmdev, "popupWindowSize", ""); # Größe eines Popups (umgelegt: Forum:https://forum.fhem.de/index.php/topic,45671.msg927912.html#msg927912) $pws = AttrVal($strmdev, "popupWindowSize", ""); # Größe eines Popups (umgelegt: Forum:https://forum.fhem.de/index.php/topic,45671.msg927912.html#msg927912)
$pws =~ s/"//g if($pws); $pws =~ s/"//g if($pws);
$ha = AttrVal($strmdev, "htmlattr", $ha); # htmlattr vom SSCamSTRM-Device übernehmen falls von SSCamSTRM-Device aufgerufen und gesetzt $ha = AttrVal($strmdev, "htmlattr", $ha); # htmlattr vom SSCamSTRM-Device übernehmen falls von SSCamSTRM-Device aufgerufen und gesetzt
$hf = AttrVal($strmdev, "hideButtons", 0); # Drucktasten im unteren Bereich ausblenden ?
if($ftui) { if($ftui) {
$ha = AttrVal($strmdev, "htmlattrFTUI", $ha); # wenn aus FTUI aufgerufen divers setzen $ha = AttrVal($strmdev, "htmlattrFTUI", $ha); # wenn aus FTUI aufgerufen divers setzen
} }
@ -7814,7 +7823,9 @@ sub SSCam_composegallery ($;$$$) {
$htmlCode .= "</tbody>"; $htmlCode .= "</tbody>";
$htmlCode .= "</table>"; $htmlCode .= "</table>";
$htmlCode .= "</div>"; $htmlCode .= "</div>";
$htmlCode .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>" if($strmdev); if(!$hf) {
$htmlCode .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>" if($strmdev);
}
$htmlCode .= "</html>"; $htmlCode .= "</html>";
return $htmlCode; return $htmlCode;
@ -9108,12 +9119,12 @@ sub SSCam_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 19750 2019-06-30 20:34:25Z DS_Starter $ im Kopf komplett! vorhanden ) if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id: 49_SSCam.pm 19996 2019-08-13 21:21:54Z 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 19750 2019-06-30 20:34:25Z DS_Starter $ im Kopf komplett! vorhanden ) return $@ unless (FHEM::Meta::SetInternals($hash)); # FVERSION wird gesetzt ( nur gesetzt wenn $Id: 49_SSCam.pm 19996 2019-08-13 21:21:54Z 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
@ -10691,14 +10702,15 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
</li> </li>
<a name="recTelegramTxt"></a> <a name="recTelegramTxt"></a>
<li><b>snapTelegramTxt tbot => &lt;TelegramBot device&gt;, peers => [&lt;peer1 peer2 ...&gt;], subject => [&lt;subject text&gt;] </b><br> <li><b>recTelegramTxt tbot => &lt;TelegramBot device&gt;, peers => [&lt;peer1 peer2 ...&gt;], subject => [&lt;subject text&gt;] </b><br>
Activates the permanent shipping of recordings by TelegramBot after their creation. <br> Activates the permanent shipping of recordings by TelegramBot after their creation. <br>
The attribute has to be definied in the form as described. With key "tbot" the TelegramBot device is specified, The attribute has to be definied in the form as described. With key "tbot" the TelegramBot device is specified,
which is used for shipping the data. Of course, the <a href="http://fhem.de/commandref.html#TelegramBot">TelegramBot device</a> which is used for shipping the data. Of course, the <a href="http://fhem.de/commandref.html#TelegramBot">TelegramBot device</a>
must be available and has to be running well. <br> must be available and has to be running well. <br>
The setting of "peers" and "subject" is optional, but the keys must (empty) specified. The setting of "peers" and "subject" is optional, but the keys must (empty) specified.
If "peer" is empty, teh default peer of the TelegramBot is used. <br> If "peer" is empty, the default peer of the TelegramBot device is used. <br><br>
You can use the following placeholders in "subject". <br><br>
You can use the following placeholders within "subject". <br><br>
<ul> <ul>
<table> <table>
@ -10712,14 +10724,14 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
</ul> </ul>
<br> <br>
<ul> <b>Examples:</b><br>
<b>Examples:</b><br> attr &lt;device&gt; recTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; Motion alarm ($FILE) <br>
recTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; Motion alarm ($FILE) <br> attr &lt;device&gt; recTelegramTxt tbot =&gt; teleBot, peers =&gt; @nabuko @foo @bar, subject =&gt; <br>
recTelegramTxt tbot =&gt; teleBot, peers =&gt; @nabuko @foo @bar, subject =&gt; <br> attr &lt;device&gt; recTelegramTxt tbot =&gt; teleBot, peers =&gt; #nabugroup, subject =&gt; <br>
recTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; <br> attr &lt;device&gt; recTelegramTxt tbot =&gt; teleBot, peers =&gt; -123456, subject =&gt; <br>
recTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; Motion alarm from $CAM. At $CTIME the recording $FILE was created. Now it is $TIME. <br> attr &lt;device&gt; recTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; <br>
</ul> attr &lt;device&gt; recTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; Motion alarm from $CAM. At $CTIME the recording $FILE was created. Now it is $TIME. <br>
<br> <br>
</li><br> </li><br>
<a name="rectime"></a> <a name="rectime"></a>
@ -10823,8 +10835,9 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
which is used for shipping the data. Of course, the <a href="http://fhem.de/commandref.html#TelegramBot">TelegramBot device</a> which is used for shipping the data. Of course, the <a href="http://fhem.de/commandref.html#TelegramBot">TelegramBot device</a>
must be available and has to be running well. <br> must be available and has to be running well. <br>
The setting of "peers" and "subject" is optional, but the keys must (empty) specified. The setting of "peers" and "subject" is optional, but the keys must (empty) specified.
If "peer" is empty, teh default peer of the TelegramBot is used. <br> If "peer" is empty, the default peer of the TelegramBot device is used. <br><br>
You can use the following placeholders in "subject". <br><br>
You can use the following placeholders within "subject". <br><br>
<ul> <ul>
<table> <table>
@ -10838,14 +10851,14 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
</ul> </ul>
<br> <br>
<ul> <b>Examples:</b><br>
<b>Examples:</b><br> attr &lt;device&gt; snapTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; Motion alarm ($FILE) <br>
snapTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; Motion alarm ($FILE) <br> attr &lt;device&gt; snapTelegramTxt tbot =&gt; teleBot, peers =&gt; @nabuko @foo @bar, subject =&gt; <br>
snapTelegramTxt tbot =&gt; teleBot, peers =&gt; @nabuko @foo @bar, subject =&gt; <br> attr &lt;device&gt; snapTelegramTxt tbot =&gt; teleBot, peers =&gt; #nabugroup, subject =&gt; <br>
snapTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; <br> attr &lt;device&gt; snapTelegramTxt tbot =&gt; teleBot, peers =&gt; -123456, subject =&gt; <br>
snapTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; Motion alarm from $CAM. At $CTIME the snapshot $FILE was created <br> attr &lt;device&gt; snapTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; <br>
</ul> attr &lt;device&gt; snapTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; Motion alarm from $CAM. At $CTIME the snapshot $FILE was created <br>
<br> <br>
</li><br> </li><br>
<a name="snapGalleryBoost"></a> <a name="snapGalleryBoost"></a>
@ -12512,7 +12525,8 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
anzugeben, welches für den Versand der Daten verwendet werden soll. anzugeben, welches für den Versand der Daten verwendet werden soll.
Das <a href="http://fhem.de/commandref_DE.html#TelegramBot">TelegramBot-Device</a> muss natürlich vorhanden und funktionstüchtig sein. <br> Das <a href="http://fhem.de/commandref_DE.html#TelegramBot">TelegramBot-Device</a> muss natürlich vorhanden und funktionstüchtig sein. <br>
Die Angabe von "peers" und "subject" ist optional, jedoch muß der Schlüssel (leer) angegeben werden. Die Angabe von "peers" und "subject" ist optional, jedoch muß der Schlüssel (leer) angegeben werden.
Wurde "peer" leer gelassen, wird der Default-Peer des TelegramBot verwendet. <br> Wurde "peer" leer gelassen, wird der Default-Peer des TelegramBot-Device verwendet. <br><br>
Es können die folgenden Platzhalter im subject verwendet werden. <br><br> Es können die folgenden Platzhalter im subject verwendet werden. <br><br>
<ul> <ul>
@ -12527,13 +12541,13 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
</ul> </ul>
<br> <br>
<ul> <b>Beispiele:</b><br>
<b>Beispiele:</b><br> attr &lt;device&gt; recTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; Bewegungsalarm ($FILE) <br>
recTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; Bewegungsalarm ($FILE) <br> attr &lt;device&gt; recTelegramTxt tbot =&gt; teleBot, peers =&gt; @nabuko @foo @bar, subject =&gt; <br>
recTelegramTxt tbot =&gt; teleBot, peers =&gt; @nabuko @foo @bar, subject =&gt; <br> attr &lt;device&gt; recTelegramTxt tbot =&gt; teleBot, peers =&gt; #nabugroup, subject =&gt; <br>
recTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; <br> attr &lt;device&gt; recTelegramTxt tbot =&gt; teleBot, peers =&gt; -123456, subject =&gt; <br>
recTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; Bewegungsalarm bei $CAM. Es wurde $CTIME die Aufnahme $FILE erstellt. Jetzt ist es $TIME. <br> attr &lt;device&gt; recTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; <br>
</ul> attr &lt;device&gt; recTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; Bewegungsalarm bei $CAM. Es wurde $CTIME die Aufnahme $FILE erstellt. Jetzt ist es $TIME. <br>
<br> <br>
</li><br> </li><br>
@ -12641,8 +12655,9 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
anzugeben, welches für den Versand der Daten verwendet werden soll. anzugeben, welches für den Versand der Daten verwendet werden soll.
Das <a href="http://fhem.de/commandref_DE.html#TelegramBot">TelegramBot-Device</a> muss natürlich vorhanden und funktionstüchtig sein. <br> Das <a href="http://fhem.de/commandref_DE.html#TelegramBot">TelegramBot-Device</a> muss natürlich vorhanden und funktionstüchtig sein. <br>
Die Angabe von "peers" und "subject" ist optional, jedoch muß der Schlüssel (leer) angegeben werden. Die Angabe von "peers" und "subject" ist optional, jedoch muß der Schlüssel (leer) angegeben werden.
Wurde "peer" leer gelassen, wird der Default-Peer des TelegramBot verwendet. <br> Wurde "peer" leer gelassen, wird der Default-Peer des TelegramBot-Devices verwendet. <br><br>
Es können die Platzhalter im subject verwendet werden. <br><br>
Es können folgende Platzhalter im subject verwendet werden. <br><br>
<ul> <ul>
<table> <table>
@ -12656,14 +12671,14 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
</ul> </ul>
<br> <br>
<ul> <b>Beispiele:</b><br>
<b>Beispiele:</b><br> attr &lt;device&gt; snapTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; Bewegungsalarm ($FILE) <br>
snapTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; Bewegungsalarm ($FILE) <br> attr &lt;device&gt; snapTelegramTxt tbot =&gt; teleBot, peers =&gt; @nabuko @foo @bar, subject =&gt; <br>
snapTelegramTxt tbot =&gt; teleBot, peers =&gt; @nabuko @foo @bar, subject =&gt; <br> attr &lt;device&gt; snapTelegramTxt tbot =&gt; teleBot, peers =&gt; #nabugroup, subject =&gt; <br>
snapTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; <br> attr &lt;device&gt; snapTelegramTxt tbot =&gt; teleBot, peers =&gt; -123456, subject =&gt; <br>
snapTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; Bewegungsalarm bei $CAM. Es wurde $CTIME der Schnappschuss $FILE erstellt <br> attr &lt;device&gt; snapTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; <br>
</ul> attr &lt;device&gt; snapTelegramTxt tbot =&gt; teleBot, peers =&gt; , subject =&gt; Bewegungsalarm bei $CAM. Es wurde $CTIME der Schnappschuss $FILE erstellt <br>
<br> <br>
</li><br> </li><br>
<a name="snapGalleryBoost"></a> <a name="snapGalleryBoost"></a>

View File

@ -35,7 +35,8 @@ eval "use FHEM::Meta;1" or my $modMetaAbsent = 1;
# Versions History intern # Versions History intern
our %SSCamSTRM_vNotesIntern = ( our %SSCamSTRM_vNotesIntern = (
"2.7.0" => "14.07.2019 FTUI support, new attributes htmlattrFTUI, hideDisplayNameFTUI ", "2.8.0" => "09.09.2019 new attribute hideFooter ",
"2.7.0" => "15.07.2019 FTUI support, new attributes htmlattrFTUI, hideDisplayNameFTUI, ptzButtonSize, ptzButtonSizeFTUI ",
"2.6.0" => "21.06.2019 GetFn -> get <name> html ", "2.6.0" => "21.06.2019 GetFn -> get <name> html ",
"2.5.0" => "27.03.2019 add Meta.pm support ", "2.5.0" => "27.03.2019 add Meta.pm support ",
"2.4.0" => "24.02.2019 support for \"genericStrmHtmlTag\" in streaming device MODEL generic ", "2.4.0" => "24.02.2019 support for \"genericStrmHtmlTag\" in streaming device MODEL generic ",
@ -85,9 +86,12 @@ sub SSCamSTRM_Initialize($) {
"htmlattrFTUI ". "htmlattrFTUI ".
"hideDisplayName:1,0 ". "hideDisplayName:1,0 ".
"hideDisplayNameFTUI:1,0 ". "hideDisplayNameFTUI:1,0 ".
"hideButtons:1,0 ".
"popupWindowSize ". "popupWindowSize ".
"popupStreamFW:$fwd ". "popupStreamFW:$fwd ".
"popupStreamTo:OK,1,2,3,4,5,6,7,8,9,10,15,20,25,30,40,50,60 ". "popupStreamTo:OK,1,2,3,4,5,6,7,8,9,10,15,20,25,30,40,50,60 ".
"ptzButtonSize:selectnumbers,50,5,100,0,lin ".
"ptzButtonSizeFTUI:selectnumbers,50,5,100,0,lin ".
$readingFnAttributes; $readingFnAttributes;
$hash->{RenameFn} = "SSCamSTRM_Rename"; $hash->{RenameFn} = "SSCamSTRM_Rename";
$hash->{CopyFn} = "SSCamSTRM_Copy"; $hash->{CopyFn} = "SSCamSTRM_Copy";
@ -525,6 +529,12 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
<br><br> <br><br>
</li> </li>
<a name="hideButtons"></a>
<li><b>hideButtons</b><br>
Hide the buttons in the footer. It has no impact for streaming devices of type "switched".
</li>
<br>
<a name="hideDisplayName"></a> <a name="hideDisplayName"></a>
<li><b>hideDisplayName</b><br> <li><b>hideDisplayName</b><br>
Hide the device/alias name (link to detail view). Hide the device/alias name (link to detail view).
@ -591,6 +601,18 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
attr &lt;name&gt; popupWindowSize width="600" height="425" <br> attr &lt;name&gt; popupWindowSize width="600" height="425" <br>
</ul> </ul>
</li> </li>
<br>
<a name="ptzButtonSize"></a>
<li><b>ptzButtonSize</b><br>
Specifies the PTZ-panel button size (in %).
</li>
<br>
<a name="ptzButtonSizeFTUI"></a>
<li><b>ptzButtonSizeFTUI</b><br>
Specifies the PTZ-panel button size used in a Tablet UI (in %).
</li>
</ul> </ul>
</ul> </ul>
@ -738,6 +760,12 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
<br><br> <br><br>
</li> </li>
<a name="hideButtons"></a>
<li><b>hideButtons</b><br>
Verbirgt die Drucktasten in der Fußzeile. Dieses Attribut hat keinen Einfluß bei Streaming-Devices vom Typ "switched".
</li>
<br>
<a name="hideDisplayName"></a> <a name="hideDisplayName"></a>
<li><b>hideDisplayName</b><br> <li><b>hideDisplayName</b><br>
Verbirgt den Device/Alias-Namen (Link zur Detailansicht). Verbirgt den Device/Alias-Namen (Link zur Detailansicht).
@ -803,6 +831,18 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
attr &lt;name&gt; popupWindowSize width="600" height="425" <br> attr &lt;name&gt; popupWindowSize width="600" height="425" <br>
</ul> </ul>
</li> </li>
<br>
<a name="ptzButtonSize"></a>
<li><b>ptzButtonSize</b><br>
Legt die Größe der Drucktasten des PTZ Paneels fest (in %).
</li>
<br>
<a name="ptzButtonSizeFTUI"></a>
<li><b>ptzButtonSizeFTUI</b><br>
Legt die Größe der Drucktasten des PTZ Paneels in einem Tablet UI fest (in %).
</li>
</ul> </ul>
</ul> </ul>