2
0
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:
rudolfkoenig 2018-01-12 20:30:17 +00:00
parent 6e8ce2b05c
commit 19178fdda2
2 changed files with 59 additions and 43 deletions

View File

@ -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

View File

@ -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}) {