49_SSCam: contrib 9.5.0

git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@22406 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2020-07-16 06:14:56 +00:00
parent 67b46dc268
commit d45d298099
2 changed files with 311 additions and 119 deletions

View File

@ -159,6 +159,7 @@ BEGIN {
# Versions History intern # Versions History intern
my %vNotesIntern = ( my %vNotesIntern = (
"9.5.0" => "15.07.2020 streamDev master type added, comref revised ",
"9.4.5" => "15.07.2020 fix crash while autocreate CommandDelete, CommandSave is missing ", "9.4.5" => "15.07.2020 fix crash while autocreate CommandDelete, CommandSave is missing ",
"9.4.4" => "14.07.2020 fix crash while autocreate makeDeviceName is missing ", "9.4.4" => "14.07.2020 fix crash while autocreate makeDeviceName is missing ",
"9.4.3" => "13.07.2020 streamDev refactored, comref revised ", "9.4.3" => "13.07.2020 streamDev refactored, comref revised ",
@ -762,8 +763,8 @@ sub Define {
$hash->{HELPER}{APIREC} = "SYNO.SurveillanceStation.Recording"; # This API provides method to query recording information. $hash->{HELPER}{APIREC} = "SYNO.SurveillanceStation.Recording"; # This API provides method to query recording information.
# Startwerte setzen # Startwerte setzen
if(IsModelCam($hash)) { if(IsModelCam($hash)) { # initiale Webkommandos setzen
$attr{$name}{webCmd} = "on:off:snap:enable:disable:runView:stopView"; # initiale Webkommandos setzen $attr{$name}{webCmd} = "on:off:snap:enable:disable:runView:stopView";
} else { } else {
$attr{$name}{webCmd} = "homeMode"; $attr{$name}{webCmd} = "homeMode";
$attr{$name}{webCmdLabel} = "HomeMode"; $attr{$name}{webCmdLabel} = "HomeMode";
@ -1175,6 +1176,7 @@ sub Set {
$setlist = "Unknown argument $opt, choose one of ". $setlist = "Unknown argument $opt, choose one of ".
"autocreateCams:noArg ". "autocreateCams:noArg ".
"credentials ". "credentials ".
"createStreamDev:master ".
"smtpcredentials ". "smtpcredentials ".
"createReadingsGroup ". "createReadingsGroup ".
"extevent:1,2,3,4,5,6,7,8,9,10 ". "extevent:1,2,3,4,5,6,7,8,9,10 ".
@ -1472,7 +1474,7 @@ sub Set {
$attr{$ptzcdev}{group} = $name."_PTZcontrol"; $attr{$ptzcdev}{group} = $name."_PTZcontrol";
return qq{PTZ control device "$ptzcdev" created and assigned to room "$room".}; return qq{PTZ control device "$ptzcdev" created and assigned to room "$room".};
} elsif ($opt eq "createStreamDev" && IsModelCam($hash)) { } elsif ($opt eq "createStreamDev") {
if (!$hash->{CREDENTIALS}) {return qq{Credentials of $name are not set - make sure you've set it with "set $name credentials username password"};} if (!$hash->{CREDENTIALS}) {return qq{Credentials of $name are not set - make sure you've set it with "set $name credentials username password"};}
my ($livedev,$ret); my ($livedev,$ret);
@ -1507,6 +1509,11 @@ sub Set {
$ret = CommandDefine($hash->{CL},"$livedev SSCamSTRM {FHEM::SSCam::streamDev('$name','$livedev','switched')}"); $ret = CommandDefine($hash->{CL},"$livedev SSCamSTRM {FHEM::SSCam::streamDev('$name','$livedev','switched')}");
return $ret if($ret); return $ret if($ret);
} }
if($prop =~ /master/x) {
$livedev = "SSCamSTRM.$name.master";
$ret = CommandDefine($hash->{CL},"$livedev SSCamSTRM {FHEM::SSCam::streamDev('$name','$livedev','master')}");
return $ret if($ret);
}
my $room = AttrVal($name,"room","SSCam"); my $room = AttrVal($name,"room","SSCam");
$attr{$livedev}{room} = $room; $attr{$livedev}{room} = $room;
@ -7867,10 +7874,9 @@ sub ptzPanel {
### add Preset / Patrols ### add Preset / Patrols
############################### ###############################
if(!$ftui) { if(!$ftui) {
my ($Presets,$Patrols,$zoom); my ($Presets,$Patrols);
my $cmdPreset = "goPreset"; my $cmdPreset = "goPreset";
my $cmdPatrol = "runPatrol"; my $cmdPatrol = "runPatrol";
my $cmdZoom = "setZoom";
## Presets ## Presets
for my $fn (sort keys %{$data{webCmdFn}}) { for my $fn (sort keys %{$data{webCmdFn}}) {
@ -8067,7 +8073,8 @@ sub streamDev { ## no critic 'comp
# 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);
my ($ttmjpegrun, $tthlsrun, $ttlrrun, $tth264run, $ttlmjpegrun, $ttlsnaprun);
# Hinweis Popups # Hinweis Popups
if(AttrVal("global","language","EN") =~ /EN/x) { if(AttrVal("global","language","EN") =~ /EN/x) {
@ -8188,7 +8195,9 @@ sub streamDev { ## no critic 'comp
$ret .= '<tbody>'; $ret .= '<tbody>';
$ret .= '<tr class="odd">'; $ret .= '<tr class="odd">';
if(!$StmKey || ReadingsVal($camname, "Availability", "") ne "enabled" || IsDisabled($camname)) { my $ismm = FHEM::SSCamSTRM::IsModelMaster($streamHash); # prüfen ob Streaming Dev ist MODEL = master
if(!$ismm && (!$StmKey || ReadingsVal($camname, "Availability", "") ne "enabled" || IsDisabled($camname))) {
# Ausgabe bei Fehler # Ausgabe bei Fehler
my $cam = AttrVal($camname, "alias", $camname); # Linktext als Aliasname oder Devicename setzen my $cam = AttrVal($camname, "alias", $camname); # Linktext als Aliasname oder Devicename setzen
$cause = !$StmKey ? "Camera $cam has no Reading \"StmKey\" set !" : "Cam \"$cam\" is disabled"; $cause = !$StmKey ? "Camera $cam has no Reading \"StmKey\" set !" : "Cam \"$cam\" is disabled";
@ -8207,6 +8216,7 @@ sub streamDev { ## no critic 'comp
$ret .= &{$sdfn{$fmt}{fn}} (\%params); $ret .= &{$sdfn{$fmt}{fn}} (\%params);
} else { } else {
$cause = qq{Streaming of format "$fmt" is not supported}; $cause = qq{Streaming of format "$fmt" is not supported};
$cause = qq{Select a Streaming client with the "adoptFrom" command.} if($ismm);
$ret .= "<td> <br> <b> $cause </b> <br><br></td>"; $ret .= "<td> <br> <b> $cause </b> <br><br></td>";
} }
use strict "refs"; use strict "refs";
@ -9111,8 +9121,8 @@ sub composeGallery {
my $gattr = (AttrVal($name,"snapGallerySize","Icon") eq "Full")?$ha:""; my $gattr = (AttrVal($name,"snapGallerySize","Icon") eq "Full")?$ha:"";
# Ausgabetabelle erstellen # Ausgabetabelle erstellen
my ($htmlCode); my $htmlCode;
$htmlCode = "<html>"; # $htmlCode = "<html>";
$htmlCode .= "<script type=\"text/javascript\" src=\"$ttjs\"></script>"; $htmlCode .= "<script type=\"text/javascript\" src=\"$ttjs\"></script>";
$htmlCode .= "<div class=\"makeTable wide\"; style=\"text-align:$hdrAlign\"> $header <br>"; $htmlCode .= "<div class=\"makeTable wide\"; style=\"text-align:$hdrAlign\"> $header <br>";
$htmlCode .= '<table class="block wide internals" style="margin-left:auto;margin-right:auto">'; $htmlCode .= '<table class="block wide internals" style="margin-left:auto;margin-right:auto">';
@ -9142,6 +9152,7 @@ sub composeGallery {
$idata = ""; $idata = "";
} }
} else { } else {
my @as; my @as;
for(cache($name, "c_getkeys")) { # relevant keys aus allen vorkommenden selektieren for(cache($name, "c_getkeys")) { # relevant keys aus allen vorkommenden selektieren
@ -9151,6 +9162,7 @@ sub composeGallery {
} }
my %seen; my %seen;
my @unique = sort{$a<=>$b} grep { !$seen{$_}++ } @as; # distinct / unique the keys my @unique = sort{$a<=>$b} grep { !$seen{$_}++ } @as; # distinct / unique the keys
for my $key (@unique) { for my $key (@unique) {
$imgdat = cache($name, "c_read", "{SNAPHASH}{$key}{imageData}"); $imgdat = cache($name, "c_read", "{SNAPHASH}{$key}{imageData}");
$imgTm = cache($name, "c_read", "{SNAPHASH}{$key}{createdTm}"); $imgTm = cache($name, "c_read", "{SNAPHASH}{$key}{createdTm}");
@ -9177,13 +9189,19 @@ sub composeGallery {
} }
$htmlCode .= "</tr>"; $htmlCode .= "</tr>";
if(!$hb) {
$htmlCode .= "<tr>";
$htmlCode .= "<td style='text-align:left' colspan=10>";
$htmlCode .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>" if($strmdev);
$htmlCode .= "</td>";
$htmlCode .= "</tr>";
}
$htmlCode .= "</tbody>"; $htmlCode .= "</tbody>";
$htmlCode .= "</table>"; $htmlCode .= "</table>";
$htmlCode .= "</div>"; $htmlCode .= "</div>";
if(!$hb) { # $htmlCode .= "</html>";
$htmlCode .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>" if($strmdev);
}
$htmlCode .= "</html>";
undef $imgdat; undef $imgdat;
undef $imgTm; undef $imgTm;
@ -11670,7 +11688,10 @@ return;
<ul> <ul>
<a name="SSCamcreateStreamDev"></a> <a name="SSCamcreateStreamDev"></a>
<li><b> createStreamDev [generic | hls | lastsnap | mjpeg | switched] </b> &nbsp;&nbsp;&nbsp;&nbsp;(valid for CAM)</li> <br> <li><b> createStreamDev [generic | hls | lastsnap | mjpeg | switched] </b> &nbsp;&nbsp;&nbsp;&nbsp;(valid for CAM) <br>
respectively <br>
<b> createStreamDev [master] </b> &nbsp;&nbsp;&nbsp;&nbsp;(valid for SVS) <br>
<br>
A separate Streaming-Device (type SSCamSTRM) will be created. This device can be used as a discrete device in a dashboard A separate Streaming-Device (type SSCamSTRM) will be created. This device can be used as a discrete device in a dashboard
for example. for example.
@ -11680,7 +11701,7 @@ return;
<ul> <ul>
<table> <table>
<colgroup> <col width=10%> <col width=90%> </colgroup> <colgroup> <col width=10%> <col width=90%> </colgroup>
<tr><td>generic </td><td>- the streaming device playback a content determined by attribute "genericStrmHtmlTag" </td></tr> <tr><td>generic </td><td>- the streaming device playback a content determined by attribute <a href="#genericStrmHtmlTag">genericStrmHtmlTag</a> </td></tr>
<tr><td>hls </td><td>- the streaming device playback a permanent HLS video stream </td></tr> <tr><td>hls </td><td>- the streaming device playback a permanent HLS video stream </td></tr>
<tr><td>lastsnap </td><td>- the streaming device playback the newest snapshot </td></tr> <tr><td>lastsnap </td><td>- the streaming device playback the newest snapshot </td></tr>
<tr><td>mjpeg </td><td>- the streaming device playback a permanent MJPEG video stream (Streamkey method) </td></tr> <tr><td>mjpeg </td><td>- the streaming device playback a permanent MJPEG video stream (Streamkey method) </td></tr>
@ -11689,8 +11710,9 @@ return;
</ul> </ul>
<br><br> <br><br>
You can control the design with HTML tags in <a href="#SSCamattr">attribute</a> "htmlattr" of the camera device or by You can control the design with HTML tags in attribute <a href="#htmlattr">htmlattr</a> of the camera device or by
specific attributes of the SSCamSTRM-device itself. <br><br> specific attributes of the SSCamSTRM-device itself. <br><br>
</li>
<b>Streaming device "hls"</b> <br><br> <b>Streaming device "hls"</b> <br><br>
@ -13591,7 +13613,10 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
<ul> <ul>
<a name="SSCamcreateStreamDev"></a> <a name="SSCamcreateStreamDev"></a>
<li><b> createStreamDev [generic | hls | lastsnap | mjpeg | switched] </b> &nbsp;&nbsp;&nbsp;&nbsp;(gilt für CAM)</li> <br> <li><b> createStreamDev [generic | hls | lastsnap | mjpeg | switched] </b> &nbsp;&nbsp;&nbsp;&nbsp;(gilt für CAM) <br>
bzw. <br>
<b> createStreamDev [master] </b> &nbsp;&nbsp;&nbsp;&nbsp;(gilt für SVS) <br>
<br>
Es wird ein separates Streaming-Device (Typ SSCamSTRM) erstellt. Dieses Device kann z.B. als separates Device Es wird ein separates Streaming-Device (Typ SSCamSTRM) erstellt. Dieses Device kann z.B. als separates Device
in einem Dashboard genutzt werden. in einem Dashboard genutzt werden.
@ -13601,17 +13626,18 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
<ul> <ul>
<table> <table>
<colgroup> <col width=10%> <col width=90%> </colgroup> <colgroup> <col width=10%> <col width=90%> </colgroup>
<tr><td>generic </td><td>- das Streaming-Device gibt einen durch das Attribut "genericStrmHtmlTag" bestimmten Content wieder </td></tr> <tr><td>generic </td><td>- das Streaming-Device gibt einen durch das Attribut <a href="#genericStrmHtmlTag">genericStrmHtmlTag</a> bestimmten Content wieder </td></tr>
<tr><td>hls </td><td>- das Streaming-Device gibt einen permanenten HLS Datenstrom wieder </td></tr> <tr><td>hls </td><td>- das Streaming-Device gibt einen permanenten HLS Datenstrom wieder </td></tr>
<tr><td>lastsnap </td><td>- das Streaming-Device zeigt den neuesten Schnappschuß an </td></tr> <tr><td>lastsnap </td><td>- das Streaming-Device zeigt den neuesten Schnappschuß an </td></tr>
<tr><td>mjpeg </td><td>- das Streaming-Device gibt einen permanenten MJPEG Kamerastream wieder (Streamkey Methode) </td></tr> <tr><td>mjpeg </td><td>- das Streaming-Device gibt einen permanenten MJPEG Kamerastream wieder (Streamkey Methode) </td></tr>
<tr><td>switched </td><td>- Wiedergabe unterschiedlicher Streamtypen. Drucktasten zur Steuerung werden angeboten. </td></tr> <tr><td>switched </td><td>- Wiedergabe unterschiedlicher Streamtypen. Drucktasten zur Steuerung werden angeboten. </td></tr>
</table> </table>
</ul> </ul>
<br><br> <br>
Die Gestaltung kann durch HTML-Tags im <a href="#SSCamattr">Attribut</a> "htmlattr" im Kameradevice oder mit den Die Gestaltung kann durch HTML-Tags im Attribut <a href="#htmlattr">htmlattr</a> im Kameradevice oder mit den
spezifischen Attributen im Streaming-Device beeinflusst werden. <br><br> spezifischen Attributen im Streaming-Device beeinflusst werden. <br><br>
</li>
<b>Streaming Device "hls"</b> <br><br> <b>Streaming Device "hls"</b> <br><br>

View File

@ -1,5 +1,5 @@
######################################################################################################################## ########################################################################################################################
# $Id: 49_SSCamSTRM.pm 22267 2020-06-25 21:07:13Z DS_Starter $ # $Id: 49_SSCamSTRM.pm 22329 2020-07-02 17:16:52Z DS_Starter $
######################################################################################################################### #########################################################################################################################
# 49_SSCamSTRM.pm # 49_SSCamSTRM.pm
# #
@ -42,6 +42,7 @@ BEGIN {
qw( qw(
AnalyzePerlCommand AnalyzePerlCommand
AttrVal AttrVal
data
defs defs
devspec2array devspec2array
FmtDateTime FmtDateTime
@ -62,6 +63,8 @@ BEGIN {
FW_cmd FW_cmd
FW_directNotify FW_directNotify
FW_wname FW_wname
FW_pH
FW_widgetFallbackFn
FHEM::SSCam::ptzPanel FHEM::SSCam::ptzPanel
FHEM::SSCam::streamDev FHEM::SSCam::streamDev
FHEM::SSCam::composeGallery FHEM::SSCam::composeGallery
@ -84,9 +87,9 @@ BEGIN {
} }
# Versions History intern # Versions History intern
my %vNotesIntern = ( my %vNotesIntern = (
"2.13.0" => "14.07.2020 integrate streamDev master ",
"2.12.0" => "28.06.2020 upgrade SSCam functions due to SSCam switch to packages ", "2.12.0" => "28.06.2020 upgrade SSCam functions due to SSCam switch to packages ",
"2.11.0" => "24.06.2020 switch to packages, changes according to PBP ", "2.11.0" => "24.06.2020 switch to packages, changes according to PBP ",
"2.10.2" => "08.11.2019 undef \$link in FwFn / streamAsHtml to save memory ", "2.10.2" => "08.11.2019 undef \$link in FwFn / streamAsHtml to save memory ",
@ -132,6 +135,8 @@ my %SSCAM_imc = ( # di
1 => { 0 => "off", 1 => "inactive" }, 1 => { 0 => "off", 1 => "inactive" },
); );
my %sdevs = (); # Hash der vorhandenen Streaming Devices
my $todef = 5; # Default Popup Zeit für set <> popupStream my $todef = 5; # Default Popup Zeit für set <> popupStream
################################################################ ################################################################
@ -253,9 +258,19 @@ sub Set {
return if(IsDisabled($name) || $hash->{MODEL} =~ /ptzcontrol|snapgallery/x); return if(IsDisabled($name) || $hash->{MODEL} =~ /ptzcontrol|snapgallery/x);
my $setlist = "Unknown argument $opt, choose one of ". my $setlist;
if(!IsModelMaster($hash)) {
$setlist = "Unknown argument $opt, choose one of ".
"popupStream " "popupStream "
; ;
} else {
my $sd = streamDevs();
$setlist = "Unknown argument $opt, choose one of ".
"adoptFrom:$sd ".
"reset:noArg "
;
}
if ($opt eq "popupStream") { if ($opt eq "popupStream") {
my $txt = FHEM::SSCam::getClHash($hash); my $txt = FHEM::SSCam::getClHash($hash);
@ -270,8 +285,6 @@ sub Set {
$to = ($to =~ /\d+/x) ? (1000 * $to) : $to; $to = ($to =~ /\d+/x) ? (1000 * $to) : $to;
my $pd = AttrVal($name, "popupStreamFW", "TYPE=FHEMWEB"); my $pd = AttrVal($name, "popupStreamFW", "TYPE=FHEMWEB");
my $parent = $hash->{PARENT};
my $parentHash = $defs{$parent};
my $htmlCode = $hash->{HELPER}{STREAM}; my $htmlCode = $hash->{HELPER}{STREAM};
if ($hash->{HELPER}{STREAMACTIVE}) { if ($hash->{HELPER}{STREAMACTIVE}) {
@ -289,6 +302,42 @@ sub Set {
} }
} }
} elsif ($opt eq "adoptFrom") {
shift @a; shift @a;
$prop = join "#", @a;
my $strmd = $sdevs{"$prop"};
my $valid = ($strmd && $defs{$strmd} && $defs{$strmd}{TYPE} eq "SSCamSTRM");
return qq{The command "$opt" needs a valid SSCamSTRM device as argument} if(!$valid);
# Übernahme der Readings
my @r;
delReadings($hash);
for my $key (keys %{$defs{$strmd}{READINGS}}) {
my $val = ReadingsVal($strmd, $key, "");
next if(!$val);
push @r, "$key:$val";
}
# Übernahme LINK
$hash->{LINK} = $defs{$strmd}{LINK};
readingsSingleUpdate($hash,"clientLink", $hash->{LINK}, 0);
if(@r) {
readingsBeginUpdate($hash);
for my $elem (@r) {
my ($rn,$rval) = split ":", $elem, 2;
readingsBulkUpdate($hash, $rn, $rval);
}
readingsEndUpdate($hash, 1);
}
} elsif ($opt eq "reset") {
delReadings($hash);
$hash->{LINK} = $hash->{DEF};
} else { } else {
return "$setlist"; return "$setlist";
} }
@ -355,22 +404,36 @@ return;
sub FwFn { sub FwFn {
my ($FW_wname, $name, $room, $pageHash) = @_; # pageHash is set for summaryFn. my ($FW_wname, $name, $room, $pageHash) = @_; # pageHash is set for summaryFn.
my $hash = $defs{$name}; my $hash = $defs{$name};
my $link = $hash->{LINK};
RemoveInternalTimer($hash); RemoveInternalTimer($hash);
$hash->{HELPER}{FW} = $FW_wname; $hash->{HELPER}{FW} = $FW_wname;
my $clink = ReadingsVal($name, "clientLink", "");
$hash->{LINK} = $clink if($clink);
my $link = $hash->{LINK};
$link = AnalyzePerlCommand(undef, $link) if($link =~ m/^{(.*)}$/xs); $link = AnalyzePerlCommand(undef, $link) if($link =~ m/^{(.*)}$/xs);
my $ret = ""; my $ret = "";
if(IsModelMaster($hash) && $clink) {
my $alias = AttrVal($name, "alias", $name); # Linktext als Aliasname oder Devicename setzen
my $dlink = "<a href=\"/fhem?detail=$name\">$alias</a> is Streaming master of device ";
$dlink = "$alias is Streaming master of device " if(AttrVal($name, "noLink", 0)); # keine Links im Stream-Dev generieren
$ret .= "<span align=\"center\">$dlink </span>" if(!AttrVal($name,"hideDisplayName",0));
}
if(IsDisabled($name)) { if(IsDisabled($name)) {
if(AttrVal($name,"hideDisplayName",0)) { if(AttrVal($name,"hideDisplayName",0)) {
$ret .= "Stream-device <a href=\"/fhem?detail=$name\">$name</a> is disabled"; $ret .= "Stream-device <a href=\"/fhem?detail=$name\">$name</a> is disabled";
} else { } else {
$ret .= "<html>Stream-device is disabled</html>"; $ret .= "<html>Stream-device is disabled</html>";
} }
} else { } else {
$ret .= $link; $ret .= $link;
$ret .= sDevsWidget($name) if(IsModelMaster($hash));
} }
my $al = AttrVal($name, "autoRefresh", 0); # Autorefresh nur des aufrufenden FHEMWEB-Devices my $al = AttrVal($name, "autoRefresh", 0); # Autorefresh nur des aufrufenden FHEMWEB-Devices
@ -398,6 +461,17 @@ sub explodeDEF {
return; return;
} }
#############################################################################################
# Ist das MODEL "master" ?
#############################################################################################
sub IsModelMaster {
my $hash = shift;
my $mm = $hash->{MODEL} eq "master" ? 1 : 0;
return $mm;
}
############################################################################################# #############################################################################################
# Seitenrefresh # Seitenrefresh
# festgelegt durch SSCamSTRM-Attribut "autoRefresh" und "autoRefreshFW" # festgelegt durch SSCamSTRM-Attribut "autoRefresh" und "autoRefreshFW"
@ -436,12 +510,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{SSCamSTRM}{META}} $modules{$type}{META}{version} = "v".$v; # Version aus META.json überschreiben, Anzeige mit {Dumper $modules{SSCamSTRM}{META}}
if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id: 49_SSCamSTRM.pm 22267 2020-06-25 21:07:13Z DS_Starter $ im Kopf komplett! vorhanden ) if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id: 49_SSCamSTRM.pm 22329 2020-07-02 17:16:52Z DS_Starter $ im Kopf komplett! vorhanden )
$modules{$type}{META}{x_version} =~ s/1\.1\.1/$v/gx; $modules{$type}{META}{x_version} =~ s/1\.1\.1/$v/gx;
} 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_SSCamSTRM.pm 22267 2020-06-25 21:07:13Z DS_Starter $ im Kopf komplett! vorhanden ) return $@ unless (FHEM::Meta::SetInternals($hash)); # FVERSION wird gesetzt ( nur gesetzt wenn $Id: 49_SSCamSTRM.pm 22329 2020-07-02 17:16:52Z 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
@ -488,6 +562,98 @@ sub streamAsHtml {
return $ret; return $ret;
} }
################################################################
# delete Readings
# $rd = angegebenes Reading löschen
################################################################
sub delReadings {
my $hash = shift;
my $rd = shift;
my $name = $hash->{NAME};
my $bl = "state|parentState"; # Blacklist
if($rd) { # angegebenes Reading löschen wenn nicht im providerLevel enthalten
delete($hash->{READINGS}{$rd}) if($rd !~ /$bl/x);
return;
}
for my $key (keys %{$hash->{READINGS}}) {
delete($hash->{READINGS}{$key}) if($key !~ /$bl/x);
}
return;
}
################################################################
# liefert String aller Streamingdevices außer MODEL = master
# und füllt Hash %sdevs{Alias} = Devicename zu Auflösung
#
# (es wird Alias (wenn gesetzt) oder Devicename verwendet,
# Leerzeichen werden durch "#" ersetzt)
################################################################
sub streamDevs {
my $sd = "";
undef %sdevs;
my @strmdevs = devspec2array("TYPE=SSCamSTRM:FILTER=MODEL!=master"); # Liste Streaming devices außer MODEL = master
for my $d (@strmdevs) {
next if(!$defs{$d});
my $alias = AttrVal($d, "alias", $d);
$alias =~ s/\s+/#/gx;
$sdevs{$alias} = "$d";
}
for my $a (sort keys %sdevs) {
$sd .= "," if($sd);
$sd .= $a;
}
return $sd;
}
################################################################
# Streaming Devices Drop-Down Widget zur Auswahl
# in einem Master Streaming Device
################################################################
sub sDevsWidget {
my $name = shift;
my $Adopts;
my $ret = "";
my $cmdAdopt = "adoptFrom";
my $valAdopts = streamDevs();
for my $fn (sort keys %{$data{webCmdFn}}) {
next if($data{webCmdFn}{$fn} ne "FW_widgetFallbackFn");
no strict "refs"; ## no critic 'NoStrict'
$Adopts = &{$data{webCmdFn}{$fn}}($FW_wname,$name,"",$cmdAdopt,$valAdopts);
use strict "refs";
last if(defined($Adopts));
}
if($Adopts) {
$Adopts =~ s,^<td[^>]*>(.*)</td>$,$1,;
} else {
$Adopts = FW_pH "cmd.$name=set $name $cmdAdopt", $cmdAdopt, 0, "", 1, 1;
}
## Tabellenerstellung
$ret .= "<style>.defsize { font-size:16px; } </style>";
$ret .= '<table class="rc_body defsize">';
if($valAdopts) {
$ret .= "<tr>";
$ret .= "<td>Adopt: </td><td>$Adopts</td>";
$ret .= "</tr>";
}
$ret .= "</table>";
return $ret;
}
1; 1;
=pod =pod