diff --git a/fhem/CHANGED b/fhem/CHANGED index 33112c663..8d6c01ce1 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # 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. + - feature: 98_logProxy.pm added postFn and scale2reading options - feature: 70_Pushbullet.pm: new module 70_Pushbullet.pm - changed: 31_MilightDevice (Thanks to MarkusM): Saturation set/transition, set with command saturation diff --git a/fhem/FHEM/98_logProxy.pm b/fhem/FHEM/98_logProxy.pm index a4fe19e49..e274826b5 100644 --- a/fhem/FHEM/98_logProxy.pm +++ b/fhem/FHEM/98_logProxy.pm @@ -697,6 +697,7 @@ logProxy_Get($@) my $log_dev = $options[0]; my $infile = $fld[0] eq "DbLog" ? "HISTORY" : "CURRENT"; my $column_specs = $3; + my $extend; my $extend_scale; my $offset; @@ -705,6 +706,7 @@ logProxy_Get($@) my $clip; my $predict; my $postFn; + my $scale2reading; if( !defined($defs{$log_dev}) ) { Log3 $hash->{NAME}, 1, "$hash->{NAME}: $log_dev does not exist"; @@ -712,7 +714,16 @@ logProxy_Get($@) next; } - foreach my $option ( @options[1..@options-1] ) { + my @options = @options[1..@options-1]; + while (@options) { + my $option = shift(@options); + while ($option && $option =~ m/={/ && $option !~ m/>}/ ) { + my $next = shift(@options); + last if( !defined($next) ); + $option .= ",". $next; + } + + #foreach my $option ( @options[1..@options-1] ) { my ($name,$value) = split( '=', $option, 2 ); if( $value ) { @@ -754,6 +765,9 @@ logProxy_Get($@) } elsif( $name eq "postFn" ) { $postFn = $value; + } elsif( $name eq "scale2reading" ) { + $scale2reading = $value if( defined($value) ); + } else { Log3 $hash->{NAME}, 2, "$hash->{NAME}: line $i: $fld[0]: unknown option >$option<"; @@ -773,6 +787,35 @@ logProxy_Get($@) $from = logProxy_shiftTime($from,-$extend.$extend_scale) if( $extend ); $to = logProxy_shiftTime($to,$extend.$extend_scale) if( $extend ); + # zoom dependent reading + if( $scale2reading ) { + my @fld = split(':', $column_specs, 3); + + my $reading; + my $zoom = logProxy_Range2Zoom($tosec-$fromsec); + if( ref($scale2reading) eq "HASH" ) { + $reading = $scale2reading->{$zoom}; + $reading = $scale2reading->{"$fld[1].$zoom"} if( defined($scale2reading->{"$fld[1].$zoom"}) ); + } elsif($scale2reading =~ m/^{.*}$/) { + } else { + no strict "refs"; + $reading = eval {&{$scale2reading}($zoom,$fld[1])}; + use strict "refs"; + if( $@ ) { + Log3 $hash->{NAME}, 1, "$hash->{NAME}:readingOfScale $a[$i]: $@"; + } + } + + if( $reading + && $reading ne $fld[1] ) { + Log3 $hash->{NAME}, 4, "$hash->{NAME}:scale $zoom: using $reading instead of $fld[1]"; + $fld[1] = $reading; + $column_specs = join( ':', @fld ); + } else { + Log3 $hash->{NAME}, 5, "$hash->{NAME}:scale $zoom: keeping $fld[1]"; + } + } + $internal_data = ""; my $cmd = "get $log_dev $infile INT $from $to $column_specs"; Log3 $hash->{NAME}, 4, "$hash->{NAME}: calling $cmd"; @@ -800,12 +843,12 @@ logProxy_Get($@) no strict "refs"; my $d = eval {&{$postFn}($a[$i],$data)}; + use strict "refs"; if( $@ ) { - Log3 $hash->{NAME}, 1, "$hash->{NAME}: $a[$i]: $@"; + Log3 $hash->{NAME}, 1, "$hash->{NAME}: postFn: $a[$i]: $@"; $ret .= "#$a[$i]\n"; next; } - use strict "refs"; $data = $d; @@ -1125,9 +1168,41 @@ logProxy_Get($@) #logProxy <column_spec>
where <column_spec> can be one or more of the following:
- options is a comma separated list of zero or more of:
-