2018-12-09 13:07:53 +00:00
########################################################################################################################
2020-07-16 06:14:56 +00:00
# $Id: 49_SSCamSTRM.pm 22329 2020-07-02 17:16:52Z DS_Starter $
2018-12-09 13:07:53 +00:00
#########################################################################################################################
# 49_SSCamSTRM.pm
#
2020-06-25 06:21:49 +00:00
# (c) 2018-2020 by Heiko Maaz
2018-12-09 13:07:53 +00:00
# forked from 98_weblink.pm by Rudolf König
# e-mail: Heiko dot Maaz at t-online dot de
#
# This Module is used by module 49_SSCam to create Streaming devices.
# It can't be used without any SSCam-Device.
#
# This script is part of fhem.
#
# Fhem is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# Fhem is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with fhem. If not, see <http://www.gnu.org/licenses/>.
#
#########################################################################################################################
2020-06-25 06:21:49 +00:00
package FHEM::SSCamSTRM ; ## no critic 'package';
2018-12-09 13:07:53 +00:00
use strict ;
use warnings ;
2020-06-25 06:21:49 +00:00
use GPUtils qw( GP_Import GP_Export ) ; # wird für den Import der FHEM Funktionen aus der fhem.pl benötigt
use Time::HiRes qw( gettimeofday ) ;
2020-07-01 07:21:11 +00:00
eval "use FHEM::Meta;1" or my $ modMetaAbsent = 1 ; ## no critic 'eval'
2018-12-09 13:07:53 +00:00
2020-06-25 06:21:49 +00:00
# Run before module compilation
BEGIN {
# Import from main::
GP_Import (
qw(
AnalyzePerlCommand
AttrVal
2020-07-18 07:10:26 +00:00
CommandSet
2020-07-16 06:14:56 +00:00
data
2020-06-25 06:21:49 +00:00
defs
devspec2array
FmtDateTime
InternalTimer
IsDisabled
Log3
modules
readingsSingleUpdate
readingsBulkUpdate
readingsBulkUpdateIfChanged
readingsBeginUpdate
readingsDelete
readingsEndUpdate
ReadingsVal
RemoveInternalTimer
readingFnAttributes
sortTopicNum
FW_cmd
FW_directNotify
2020-07-16 06:14:56 +00:00
FW_wname
FW_pH
FW_widgetFallbackFn
2020-06-28 18:49:16 +00:00
FHEM::SSCam:: ptzPanel
FHEM::SSCam:: streamDev
FHEM::SSCam:: composeGallery
FHEM::SSCam:: getClHash
2020-06-25 06:21:49 +00:00
)
) ;
# Export to main context with different name
# my $pkg = caller(0);
# my $main = $pkg;
# $main =~ s/^(?:.+::)?([^:]+)$/main::$1\_/gx;
# for (@_) {
# *{ $main . $_ } = *{ $pkg . '::' . $_ };
# }
GP_Export (
qw(
Initialize
)
) ;
}
2018-12-09 13:07:53 +00:00
# Versions History intern
2020-06-25 06:21:49 +00:00
my % vNotesIntern = (
2020-07-16 06:14:56 +00:00
"2.13.0" = > "14.07.2020 integrate streamDev master " ,
2020-06-28 18:49:16 +00:00
"2.12.0" = > "28.06.2020 upgrade SSCam functions due to SSCam switch to packages " ,
2020-06-25 06:21:49 +00:00
"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.1" = > "18.10.2019 set parentState initial in Define, Forum: https://forum.fhem.de/index.php/topic,45671.msg985136.html#msg985136 " ,
2019-09-21 13:03:06 +00:00
"2.10.0" = > "21.09.2019 new attribute hideAudio " ,
"2.9.0" = > "19.09.2019 new attribute noLink " ,
"2.8.0" = > "09.09.2019 new attribute hideButtons " ,
2019-09-09 22:24:51 +00:00
"2.7.0" = > "15.07.2019 FTUI support, new attributes htmlattrFTUI, hideDisplayNameFTUI, ptzButtonSize, ptzButtonSizeFTUI " ,
2019-07-12 20:10:53 +00:00
"2.6.0" = > "21.06.2019 GetFn -> get <name> html " ,
"2.5.0" = > "27.03.2019 add Meta.pm support " ,
"2.4.0" = > "24.02.2019 support for \"genericStrmHtmlTag\" in streaming device MODEL generic " ,
2020-06-25 06:21:49 +00:00
"2.3.0" = > "04.02.2019 Rename / Copy added, Streaming device can now be renamed or copied " ,
2018-12-30 20:20:27 +00:00
"2.2.1" = > "19.12.2018 commandref revised " ,
"2.2.0" = > "13.12.2018 load sscam_hls.js, sscam_tooltip.js from pgm2 for HLS Streaming support and tooltips " ,
2018-12-11 19:34:15 +00:00
"2.1.0" = > "11.12.2018 switch \"popupStream\" from get to set " ,
2018-12-10 22:11:29 +00:00
"2.0.0" = > "09.12.2018 get command \"popupStream\" and attribute \"popupStreamFW\" " ,
2018-12-09 13:07:53 +00:00
"1.5.0" = > "02.12.2018 new attribute \"popupWindowSize\" " ,
"1.4.1" = > "31.10.2018 attribute \"autoLoop\" changed to \"autoRefresh\", new attribute \"autoRefreshFW\" " ,
"1.4.0" = > "29.10.2018 readingFnAttributes added " ,
"1.3.0" = > "28.10.2018 direct help for attributes, new attribute \"autoLoop\" " ,
"1.2.4" = > "27.10.2018 fix undefined subroutine &main::SSCam_ptzpanel (https://forum.fhem.de/index.php/topic,45671.msg850505.html#msg850505) " ,
"1.2.3" = > "03.07.2018 behavior changed if device is disabled " ,
"1.2.2" = > "26.06.2018 make changes for generic stream dev " ,
"1.2.1" = > "23.06.2018 no name add-on if MODEL is snapgallery " ,
"1.2.0" = > "20.06.2018 running stream as human readable entry for SSCamSTRM-Device " ,
"1.1.0" = > "16.06.2018 attr hideDisplayName regarding to Forum #88667 " ,
"1.0.1" = > "14.06.2018 commandref revised " ,
"1.0.0" = > "14.06.2018 switch to longpoll refresh " ,
"0.4.0" = > "13.06.2018 new attribute \"noDetaillink\" (deleted in V1.0.0) " ,
"0.3.0" = > "12.06.2018 new attribute \"forcePageRefresh\" " ,
"0.2.0" = > "11.06.2018 check in with SSCam 5.0.0 " ,
"0.1.0" = > "10.06.2018 initial Version "
) ;
2020-06-28 18:49:16 +00:00
my % fupgrade = ( # Funktionsupgrade in SSCamSTRM devices definiert vor SSCam Version 9.4.0
1 = > { of = > "SSCam_ptzpanel" , nf = > "FHEM::SSCam::ptzPanel" } ,
2 = > { of = > "SSCam_composegallery" , nf = > "FHEM::SSCam::composeGallery" } ,
3 = > { of = > "SSCam_StreamDev" , nf = > "FHEM::SSCam::streamDev" } ,
) ;
2020-07-20 16:27:33 +00:00
my % hvattr = ( # Hash zur Validierung von Attributen
2020-07-20 18:59:35 +00:00
adoptSubset = > { master = > 1 , nomaster = > 0 } ,
2020-07-20 16:27:33 +00:00
autoRefresh = > { master = > 1 , nomaster = > 1 } ,
autoRefreshFW = > { master = > 1 , nomaster = > 1 } ,
disable = > { master = > 1 , nomaster = > 1 } ,
forcePageRefresh = > { master = > 1 , nomaster = > 1 } ,
genericStrmHtmlTag = > { master = > 0 , nomaster = > 1 } ,
htmlattr = > { master = > 0 , nomaster = > 1 } ,
htmlattrFTUI = > { master = > 0 , nomaster = > 1 } ,
hideAudio = > { master = > 0 , nomaster = > 1 } ,
hideButtons = > { master = > 0 , nomaster = > 1 } ,
hideDisplayName = > { master = > 1 , nomaster = > 1 } ,
hideDisplayNameFTUI = > { master = > 1 , nomaster = > 1 } ,
noLink = > { master = > 1 , nomaster = > 1 } ,
popupWindowSize = > { master = > 0 , nomaster = > 1 } ,
popupStreamFW = > { master = > 0 , nomaster = > 1 } ,
popupStreamTo = > { master = > 0 , nomaster = > 1 } ,
ptzButtonSize = > { master = > 0 , nomaster = > 1 } ,
ptzButtonSizeFTUI = > { master = > 0 , nomaster = > 1 } ,
2020-06-28 18:49:16 +00:00
) ;
2018-12-09 13:07:53 +00:00
2020-07-16 06:14:56 +00:00
my % sdevs = ( ) ; # Hash der vorhandenen Streaming Devices
2020-07-01 07:21:11 +00:00
my $ todef = 5 ; # Default Popup Zeit für set <> popupStream
2018-12-09 13:07:53 +00:00
################################################################
2020-06-25 06:21:49 +00:00
sub Initialize {
my $ hash = shift ;
2018-12-09 13:07:53 +00:00
my $ fwd = join ( "," , devspec2array ( "TYPE=FHEMWEB:FILTER=STATE=Initialized" ) ) ;
2020-07-20 18:59:35 +00:00
my $ sd = "--reset--," . allStreamDevs ( ) ;
2018-12-09 13:07:53 +00:00
2020-06-25 06:21:49 +00:00
$ hash - > { DefFn } = \ & Define ;
$ hash - > { SetFn } = \ & Set ;
$ hash - > { GetFn } = \ & Get ;
2020-07-20 18:59:35 +00:00
$ hash - > { AttrList } = "adoptSubset:sortable-strict,$sd " .
"autoRefresh:selectnumbers,120,0.2,1800,0,log10 " .
2018-12-09 13:07:53 +00:00
"autoRefreshFW:$fwd " .
"disable:1,0 " .
2019-07-12 20:10:53 +00:00
"forcePageRefresh:1,0 " .
"genericStrmHtmlTag " .
2018-12-09 13:07:53 +00:00
"htmlattr " .
2019-07-14 18:18:07 +00:00
"htmlattrFTUI " .
2019-09-21 13:03:06 +00:00
"hideAudio:1,0 " .
"hideButtons:1,0 " .
2018-12-09 13:07:53 +00:00
"hideDisplayName:1,0 " .
2019-07-14 18:18:07 +00:00
"hideDisplayNameFTUI:1,0 " .
2019-09-21 13:03:06 +00:00
"noLink:1,0 " .
2018-12-09 13:07:53 +00:00
"popupWindowSize " .
2018-12-09 21:04:11 +00:00
"popupStreamFW:$fwd " .
2018-12-09 18:42:54 +00:00
"popupStreamTo:OK,1,2,3,4,5,6,7,8,9,10,15,20,25,30,40,50,60 " .
2019-09-09 22:24:51 +00:00
"ptzButtonSize:selectnumbers,50,5,100,0,lin " .
2020-06-25 06:21:49 +00:00
"ptzButtonSizeFTUI:selectnumbers,50,5,200,0,lin " .
2018-12-09 13:07:53 +00:00
$ readingFnAttributes ;
2020-06-25 06:21:49 +00:00
$ hash - > { RenameFn } = \ & Rename ;
$ hash - > { CopyFn } = \ & Copy ;
$ hash - > { FW_summaryFn } = \ & FwFn ;
$ hash - > { FW_detailFn } = \ & FwFn ;
$ hash - > { AttrFn } = \ & Attr ;
2019-07-12 20:10:53 +00:00
$ hash - > { FW_hideDisplayName } = 1 ; # Forum 88667
2018-12-09 13:07:53 +00:00
# $hash->{FW_addDetailToSummary} = 1;
2019-07-12 20:10:53 +00:00
# $hash->{FW_atPageEnd} = 1; # wenn 1 -> kein Longpoll ohne informid in HTML-Tag
2018-12-09 13:07:53 +00:00
2020-07-01 07:21:11 +00:00
eval { FHEM::Meta:: InitMod ( __FILE__ , $ hash ) } ; ## no critic 'eval' # für Meta.pm (https://forum.fhem.de/index.php/topic,97589.0.html)
2018-12-30 20:20:27 +00:00
2019-07-12 20:10:53 +00:00
return ;
2018-12-30 20:20:27 +00:00
}
2018-12-09 13:07:53 +00:00
2020-06-28 18:49:16 +00:00
################################################################
# Define
2018-12-09 13:07:53 +00:00
################################################################
2020-06-25 06:21:49 +00:00
sub Define {
2018-12-09 13:07:53 +00:00
my ( $ hash , $ def ) = @ _ ;
my ( $ name , $ type , $ link ) = split ( "[ \t]+" , $ def , 3 ) ;
if ( ! $ link ) {
return "Usage: define <name> SSCamSTRM <arg>" ;
}
2020-07-01 07:21:11 +00:00
$ link = migrateFunc ( $ hash , $ link ) ;
2020-06-28 18:49:16 +00:00
2020-07-17 10:58:15 +00:00
explodeLinkData ( $ hash , $ link , 1 ) ;
2020-06-28 18:49:16 +00:00
2019-07-12 20:10:53 +00:00
$ hash - > { HELPER } { MODMETAABSENT } = 1 if ( $ modMetaAbsent ) ; # Modul Meta.pm nicht vorhanden
2018-12-09 13:07:53 +00:00
2019-07-12 20:10:53 +00:00
# Versionsinformationen setzen
2020-06-25 06:21:49 +00:00
setVersionInfo ( $ hash ) ;
2018-12-09 13:07:53 +00:00
2020-07-19 20:37:26 +00:00
my @ r ;
2020-07-20 20:24:42 +00:00
push @ r , "adoptSubset:--reset--" if ( IsModelMaster ( $ hash ) ) ; # Init für FTUI Subset wenn benutzt (Attr adoptSubset)
2020-07-19 20:37:26 +00:00
push @ r , "parentState:initialized" ; # Init für "parentState" Forum: https://forum.fhem.de/index.php/topic,45671.msg985136.html#msg985136
push @ r , "state:initialized" ; # Init für "state"
setReadings ( $ hash , \ @ r , 1 ) ;
2018-12-09 13:07:53 +00:00
2020-06-28 18:49:16 +00:00
return ;
2018-12-09 13:07:53 +00:00
}
2019-02-06 21:06:40 +00:00
################################################################
2020-07-01 07:21:11 +00:00
# im DEF hinterlegte Funktionen vor SSCam V9.4.0 migrieren
2020-06-28 18:49:16 +00:00
################################################################
2020-07-01 07:21:11 +00:00
sub migrateFunc {
2020-06-28 18:49:16 +00:00
my $ hash = shift ;
my $ link = shift ;
for my $ k ( keys % fupgrade ) {
$ hash - > { DEF } =~ s/$fupgrade{$k}{of}/$fupgrade{$k}{nf}/gx ;
$ link =~ s/$fupgrade{$k}{of}/$fupgrade{$k}{nf}/gx ;
}
return $ link ;
}
###############################################################
# SSCamSTRM Copy & Rename
# passt die Deviceparameter bei kopierten / umbenennen an
###############################################################
2020-06-25 06:21:49 +00:00
sub Rename {
2020-07-01 07:21:11 +00:00
my $ new_name = shift ;
2020-06-28 18:49:16 +00:00
my $ old_name = shift ;
my $ hash = $ defs { $ new_name } // return ;
2019-02-06 21:06:40 +00:00
2020-07-17 10:58:15 +00:00
$ hash - > { DEF } =~ s/\'$old_name\'/\'$new_name\'/xg ;
explodeLinkData ( $ hash , $ hash - > { DEF } , 1 ) ;
2019-02-06 21:06:40 +00:00
return ;
}
2020-06-25 06:21:49 +00:00
sub Copy {
2020-07-01 07:21:11 +00:00
my $ old_name = shift ;
2020-06-28 18:49:16 +00:00
my $ new_name = shift ;
my $ hash = $ defs { $ new_name } // return ;
2019-02-06 21:06:40 +00:00
2020-07-17 10:58:15 +00:00
$ hash - > { DEF } =~ s/\'$old_name\'/\'$new_name\'/xg ;
explodeLinkData ( $ hash , $ hash - > { DEF } , 1 ) ;
2019-02-06 21:06:40 +00:00
return ;
}
2018-12-09 13:07:53 +00:00
################################################################
2020-06-25 06:21:49 +00:00
sub Set {
2018-12-09 13:07:53 +00:00
my ( $ hash , @ a ) = @ _ ;
return "\"set X\" needs at least an argument" if ( @ a < 2 ) ;
my $ name = $ a [ 0 ] ;
my $ opt = $ a [ 1 ] ;
my $ prop = $ a [ 2 ] ;
2020-07-01 07:21:11 +00:00
return if ( IsDisabled ( $ name ) || $ hash - > { MODEL } =~ /ptzcontrol|snapgallery/x ) ;
2018-12-09 13:07:53 +00:00
2020-07-16 06:14:56 +00:00
my $ setlist ;
if ( ! IsModelMaster ( $ hash ) ) {
$ setlist = "Unknown argument $opt, choose one of " .
2020-07-01 07:21:11 +00:00
"popupStream "
2018-12-09 13:07:53 +00:00
;
2020-07-16 06:14:56 +00:00
} else {
2020-07-20 18:59:35 +00:00
my $ as = "--reset--," . allStreamDevs ( ) ;
my $ sd = AttrVal ( $ name , "adoptSubset" , $ as ) ;
$ sd =~ s/\s+/#/gx ;
2020-07-19 11:53:46 +00:00
2020-07-20 18:59:35 +00:00
my $ rsd = $ as ;
$ rsd =~ s/#/ /g ; ## no critic 'regular expression' # Regular expression without "/x" flag nicht anwenden !!!
2020-07-19 11:53:46 +00:00
push my @ ado , "adoptList:$rsd" ;
setReadings ( $ hash , \ @ ado , 0 ) ;
2020-07-16 06:14:56 +00:00
$ setlist = "Unknown argument $opt, choose one of " .
2020-07-19 14:13:57 +00:00
"adopt:$sd "
2020-07-16 06:14:56 +00:00
;
}
2018-12-09 13:07:53 +00:00
if ( $ opt eq "popupStream" ) {
2020-07-01 07:21:11 +00:00
my $ txt = FHEM::SSCam:: getClHash ( $ hash ) ;
2018-12-09 13:07:53 +00:00
return $ txt if ( $ txt ) ;
2018-12-09 20:10:52 +00:00
# OK-Dialogbox oder Autoclose
2020-07-01 07:21:11 +00:00
my $ temp = AttrVal ( $ name , "popupStreamTo" , $ todef ) ;
my $ to = $ prop // $ temp ;
unless ( $ to =~ /^\d+$/x || lc ( $ to ) eq "ok" ) { $ to = $ todef ; }
$ to = ( $ to =~ /\d+/x ) ? ( 1000 * $ to ) : $ to ;
2018-12-09 17:25:00 +00:00
2020-07-16 06:14:56 +00:00
my $ pd = AttrVal ( $ name , "popupStreamFW" , "TYPE=FHEMWEB" ) ;
my $ htmlCode = $ hash - > { HELPER } { STREAM } ;
2018-12-09 13:07:53 +00:00
2018-12-09 17:25:00 +00:00
if ( $ hash - > { HELPER } { STREAMACTIVE } ) {
2018-12-09 15:52:14 +00:00
my $ out = "<html>" ;
$ out . = $ htmlCode ;
$ out . = "</html>" ;
2018-12-11 19:34:15 +00:00
Log3 ( $ name , 4 , "$name - Stream to display: $htmlCode" ) ;
Log3 ( $ name , 4 , "$name - Stream display to webdevice: $pd" ) ;
2020-07-01 07:21:11 +00:00
if ( $ to =~ /\d+/x ) {
map { FW_directNotify ( "#FHEMWEB:$_" , "FW_errmsg('$out', $to)" , "" ) } devspec2array ( "$pd" ) ; ## no critic 'void context';
2018-12-09 18:42:54 +00:00
} else {
2020-07-01 07:21:11 +00:00
map { FW_directNotify ( "#FHEMWEB:$_" , "FW_okDialog('$out')" , "" ) } devspec2array ( "$pd" ) ; ## no critic 'void context';
}
2018-12-09 15:03:29 +00:00
}
2018-12-09 13:07:53 +00:00
2020-07-19 14:13:57 +00:00
} elsif ( $ opt eq "adopt" ) {
2020-07-16 06:14:56 +00:00
shift @ a ; shift @ a ;
2020-07-19 11:53:46 +00:00
$ prop = join "#" , @ a ;
2020-07-18 07:10:26 +00:00
if ( $ prop eq "--reset--" ) {
CommandSet ( undef , "$name reset" ) ;
return ;
}
2020-07-19 11:53:46 +00:00
my $ strmd = $ sdevs { "$prop" } // "" ;
2020-07-16 06:14:56 +00:00
my $ valid = ( $ strmd && $ defs { $ strmd } && $ defs { $ strmd } { TYPE } eq "SSCamSTRM" ) ;
2020-07-19 11:53:46 +00:00
return qq{ The command "$opt" needs a valid SSCamSTRM device as argument instead of "$strmd" } if ( ! $ valid ) ;
2020-07-16 06:14:56 +00:00
# Ü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" ;
}
2020-07-17 10:58:15 +00:00
# Übernahme Link-Parameter
my $ link = "{$defs{$strmd}{LINKFN}('$defs{$strmd}{LINKPARENT}','$defs{$strmd}{LINKNAME}','$defs{$strmd}{LINKMODEL}')}" ;
2020-07-19 18:37:44 +00:00
2020-07-18 12:34:49 +00:00
explodeLinkData ( $ hash , $ link , 0 ) ;
2020-07-19 18:37:44 +00:00
2020-07-18 07:26:30 +00:00
push @ r , "clientLink:$link" ;
2020-07-19 18:37:44 +00:00
push @ r , "parentCam:$hash->{LINKPARENT}" ;
2020-07-16 06:14:56 +00:00
if ( @ r ) {
2020-07-19 11:53:46 +00:00
setReadings ( $ hash , \ @ r , 1 ) ;
2020-07-16 06:14:56 +00:00
}
2020-07-18 12:34:49 +00:00
my $ camname = $ hash - > { LINKPARENT } ;
$ defs { $ camname } { HELPER } { INFORM } = $ hash - > { FUUID } ;
2020-07-19 11:53:46 +00:00
InternalTimer ( gettimeofday ( ) + 1.5 , "FHEM::SSCam::roomRefresh" , "$camname,0,0,0" , 0 ) ;
2020-07-18 07:10:26 +00:00
2020-07-16 06:14:56 +00:00
} elsif ( $ opt eq "reset" ) {
delReadings ( $ hash ) ;
2020-07-17 15:08:17 +00:00
explodeLinkData ( $ hash , $ hash - > { DEF } , 1 ) ;
2020-07-16 06:14:56 +00:00
2020-07-18 07:10:26 +00:00
my @ r ;
push @ r , "parentState:initialized" ;
push @ r , "state:initialized" ;
2020-07-19 20:37:26 +00:00
push @ r , "parentCam:initialized" ;
2020-07-18 07:10:26 +00:00
2020-07-19 11:53:46 +00:00
setReadings ( $ hash , \ @ r , 1 ) ;
2020-07-18 07:10:26 +00:00
2020-07-18 12:34:49 +00:00
my $ camname = $ hash - > { LINKPARENT } ;
$ defs { $ camname } { HELPER } { INFORM } = $ hash - > { FUUID } ;
2020-07-19 11:53:46 +00:00
InternalTimer ( gettimeofday ( ) + 1.5 , "FHEM::SSCam::roomRefresh" , "$camname,0,0,0" , 0 ) ;
2020-07-18 07:10:26 +00:00
2018-12-09 13:07:53 +00:00
} else {
2018-12-11 19:34:15 +00:00
return "$setlist" ;
2018-12-09 13:07:53 +00:00
}
return ;
}
2020-06-25 06:21:49 +00:00
###############################################################
# SSCamSTRM Get
###############################################################
sub Get {
my ( $ hash , @ a ) = @ _ ;
return "\"get X\" needs at least an argument" if ( @ a < 2 ) ;
my $ name = shift @ a ;
my $ cmd = shift @ a ;
if ( $ cmd eq "html" ) {
return streamAsHtml ( $ hash ) ;
}
if ( $ cmd eq "ftui" ) {
return streamAsHtml ( $ hash , "ftui" ) ;
}
2020-07-01 07:21:11 +00:00
return ;
2020-06-25 06:21:49 +00:00
}
2020-07-20 16:27:33 +00:00
################################################################
# Attr
# $cmd can be "del" or "set"
# $name is device name
# aName and aVal are Attribute name and value
2018-12-09 13:07:53 +00:00
################################################################
2020-06-25 06:21:49 +00:00
sub Attr {
2018-12-09 13:07:53 +00:00
my ( $ cmd , $ name , $ aName , $ aVal ) = @ _ ;
2020-07-20 16:27:33 +00:00
my $ hash = $ defs { $ name } ;
my $ model = $ hash - > { MODEL } ;
2018-12-09 13:07:53 +00:00
my ( $ do , $ val ) ;
2020-07-20 16:27:33 +00:00
2020-07-20 19:29:21 +00:00
if ( defined $ hvattr { $ aName } ) {
if ( $ model eq "master" && ! $ hvattr { $ aName } { master } ) {
return qq{ The attribute "$aName" is only valid if MODEL is not "$model" ! } ;
}
if ( $ model ne "master" && ! $ hvattr { $ aName } { nomaster } ) {
return qq{ The attribute "$aName" is only valid if MODEL is "master" ! } ;
}
2020-07-20 16:27:33 +00:00
}
2018-12-09 13:07:53 +00:00
2020-07-20 18:59:35 +00:00
if ( $ aName eq "genericStrmHtmlTag" && $ hash - > { MODEL } ne "generic" ) {
return qq{ This attribute is only valid if MODEL is "generic" ! } ;
}
2019-07-12 20:10:53 +00:00
if ( $ aName eq "disable" ) {
2018-12-09 13:07:53 +00:00
if ( $ cmd eq "set" ) {
$ do = ( $ aVal ) ? 1 : 0 ;
}
$ do = 0 if ( $ cmd eq "del" ) ;
2020-07-01 07:21:11 +00:00
$ val = ( $ do == 1 ? "disabled" : "initialized" ) ;
2018-12-09 13:07:53 +00:00
readingsSingleUpdate ( $ hash , "state" , $ val , 1 ) ;
}
2018-12-09 20:10:52 +00:00
2020-07-20 18:59:35 +00:00
if ( $ aName eq "adoptSubset" ) {
if ( $ cmd eq "set" ) {
readingsSingleUpdate ( $ hash , "adoptSubset" , $ aVal , 1 ) ;
} else {
readingsSingleUpdate ( $ hash , "adoptSubset" , "--reset--" , 1 ) ;
}
2019-07-12 20:10:53 +00:00
}
2018-12-09 20:10:52 +00:00
if ( $ cmd eq "set" ) {
2020-07-01 07:21:11 +00:00
if ( $ aName =~ m/popupStreamTo/x ) {
unless ( $ aVal =~ /^\d+$/x || $ aVal eq "OK" ) { return qq{ The Value for $aName is not valid. Use only figures 0-9 or "OK" ! } ; }
2018-12-09 20:10:52 +00:00
}
}
2018-12-09 13:07:53 +00:00
2020-07-01 07:21:11 +00:00
return ;
2018-12-09 13:07:53 +00:00
}
2020-06-28 18:49:16 +00:00
#############################################################################################
# FHEMWEB Summary
#############################################################################################
2020-06-25 06:21:49 +00:00
sub FwFn {
2020-06-28 18:49:16 +00:00
my ( $ FW_wname , $ name , $ room , $ pageHash ) = @ _ ; # pageHash is set for summaryFn.
2020-07-16 06:14:56 +00:00
my $ hash = $ defs { $ name } ;
2018-12-09 13:07:53 +00:00
RemoveInternalTimer ( $ hash ) ;
2020-07-16 06:14:56 +00:00
2018-12-09 13:07:53 +00:00
$ hash - > { HELPER } { FW } = $ FW_wname ;
2020-07-16 06:14:56 +00:00
my $ clink = ReadingsVal ( $ name , "clientLink" , "" ) ;
2020-07-17 10:58:15 +00:00
explodeLinkData ( $ hash , $ clink , 0 ) ;
2020-07-17 11:52:37 +00:00
# Beispielsyntax: "{$hash->{LINKFN}('$hash->{LINKPARENT}','$hash->{LINKNAME}','$hash->{LINKMODEL}')}";
2020-07-17 10:58:15 +00:00
my $ ftui = 0 ;
my $ linkfn = $ hash - > { LINKFN } ;
my % pars = ( linkparent = > $ hash - > { LINKPARENT } ,
linkname = > $ hash - > { LINKNAME } ,
linkmodel = > $ hash - > { LINKMODEL } ,
2020-07-19 11:53:46 +00:00
omodel = > $ hash - > { MODEL } ,
oname = > $ hash - > { NAME } ,
2020-07-17 10:58:15 +00:00
ftui = > $ ftui
) ;
no strict "refs" ; ## no critic 'NoStrict'
2020-07-17 11:52:37 +00:00
my $ html = eval { & { $ linkfn } ( \ % pars ) } or do { return qq{ Error in Streaming function definition of <html><a href= \ "/fhem?detail=$name \ ">$name</a></html> } } ;
2020-07-17 10:58:15 +00:00
use strict "refs" ;
2018-12-09 13:07:53 +00:00
my $ ret = "" ;
2020-07-16 06:14:56 +00:00
if ( IsModelMaster ( $ hash ) && $ clink ) {
my $ alias = AttrVal ( $ name , "alias" , $ name ) ; # Linktext als Aliasname oder Devicename setzen
2020-07-19 13:29:55 +00:00
my $ lang = AttrVal ( "global" , "language" , "EN" ) ;
my $ txt = "is Streaming master of" ;
$ txt = "ist Streaming Master von " if ( $ lang eq "DE" ) ;
my $ dlink = "<a href=\"/fhem?detail=$name\">$alias</a> $txt " ;
$ dlink = "$alias $txt " if ( AttrVal ( $ name , "noLink" , 0 ) ) ; # keine Links im Stream-Dev generieren
2020-07-16 06:14:56 +00:00
$ ret . = "<span align=\"center\">$dlink </span>" if ( ! AttrVal ( $ name , "hideDisplayName" , 0 ) ) ;
}
2020-06-25 06:21:49 +00:00
if ( IsDisabled ( $ name ) ) {
if ( AttrVal ( $ name , "hideDisplayName" , 0 ) ) {
$ ret . = "Stream-device <a href=\"/fhem?detail=$name\">$name</a> is disabled" ;
2018-12-09 13:07:53 +00:00
} else {
$ ret . = "<html>Stream-device is disabled</html>" ;
2020-07-16 06:14:56 +00:00
}
2018-12-09 13:07:53 +00:00
} else {
2020-07-17 10:58:15 +00:00
$ ret . = $ html ;
2020-07-16 06:14:56 +00:00
$ ret . = sDevsWidget ( $ name ) if ( IsModelMaster ( $ hash ) ) ;
2018-12-09 13:07:53 +00:00
}
2020-07-16 06:14:56 +00:00
my $ al = AttrVal ( $ name , "autoRefresh" , 0 ) ; # Autorefresh nur des aufrufenden FHEMWEB-Devices
2018-12-09 13:07:53 +00:00
if ( $ al ) {
2020-06-25 06:21:49 +00:00
InternalTimer ( gettimeofday ( ) + $ al , "FHEM::SSCamSTRM::webRefresh" , $ hash , 0 ) ;
Log3 ( $ name , 5 , "$name - next start of autoRefresh: " . FmtDateTime ( gettimeofday ( ) + $ al ) ) ;
2018-12-09 13:07:53 +00:00
}
2020-06-25 06:21:49 +00:00
2020-07-17 10:58:15 +00:00
undef $ html ;
2018-12-09 13:07:53 +00:00
return $ ret ;
}
2020-06-28 18:49:16 +00:00
#############################################################################################
2020-07-17 10:58:15 +00:00
# Bestandteile des DEF (oder Link) auflösen
# $link = aufzulösender String
# $def = 1 -> es ist ein Shash->{DEF} Inhalt, 0 -> eine andere Quelle
2020-06-28 18:49:16 +00:00
#############################################################################################
2020-07-17 10:58:15 +00:00
sub explodeLinkData {
2020-06-28 18:49:16 +00:00
my $ hash = shift ;
my $ link = shift ;
2020-07-17 10:58:15 +00:00
my $ def = shift ;
2020-06-28 18:49:16 +00:00
2020-07-17 10:58:15 +00:00
return if ( ! $ link ) ;
my ( $ fn , $ arg ) = split ( "[()]" , $ link ) ;
$ arg =~ s/'//xg ;
$ fn =~ s/{//xg ;
if ( $ def ) {
( $ hash - > { PARENT } , $ hash - > { LINKNAME } , $ hash - > { MODEL } ) = split ( "," , $ arg ) ;
$ hash - > { LINKMODEL } = $ hash - > { MODEL } ;
$ hash - > { LINKPARENT } = $ hash - > { PARENT } ;
} else {
( $ hash - > { LINKPARENT } , $ hash - > { LINKNAME } , $ hash - > { LINKMODEL } ) = split ( "," , $ arg ) ;
}
$ hash - > { LINKFN } = $ fn ;
2020-06-28 18:49:16 +00:00
return ;
}
2020-07-16 06:14:56 +00:00
#############################################################################################
# Ist das MODEL "master" ?
#############################################################################################
sub IsModelMaster {
my $ hash = shift ;
my $ mm = $ hash - > { MODEL } eq "master" ? 1 : 0 ;
return $ mm ;
}
2020-06-28 18:49:16 +00:00
#############################################################################################
# Seitenrefresh
# festgelegt durch SSCamSTRM-Attribut "autoRefresh" und "autoRefreshFW"
#############################################################################################
2020-06-25 06:21:49 +00:00
sub webRefresh {
2020-06-28 18:49:16 +00:00
my $ hash = shift ;
2020-07-01 07:21:11 +00:00
my $ name = $ hash - > { NAME } ;
2018-12-09 13:07:53 +00:00
2020-07-01 07:21:11 +00:00
my $ rd = AttrVal ( $ name , "autoRefreshFW" , $ hash - > { HELPER } { FW } ) ;
{ map { FW_directNotify ( "#FHEMWEB:$_" , "location.reload('true')" , "" ) } $ rd } ## no critic 'void context';
2018-12-09 13:07:53 +00:00
2020-07-01 07:21:11 +00:00
my $ al = AttrVal ( $ name , "autoRefresh" , 0 ) ;
2018-12-09 13:07:53 +00:00
if ( $ al ) {
2020-06-25 06:21:49 +00:00
InternalTimer ( gettimeofday ( ) + $ al , "FHEM::SSCamSTRM::webRefresh" , $ hash , 0 ) ;
2020-07-01 07:21:11 +00:00
Log3 ( $ name , 5 , "$name - next start of autoRefresh: " . FmtDateTime ( gettimeofday ( ) + $ al ) ) ;
2018-12-09 13:07:53 +00:00
} else {
RemoveInternalTimer ( $ hash ) ;
}
return ;
}
2019-07-12 20:10:53 +00:00
#############################################################################################
# Versionierungen des Moduls setzen
# Die Verwendung von Meta.pm und Packages wird berücksichtigt
#############################################################################################
2020-06-25 06:21:49 +00:00
sub setVersionInfo {
2019-07-12 20:10:53 +00:00
my ( $ hash ) = @ _ ;
my $ name = $ hash - > { NAME } ;
2020-06-25 06:21:49 +00:00
my $ v = ( sortTopicNum ( "desc" , keys % vNotesIntern ) ) [ 0 ] ;
2019-07-12 20:10:53 +00:00
my $ type = $ hash - > { TYPE } ;
$ hash - > { HELPER } { PACKAGE } = __PACKAGE__ ;
$ hash - > { HELPER } { VERSION } = $ v ;
if ( $ modules { $ type } { META } { x_prereqs_src } && ! $ hash - > { HELPER } { MODMETAABSENT } ) {
2020-07-01 07:21:11 +00:00
# META-Daten sind vorhanden
$ modules { $ type } { META } { version } = "v" . $ v ; # Version aus META.json überschreiben, Anzeige mit {Dumper $modules{SSCamSTRM}{META}}
2020-07-16 06:14:56 +00:00
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 )
2020-06-25 06:21:49 +00:00
$ modules { $ type } { META } { x_version } =~ s/1\.1\.1/$v/gx ;
2020-07-01 07:21:11 +00:00
} else {
$ modules { $ type } { META } { x_version } = $ v ;
}
2020-07-16 06:14:56 +00:00
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 )
2020-07-01 07:21:11 +00:00
if ( __PACKAGE__ eq "FHEM::$type" || __PACKAGE__ eq $ type ) {
# es wird mit Packages gearbeitet -> Perl übliche Modulversion setzen
# mit {<Modul>->VERSION()} im FHEMWEB kann Modulversion abgefragt werden
2020-06-25 06:21:49 +00:00
use version 0.77 ; our $ VERSION = FHEM::Meta:: Get ( $ hash , 'version' ) ; ## no critic 'VERSION'
2019-07-12 20:10:53 +00:00
}
} else {
2020-07-01 07:21:11 +00:00
# herkömmliche Modulstruktur
$ hash - > { VERSION } = $ v ;
2019-07-12 20:10:53 +00:00
}
return ;
}
################################################################
# Grafik als HTML zurück liefern (z.B. für Widget)
################################################################
2020-06-25 06:21:49 +00:00
sub streamAsHtml {
2020-07-17 10:58:15 +00:00
my $ hash = shift ;
my $ ftui = shift ;
my $ name = $ hash - > { NAME } ;
2019-07-12 20:10:53 +00:00
2020-07-17 10:58:15 +00:00
if ( $ ftui && $ ftui eq "ftui" ) {
$ ftui = 1 ;
} else {
$ ftui = 0 ;
2019-07-12 20:10:53 +00:00
}
2020-07-17 10:58:15 +00:00
my $ clink = ReadingsVal ( $ name , "clientLink" , "" ) ;
explodeLinkData ( $ hash , $ clink , 0 ) ;
2020-07-17 11:52:37 +00:00
2020-07-17 10:58:15 +00:00
my $ linkfn = $ hash - > { LINKFN } ;
my % pars = ( linkparent = > $ hash - > { LINKPARENT } ,
linkname = > $ hash - > { LINKNAME } ,
linkmodel = > $ hash - > { LINKMODEL } ,
2020-07-19 11:53:46 +00:00
omodel = > $ hash - > { MODEL } ,
oname = > $ hash - > { NAME } ,
2020-07-17 10:58:15 +00:00
ftui = > $ ftui
) ;
no strict "refs" ; ## no critic 'NoStrict'
2020-07-17 11:52:37 +00:00
my $ html = eval { & { $ linkfn } ( \ % pars ) } or do { return qq{ Error in Streaming function definition of <html><a href= \ "/fhem?detail=$name \ ">$name</a></html> } } ;
2020-07-17 10:58:15 +00:00
use strict "refs" ;
2019-07-12 20:10:53 +00:00
my $ ret = "<html>" ;
if ( IsDisabled ( $ name ) ) {
if ( AttrVal ( $ name , "hideDisplayName" , 0 ) ) {
$ ret . = "Stream-device <a href=\"/fhem?detail=$name\">$name</a> is disabled" ;
} else {
$ ret . = "Stream-device is disabled" ;
}
} else {
2020-07-17 10:58:15 +00:00
$ ret . = $ html ;
2019-07-12 20:10:53 +00:00
}
$ ret . = "</html>" ;
2020-07-17 10:58:15 +00:00
undef $ html ;
2019-07-12 20:10:53 +00:00
return $ ret ;
}
2020-07-16 06:14:56 +00:00
################################################################
# delete Readings
# $rd = angegebenes Reading löschen
################################################################
sub delReadings {
my $ hash = shift ;
my $ rd = shift ;
my $ name = $ hash - > { NAME } ;
2020-07-20 18:59:35 +00:00
my $ bl = "state|parentState|adoptSubset" ; # Blacklist
2020-07-16 06:14:56 +00:00
if ( $ rd ) { # angegebenes Reading löschen wenn nicht im providerLevel enthalten
2020-07-18 07:10:26 +00:00
readingsDelete ( $ hash , $ rd ) if ( $ rd !~ /$bl/x ) ;
2020-07-16 06:14:56 +00:00
return ;
}
for my $ key ( keys % { $ hash - > { READINGS } } ) {
2020-07-18 07:10:26 +00:00
readingsDelete ( $ hash , $ key ) if ( $ key !~ /$bl/x ) ;
2020-07-16 06:14:56 +00:00
}
return ;
}
2020-07-18 07:26:30 +00:00
################################################################
# set Readings
# $rref = Referenz zum Array der zu setzenen Reading
# (Aufbau: <Reading>:<Wert>)
# $event = 1 wenn Event generiert werden soll
################################################################
sub setReadings {
my $ hash = shift ;
my $ rref = shift ;
my $ event = shift ;
my $ name = $ hash - > { NAME } ;
readingsBeginUpdate ( $ hash ) ;
for my $ elem ( @$ rref ) {
my ( $ rn , $ rval ) = split ":" , $ elem , 2 ;
readingsBulkUpdate ( $ hash , $ rn , $ rval ) ;
}
readingsEndUpdate ( $ hash , $ event ) ;
return ;
}
2020-07-16 06:14:56 +00:00
################################################################
# 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)
################################################################
2020-07-17 10:58:15 +00:00
sub allStreamDevs {
2020-07-16 06:14:56 +00:00
my $ sd = "" ;
undef % sdevs ;
my @ strmdevs = devspec2array ( "TYPE=SSCamSTRM:FILTER=MODEL!=master" ) ; # Liste Streaming devices außer MODEL = master
2020-07-19 11:53:46 +00:00
for my $ da ( @ strmdevs ) {
next if ( ! $ defs { $ da } ) ;
my $ alias = AttrVal ( $ da , "alias" , $ da ) ;
2020-07-16 06:14:56 +00:00
$ alias =~ s/\s+/#/gx ;
2020-07-19 11:53:46 +00:00
$ sdevs { $ alias } = "$da" ;
2020-07-16 06:14:56 +00:00
}
for my $ a ( sort keys % sdevs ) {
$ sd . = "," if ( $ sd ) ;
$ sd . = $ a ;
}
2020-07-19 11:53:46 +00:00
2020-07-19 14:13:57 +00:00
for my $ d ( @ strmdevs ) { # Devicenamen zusätzlich als Schlüssel speichern damit set <> adopt ohne Widget funktioniert
2020-07-19 11:53:46 +00:00
next if ( ! $ defs { $ d } ) ;
$ sdevs { $ d } = "$d" ;
}
2020-07-16 06:14:56 +00:00
return $ sd ;
}
################################################################
# Streaming Devices Drop-Down Widget zur Auswahl
# in einem Master Streaming Device
################################################################
sub sDevsWidget {
my $ name = shift ;
my $ Adopts ;
2020-07-20 18:59:35 +00:00
my $ ret = "" ;
my $ cmdAdopt = "adopt" ;
my $ as = "--reset--," . allStreamDevs ( ) ;
my $ valAdopts = AttrVal ( $ name , "adoptSubset" , $ as ) ;
$ valAdopts =~ s/\s+/#/gx ;
2020-07-16 06:14:56 +00:00
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 ) {
2020-07-18 14:52:06 +00:00
$ Adopts =~ s , ^ <td[^> ] * > ( . * ) </td> $, $ 1 , x ;
2020-07-16 06:14:56 +00:00
} 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">' ;
2020-07-20 18:59:35 +00:00
$ ret . = "<tr>" ;
$ ret . = "<td>Streaming Device: </td><td>$Adopts</td>" ;
$ ret . = "</tr>" ;
2020-07-16 06:14:56 +00:00
$ ret . = "</table>" ;
return $ ret ;
}
2018-12-09 13:07:53 +00:00
1 ;
= pod
2019-07-12 20:10:53 +00:00
= item summary Definition of a streaming device by the SSCam module
2018-12-09 13:07:53 +00:00
= item summary_DE Erstellung eines Streaming - Device durch das SSCam - Modul
= begin html
< a name = "SSCamSTRM" > </a>
<h3> SSCamSTRM </h3>
<br>
2019-07-12 20:10:53 +00:00
<ul>
The module SSCamSTRM is a special device module synchronized to the SSCam module . It is used for definition of
Streaming - Devices . <br>
2020-07-19 16:01:17 +00:00
Dependend of the Streaming - Device state , different buttons are provided to start actions: <br> <br>
2019-07-12 20:10:53 +00:00
<ul>
<table>
<colgroup> < col width = 25 % > < col width = 75 % > < / colgroup >
<tr> <td> Switch off </td> <td> - stops a running playback </td> </tr>
<tr> <td> Refresh </td> <td> - refresh a view ( no page reload ) </td> </tr>
<tr> <td> Restart </td> <td> - restart a running content ( e . g . a HLS - Stream ) </td> </tr>
<tr> <td> MJPEG </td> <td> - starts a MJPEG Livestream </td> </tr>
<tr> <td> HLS </td> <td> - starts HLS ( HTTP Live Stream ) </td> </tr>
<tr> <td> Last Record </td> <td> - playback the last recording as iFrame </td> </tr>
<tr> <td> Last Rec H .264 </td> <td> - playback the last recording if available as H .264 </td> </tr>
<tr> <td> Last Rec MJPEG </td> <td> - playback the last recording if available as MJPEG </td> </tr>
<tr> <td> Last SNAP </td> <td> - show the last snapshot </td> </tr>
<tr> <td> Start Recording </td> <td> - starts an endless recording </td> </tr>
<tr> <td> Stop Recording </td> <td> - stopps the recording </td> </tr>
<tr> <td> Take Snapshot </td> <td> - take a snapshot </td> </tr>
</table>
</ul>
<br>
<b> Integration into FHEM TabletUI: </b> <br> <br>
There is a widget provided for integration of SSCam - Streaming devices into FTUI . For further information please be informed by the
( german ) FHEM Wiki article: <br>
< a href = "https://wiki.fhem.de/wiki/FTUI_Widget_f%C3%BCr_SSCam_Streaming_Devices_(SSCamSTRM)" > FTUI Widget für SSCam Streaming Devices ( SSCamSTRM ) </a> .
<br> <br>
</ul>
2018-12-09 13:07:53 +00:00
<ul>
< a name = "SSCamSTRMdefine" > </a>
<b> Define </b>
2018-12-11 19:34:15 +00:00
<br> <br>
2018-12-09 13:07:53 +00:00
<ul>
2020-07-19 16:01:17 +00:00
A SSCam Streaming - device is defined by the SSCam command: <br> <br>
<ul>
set & lt ; name & gt ; createStreamDev & lt ; Device Typ & gt ; <br> <br>
</ul>
2018-12-09 13:07:53 +00:00
Please refer to SSCam < a href = "#SSCamcreateStreamDev" > "createStreamDev" </a> command .
<br> <br>
</ul>
< a name = "SSCamSTRMset" > </a>
2018-12-11 19:34:15 +00:00
<b> Set </b>
2018-12-09 13:07:53 +00:00
<ul>
<ul>
2020-07-19 16:01:17 +00:00
<li> <b> popupStream </b> & nbsp ; & nbsp ; & nbsp ; & nbsp ; ( only valid if MODEL != master ) <br>
2018-12-09 13:07:53 +00:00
2018-12-09 18:42:54 +00:00
The current streaming content is depicted in a popup window . By setting attribute "popupWindowSize" the
size of display can be adjusted . The attribute "popupStreamTo" determines the type of the popup window .
If "OK" is set , an OK - dialog window will be opened . A specified number in seconds closes the popup window after this
2018-12-09 20:10:52 +00:00
time automatically ( default 5 seconds ) . <br>
2018-12-09 21:04:11 +00:00
Optionally you can append "OK" or & lt ; seconds & gt ; directly to override the adjustment by attribute "popupStreamTo" .
2018-12-09 13:07:53 +00:00
</li>
</ul>
<br>
2020-07-19 16:01:17 +00:00
<ul>
<li> <b> adopt & lt ; Streaming device & gt ; </b> & nbsp ; & nbsp ; & nbsp ; & nbsp ; ( only valid if MODEL = master ) <br>
A Streaming Device of type <b> master </b> adopts the content of another defined Streaming Device .
</li>
</ul>
<br>
2018-12-09 13:07:53 +00:00
</ul>
<br>
2018-12-11 19:34:15 +00:00
< a name = "SSCamSTRMget" > </a>
2019-07-12 20:10:53 +00:00
<b> Get </b>
<ul>
<br>
<ul>
<li> <b> get & lt ; name & gt ; html </b> </li>
The stream object ( camera live view , snapshots or replay ) is fetched as HTML - code and depicted .
</ul>
<br>
<br>
</ul>
2018-12-11 19:34:15 +00:00
2018-12-09 13:07:53 +00:00
< a name = "SSCamSTRMattr" > </a>
<b> Attributes </b>
<br> <br>
<ul>
<ul>
2020-07-20 18:59:35 +00:00
< a name = "adoptSubset" > </a>
<li> <b> adoptSubset </b> & nbsp ; & nbsp ; & nbsp ; & nbsp ; ( only valid for MODEL "master" ) <br>
2020-07-20 19:29:21 +00:00
In a Streaming <b> master </b> Device a subset of all defined Streaming Devices is selected and used for
the <b> adopt </b> command is provided . <br>
2020-07-20 18:59:35 +00:00
For control in the FTUI , the selection is also stored in the Reading of the same name .
</li>
<br>
2018-12-09 13:07:53 +00:00
< a name = "autoRefresh" > </a>
<li> <b> autoRefresh </b> <br>
If set , active browser pages of the FHEMWEB - Device which has called the SSCamSTRM - Device , are new reloaded after
the specified time ( seconds ) . Browser pages of a particular FHEMWEB - Device to be refreshed can be specified by
attribute "autoRefreshFW" instead .
This may stabilize the video playback in some cases .
</li>
<br>
< a name = "autoRefreshFW" > </a>
<li> <b> autoRefreshFW </b> <br>
If "autoRefresh" is activated , you can specify a particular FHEMWEB - Device whose active browser pages are refreshed
periodically .
</li>
<br>
< a name = "disable" > </a>
<li> <b> disable </b> <br>
Deactivates the device .
</li>
<br>
< a name = "forcePageRefresh" > </a>
<li> <b> forcePageRefresh </b> <br>
The attribute is evaluated by SSCam . <br>
If set , a reload of all browser pages with active FHEMWEB connections will be enforced when particular camera operations
were finished .
This may stabilize the video playback in some cases .
</li>
<br>
2019-07-12 20:10:53 +00:00
< a name = "genericStrmHtmlTag" > </a>
<li> <b> genericStrmHtmlTag </b> & nbsp ; & nbsp ; & nbsp ; & nbsp ; ( only valid for MODEL "generic" ) <br>
This attribute contains HTML - Tags for video - specification in a Streaming - Device of type "generic" .
<br> <br>
<ul>
2020-07-01 07:21:11 +00:00
<b> Examples: </b>
2019-07-12 20:10:53 +00:00
<pre>
attr & lt ; name & gt ; genericStrmHtmlTag & lt ; video $ HTMLATTR controls autoplay & gt ;
& lt ; source src = 'http://192.168.2.10:32000/$NAME.m3u8' type = 'application/x-mpegURL' & gt ;
& lt ; / video & gt ;
attr & lt ; name & gt ; genericStrmHtmlTag & lt ; img $ HTMLATTR
src = "http://192.168.2.10:32774"
onClick = "FW_okDialog('<img src=http://192.168.2.10:32774 $PWS>')"
& gt
</pre>
The variables $ HTMLATTR , $ NAME and $ PWS are placeholders and absorb the attribute "htmlattr" ( if set ) , the SSCam - Devicename
respectively the value of attribute "popupWindowSize" in streaming - device , which specify the windowsize of a popup window .
</ul>
<br> <br>
</li>
2019-09-21 13:03:06 +00:00
< a name = "hideAudio" > </a>
<li> <b> hideAudio </b> <br>
Hide the control block for audio playback in the footer .
</li>
<br>
2019-09-09 22:24:51 +00:00
< 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>
2018-12-09 13:07:53 +00:00
< a name = "hideDisplayName" > </a>
<li> <b> hideDisplayName </b> <br>
Hide the device / alias name ( link to detail view ) .
</li>
<br>
2019-07-14 18:18:07 +00:00
< a name = "hideDisplayNameFTUI" > </a>
<li> <b> hideDisplayNameFTUI </b> <br>
Hide the device / alias name ( link to detail view ) in FHEM TabletUI .
</li>
<br>
2018-12-09 13:07:53 +00:00
< a name = "htmlattr" > </a>
<li> <b> htmlattr </b> <br>
Additional HTML tags to manipulate the streaming device .
<br> <br>
<ul>
<b> Example: </b> <br>
2019-07-14 18:18:07 +00:00
attr & lt ; name & gt ; htmlattr width = "580" height = "460" <br>
</ul>
</li>
<br>
< a name = "htmlattrFTUI" > </a>
<li> <b> htmlattrFTUI </b> <br>
Additional HTML tags to manipulate the streaming device in TabletUI .
<br> <br>
<ul>
<b> Example: </b> <br>
attr & lt ; name & gt ; htmlattr width = "580" height = "460" <br>
2018-12-09 13:07:53 +00:00
</ul>
</li>
<br>
2019-09-21 13:03:06 +00:00
< a name = "noLink" > </a>
<li> <b> noLink </b> <br>
The device name or alias doesn ' t contain a link to the detail device view .
</li>
<br>
2018-12-09 21:04:11 +00:00
< a name = "popupStreamFW" > </a>
<li> <b> popupStreamFW </b> <br>
You can specify a particular FHEMWEB device whose active browser pages should open a popup window by the
2018-12-30 20:20:27 +00:00
"set <name> popupStream" command ( default: all active FHEMWEB devices ) .
2018-12-09 21:04:11 +00:00
</li>
<br>
2018-12-09 18:42:54 +00:00
< a name = "popupStreamTo" > </a>
2018-12-09 20:10:52 +00:00
<li> <b> popupStreamTo [ OK | & lt ; seconds & gt ; ] </b> <br>
2018-12-30 20:20:27 +00:00
The attribute "popupStreamTo" determines the type of the popup window which is opend by set - function "popupStream" .
2018-12-09 18:42:54 +00:00
If "OK" is set , an OK - dialog window will be opened . A specified number in seconds closes the popup window after this
time automatically ( default 5 seconds ) ..
<br> <br>
<ul>
<b> Example: </b> <br>
attr & lt ; name & gt ; popupStreamTo 10 <br>
</ul>
<br>
</li>
2018-12-09 13:07:53 +00:00
< a name = "popupWindowSize" > </a>
<li> <b> popupWindowSize </b> <br>
If the content of playback ( Videostream or Snapshot gallery ) is suitable , by clicking the content a popup window will
appear .
The size of display can be setup by this attribute .
2018-12-09 18:42:54 +00:00
It is also valid for the get - function "popupStream" .
2018-12-09 13:07:53 +00:00
<br> <br>
<ul>
<b> Example: </b> <br>
attr & lt ; name & gt ; popupWindowSize width = "600" height = "425" <br>
</ul>
</li>
2019-09-09 22:24:51 +00:00
<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>
2018-12-09 13:07:53 +00:00
</ul>
</ul>
</ul>
= end html
= begin html_DE
< a name = "SSCamSTRM" > </a>
<h3> SSCamSTRM </h3>
2019-07-12 20:10:53 +00:00
<ul>
<br>
Das Modul SSCamSTRM ist ein mit SSCam abgestimmtes Gerätemodul zur Definition von Streaming - Devices . <br>
2020-07-19 16:01:17 +00:00
Abhängig vom Zustand des Streaming - Devices werden zum Start von Aktionen unterschiedliche Drucktasten angeboten: <br> <br>
2019-07-12 20:10:53 +00:00
<ul>
<table>
<colgroup> < col width = 25 % > < col width = 75 % > < / colgroup >
<tr> <td> Switch off </td> <td> - stoppt eine laufende Wiedergabe </td> </tr>
<tr> <td> Refresh </td> <td> - auffrischen einer Ansicht ( kein Browser Seiten - Reload ) </td> </tr>
<tr> <td> Restart </td> <td> - neu starten eines laufenden Contents ( z . B . eines HLS - Streams ) </td> </tr>
<tr> <td> MJPEG </td> <td> - Startet MJPEG Livestream </td> </tr>
<tr> <td> HLS </td> <td> - Startet HLS ( HTTP Live Stream ) </td> </tr>
<tr> <td> Last Record </td> <td> - spielt die letzte Aufnahme als iFrame </td> </tr>
<tr> <td> Last Rec H .264 </td> <td> - spielt die letzte Aufnahme wenn als H .264 vorliegend </td> </tr>
<tr> <td> Last Rec MJPEG </td> <td> - spielt die letzte Aufnahme wenn als MJPEG vorliegend </td> </tr>
<tr> <td> Last SNAP </td> <td> - zeigt den letzten Snapshot </td> </tr>
<tr> <td> Start Recording </td> <td> - startet eine Endlosaufnahme </td> </tr>
<tr> <td> Stop Recording </td> <td> - stoppt eine Aufnahme </td> </tr>
<tr> <td> Take Snapshot </td> <td> - löst einen Schnappschuß aus </td> </tr>
</table>
</ul>
<br>
<b> Integration in FHEM TabletUI: </b> <br> <br>
Zur Integration von SSCam Streaming Devices ( Typ SSCamSTRM ) wird ein Widget bereitgestellt .
2020-07-01 07:21:11 +00:00
Für weitere Information dazu bitte den Artikel im Wiki durchlesen: <br>
2019-07-12 20:10:53 +00:00
< a href = "https://wiki.fhem.de/wiki/FTUI_Widget_f%C3%BCr_SSCam_Streaming_Devices_(SSCamSTRM)" > FTUI Widget für SSCam Streaming Devices ( SSCamSTRM ) </a> .
<br> <br> <br>
</ul>
2018-12-09 13:07:53 +00:00
<ul>
< a name = "SSCamSTRMdefine" > </a>
<b> Define </b>
2018-12-11 19:34:15 +00:00
<br> <br>
2018-12-09 13:07:53 +00:00
<ul>
2020-07-19 16:01:17 +00:00
Ein SSCam Streaming - Device wird durch den SSCam Befehl <br> <br>
<ul>
set & lt ; name & gt ; createStreamDev & lt ; Device Typ & gt ; <br> <br>
</ul>
erstellt . Siehe auch die Beschreibung zum SSCam < a href = "#SSCamcreateStreamDev" > "createStreamDev" </a> Befehl .
2018-12-09 13:07:53 +00:00
<br> <br>
</ul>
< a name = "SSCamSTRMset" > </a>
2018-12-11 19:34:15 +00:00
<b> Set </b>
2018-12-09 13:07:53 +00:00
<ul>
<ul>
2020-07-19 16:01:17 +00:00
<li> <b> popupStream [ OK | & lt ; Sekunden & gt ; ] </b> & nbsp ; & nbsp ; & nbsp ; & nbsp ; ( nur wenn MODEL != master ) <br>
2018-12-09 13:07:53 +00:00
2018-12-09 18:42:54 +00:00
Der aktuelle Streaminhalt wird in einem Popup - Fenster dargestellt . Mit dem Attribut "popupWindowSize" kann die
Darstellungsgröße eingestellt werden . Das Attribut "popupStreamTo" legt die Art des Popup - Fensters fest .
Ist "OK" eingestellt , öffnet sich ein OK - Dialogfenster . Die angegebene Zahl in Sekunden schließt das Fenster nach dieser
2018-12-09 20:10:52 +00:00
Zeit automatisch ( default 5 Sekunden ) . <br>
Durch die optionalen Angabe von "OK" oder & lt ; Sekunden & gt ; kann die Einstellung des Attributes "popupStreamTo" übersteuert
werden .
2018-12-09 13:07:53 +00:00
</li>
2020-07-19 16:01:17 +00:00
</ul>
<br>
<ul>
<li> <b> adopt & lt ; Streaming Device & gt ; </b> & nbsp ; & nbsp ; & nbsp ; & nbsp ; ( nur wenn MODEL = master ) <br>
Ein Streaming Device vom Type <b> master </b> übernimmt ( adoptiert ) den Content eines anderen definierten Streaming Devices .
</li>
2018-12-09 13:07:53 +00:00
</ul>
<br>
</ul>
<br>
2018-12-11 19:34:15 +00:00
< a name = "SSCamSTRMget" > </a>
2019-07-12 20:10:53 +00:00
<b> Get </b>
<ul>
<br>
<ul>
<li> <b> get & lt ; name & gt ; html </b> </li>
Das eingebundene Streamobjekt ( Kamera Live View , Schnappschüsse oder Wiedergabe einer Aufnahme ) wird als HTML - code
abgerufen und dargestellt .
</ul>
<br>
<br>
</ul>
2018-12-09 13:07:53 +00:00
< a name = "SSCamSTRMattr" > </a>
2018-12-09 18:42:54 +00:00
<b> Attribute </b>
2018-12-09 13:07:53 +00:00
<br> <br>
<ul>
<ul>
2020-07-20 18:59:35 +00:00
< a name = "adoptSubset" > </a>
<li> <b> adoptSubset </b> & nbsp ; & nbsp ; & nbsp ; & nbsp ; ( nur für MODEL "master" ) <br>
2020-07-20 19:29:21 +00:00
In einem Streaming <b> master </b> Device wird eine Teilmenge aller definierten Streaming Devices ausgewählt und für
2020-07-20 18:59:35 +00:00
das <b> adopt </b> Kommando bereitgestellt . <br>
Für die Steuerung im FTUI wird die Auswahl ebenfalls im gleichnamigen Reading gespeichert .
</li>
<br>
2018-12-09 13:07:53 +00:00
< a name = "autoRefresh" > </a>
<li> <b> autoRefresh </b> <br>
Wenn gesetzt , werden aktive Browserseiten des FHEMWEB - Devices welches das SSCamSTRM - Device aufgerufen hat , nach der
2018-12-30 20:20:27 +00:00
eingestellten Zeit ( Sekunden ) neu geladen . Sollen statt dessen Browserseiten eines bestimmten FHEMWEB - Devices neu
2018-12-09 13:07:53 +00:00
geladen werden , kann dieses Device mit dem Attribut "autoRefreshFW" festgelegt werden .
Dies kann in manchen Fällen die Wiedergabe innerhalb einer Anwendung stabilisieren .
</li>
<br>
< a name = "autoRefreshFW" > </a>
<li> <b> autoRefreshFW </b> <br>
Ist "autoRefresh" aktiviert , kann mit diesem Attribut das FHEMWEB - Device bestimmt werden dessen aktive Browserseiten
regelmäßig neu geladen werden sollen .
</li>
<br>
< a name = "disable" > </a>
<li> <b> disable </b> <br>
Aktiviert / deaktiviert das Device .
</li>
<br>
< a name = "forcePageRefresh" > </a>
<li> <b> forcePageRefresh </b> <br>
Das Attribut wird durch SSCam ausgewertet . <br>
Wenn gesetzt , wird ein Reload aller Browserseiten mit aktiven FHEMWEB - Verbindungen nach dem Abschluß bestimmter
SSCam - Befehle erzwungen .
Dies kann in manchen Fällen die Wiedergabe innerhalb einer Anwendung stabilisieren .
</li>
<br>
2019-07-12 20:10:53 +00:00
< a name = "genericStrmHtmlTag" > </a>
<li> <b> genericStrmHtmlTag </b> & nbsp ; & nbsp ; & nbsp ; & nbsp ; ( nur für MODEL "generic" ) <br>
Das Attribut enthält HTML - Tags zur Video - Spezifikation in einem Streaming - Device von Typ "generic" .
<br> <br>
<ul>
2020-07-01 07:21:11 +00:00
<b> Beispiele: </b>
2019-07-12 20:10:53 +00:00
<pre>
attr & lt ; name & gt ; genericStrmHtmlTag & lt ; video $ HTMLATTR controls autoplay & gt ;
& lt ; source src = 'http://192.168.2.10:32000/$NAME.m3u8' type = 'application/x-mpegURL' & gt ;
& lt ; / video & gt ;
attr & lt ; name & gt ; genericStrmHtmlTag & lt ; img $ HTMLATTR
src = "http://192.168.2.10:32774"
onClick = "FW_okDialog('<img src=http://192.168.2.10:32774 $PWS >')"
& gt
</pre>
Die Variablen $ HTMLATTR , $ NAME und $ PWS sind Platzhalter und übernehmen ein gesetztes Attribut "htmlattr" , den SSCam -
Devicenamen bzw . das Attribut "popupWindowSize" im Streaming - Device , welches die Größe eines Popup - Windows festlegt .
</ul>
<br> <br>
2019-09-09 22:24:51 +00:00
</li>
2019-09-21 13:03:06 +00:00
< a name = "hideAudio" > </a>
<li> <b> hideAudio </b> <br>
Verbirgt die Steuerungsbereich für die Audiowiedergabe in der Fußzeile .
</li>
<br>
2019-09-09 22:24:51 +00:00
< 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>
2019-07-12 20:10:53 +00:00
2018-12-09 13:07:53 +00:00
< a name = "hideDisplayName" > </a>
<li> <b> hideDisplayName </b> <br>
Verbirgt den Device / Alias - Namen ( Link zur Detailansicht ) .
</li>
<br>
2019-07-14 18:18:07 +00:00
< a name = "hideDisplayNameFTUI" > </a>
<li> <b> hideDisplayNameFTUI </b> <br>
Verbirgt den Device / Alias - Namen ( Link zur Detailansicht ) im TabletUI .
</li>
<br>
2018-12-09 13:07:53 +00:00
< a name = "htmlattr" > </a>
<li> <b> htmlattr </b> <br>
2019-07-14 18:18:07 +00:00
Zusätzliche HTML Tags zur Darstellung im Streaming Device .
<br> <br>
<ul>
<b> Beispiel: </b> <br>
attr & lt ; name & gt ; htmlattr width = "580" height = "460" <br>
</ul>
</li>
<br>
< a name = "htmlattrFTUI" > </a>
<li> <b> htmlattrFTUI </b> <br>
Zusätzliche HTML Tags zur Darstellung des Streaming Device im TabletUI .
2018-12-09 13:07:53 +00:00
<br> <br>
<ul>
<b> Beispiel: </b> <br>
2019-07-14 18:18:07 +00:00
attr & lt ; name & gt ; htmlattr width = "580" height = "460" <br>
2018-12-09 13:07:53 +00:00
</ul>
</li>
<br>
2019-09-21 13:03:06 +00:00
< a name = "noLink" > </a>
<li> <b> noLink </b> <br>
Der Devicename oder Alias enthält keinen Link zur Detailansicht .
</li>
<br>
2018-12-09 21:04:11 +00:00
< a name = "popupStreamFW" > </a>
<li> <b> popupStreamFW </b> <br>
Es kann mit diesem Attribut das FHEMWEB - Device bestimmt werden , auf dessen Browserseiten sich Popup - Fenster mit
2018-12-30 20:20:27 +00:00
"set <name> popupStream" öffnen sollen ( default: alle aktiven FHEMWEB - Devices ) .
2018-12-09 21:04:11 +00:00
</li>
<br>
2018-12-09 18:42:54 +00:00
< a name = "popupStreamTo" > </a>
2018-12-09 20:10:52 +00:00
<li> <b> popupStreamTo [ OK | & lt ; Sekunden & gt ; ] </b> <br>
2018-12-30 20:20:27 +00:00
Das Attribut "popupStreamTo" legt die Art des Popup - Fensters fest welches mit der set - Funktion "popupStream" geöffnet wird .
2018-12-09 18:42:54 +00:00
Ist "OK" eingestellt , öffnet sich ein OK - Dialogfenster . Die angegebene Zahl in Sekunden schließt das Fenster nach dieser
Zeit automatisch ( default 5 Sekunden ) .
<br> <br>
<ul>
<b> Beispiel: </b> <br>
attr & lt ; name & gt ; popupStreamTo 10 <br>
</ul>
<br>
</li>
2018-12-09 13:07:53 +00:00
< a name = "popupWindowSize" > </a>
<li> <b> popupWindowSize </b> <br>
Bei geeigneten Wiedergabeinhalten ( Videostream oder Schnappschußgalerie ) öffnet ein Klick auf den Bildinhalt ein
Popup - Fenster mit diesem Inhalt . Die Darstellungsgröße kann mit diesem Attribut eingestellt werden .
2018-12-30 20:20:27 +00:00
Das Attribut gilt ebenfalls für die set - Funktion "popupStream" .
2018-12-09 13:07:53 +00:00
<br> <br>
<ul>
<b> Beispiel: </b> <br>
attr & lt ; name & gt ; popupWindowSize width = "600" height = "425" <br>
</ul>
</li>
2019-09-09 22:24:51 +00:00
<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>
2018-12-09 13:07:53 +00:00
</ul>
</ul>
</ul>
= end html_DE
2019-07-12 20:10:53 +00:00
= for : application / json ; q = META . json 49 _SSCamSTRM . pm
{
"abstract" : "Definition of a streaming device by the SSCam module" ,
"x_lang" : {
"de" : {
"abstract" : "Erstellung eines Streaming-Device durch das SSCam-Modul"
}
} ,
"keywords" : [
"camera" ,
"streaming" ,
"PTZ" ,
"Synology Surveillance Station" ,
"MJPEG" ,
"HLS" ,
"RTSP"
] ,
"version" : "v1.1.1" ,
"release_status" : "stable" ,
"author" : [
"Heiko Maaz <heiko.maaz@t-online.de>"
] ,
"x_fhem_maintainer" : [
"DS_Starter"
] ,
"x_fhem_maintainer_github" : [
"nasseeder1"
] ,
"prereqs" : {
"runtime" : {
"requires" : {
"FHEM" : 5.00918799 ,
"perl" : 5.014
} ,
"recommends" : {
"FHEM::Meta" : 0
} ,
"suggests" : {
}
}
} ,
"resources" : {
"x_wiki" : {
"web" : "https://wiki.fhem.de/wiki/SSCAM_-_Steuerung_von_Kameras_in_Synology_Surveillance_Station" ,
"title" : "SSCAM - Steuerung von Kameras in Synology Surveillance Station"
}
}
}
= end : application / json ; q = META . json
2018-12-09 13:07:53 +00:00
= cut