mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-10 09:16:53 +00:00
fhem.pl: userReadings based on array instead of hash (Forum #49682)
git-svn-id: https://svn.fhem.de/fhem/trunk@10914 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
71e0945c1b
commit
fe19ff991a
48
fhem/fhem.pl
48
fhem/fhem.pl
@ -2472,7 +2472,7 @@ CommandAttr($$)
|
|||||||
|
|
||||||
if($attrName eq "userReadings") {
|
if($attrName eq "userReadings") {
|
||||||
|
|
||||||
my %userReadings;
|
my @userReadings;
|
||||||
# myReading1[:trigger1] [modifier1] { codecodecode1 }, ...
|
# myReading1[:trigger1] [modifier1] { codecodecode1 }, ...
|
||||||
my $arg= $a[2];
|
my $arg= $a[2];
|
||||||
|
|
||||||
@ -2482,7 +2482,7 @@ CommandAttr($$)
|
|||||||
my $rNo=0;
|
my $rNo=0;
|
||||||
|
|
||||||
while($arg =~ /$regexo/s) {
|
while($arg =~ /$regexo/s) {
|
||||||
my $userReading= $2;
|
my $reading= $2;
|
||||||
my $trigger= $3 ? $3 : undef;
|
my $trigger= $3 ? $3 : undef;
|
||||||
my $modifier= $5 ? $5 : "none";
|
my $modifier= $5 ? $5 : "none";
|
||||||
my $perlCode= $6;
|
my $perlCode= $6;
|
||||||
@ -2491,17 +2491,15 @@ CommandAttr($$)
|
|||||||
if(grep { /$modifier/ }
|
if(grep { /$modifier/ }
|
||||||
qw(none difference differential offset monotonic integral)) {
|
qw(none difference differential offset monotonic integral)) {
|
||||||
$trigger =~ s/^:// if($trigger);
|
$trigger =~ s/^:// if($trigger);
|
||||||
$userReadings{$userReading}{trigger}= $trigger;
|
my %userReading = ( reading => $reading, trigger => $trigger, modifier => $modifier, perlCode => $perlCode );
|
||||||
$userReadings{$userReading}{modifier}= $modifier;
|
push @userReadings, \%userReading;
|
||||||
$userReadings{$userReading}{perlCode}= $perlCode;
|
|
||||||
$userReadings{$userReading}{readingNo}= $rNo++;
|
|
||||||
} else {
|
} else {
|
||||||
push @rets, "$sdev: unknown modifier $modifier for ".
|
push @rets, "$sdev: unknown modifier $modifier for ".
|
||||||
"userReading $userReading, this userReading will be ignored";
|
"userReading $reading, this userReading will be ignored";
|
||||||
}
|
}
|
||||||
$arg= defined($8) ? $8 : "";
|
$arg= defined($8) ? $8 : "";
|
||||||
}
|
}
|
||||||
$hash->{'.userReadings'}= \%userReadings;
|
$hash->{'.userReadings'}= \@userReadings;
|
||||||
}
|
}
|
||||||
|
|
||||||
if($attrName eq "IODev" && (!$a[2] || !defined($defs{$a[2]}))) {
|
if($attrName eq "IODev" && (!$a[2] || !defined($defs{$a[2]}))) {
|
||||||
@ -3869,29 +3867,27 @@ readingsEndUpdate($$)
|
|||||||
|
|
||||||
# process user readings
|
# process user readings
|
||||||
if(defined($hash->{'.userReadings'})) {
|
if(defined($hash->{'.userReadings'})) {
|
||||||
my %userReadings= %{$hash->{'.userReadings'}};
|
foreach my $userReading (@{$hash->{'.userReadings'}}) {
|
||||||
foreach my $userReading (sort { $userReadings{$a}{readingNo} <=>
|
|
||||||
$userReadings{$b}{readingNo} }
|
|
||||||
keys %userReadings) {
|
|
||||||
|
|
||||||
my $trigger = $userReadings{$userReading}{trigger};
|
my $trigger = $userReading->{trigger};
|
||||||
if(defined($trigger)) {
|
if(defined($trigger)) {
|
||||||
my @fnd = grep { $_ && $_ =~ m/^$trigger/ } @{$hash->{CHANGED}};
|
my @fnd = grep { $_ && $_ =~ m/^$trigger/ } @{$hash->{CHANGED}};
|
||||||
next if(!@fnd);
|
next if(!@fnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
my $modifier= $userReadings{$userReading}{modifier};
|
my $reading= $userReading->{reading};
|
||||||
my $perlCode= $userReadings{$userReading}{perlCode};
|
my $modifier= $userReading->{modifier};
|
||||||
my $oldvalue= $userReadings{$userReading}{value};
|
my $perlCode= $userReading->{perlCode};
|
||||||
my $oldt= $userReadings{$userReading}{t};
|
my $oldvalue= $userReading->{value};
|
||||||
#Debug "Evaluating " . $userReadings{$userReading};
|
my $oldt= $userReading->{t};
|
||||||
|
#Debug "Evaluating " . $reading;
|
||||||
$cmdFromAnalyze = $perlCode; # For the __WARN__ sub
|
$cmdFromAnalyze = $perlCode; # For the __WARN__ sub
|
||||||
my $value= eval $perlCode;
|
my $value= eval $perlCode;
|
||||||
$cmdFromAnalyze = undef;
|
$cmdFromAnalyze = undef;
|
||||||
my $result;
|
my $result;
|
||||||
# store result
|
# store result
|
||||||
if($@) {
|
if($@) {
|
||||||
$value = "Error evaluating $name userReading $userReading: $@";
|
$value = "Error evaluating $name userReading $reading: $@";
|
||||||
Log 1, $value;
|
Log 1, $value;
|
||||||
$result= $value;
|
$result= $value;
|
||||||
} elsif($modifier eq "none") {
|
} elsif($modifier eq "none") {
|
||||||
@ -3908,25 +3904,25 @@ readingsEndUpdate($$)
|
|||||||
if(defined($oldt) && defined($oldvalue)) {
|
if(defined($oldt) && defined($oldvalue)) {
|
||||||
my $deltat= $hash->{".updateTime"} - $oldt if(defined($oldt));
|
my $deltat= $hash->{".updateTime"} - $oldt if(defined($oldt));
|
||||||
my $avgval= ($value + $oldvalue) / 2;
|
my $avgval= ($value + $oldvalue) / 2;
|
||||||
$result = ReadingsVal($name,$userReading,$value);
|
$result = ReadingsVal($name,$reading,$value);
|
||||||
if(defined($deltat) && $deltat>= 1.0) {
|
if(defined($deltat) && $deltat>= 1.0) {
|
||||||
$result+= $avgval*$deltat;
|
$result+= $avgval*$deltat;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} elsif($modifier eq "offset") {
|
} elsif($modifier eq "offset") {
|
||||||
$oldvalue = $value if( !defined($oldvalue) );
|
$oldvalue = $value if( !defined($oldvalue) );
|
||||||
$result = ReadingsVal($name,$userReading,0);
|
$result = ReadingsVal($name,$reading,0);
|
||||||
$result += $oldvalue if( $value < $oldvalue );
|
$result += $oldvalue if( $value < $oldvalue );
|
||||||
} elsif($modifier eq "monotonic") {
|
} elsif($modifier eq "monotonic") {
|
||||||
$oldvalue = $value if( !defined($oldvalue) );
|
$oldvalue = $value if( !defined($oldvalue) );
|
||||||
$result = ReadingsVal($name,$userReading,$value);
|
$result = ReadingsVal($name,$reading,$value);
|
||||||
$result += $value - $oldvalue if( $value > $oldvalue );
|
$result += $value - $oldvalue if( $value > $oldvalue );
|
||||||
}
|
}
|
||||||
readingsBulkUpdate($hash,$userReading,$result,1) if(defined($result));
|
readingsBulkUpdate($hash,$reading,$result,1) if(defined($result));
|
||||||
# store value
|
# store value
|
||||||
$hash->{'.userReadings'}{$userReading}{TIME}= $hash->{".updateTimestamp"};
|
$userReading->{TIME}= $hash->{".updateTimestamp"};
|
||||||
$hash->{'.userReadings'}{$userReading}{t}= $hash->{".updateTime"};
|
$userReading->{t}= $hash->{".updateTime"};
|
||||||
$hash->{'.userReadings'}{$userReading}{value}= $value;
|
$userReading->{value}= $value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
evalStateFormat($hash);
|
evalStateFormat($hash);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user