2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-10 03:06:37 +00:00

49_SSCamSTRM: fix: set of values in attr adoptSubset is empty after restart, changes according level 3 PBP

git-svn-id: https://svn.fhem.de/fhem/trunk@22448 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2020-07-21 16:48:39 +00:00
parent 4d991f7275
commit a631524527
2 changed files with 341 additions and 183 deletions

View File

@ -90,6 +90,7 @@ BEGIN {
# Versions History intern
my %vNotesIntern = (
"2.13.1" => "21.07.2020 fix: set of values in attr adoptSubset is empty after restart, changes according level 3 PBP ",
"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.11.0" => "24.06.2020 switch to packages, changes according to PBP ",
@ -152,21 +153,30 @@ my %hvattr = ( # Has
ptzButtonSizeFTUI => { master => 0, nomaster => 1 },
);
my %hset = ( # Hash für Set-Funktion
popupStream => { fn => "_setpopupStream" },
adopt => { fn => "_setadopt" },
reset => { fn => "_setreset" },
);
my %sdevs = (); # Hash der vorhandenen Streaming Devices
my $todef = 5; # Default Popup Zeit für set <> popupStream
################################################################
# Initialize
# !! Werte von adoptSubset werden durch Funktion in
# sub FwFn überschrieben !!
################################################################
sub Initialize {
my $hash = shift;
my $fwd = join(",",devspec2array("TYPE=FHEMWEB:FILTER=STATE=Initialized"));
my $sd = "--reset--,".allStreamDevs();
my $fwd = join(",",devspec2array("TYPE=FHEMWEB:FILTER=STATE=Initialized"));
$hash->{DefFn} = \&Define;
$hash->{SetFn} = \&Set;
$hash->{GetFn} = \&Get;
$hash->{AttrList} = "adoptSubset:sortable-strict,$sd ".
$hash->{AttrList} = "adoptSubset:sortable-strict,--reset-- ".
"autoRefresh:selectnumbers,120,0.2,1800,0,log10 ".
"autoRefreshFW:$fwd ".
"disable:1,0 ".
@ -270,6 +280,8 @@ sub Copy {
return;
}
################################################################
# Set und Subroutinen
################################################################
sub Set {
my ($hash, @a) = @_;
@ -301,95 +313,140 @@ sub Set {
;
}
if ($opt eq "popupStream") {
my $txt = FHEM::SSCam::getClHash($hash);
return $txt if($txt);
# OK-Dialogbox oder Autoclose
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;
my $pd = AttrVal($name, "popupStreamFW", "TYPE=FHEMWEB");
my $htmlCode = $hash->{HELPER}{STREAM};
if ($hash->{HELPER}{STREAMACTIVE}) {
my $out = "<html>";
$out .= $htmlCode;
$out .= "</html>";
Log3($name, 4, "$name - Stream to display: $htmlCode");
Log3($name, 4, "$name - Stream display to webdevice: $pd");
if($to =~ /\d+/x) {
map {FW_directNotify("#FHEMWEB:$_", "FW_errmsg('$out', $to)", "")} devspec2array("$pd"); ## no critic 'void context';
} else {
map {FW_directNotify("#FHEMWEB:$_", "FW_okDialog('$out')", "")} devspec2array("$pd"); ## no critic 'void context';
}
}
my %params = (
hash => $hash,
name => $name,
opt => $opt,
prop => $prop,
aref => \@a,
);
} elsif ($opt eq "adopt") {
shift @a; shift @a;
$prop = join "#", @a;
no strict "refs"; ## no critic 'NoStrict'
if($hset{$opt}) {
&{$hset{$opt}{fn}} (\%params) if(defined &{$hset{$opt}{fn}});
return;
}
use strict "refs";
return "$setlist";
}
################################################################
# Setter popupStream
################################################################
sub _setpopupStream { ## no critic "not used"
my $paref = shift;
my $hash = $paref->{hash};
my $name = $paref->{name};
my $prop = $paref->{prop};
my $txt = FHEM::SSCam::getClHash($hash);
return $txt if($txt);
# OK-Dialogbox oder Autoclose
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;
my $pd = AttrVal($name, "popupStreamFW", "TYPE=FHEMWEB");
my $htmlCode = $hash->{HELPER}{STREAM};
if ($hash->{HELPER}{STREAMACTIVE}) {
my $out = "<html>";
$out .= $htmlCode;
$out .= "</html>";
if($prop eq "--reset--") {
CommandSet(undef, "$name reset");
return;
}
Log3($name, 4, "$name - Stream to display: $htmlCode");
Log3($name, 4, "$name - Stream display to webdevice: $pd");
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 instead of "$strmd"} 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-Parameter
my $link = "{$defs{$strmd}{LINKFN}('$defs{$strmd}{LINKPARENT}','$defs{$strmd}{LINKNAME}','$defs{$strmd}{LINKMODEL}')}";
explodeLinkData ($hash, $link, 0);
push @r, "clientLink:$link";
push @r, "parentCam:$hash->{LINKPARENT}";
if(@r) {
setReadings($hash, \@r, 1);
}
my $camname = $hash->{LINKPARENT};
$defs{$camname}{HELPER}{INFORM} = $hash->{FUUID};
InternalTimer(gettimeofday()+1.5, "FHEM::SSCam::roomRefresh", "$camname,0,0,0", 0);
} elsif ($opt eq "reset") {
delReadings($hash);
explodeLinkData ($hash, $hash->{DEF}, 1);
my @r;
push @r, "parentState:initialized";
push @r, "state:initialized";
push @r, "parentCam:initialized";
setReadings($hash, \@r, 1);
my $camname = $hash->{LINKPARENT};
$defs{$camname}{HELPER}{INFORM} = $hash->{FUUID};
InternalTimer(gettimeofday()+1.5, "FHEM::SSCam::roomRefresh", "$camname,0,0,0", 0);
} else {
return "$setlist";
if($to =~ /\d+/x) {
map {FW_directNotify("#FHEMWEB:$_", "FW_errmsg('$out', $to)", "")} devspec2array("$pd"); ## no critic 'void context';
} else {
map {FW_directNotify("#FHEMWEB:$_", "FW_okDialog('$out')", "")} devspec2array("$pd"); ## no critic 'void context';
}
}
return;
}
################################################################
# Setter adopt
################################################################
sub _setadopt { ## no critic "not used"
my $paref = shift;
my $hash = $paref->{hash};
my $name = $paref->{name};
my $opt = $paref->{opt};
my $prop = $paref->{prop};
my $aref = $paref->{aref};
shift @$aref; shift @$aref;
$prop = join "#", @$aref;
if($prop eq "--reset--") {
CommandSet(undef, "$name reset");
return;
}
return;
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 instead of "$strmd"} 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-Parameter
my $link = "{$defs{$strmd}{LINKFN}('$defs{$strmd}{LINKPARENT}','$defs{$strmd}{LINKNAME}','$defs{$strmd}{LINKMODEL}')}";
explodeLinkData ($hash, $link, 0);
push @r, "clientLink:$link";
push @r, "parentCam:$hash->{LINKPARENT}";
if(@r) {
setReadings($hash, \@r, 1);
}
my $camname = $hash->{LINKPARENT};
$defs{$camname}{HELPER}{INFORM} = $hash->{FUUID};
InternalTimer(gettimeofday()+1.5, "FHEM::SSCam::roomRefresh", "$camname,0,0,0", 0);
return;
}
################################################################
# Setter reset
################################################################
sub _setreset { ## no critic "not used"
my $paref = shift;
my $hash = $paref->{hash};
delReadings ($hash);
explodeLinkData ($hash, $hash->{DEF}, 1);
my @r;
push @r, "parentState:initialized";
push @r, "state:initialized";
push @r, "parentCam:initialized";
setReadings($hash, \@r, 1);
my $camname = $hash->{LINKPARENT};
$defs{$camname}{HELPER}{INFORM} = $hash->{FUUID};
InternalTimer(gettimeofday()+1.5, "FHEM::SSCam::roomRefresh", "$camname,0,0,0", 0);
return;
}
###############################################################
@ -423,8 +480,6 @@ sub Attr {
my $hash = $defs{$name};
my $model = $hash->{MODEL};
my ($do,$val);
if(defined $hvattr{$aName}) {
if ($model eq "master" && !$hvattr{$aName}{master}) {
return qq{The attribute "$aName" is only valid if MODEL is not "$model" !};
@ -439,6 +494,7 @@ sub Attr {
return qq{This attribute is only valid if MODEL is "generic" !};
}
my ($do,$val);
if($aName eq "disable") {
if($cmd eq "set") {
$do = ($aVal) ? 1 : 0;
@ -477,7 +533,8 @@ sub FwFn {
$hash->{HELPER}{FW} = $FW_wname;
my $clink = ReadingsVal($name, "clientLink", "");
sofAdoptSubset ($hash);
explodeLinkData ($hash, $clink, 0);
# Beispielsyntax: "{$hash->{LINKFN}('$hash->{LINKPARENT}','$hash->{LINKNAME}','$hash->{LINKMODEL}')}";
@ -702,6 +759,28 @@ sub delReadings {
return;
}
################################################################
# Wertevorrat für adoptSubset generieren
################################################################
sub sofAdoptSubset {
my $hash = shift;
my @na;
my $ca = $modules{$hash->{TYPE}}{AttrList};
my $sd = "--reset--,".allStreamDevs();
my @dca = split(" ", $ca);
for my $attr (@dca) {
push @na, $attr if($attr !~ /adoptSubset:/x);
}
push @na, "adoptSubset:sortable-strict,$sd ";
$hash->{".AttrList"} = join " ", @na; # Device spezifische AttrList, überschreibt Modul AttrList !
return;
}
################################################################
# set Readings
# $rref = Referenz zum Array der zu setzenen Reading

View File

@ -1,5 +1,5 @@
########################################################################################################################
# $Id: 49_SSCamSTRM.pm 22329 2020-07-02 17:16:52Z DS_Starter $
# $Id: 49_SSCamSTRM.pm 22446 2020-07-20 21:16:31Z DS_Starter $
#########################################################################################################################
# 49_SSCamSTRM.pm
#
@ -90,6 +90,7 @@ BEGIN {
# Versions History intern
my %vNotesIntern = (
"2.13.1" => "21.07.2020 fix: set of values in attr adoptSubset is empty after restart, changes according level 3 PBP ",
"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.11.0" => "24.06.2020 switch to packages, changes according to PBP ",
@ -152,21 +153,30 @@ my %hvattr = ( # Has
ptzButtonSizeFTUI => { master => 0, nomaster => 1 },
);
my %hset = ( # Hash für Set-Funktion
popupStream => { fn => "_setpopupStream" },
adopt => { fn => "_setadopt" },
reset => { fn => "_setreset" },
);
my %sdevs = (); # Hash der vorhandenen Streaming Devices
my $todef = 5; # Default Popup Zeit für set <> popupStream
################################################################
# Initialize
# !! Werte von adoptSubset werden durch Funktion in
# sub FwFn überschrieben !!
################################################################
sub Initialize {
my $hash = shift;
my $fwd = join(",",devspec2array("TYPE=FHEMWEB:FILTER=STATE=Initialized"));
my $sd = "--reset--,".allStreamDevs();
my $fwd = join(",",devspec2array("TYPE=FHEMWEB:FILTER=STATE=Initialized"));
$hash->{DefFn} = \&Define;
$hash->{SetFn} = \&Set;
$hash->{GetFn} = \&Get;
$hash->{AttrList} = "adoptSubset:sortable-strict,$sd ".
$hash->{AttrList} = "adoptSubset:sortable-strict,--reset-- ".
"autoRefresh:selectnumbers,120,0.2,1800,0,log10 ".
"autoRefreshFW:$fwd ".
"disable:1,0 ".
@ -270,6 +280,8 @@ sub Copy {
return;
}
################################################################
# Set und Subroutinen
################################################################
sub Set {
my ($hash, @a) = @_;
@ -301,95 +313,140 @@ sub Set {
;
}
if ($opt eq "popupStream") {
my $txt = FHEM::SSCam::getClHash($hash);
return $txt if($txt);
# OK-Dialogbox oder Autoclose
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;
my $pd = AttrVal($name, "popupStreamFW", "TYPE=FHEMWEB");
my $htmlCode = $hash->{HELPER}{STREAM};
if ($hash->{HELPER}{STREAMACTIVE}) {
my $out = "<html>";
$out .= $htmlCode;
$out .= "</html>";
Log3($name, 4, "$name - Stream to display: $htmlCode");
Log3($name, 4, "$name - Stream display to webdevice: $pd");
if($to =~ /\d+/x) {
map {FW_directNotify("#FHEMWEB:$_", "FW_errmsg('$out', $to)", "")} devspec2array("$pd"); ## no critic 'void context';
} else {
map {FW_directNotify("#FHEMWEB:$_", "FW_okDialog('$out')", "")} devspec2array("$pd"); ## no critic 'void context';
}
}
my %params = (
hash => $hash,
name => $name,
opt => $opt,
prop => $prop,
aref => \@a,
);
} elsif ($opt eq "adopt") {
shift @a; shift @a;
$prop = join "#", @a;
no strict "refs"; ## no critic 'NoStrict'
if($hset{$opt}) {
&{$hset{$opt}{fn}} (\%params) if(defined &{$hset{$opt}{fn}});
return;
}
use strict "refs";
return "$setlist";
}
################################################################
# Setter popupStream
################################################################
sub _setpopupStream { ## no critic "not used"
my $paref = shift;
my $hash = $paref->{hash};
my $name = $paref->{name};
my $prop = $paref->{prop};
my $txt = FHEM::SSCam::getClHash($hash);
return $txt if($txt);
# OK-Dialogbox oder Autoclose
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;
my $pd = AttrVal($name, "popupStreamFW", "TYPE=FHEMWEB");
my $htmlCode = $hash->{HELPER}{STREAM};
if ($hash->{HELPER}{STREAMACTIVE}) {
my $out = "<html>";
$out .= $htmlCode;
$out .= "</html>";
if($prop eq "--reset--") {
CommandSet(undef, "$name reset");
return;
}
Log3($name, 4, "$name - Stream to display: $htmlCode");
Log3($name, 4, "$name - Stream display to webdevice: $pd");
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 instead of "$strmd"} 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-Parameter
my $link = "{$defs{$strmd}{LINKFN}('$defs{$strmd}{LINKPARENT}','$defs{$strmd}{LINKNAME}','$defs{$strmd}{LINKMODEL}')}";
explodeLinkData ($hash, $link, 0);
push @r, "clientLink:$link";
push @r, "parentCam:$hash->{LINKPARENT}";
if(@r) {
setReadings($hash, \@r, 1);
}
my $camname = $hash->{LINKPARENT};
$defs{$camname}{HELPER}{INFORM} = $hash->{FUUID};
InternalTimer(gettimeofday()+1.5, "FHEM::SSCam::roomRefresh", "$camname,0,0,0", 0);
} elsif ($opt eq "reset") {
delReadings($hash);
explodeLinkData ($hash, $hash->{DEF}, 1);
my @r;
push @r, "parentState:initialized";
push @r, "state:initialized";
push @r, "parentCam:initialized";
setReadings($hash, \@r, 1);
my $camname = $hash->{LINKPARENT};
$defs{$camname}{HELPER}{INFORM} = $hash->{FUUID};
InternalTimer(gettimeofday()+1.5, "FHEM::SSCam::roomRefresh", "$camname,0,0,0", 0);
} else {
return "$setlist";
if($to =~ /\d+/x) {
map {FW_directNotify("#FHEMWEB:$_", "FW_errmsg('$out', $to)", "")} devspec2array("$pd"); ## no critic 'void context';
} else {
map {FW_directNotify("#FHEMWEB:$_", "FW_okDialog('$out')", "")} devspec2array("$pd"); ## no critic 'void context';
}
}
return;
}
################################################################
# Setter adopt
################################################################
sub _setadopt { ## no critic "not used"
my $paref = shift;
my $hash = $paref->{hash};
my $name = $paref->{name};
my $opt = $paref->{opt};
my $prop = $paref->{prop};
my $aref = $paref->{aref};
shift @$aref; shift @$aref;
$prop = join "#", @$aref;
if($prop eq "--reset--") {
CommandSet(undef, "$name reset");
return;
}
return;
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 instead of "$strmd"} 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-Parameter
my $link = "{$defs{$strmd}{LINKFN}('$defs{$strmd}{LINKPARENT}','$defs{$strmd}{LINKNAME}','$defs{$strmd}{LINKMODEL}')}";
explodeLinkData ($hash, $link, 0);
push @r, "clientLink:$link";
push @r, "parentCam:$hash->{LINKPARENT}";
if(@r) {
setReadings($hash, \@r, 1);
}
my $camname = $hash->{LINKPARENT};
$defs{$camname}{HELPER}{INFORM} = $hash->{FUUID};
InternalTimer(gettimeofday()+1.5, "FHEM::SSCam::roomRefresh", "$camname,0,0,0", 0);
return;
}
################################################################
# Setter reset
################################################################
sub _setreset { ## no critic "not used"
my $paref = shift;
my $hash = $paref->{hash};
delReadings ($hash);
explodeLinkData ($hash, $hash->{DEF}, 1);
my @r;
push @r, "parentState:initialized";
push @r, "state:initialized";
push @r, "parentCam:initialized";
setReadings($hash, \@r, 1);
my $camname = $hash->{LINKPARENT};
$defs{$camname}{HELPER}{INFORM} = $hash->{FUUID};
InternalTimer(gettimeofday()+1.5, "FHEM::SSCam::roomRefresh", "$camname,0,0,0", 0);
return;
}
###############################################################
@ -423,8 +480,6 @@ sub Attr {
my $hash = $defs{$name};
my $model = $hash->{MODEL};
my ($do,$val);
if(defined $hvattr{$aName}) {
if ($model eq "master" && !$hvattr{$aName}{master}) {
return qq{The attribute "$aName" is only valid if MODEL is not "$model" !};
@ -439,6 +494,7 @@ sub Attr {
return qq{This attribute is only valid if MODEL is "generic" !};
}
my ($do,$val);
if($aName eq "disable") {
if($cmd eq "set") {
$do = ($aVal) ? 1 : 0;
@ -477,7 +533,8 @@ sub FwFn {
$hash->{HELPER}{FW} = $FW_wname;
my $clink = ReadingsVal($name, "clientLink", "");
sofAdoptSubset ($hash);
explodeLinkData ($hash, $clink, 0);
# Beispielsyntax: "{$hash->{LINKFN}('$hash->{LINKPARENT}','$hash->{LINKNAME}','$hash->{LINKMODEL}')}";
@ -610,12 +667,12 @@ sub setVersionInfo {
if($modules{$type}{META}{x_prereqs_src} && !$hash->{HELPER}{MODMETAABSENT}) {
# META-Daten sind vorhanden
$modules{$type}{META}{version} = "v".$v; # Version aus META.json überschreiben, Anzeige mit {Dumper $modules{SSCamSTRM}{META}}
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 )
if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id: 49_SSCamSTRM.pm 22446 2020-07-20 21:16:31Z DS_Starter $ im Kopf komplett! vorhanden )
$modules{$type}{META}{x_version} =~ s/1\.1\.1/$v/gx;
} else {
$modules{$type}{META}{x_version} = $v;
}
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 )
return $@ unless (FHEM::Meta::SetInternals($hash)); # FVERSION wird gesetzt ( nur gesetzt wenn $Id: 49_SSCamSTRM.pm 22446 2020-07-20 21:16:31Z DS_Starter $ im Kopf komplett! vorhanden )
if(__PACKAGE__ eq "FHEM::$type" || __PACKAGE__ eq $type) {
# es wird mit Packages gearbeitet -> Perl übliche Modulversion setzen
# mit {<Modul>->VERSION()} im FHEMWEB kann Modulversion abgefragt werden
@ -702,6 +759,28 @@ sub delReadings {
return;
}
################################################################
# Wertevorrat für adoptSubset generieren
################################################################
sub sofAdoptSubset {
my $hash = shift;
my @na;
my $ca = $modules{$hash->{TYPE}}{AttrList};
my $sd = "--reset--,".allStreamDevs();
my @dca = split(" ", $ca);
for my $attr (@dca) {
push @na, $attr if($attr !~ /adoptSubset:/x);
}
push @na, "adoptSubset:sortable-strict,$sd ";
$hash->{".AttrList"} = join " ", @na; # Device spezifische AttrList, überschreibt Modul AttrList !
return;
}
################################################################
# set Readings
# $rref = Referenz zum Array der zu setzenen Reading