2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-10 03:06:37 +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:
rudolfkoenig 2016-02-22 08:38:46 +00:00
parent 71e0945c1b
commit fe19ff991a

View File

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