mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-10 03:06:37 +00:00
98_structure.pm: implement dynamic members via devspec (Forum #82604)
git-svn-id: https://svn.fhem.de/fhem/trunk@15858 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
6e8ce2b05c
commit
19178fdda2
@ -1,5 +1,6 @@
|
|||||||
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
|
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
|
||||||
# Do not insert empty lines here, update check depends on it.
|
# Do not insert empty lines here, update check depends on it.
|
||||||
|
- feature: structure: implement dynamic members via devspec (Forum #82604)
|
||||||
- feature: new module 74_UnifiVideo for UnifiVideo integration (justme1968)
|
- feature: new module 74_UnifiVideo for UnifiVideo integration (justme1968)
|
||||||
- change: 93_DbLog: V3.6.2, new attribute "exportCacheAppend", minor fix in
|
- change: 93_DbLog: V3.6.2, new attribute "exportCacheAppend", minor fix in
|
||||||
Log verbose 5
|
Log verbose 5
|
||||||
|
@ -62,7 +62,7 @@ structAdd($$)
|
|||||||
my ($d, $attrList) = @_;
|
my ($d, $attrList) = @_;
|
||||||
return if(!$defs{$d});
|
return if(!$defs{$d});
|
||||||
$defs{$d}{INstructAdd} = 1;
|
$defs{$d}{INstructAdd} = 1;
|
||||||
foreach my $c (keys %{$defs{$d}{CONTENT}}) {
|
foreach my $c (@{$defs{$d}{".memberList"}}) {
|
||||||
if($defs{$c} && $defs{$c}{INstructAdd}) {
|
if($defs{$c} && $defs{$c}{INstructAdd}) {
|
||||||
Log 1, "recursive structure definition"
|
Log 1, "recursive structure definition"
|
||||||
|
|
||||||
@ -74,6 +74,8 @@ structAdd($$)
|
|||||||
delete $defs{$d}{INstructAdd} if($defs{$d});
|
delete $defs{$d}{INstructAdd} if($defs{$d});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub structure_setDevs($;$);
|
||||||
|
|
||||||
#############################
|
#############################
|
||||||
sub
|
sub
|
||||||
structure_Define($$)
|
structure_Define($$)
|
||||||
@ -91,19 +93,9 @@ structure_Define($$)
|
|||||||
$hash->{ATTR} = $stype;
|
$hash->{ATTR} = $stype;
|
||||||
$hash->{CHANGEDCNT} = 0;
|
$hash->{CHANGEDCNT} = 0;
|
||||||
|
|
||||||
my %list;
|
structure_setDevs($hash, $def);
|
||||||
my $aList = "$stype ${stype}_map structexclude";
|
|
||||||
foreach my $a (@a) {
|
$hash->{".asyncQueue"} = [];
|
||||||
foreach my $d (devspec2array($a)) {
|
|
||||||
$list{$d} = 1;
|
|
||||||
addToDevAttrList($d, $aList);
|
|
||||||
structAdd($d, $aList) if($defs{$d} && $defs{$d}{TYPE} eq "structure");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$hash->{CONTENT} = \%list;
|
|
||||||
my @arr = ();
|
|
||||||
$hash->{".asyncQueue"} = \@arr;
|
|
||||||
delete $hash->{".cachedHelp"};
|
|
||||||
|
|
||||||
@a = ( "set", $devname, $stype, $devname );
|
@a = ( "set", $devname, $stype, $devname );
|
||||||
structure_Attr(@a);
|
structure_Attr(@a);
|
||||||
@ -111,6 +103,36 @@ structure_Define($$)
|
|||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub
|
||||||
|
structure_setDevs($;$)
|
||||||
|
{
|
||||||
|
my ($hash, $def) = @_;
|
||||||
|
$def = "$hash->{NAME} structure $hash->{DEF}" if(!$def);
|
||||||
|
my $c = $hash->{".memberHash"};
|
||||||
|
|
||||||
|
my @a = split("[ \t][ \t]*", $def);
|
||||||
|
my $devname = shift(@a);
|
||||||
|
my $modname = shift(@a);
|
||||||
|
my $stype = shift(@a);
|
||||||
|
|
||||||
|
my (%list, @list);
|
||||||
|
my $aList = "$stype ${stype}_map structexclude";
|
||||||
|
foreach my $a (@a) {
|
||||||
|
foreach my $d (devspec2array($a)) {
|
||||||
|
next if(!$defs{$d} || $list{$d});
|
||||||
|
$hash->{DEVSPECDEF} = 1 if($a ne $d);
|
||||||
|
$list{$d} = 1;
|
||||||
|
push(@list, $d);
|
||||||
|
next if($c && $c->{$d});
|
||||||
|
addToDevAttrList($d, $aList);
|
||||||
|
structAdd($d, $aList) if($defs{$d} && $defs{$d}{TYPE} eq "structure");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$hash->{".memberHash"} = \%list;
|
||||||
|
$hash->{".memberList"} = \@list;
|
||||||
|
delete $hash->{".cachedHelp"};
|
||||||
|
}
|
||||||
|
|
||||||
#############################
|
#############################
|
||||||
sub
|
sub
|
||||||
structure_Undef($$)
|
structure_Undef($$)
|
||||||
@ -143,43 +165,38 @@ structure_Notify($$)
|
|||||||
my $me = $hash->{NAME};
|
my $me = $hash->{NAME};
|
||||||
my $devmap = $hash->{ATTR}."_map";
|
my $devmap = $hash->{ATTR}."_map";
|
||||||
|
|
||||||
if( $dev->{NAME} eq "global" ) {
|
if($dev->{NAME} eq "global") {
|
||||||
my $max = int(@{$dev->{CHANGED}});
|
my $max = int(@{$dev->{CHANGED}});
|
||||||
for (my $i = 0; $i < $max; $i++) {
|
for (my $i = 0; $i < $max; $i++) {
|
||||||
my $s = $dev->{CHANGED}[$i];
|
my $s = $dev->{CHANGED}[$i];
|
||||||
$s = "" if(!defined($s));
|
$s = "" if(!defined($s));
|
||||||
|
|
||||||
if($s =~ m/^RENAMED ([^ ]*) ([^ ]*)$/) {
|
if($s =~ m/^RENAMED ([^ ]*) ([^ ]*)$/) {
|
||||||
my ($old, $new) = ($1, $2);
|
my ($old, $new) = ($1, $2);
|
||||||
if( exists($hash->{CONTENT}{$old}) ) {
|
if($hash->{".memberHash"}{$old}) {
|
||||||
|
$hash->{DEF} =~ s/\b$old\b/$new/;
|
||||||
$hash->{DEF} =~ s/(\s+)$old(\s*)/$1$new$2/;
|
structure_setDevs($hash);
|
||||||
|
|
||||||
delete( $hash->{CONTENT}{$old} );
|
|
||||||
$hash->{CONTENT}{$new} = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} elsif($s =~ m/^DELETED ([^ ]*)$/) {
|
} elsif($s =~ m/^DELETED ([^ ]*)$/) {
|
||||||
my ($name) = ($1);
|
my $n = $1;
|
||||||
|
if($hash->{".memberHash"}{$n}) {
|
||||||
if( exists($hash->{CONTENT}{$name}) ) {
|
$hash->{DEF} =~ s/\b$n\b//;
|
||||||
|
structure_setDevs($hash)
|
||||||
$hash->{DEF} =~ s/(\s+)$name(\s*)/ /;
|
|
||||||
$hash->{DEF} =~ s/^ //;
|
|
||||||
$hash->{DEF} =~ s/ $//;
|
|
||||||
|
|
||||||
delete $hash->{CONTENT}{$name};
|
|
||||||
delete $hash->{".cachedHelp"};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} elsif($s =~ m/^DEFINED ([^ ]*)$/) {
|
||||||
|
structure_setDevs($hash) if($hash->{NAME} ne $1 && $hash->{DEVSPECDEF});
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
return "" if(IsDisabled($me));
|
return "" if(IsDisabled($me));
|
||||||
|
|
||||||
#pruefen ob Devices welches das notify ausgeloest hat Mitglied dieser
|
return "" if (! exists $hash->{".memberHash"}->{$dev->{NAME}});
|
||||||
# Struktur ist
|
|
||||||
return "" if (! exists $hash->{CONTENT}->{$dev->{NAME}});
|
|
||||||
|
|
||||||
# lade das Verhalten, Standard ist absolute
|
|
||||||
my $behavior = AttrVal($me, "clientstate_behavior", "absolute");
|
my $behavior = AttrVal($me, "clientstate_behavior", "absolute");
|
||||||
my %clientstate;
|
my %clientstate;
|
||||||
|
|
||||||
@ -208,7 +225,7 @@ structure_Notify($$)
|
|||||||
my $minprio = 99999;
|
my $minprio = 99999;
|
||||||
my $devstate;
|
my $devstate;
|
||||||
|
|
||||||
foreach my $d (sort keys %{ $hash->{CONTENT} }) {
|
foreach my $d (sort keys %{ $hash->{".memberHash"} }) {
|
||||||
next if(!$defs{$d});
|
next if(!$defs{$d});
|
||||||
|
|
||||||
if($attr{$d} && $attr{$d}{$devmap}) {
|
if($attr{$d} && $attr{$d}{$devmap}) {
|
||||||
@ -263,7 +280,7 @@ structure_Notify($$)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$hash->{CONTENT}{$d} = $devstate;
|
$hash->{".memberHash"}{$d} = $devstate;
|
||||||
}
|
}
|
||||||
|
|
||||||
my $newState = "undefined";
|
my $newState = "undefined";
|
||||||
@ -313,7 +330,7 @@ CommandAddStruct($)
|
|||||||
}
|
}
|
||||||
|
|
||||||
foreach my $d (devspec2array($a[0])) {
|
foreach my $d (devspec2array($a[0])) {
|
||||||
$hash->{CONTENT}{$d} = 1;
|
$hash->{".memberHash"}{$d} = 1;
|
||||||
$hash->{DEF} .= " $d";
|
$hash->{DEF} .= " $d";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -341,7 +358,7 @@ CommandDelStruct($)
|
|||||||
}
|
}
|
||||||
|
|
||||||
foreach my $d (devspec2array($a[0])) {
|
foreach my $d (devspec2array($a[0])) {
|
||||||
delete($hash->{CONTENT}{$d});
|
delete($hash->{".memberHash"}{$d});
|
||||||
$hash->{DEF} =~ s/\b$d\b//g;
|
$hash->{DEF} =~ s/\b$d\b//g;
|
||||||
}
|
}
|
||||||
$hash->{DEF} =~ s/ / /g;
|
$hash->{DEF} =~ s/ / /g;
|
||||||
@ -378,8 +395,7 @@ structure_Set($@)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
my @devList = split("[ \t][ \t]*", $hash->{DEF});
|
my @devList = @{$hash->{".memberList"}};
|
||||||
shift @devList;
|
|
||||||
if(@list > 1 && $list[$#list] eq "reverse") {
|
if(@list > 1 && $list[$#list] eq "reverse") {
|
||||||
pop @list;
|
pop @list;
|
||||||
@devList = reverse @devList;
|
@devList = reverse @devList;
|
||||||
@ -493,8 +509,7 @@ structure_Attr($@)
|
|||||||
$hash->{INATTR} = 1;
|
$hash->{INATTR} = 1;
|
||||||
|
|
||||||
my $ret = "";
|
my $ret = "";
|
||||||
my @devList = split("[ \t][ \t]*", $hash->{DEF});
|
my @devList = @{$hash->{".memberList"}};
|
||||||
shift @devList;
|
|
||||||
foreach my $d (@devList) {
|
foreach my $d (@devList) {
|
||||||
next if(!$defs{$d});
|
next if(!$defs{$d});
|
||||||
if($attr{$d} && $attr{$d}{structexclude}) {
|
if($attr{$d} && $attr{$d}{structexclude}) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user