mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-04 22:19:38 +00:00
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:
parent
67b46dc268
commit
d45d298099
@ -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";
|
||||||
@ -1148,7 +1149,7 @@ sub Set {
|
|||||||
"off:noArg ".
|
"off:noArg ".
|
||||||
"motdetsc:disable,camera,SVS ".
|
"motdetsc:disable,camera,SVS ".
|
||||||
"snap ".
|
"snap ".
|
||||||
(AttrVal($name, "snapGalleryBoost",0) ? (AttrVal($name,"snapGalleryNumber",undef) || AttrVal($name,"snapGalleryBoost",0))?"snapGallery:noArg ":"snapGallery:$defSnum ":" ").
|
(AttrVal($name, "snapGalleryBoost",0) ? (AttrVal($name,"snapGalleryNumber",undef) || AttrVal($name,"snapGalleryBoost",0)) ? "snapGallery:noArg " : "snapGallery:$defSnum " : " ").
|
||||||
"createReadingsGroup ".
|
"createReadingsGroup ".
|
||||||
"createSnapGallery:noArg ".
|
"createSnapGallery:noArg ".
|
||||||
"createStreamDev:generic,hls,lastsnap,mjpeg,switched ".
|
"createStreamDev:generic,hls,lastsnap,mjpeg,switched ".
|
||||||
@ -1175,10 +1176,11 @@ 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 ".
|
||||||
($hash->{HELPER}{APIHMMAXVER}?"homeMode:on,off ": "").
|
($hash->{HELPER}{APIHMMAXVER} ? "homeMode:on,off " : "").
|
||||||
"snapCams ";
|
"snapCams ";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -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,9 +1509,14 @@ 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;
|
||||||
return "Livestream device \"$livedev\" created and assigned to room \"$room\".";
|
return "Livestream device \"$livedev\" created and assigned to room \"$room\".";
|
||||||
|
|
||||||
} elsif ($opt eq "createReadingsGroup") {
|
} elsif ($opt eq "createReadingsGroup") {
|
||||||
@ -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) {
|
||||||
@ -8187,11 +8194,13 @@ 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";
|
||||||
$cause = "Camera \"$cam\" is disabled" if(IsDisabled($camname));
|
$cause = "Camera \"$cam\" is disabled" if(IsDisabled($camname));
|
||||||
$ret .= "<td> <br> <b> $cause </b> <br><br></td>";
|
$ret .= "<td> <br> <b> $cause </b> <br><br></td>";
|
||||||
$ret .= '</tr>';
|
$ret .= '</tr>';
|
||||||
@ -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";
|
||||||
@ -9040,7 +9050,7 @@ sub composeGallery {
|
|||||||
|
|
||||||
if($strmdev) {
|
if($strmdev) {
|
||||||
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
|
$alias = AttrVal($strmdev, "alias", $strmdev); # Linktext als Aliasname oder Devicename setzen
|
||||||
if(AttrVal($strmdev, "noLink", 0)) {
|
if(AttrVal($strmdev, "noLink", 0)) {
|
||||||
@ -9050,8 +9060,8 @@ sub composeGallery {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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"
|
||||||
my $imgdosnap = "<img src=\"$FW_ME/www/images/sscam/black_btn_DOSNAP.png\">";
|
my $imgdosnap = "<img src=\"$FW_ME/www/images/sscam/black_btn_DOSNAP.png\">";
|
||||||
|
|
||||||
# bei Aufruf durch FTUI Kommandosyntax anpassen
|
# bei Aufruf durch FTUI Kommandosyntax anpassen
|
||||||
if($ftui) {
|
if($ftui) {
|
||||||
@ -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">';
|
||||||
@ -9132,16 +9142,17 @@ sub composeGallery {
|
|||||||
$cell++;
|
$cell++;
|
||||||
|
|
||||||
if ( $cell == $sgc+1 ) {
|
if ( $cell == $sgc+1 ) {
|
||||||
$htmlCode .= sprintf("<td>$data{SSCam}{$name}{SNAPHASH}{$key}{createdTm}<br> <img src=\"data:image/jpeg;base64,$data{SSCam}{$name}{SNAPHASH}{$key}{imageData}\" $gattr $idata> </td>" );
|
$htmlCode .= sprintf("<td>$data{SSCam}{$name}{SNAPHASH}{$key}{createdTm}<br> <img src=\"data:image/jpeg;base64,$data{SSCam}{$name}{SNAPHASH}{$key}{imageData}\" $gattr $idata> </td>" );
|
||||||
$htmlCode .= "</tr>";
|
$htmlCode .= "</tr>";
|
||||||
$htmlCode .= "<tr class=\"odd\">";
|
$htmlCode .= "<tr class=\"odd\">";
|
||||||
$cell = 1;
|
$cell = 1;
|
||||||
} else {
|
} else {
|
||||||
$htmlCode .= sprintf("<td>$data{SSCam}{$name}{SNAPHASH}{$key}{createdTm}<br> <img src=\"data:image/jpeg;base64,$data{SSCam}{$name}{SNAPHASH}{$key}{imageData}\" $gattr $idata> </td>" );
|
$htmlCode .= sprintf("<td>$data{SSCam}{$name}{SNAPHASH}{$key}{createdTm}<br> <img src=\"data:image/jpeg;base64,$data{SSCam}{$name}{SNAPHASH}{$key}{imageData}\" $gattr $idata> </td>" );
|
||||||
}
|
}
|
||||||
|
|
||||||
$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}");
|
||||||
@ -9160,12 +9172,12 @@ sub composeGallery {
|
|||||||
$cell++;
|
$cell++;
|
||||||
|
|
||||||
if ( $cell == $sgc+1 ) {
|
if ( $cell == $sgc+1 ) {
|
||||||
$htmlCode .= sprintf("<td>$imgTm<br> <img src=\"data:image/jpeg;base64,$imgdat\" $gattr $idata> </td>" );
|
$htmlCode .= sprintf("<td>$imgTm<br> <img src=\"data:image/jpeg;base64,$imgdat\" $gattr $idata> </td>" );
|
||||||
$htmlCode .= "</tr>";
|
$htmlCode .= "</tr>";
|
||||||
$htmlCode .= "<tr class=\"odd\">";
|
$htmlCode .= "<tr class=\"odd\">";
|
||||||
$cell = 1;
|
$cell = 1;
|
||||||
} else {
|
} else {
|
||||||
$htmlCode .= sprintf("<td>$imgTm<br> <img src=\"data:image/jpeg;base64,$imgdat\" $gattr $idata> </td>" );
|
$htmlCode .= sprintf("<td>$imgTm<br> <img src=\"data:image/jpeg;base64,$imgdat\" $gattr $idata> </td>" );
|
||||||
}
|
}
|
||||||
|
|
||||||
$idata = "";
|
$idata = "";
|
||||||
@ -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;
|
||||||
@ -9346,7 +9364,7 @@ sub prepareSendData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
$asref = $svshash->{HELPER}{ALLSNAPREF}; # Hashreferenz zum summarischen Snaphash
|
$asref = $svshash->{HELPER}{ALLSNAPREF}; # Hashreferenz zum summarischen Snaphash
|
||||||
for my $key (keys%{$asref}) { # prüfen ob Bildhash komplett ?
|
for my $key (keys%{$asref}) { # prüfen ob Bildhash komplett ?
|
||||||
if(!$asref->{$key}) {
|
if(!$asref->{$key}) {
|
||||||
return; # Bildhash noch nicht komplett
|
return; # Bildhash noch nicht komplett
|
||||||
}
|
}
|
||||||
@ -9357,10 +9375,10 @@ sub prepareSendData {
|
|||||||
$name = $svshash->{NAME}; # Name des auslösenden SVS-Devices wird eingesetzt
|
$name = $svshash->{NAME}; # Name des auslösenden SVS-Devices wird eingesetzt
|
||||||
Log3($name, 4, "$name - Central Snaphash fillup completed by all selected cams. Send it now ...");
|
Log3($name, 4, "$name - Central Snaphash fillup completed by all selected cams. Send it now ...");
|
||||||
|
|
||||||
my $cache = cache($name, "c_init"); # Cache initialisieren (im SVS Device)
|
my $cache = cache($name, "c_init"); # Cache initialisieren (im SVS Device)
|
||||||
if(!$cache || $cache eq "internal" ) {
|
if(!$cache || $cache eq "internal" ) {
|
||||||
delete $data{SSCam}{RS};
|
delete $data{SSCam}{RS};
|
||||||
for my $key (keys%{$asref}) { # Referenz zum summarischen Hash einsetzen
|
for my $key (keys%{$asref}) { # Referenz zum summarischen Hash einsetzen
|
||||||
$data{SSCam}{RS}{$key} = delete $asref->{$key};
|
$data{SSCam}{RS}{$key} = delete $asref->{$key};
|
||||||
}
|
}
|
||||||
$dat = $data{SSCam}{RS}; # Referenz zum summarischen Hash einsetzen
|
$dat = $data{SSCam}{RS}; # Referenz zum summarischen Hash einsetzen
|
||||||
@ -9425,16 +9443,16 @@ sub prepareSendData {
|
|||||||
$smtpmsg{$bodyk} = "$bodyt";
|
$smtpmsg{$bodyk} = "$bodyt";
|
||||||
|
|
||||||
$ret = sendEmail($hash, {'subject' => $smtpmsg{subject},
|
$ret = sendEmail($hash, {'subject' => $smtpmsg{subject},
|
||||||
'part1txt' => $smtpmsg{body},
|
'part1txt' => $smtpmsg{body},
|
||||||
'part2type' => 'image/jpeg',
|
'part2type' => 'image/jpeg',
|
||||||
'smtpport' => $sp,
|
'smtpport' => $sp,
|
||||||
'sdat' => $dat,
|
'sdat' => $dat,
|
||||||
'opmode' => $OpMode,
|
'opmode' => $OpMode,
|
||||||
'smtpnousessl' => $nousessl,
|
'smtpnousessl' => $nousessl,
|
||||||
'sslfrominit' => $sslfrominit,
|
'sslfrominit' => $sslfrominit,
|
||||||
'smtpsslport' => $smtpsslport,
|
'smtpsslport' => $smtpsslport,
|
||||||
'tac' => $tac,
|
'tac' => $tac,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
readingsSingleUpdate($hash, "sendEmailState", $ret, 1) if ($ret);
|
readingsSingleUpdate($hash, "sendEmailState", $ret, 1) if ($ret);
|
||||||
}
|
}
|
||||||
@ -9465,16 +9483,16 @@ sub prepareSendData {
|
|||||||
$smtpmsg{$bodyk} = "$bodyt";
|
$smtpmsg{$bodyk} = "$bodyt";
|
||||||
|
|
||||||
$ret = sendEmail($hash, {'subject' => $smtpmsg{subject},
|
$ret = sendEmail($hash, {'subject' => $smtpmsg{subject},
|
||||||
'part1txt' => $smtpmsg{body},
|
'part1txt' => $smtpmsg{body},
|
||||||
'part2type' => 'video/mpeg',
|
'part2type' => 'video/mpeg',
|
||||||
'smtpport' => $sp,
|
'smtpport' => $sp,
|
||||||
'vdat' => $dat,
|
'vdat' => $dat,
|
||||||
'opmode' => $OpMode,
|
'opmode' => $OpMode,
|
||||||
'smtpnousessl' => $nousessl,
|
'smtpnousessl' => $nousessl,
|
||||||
'sslfrominit' => $sslfrominit,
|
'sslfrominit' => $sslfrominit,
|
||||||
'smtpsslport' => $smtpsslport,
|
'smtpsslport' => $smtpsslport,
|
||||||
'tac' => $tac,
|
'tac' => $tac,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
readingsSingleUpdate($hash, "sendEmailState", $ret, 1) if ($ret);
|
readingsSingleUpdate($hash, "sendEmailState", $ret, 1) if ($ret);
|
||||||
}
|
}
|
||||||
@ -9490,7 +9508,7 @@ sub prepareSendData {
|
|||||||
$mt =~ s/['"]//gx;
|
$mt =~ s/['"]//gx;
|
||||||
|
|
||||||
my ($tbotk,$tbott,$peerk,$peert,$subjk,$subjt);
|
my ($tbotk,$tbott,$peerk,$peert,$subjk,$subjt);
|
||||||
my ($telebot,$peers,$subj) = split(",", $mt, 3 );
|
my ($telebot,$peers,$subj) = split(",", $mt, 3 );
|
||||||
($tbotk,$tbott) = split("=>", $telebot) if($telebot);
|
($tbotk,$tbott) = split("=>", $telebot) if($telebot);
|
||||||
($peerk,$peert) = split("=>", $peers ) if($peers);
|
($peerk,$peert) = split("=>", $peers ) if($peers);
|
||||||
($subjk,$subjt) = split("=>", $subj ) if($subj);
|
($subjk,$subjt) = split("=>", $subj ) if($subj);
|
||||||
@ -9513,14 +9531,14 @@ sub prepareSendData {
|
|||||||
$telemsg{$subjk} = "$subjt" if($subjt);
|
$telemsg{$subjk} = "$subjt" if($subjt);
|
||||||
|
|
||||||
$ret = sendTelegram($hash, {'subject' => $telemsg{subject},
|
$ret = sendTelegram($hash, {'subject' => $telemsg{subject},
|
||||||
'part2type' => 'image/jpeg',
|
'part2type' => 'image/jpeg',
|
||||||
'sdat' => $dat,
|
'sdat' => $dat,
|
||||||
'opmode' => $OpMode,
|
'opmode' => $OpMode,
|
||||||
'tac' => $tac,
|
'tac' => $tac,
|
||||||
'telebot' => $telemsg{$tbotk},
|
'telebot' => $telemsg{$tbotk},
|
||||||
'peers' => $telemsg{$peerk},
|
'peers' => $telemsg{$peerk},
|
||||||
'MediaStream' => '-1', # Code für MediaStream im TelegramBot (png/jpg = -1)
|
'MediaStream' => '-1', # Code für MediaStream im TelegramBot (png/jpg = -1)
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
readingsSingleUpdate($hash, "sendTeleState", $ret, 1) if ($ret);
|
readingsSingleUpdate($hash, "sendTeleState", $ret, 1) if ($ret);
|
||||||
}
|
}
|
||||||
@ -9559,14 +9577,14 @@ sub prepareSendData {
|
|||||||
$telemsg{$subjk} = "$subjt" if($subjt);
|
$telemsg{$subjk} = "$subjt" if($subjt);
|
||||||
|
|
||||||
$vdat = $dat;
|
$vdat = $dat;
|
||||||
$ret = sendTelegram($hash, {'subject' => $telemsg{subject},
|
$ret = sendTelegram($hash, {'subject' => $telemsg{subject},
|
||||||
'vdat' => $vdat,
|
'vdat' => $vdat,
|
||||||
'opmode' => $OpMode,
|
'opmode' => $OpMode,
|
||||||
'telebot' => $telemsg{$tbotk},
|
'telebot' => $telemsg{$tbotk},
|
||||||
'peers' => $telemsg{$peerk},
|
'peers' => $telemsg{$peerk},
|
||||||
'tac' => $tac,
|
'tac' => $tac,
|
||||||
'MediaStream' => '-30', # Code für MediaStream im TelegramBot (png/jpg = -1)
|
'MediaStream' => '-30', # Code für MediaStream im TelegramBot (png/jpg = -1)
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
readingsSingleUpdate($hash, "sendTeleState", $ret, 1) if ($ret);
|
readingsSingleUpdate($hash, "sendTeleState", $ret, 1) if ($ret);
|
||||||
}
|
}
|
||||||
@ -9605,12 +9623,12 @@ sub prepareSendData {
|
|||||||
$chatmsg{$subjk} = "$subjt" if($subjt);
|
$chatmsg{$subjk} = "$subjt" if($subjt);
|
||||||
|
|
||||||
$ret = sendChat($hash, {'subject' => $chatmsg{subject},
|
$ret = sendChat($hash, {'subject' => $chatmsg{subject},
|
||||||
'opmode' => $OpMode,
|
'opmode' => $OpMode,
|
||||||
'tac' => $tac,
|
'tac' => $tac,
|
||||||
'sdat' => $dat,
|
'sdat' => $dat,
|
||||||
'chatbot' => $chatmsg{$cbotk},
|
'chatbot' => $chatmsg{$cbotk},
|
||||||
'peers' => $chatmsg{$peerk},
|
'peers' => $chatmsg{$peerk},
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
readingsSingleUpdate($hash, "sendChatState", $ret, 1) if ($ret);
|
readingsSingleUpdate($hash, "sendChatState", $ret, 1) if ($ret);
|
||||||
}
|
}
|
||||||
@ -9648,13 +9666,13 @@ sub prepareSendData {
|
|||||||
$chatmsg{$peerk} = "$peert" if($peert);
|
$chatmsg{$peerk} = "$peert" if($peert);
|
||||||
$chatmsg{$subjk} = "$subjt" if($subjt);
|
$chatmsg{$subjk} = "$subjt" if($subjt);
|
||||||
|
|
||||||
$ret = sendChat($hash, {'subject' => $chatmsg{subject},
|
$ret = sendChat($hash, {'subject' => $chatmsg{subject},
|
||||||
'opmode' => $OpMode,
|
'opmode' => $OpMode,
|
||||||
'tac' => $tac,
|
'tac' => $tac,
|
||||||
'vdat' => $dat,
|
'vdat' => $dat,
|
||||||
'chatbot' => $chatmsg{$cbotk},
|
'chatbot' => $chatmsg{$cbotk},
|
||||||
'peers' => $chatmsg{$peerk},
|
'peers' => $chatmsg{$peerk},
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
readingsSingleUpdate($hash, "sendChatState", $ret, 1) if ($ret);
|
readingsSingleUpdate($hash, "sendChatState", $ret, 1) if ($ret);
|
||||||
}
|
}
|
||||||
@ -9679,14 +9697,14 @@ sub sendChat {
|
|||||||
Log3($name, 4, "$name - ####################################################");
|
Log3($name, 4, "$name - ####################################################");
|
||||||
|
|
||||||
my %chatparams = (
|
my %chatparams = (
|
||||||
'subject' => { 'default'=>'', 'required'=>1, 'set'=>1},
|
'subject' => { 'default'=>'', 'required'=>1, 'set'=>1},
|
||||||
'opmode' => { 'default'=>'', 'required'=>1, 'set'=>1}, # OpMode muss gesetzt sein
|
'opmode' => { 'default'=>'', 'required'=>1, 'set'=>1}, # OpMode muss gesetzt sein
|
||||||
'tac' => { 'default'=>'', 'required'=>0, 'set'=>1}, # übermittelter Transaktionscode der ausgewerteten Transaktion
|
'tac' => { 'default'=>'', 'required'=>0, 'set'=>1}, # übermittelter Transaktionscode der ausgewerteten Transaktion
|
||||||
'sdat' => { 'default'=>'', 'required'=>0, 'set'=>1}, # Hashref der Bilddaten (Bilddaten base64 codiert)
|
'sdat' => { 'default'=>'', 'required'=>0, 'set'=>1}, # Hashref der Bilddaten (Bilddaten base64 codiert)
|
||||||
'vdat' => { 'default'=>'', 'required'=>0, 'set'=>1}, # Hashref der Videodaten
|
'vdat' => { 'default'=>'', 'required'=>0, 'set'=>1}, # Hashref der Videodaten
|
||||||
'chatbot' => { 'default'=>'', 'required'=>1, 'set'=>1}, # SSChatBot-Device welches zum Senden verwendet werden soll
|
'chatbot' => { 'default'=>'', 'required'=>1, 'set'=>1}, # SSChatBot-Device welches zum Senden verwendet werden soll
|
||||||
'peers' => { 'default'=>'', 'required'=>0, 'set'=>1}, # SSChatBot Peers
|
'peers' => { 'default'=>'', 'required'=>0, 'set'=>1}, # SSChatBot Peers
|
||||||
'videofolderMap' => {'attr'=>'videofolderMap', 'default'=>'', 'required'=>1, 'set'=>1}, # Wert des Attributs videofolderMap (muss gesetzt sein !)
|
'videofolderMap' => {'attr'=>'videofolderMap', 'default'=>'', 'required'=>1, 'set'=>1}, # Wert des Attributs videofolderMap (muss gesetzt sein !)
|
||||||
);
|
);
|
||||||
|
|
||||||
my $tac = $extparamref->{tac};
|
my $tac = $extparamref->{tac};
|
||||||
@ -9944,7 +9962,7 @@ sub sendTelegram {
|
|||||||
'telebot' => { 'default'=>'', 'required'=>1, 'set'=>1}, # TelegramBot-Device welches zum Senden verwendet werden soll
|
'telebot' => { 'default'=>'', 'required'=>1, 'set'=>1}, # TelegramBot-Device welches zum Senden verwendet werden soll
|
||||||
'peers' => { 'default'=>'', 'required'=>0, 'set'=>1}, # TelegramBot Peers
|
'peers' => { 'default'=>'', 'required'=>0, 'set'=>1}, # TelegramBot Peers
|
||||||
'MediaStream' => { 'default'=>'', 'required'=>0, 'set'=>1}, # Code für MediaStream im TelegramBot (png/jpg = -1)
|
'MediaStream' => { 'default'=>'', 'required'=>0, 'set'=>1}, # Code für MediaStream im TelegramBot (png/jpg = -1)
|
||||||
);
|
);
|
||||||
|
|
||||||
my $tac = $extparamref->{tac};
|
my $tac = $extparamref->{tac};
|
||||||
|
|
||||||
@ -10516,7 +10534,7 @@ sub sendEmail {
|
|||||||
'sslfrominit' => { 'default'=>'', 'required'=>0, 'set'=>1}, # SSL soll sofort ! aufgebaut werden
|
'sslfrominit' => { 'default'=>'', 'required'=>0, 'set'=>1}, # SSL soll sofort ! aufgebaut werden
|
||||||
'tac' => { 'default'=>'', 'required'=>0, 'set'=>1}, # übermittelter Transaktionscode der ausgewerteten Transaktion
|
'tac' => { 'default'=>'', 'required'=>0, 'set'=>1}, # übermittelter Transaktionscode der ausgewerteten Transaktion
|
||||||
'vdat' => { 'default'=>'', 'required'=>0, 'set'=>1}, # Videodaten, wenn gesetzt muss 'part2type' auf 'video/mpeg' gesetzt sein
|
'vdat' => { 'default'=>'', 'required'=>0, 'set'=>1}, # Videodaten, wenn gesetzt muss 'part2type' auf 'video/mpeg' gesetzt sein
|
||||||
);
|
);
|
||||||
|
|
||||||
my $tac = $extparamref->{tac};
|
my $tac = $extparamref->{tac};
|
||||||
|
|
||||||
@ -11670,7 +11688,10 @@ return;
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<a name="SSCamcreateStreamDev"></a>
|
<a name="SSCamcreateStreamDev"></a>
|
||||||
<li><b> createStreamDev [generic | hls | lastsnap | mjpeg | switched] </b> (valid for CAM)</li> <br>
|
<li><b> createStreamDev [generic | hls | lastsnap | mjpeg | switched] </b> (valid for CAM) <br>
|
||||||
|
respectively <br>
|
||||||
|
<b> createStreamDev [master] </b> (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 <name> genericStrmHtmlTag <img $HTMLATTR
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<a name="SSCamcreateStreamDev"></a>
|
<a name="SSCamcreateStreamDev"></a>
|
||||||
<li><b> createStreamDev [generic | hls | lastsnap | mjpeg | switched] </b> (gilt für CAM)</li> <br>
|
<li><b> createStreamDev [generic | hls | lastsnap | mjpeg | switched] </b> (gilt für CAM) <br>
|
||||||
|
bzw. <br>
|
||||||
|
<b> createStreamDev [master] </b> (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 <name> genericStrmHtmlTag <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>
|
||||||
|
|
||||||
|
@ -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
|
||||||
@ -61,7 +62,9 @@ BEGIN {
|
|||||||
sortTopicNum
|
sortTopicNum
|
||||||
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);
|
||||||
@ -269,10 +284,8 @@ sub Set {
|
|||||||
unless ($to =~ /^\d+$/x || lc($to) eq "ok") { $to = $todef; }
|
unless ($to =~ /^\d+$/x || lc($to) eq "ok") { $to = $todef; }
|
||||||
$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 $htmlCode = $hash->{HELPER}{STREAM};
|
||||||
my $parentHash = $defs{$parent};
|
|
||||||
my $htmlCode = $hash->{HELPER}{STREAM};
|
|
||||||
|
|
||||||
if ($hash->{HELPER}{STREAMACTIVE}) {
|
if ($hash->{HELPER}{STREAMACTIVE}) {
|
||||||
my $out = "<html>";
|
my $out = "<html>";
|
||||||
@ -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";
|
||||||
}
|
}
|
||||||
@ -354,26 +403,40 @@ 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
|
||||||
if($al) {
|
if($al) {
|
||||||
InternalTimer(gettimeofday()+$al, "FHEM::SSCamSTRM::webRefresh", $hash, 0);
|
InternalTimer(gettimeofday()+$al, "FHEM::SSCamSTRM::webRefresh", $hash, 0);
|
||||||
Log3($name, 5, "$name - next start of autoRefresh: ".FmtDateTime(gettimeofday()+$al));
|
Log3($name, 5, "$name - next start of autoRefresh: ".FmtDateTime(gettimeofday()+$al));
|
||||||
@ -392,12 +455,23 @@ sub explodeDEF {
|
|||||||
my $link = shift;
|
my $link = shift;
|
||||||
|
|
||||||
my $arg = (split("[()]",$link))[1];
|
my $arg = (split("[()]",$link))[1];
|
||||||
$arg =~ s/'//xg;
|
$arg =~ s/'//xg;
|
||||||
($hash->{PARENT},undef,$hash->{MODEL}) = split(",",$arg);
|
($hash->{PARENT},undef,$hash->{MODEL}) = split(",",$arg);
|
||||||
|
|
||||||
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
|
||||||
@ -479,7 +553,7 @@ sub streamAsHtml {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
$ret .= $link;
|
$ret .= $link;
|
||||||
}
|
}
|
||||||
|
|
||||||
$ret .= "</html>";
|
$ret .= "</html>";
|
||||||
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user