diff --git a/fhem/FHEM/92_FileLog.pm b/fhem/FHEM/92_FileLog.pm index 7a94e51a4..1b3ba6e2c 100644 --- a/fhem/FHEM/92_FileLog.pm +++ b/fhem/FHEM/92_FileLog.pm @@ -959,7 +959,7 @@ RESCAN: } - next if(!defined($val) || $val !~ m/^-?[.\d]+$/o); + next if(!defined($val) || $val !~ m/^-?[.0-9]+(e[-+0-9]+)?$/i); if($val < $min[$i]) { $min[$i] = $val; $mind[$i] = $dte; diff --git a/fhem/FHEM/98_SVG.pm b/fhem/FHEM/98_SVG.pm index d8782c094..2b98767c6 100644 --- a/fhem/FHEM/98_SVG.pm +++ b/fhem/FHEM/98_SVG.pm @@ -203,9 +203,15 @@ SVG_log10($) { my ($n) = @_; - return 0.0000000001 if( $n <= 0 ); + $n = 0.0000000001 if($n <= 0); + return log($n)/log(10); +} - return log(1+$n)/log(10); +sub +SVG_exp10($) +{ + my ($n) = @_; + return 10**$n; } @@ -766,7 +772,7 @@ SVG_readgplotfile($$$) { return "%$_[0]%" if(!$pr); my $v = $pr->{$_[0]}; - return "%$_[0]%" if(!$v); + return "%$_[0]%" if(!defined($v)); if($v =~ m/^{.*}$/) { $cmdFromAnalyze = $v; return eval $v; @@ -1760,6 +1766,12 @@ SVG_render($$$$$$$$$$) $htics{$a} = defined($conf{$yt}) ? $conf{$yt} : ""; #-- Round values, compute a nice step + my $scale = $conf{"y".($idx ? $idx+1:"")."scale"}; + $scale = "" if(!defined($scale)); + if($scale eq "log") { + $hmax{$a} = SVG_log10($hmax{$a}); + $hmin{$a} = SVG_log10($hmin{$a}); + } ($hstep{$a}, $hmin{$a}, $hmax{$a}) = SVG_getSteps($conf{$yra},$hmin{$a},$hmax{$a}); @@ -1772,25 +1784,15 @@ SVG_render($$$$$$$$$$) next if(!defined($hmin{$a})); # Bogus case - #-- safeguarding against pathological data - if( !$hstep{$a} ){ - $hmax{$a} = $hmin{$a}+1; - $hstep{$a} = 1; - } + my $axis = 1; + $axis = $1 if( $a =~ m/x\d+y(\d+)/ ); + my $scale = $conf{"y".($axis==1?"":$axis)."scale"}; + $scale = "" if(!defined($scale)); #-- Draw the y-axis values and grid my $dh = $hmax{$a} - $hmin{$a}; my $hmul = $dh>0 ? $h/$dh : $h; - my $axis = 1; - $axis = $1 if( $a =~ m/x\d+y(\d+)/ ); - - my $scale = "y".($axis)."scale"; $scale = "yscale" if( $axis == 1 ); - my $log = ""; $log = $conf{$scale} if( $conf{$scale} ); - my $f_log = (int($hmax{$a}) && $dh > 0) ? - ((SVG_log10($hmax{$a})-SVG_log10($hmin{$a})) / $dh) : - 1; - # offsets my ($align,$display,$cll); if( $axis <= $use_left_axis ) { @@ -1827,23 +1829,18 @@ SVG_render($$$$$$$$$$) #-- tics handling my $tic = $htics{$a}; #-- tics as in the config-file - if($tic && $tic !~ m/mirror/) { + if($tic) { $tic =~ s/^\((.*)\)$/$1/; # Strip () - for(my $decimal = 0; - $decimal <($log eq 'log'?SVG_log10($hmax{$a})-SVG_log10($hmin{$a}):1); - $decimal++) { foreach my $onetic (split(",", $tic)) { + last if($onetic eq "nomirror"); $onetic =~ s/^ *(.*) *$/$1/; my ($tlabel, $tvalue) = split(" ", $onetic); $tlabel =~ s/^"(.*)"$/$1/; $tvalue = 0 if( !$tvalue ); - $tvalue /= 10 ** $decimal; $tlabel = $tvalue if( !$tlabel ); + $tvalue = SVG_log10($tvalue) if($scale eq "log"); $off2 = int($y+($hmax{$a}-$tvalue)*$hmul); - $off2 = int($y+($hmax{$a}- - (SVG_log10($tvalue)-SVG_log10($hmin{$a}))/$f_log)*$hmul) - if( $log eq 'log' ); #-- tics SVG_pO ""; #--grids @@ -1860,22 +1857,11 @@ SVG_render($$$$$$$$$$) SVG_pO "$tlabel"; } - } + #-- tics automatically - } elsif( $hstep{$a}>0 ) { - for(my $decimal = 0; - $decimal <($log eq 'log'?SVG_log10($hmax{$a})-SVG_log10($hmin{$a}):1); - $decimal++) { - for(my $i = ($log eq 'log' ? 0 : $hmin{$a}); - $i <= $hmax{$a}; $i += $hstep{$a}) { - my $i = $i / 10 ** $decimal; - if( $log eq 'log' ) { - next if( $i < $hmin{$a} ); - $off2 = int($y + ($hmax{$a} - - (SVG_log10($i) - SVG_log10($hmin{$a})) / $f_log) * $hmul); - } else { - $off2 = int($y+($hmax{$a}-$i)*$hmul); - } + } elsif( $hstep{$a}>0 ) { + for(my $i = $hmin{$a}; $i <= $hmax{$a}; $i += $hstep{$a}) { + $off2 = int($y+($hmax{$a}-$i)*$hmul); #-- tics SVG_pO " "; #--grids @@ -1891,11 +1877,12 @@ SVG_render($$$$$$$$$$) $off2 += $th/4; #-- text my $name = ($axis==1 ? "y":"y$axis")."sprintf"; # Forum #88460 - my $txt = sprintf($conf{$name} ? $conf{$name} : "%g", $i); + my $txt = sprintf($conf{$name} ? $conf{$name} : + ($scale eq "log" ? "%0.0e" : "%g"), + ($scale eq "log" ? SVG_exp10($i) : $i)); SVG_pO "$txt"; } - } } SVG_pO ""; @@ -1911,8 +1898,8 @@ SVG_render($$$$$$$$$$) next if(!defined($a)); my $axis = 1; $axis = $1 if( $a =~ m/x\d+y(\d+)/ ); - my $scale = "y".($axis)."scale"; $scale = "yscale" if( $axis == 1 ); - my $log = ""; $log = $conf{$scale} if( $conf{$scale} ); + my $scale = $conf{"y".($axis==1?"":$axis)."scale"}; + $scale = "" if(!defined($scale)); $min = $hmin{$a}; $hmax{$a} += 1 if($min == $hmax{$a}); # Else division by 0 in the next line @@ -1925,11 +1912,9 @@ SVG_render($$$$$$$$$$) SVG_pO "" if(!defined($dxp)); next if(!defined($dxp)); - my $f_log = int($hmax{$a}) ? ((SVG_log10($hmax{$a}) - - SVG_log10($hmin{$a})) / ($hmax{$a}-$hmin{$a})) : 1; - if( $log eq 'log' ) { + if($scale eq 'log') { foreach my $i (0..int(@{$dyp})-1) { - $dyp->[$i] = (SVG_log10($dyp->[$i])-SVG_log10($hmin{$a})) / $f_log; + $dyp->[$i] = SVG_log10($dyp->[$i]); } } @@ -1945,7 +1930,7 @@ SVG_render($$$$$$$$$$) ($conf{xrange}?"x_off=\"$xmin\" ":"x_off=\"$fromsec\" "). ($conf{xrange}?"x_mul=\"$xmul\" ":"t_mul=\"$tmul\" "). "y_h=\"$yh\" y_min=\"$min\" y_mul=\"$hmul\" title=\"$tl\" ". - ($log eq 'log'?"log_scale=\"$f_log\" ":""). + "scale=\"$scale\" ". "onclick=\"parent.svg_click(evt)\""; my $lStyle = $conf{lStyle}[$idx]; my $isFill = ($conf{lStyle}[$idx] =~ m/fill/); diff --git a/fhem/www/pgm2/svg.js b/fhem/www/pgm2/svg.js index 56bcfdb8e..e41275155 100644 --- a/fhem/www/pgm2/svg.js +++ b/fhem/www/pgm2/svg.js @@ -53,10 +53,12 @@ function svg_prepareHash(el) { var obj = { y_mul:0,y_h:0,y_min:0, decimals:0, - t_mul:0,x_off:0,x_min:0, x_mul:0, log_scale:undefined }; + t_mul:0,x_off:0,x_min:0, x_mul:0, scale:"" }; for(var name in obj) { var n = $(el).attr(name); - if(n) + if(name == "scale" && n) + obj[name] = n; + else if(n) obj[name] = parseFloat(n); } return obj; @@ -76,7 +78,12 @@ svg_click(evt) y -= off.top; } - var y_org = (((o.y_h-y)/o.y_mul)+o.y_min).toFixed(o.decimals); + var y_org = (((o.y_h-y)/o.y_mul)+o.y_min); + if(o.scale == "log") + y_org = Math.pow(10,y_org); + else + y_org = y_org.toFixed(o.decimals); + var d = new Date((((x-o.x_min)/o.t_mul)+o.x_off) * 1000); var ts = (d.getHours() < 10 ? '0' : '') + d.getHours() + ":"+ (d.getMinutes() < 10 ? '0' : '') + d.getMinutes(); @@ -119,6 +126,12 @@ sv_menu(evt, embed) return { x:parseFloat(xy[0]), y:parseFloat(xy[1]) }; } } + + var embedOffsetY = 0; + if(embed) { + var name = $(evt.target).parent("svg").attr("id").substr(8); + embedOffsetY = $("div.SVGplot.SVG_"+name).offset().top; + } function showValOff() { @@ -251,7 +264,6 @@ sv_menu(evt, embed) $(svg).append(par.circle); par.div = $('
'); - par.divoffY = -50; var parent = (embed ? $(embed).parent() : $(svg).parent()); $(parent).append(par.div); @@ -300,14 +312,10 @@ sv_menu(evt, embed) var y = (((par.y_h-yRaw)/par.y_mul)+par.y_min); - if( par.log_scale ) { - y *= par.log_scale; - if( par.y_min ) - y += Math.log(par.y_min)/Math.log(10); + if(par.scale == "log") y = Math.pow(10,y); - } - - y = y.toFixed(par.decimals); + else + y = y.toFixed(par.decimals); if(selNode.isInt) { if(selNode.clicked) { @@ -347,7 +355,13 @@ sv_menu(evt, embed) } $(par.circle).attr("cx", xRaw).attr("cy", yRaw); - var yd = Math.floor((yRaw+par.divoffY) / 20)*20; + var yd = Math.floor(yRaw / 20)*20; + + if(embed) + yd += embedOffsetY-90; + else + yd += $(svg).offset().top-90; + $(par.div).html(ts+" "+y) .css({ left:xRaw-20, top:yd }); } @@ -380,8 +394,8 @@ sv_menu(evt, embed) function animateVisibility(sel, currval, maxval) { - var h = parseFloat(sel.attr("y_h")); - sel.attr("transform", "translate(0,"+h*(1-currval)+") "+ + var h = parseFloat(sel.attr("y_h")); + sel.attr("transform", "translate(0,"+h*(1-currval)+") "+ "scale(1,"+currval+")"); if(currval != maxval) {