diff --git a/fhem/FHEM/01_FHEMWEB.pm b/fhem/FHEM/01_FHEMWEB.pm index 456abea0a..5c7bce3a2 100755 --- a/fhem/FHEM/01_FHEMWEB.pm +++ b/fhem/FHEM/01_FHEMWEB.pm @@ -571,17 +571,17 @@ FW_answerCall($) ######################## # FW Extensions + my $jsTemplate = ''; if(defined($data{FWEXT})) { foreach my $k (sort keys %{$data{FWEXT}}) { my $h = $data{FWEXT}{$k}; next if($h !~ m/HASH/ || !$h->{SCRIPT}); my $script = $h->{SCRIPT}; $script = ($script =~ m,^/,) ? "$FW_ME$script" : "$FW_ME/pgm2/$script"; - FW_pO ""; + FW_pO sprintf($jsTemplate, $script); } } - my $jsTemplate = ''; FW_pO sprintf($jsTemplate, "$FW_ME/pgm2/svg.js") if($FW_plotmode eq "SVG"); foreach my $js (@FW_fhemwebjs) { FW_pO sprintf($jsTemplate, "$FW_ME/pgm2/$js"); diff --git a/fhem/FHEM/98_SVG.pm b/fhem/FHEM/98_SVG.pm index 415e07d55..3170ee93d 100755 --- a/fhem/FHEM/98_SVG.pm +++ b/fhem/FHEM/98_SVG.pm @@ -49,7 +49,7 @@ SVG_Initialize($) my ($hash) = @_; $hash->{DefFn} = "SVG_Define"; - $hash->{AttrList} = "fixedrange startDate plotsize label title plotfunction"; + $hash->{AttrList} = "fixedoffset fixedrange startDate plotsize label title plotfunction"; $hash->{SetFn} = "SVG_Set"; $hash->{FW_summaryFn} = "SVG_FwFn"; $hash->{FW_detailFn} = "SVG_FwFn"; @@ -550,6 +550,17 @@ SVG_substcfg($$$$$$) } } +sub +SVG_tspec($$@) +{ + my ($n,$e) = (shift,shift); + for(my $i=1; $i<$n; $i++) { + $_[$i] = 0; + } + return sprintf("%04d-%02d-%02d_%02d:%02d:%02d", + $_[5]+1900,$_[4]+1,$_[3],$_[2],$_[1],$e); +} + ################## # Calculate either the number of scrollable SVGs (for $d = undef) or # for the device the valid from and to dates for the given zoom and offset @@ -561,13 +572,12 @@ SVG_calcOffsets($$) my $pm = AttrVal($d,"plotmode",$FW_plotmode); return if($pm eq "gnuplot"); - my $frx; + my ($fr, $fo); if($defs{$wl}) { - my $fr = AttrVal($wl, "fixedrange", undef); + $fr = AttrVal($wl, "fixedrange", undef); if($fr) { - #klaus fixed range day, week, month or year - if($fr eq "day" || $fr eq "week" || $fr eq "month" || $fr eq "year" ) { - $frx=$fr; + if($fr eq "day" || $fr eq "week" || $fr eq "month" || $fr eq "year" || + $fr =~ m/^\d+days$/ ) { } else { my @range = split(" ", $fr); @@ -577,11 +587,14 @@ SVG_calcOffsets($$) return; } } + + $fo = AttrVal( $wl, "fixedoffset", undef); } my $off = $FW_pos{$d}; $off = 0 if(!$off); $off += $FW_pos{off} if($FW_pos{off}); + $off = $fo if(defined($fo) && $fo =~ m/^[+-]?\d+$/); my $now; my $st = AttrVal($wl, "startDate", undef); @@ -593,75 +606,64 @@ SVG_calcOffsets($$) my $zoom = $FW_pos{zoom}; $zoom = "day" if(!$zoom); - $zoom = $frx if ($frx); #for fixedrange {day|week|...} klaus + $zoom = $fr if(defined($fr)); + my $endPlotNow = (AttrVal($FW_wname, "endPlotNow", undef) && !$st); if($zoom eq "hour") { - if(AttrVal($FW_wname, "endPlotNow", undef) && !$st) { + if($endPlotNow) { my $t = int(($now + $off*3600 - 3600)/300.0)*300 + 300; my @l = localtime($t); - $SVG_devs{$d}{from} = sprintf("%04d-%02d-%02d_%02d:%02d:00", - $l[5]+1900,$l[4]+1,$l[3],$l[2],$l[1]); + $SVG_devs{$d}{from} = SVG_tspec(1,0,@l); @l = localtime($t+3600); - $SVG_devs{$d}{to} = sprintf("%04d-%02d-%02d_%02d:%02d:01", - $l[5]+1900,$l[4]+1,$l[3],$l[2],$l[1]); + $SVG_devs{$d}{to} = SVG_tspec(1,1,@l); + } else { my $t = $now + $off*3600; my @l = localtime($t); - $SVG_devs{$d}{from} = sprintf("%04d-%02d-%02d_%02d:00:00", - $l[5]+1900,$l[4]+1,$l[3],$l[2]); + $SVG_devs{$d}{from} = SVG_tspec(2,0,@l); @l = localtime($t+3600); - $SVG_devs{$d}{to} = sprintf("%04d-%02d-%02d_%02d:00:01", - $l[5]+1900,$l[4]+1,$l[3],$l[2]); + $SVG_devs{$d}{to} = SVG_tspec(2,1,@l); } } elsif($zoom eq "qday") { - if(AttrVal($FW_wname, "endPlotNow", undef) && !$st) { + if($endPlotNow) { my $t = int(($now + $off*21600 - 21600)/300.0)*300 + 300; my @l = localtime($t); - $SVG_devs{$d}{from} = sprintf("%04d-%02d-%02d_%02d:%02d:00", - $l[5]+1900,$l[4]+1,$l[3],$l[2],$l[1]); + $SVG_devs{$d}{from} = SVG_tspec(1,0,@l); @l = localtime($t+21600); - $SVG_devs{$d}{to} = sprintf("%04d-%02d-%02d_%02d:%02d:01", - $l[5]+1900,$l[4]+1,$l[3],$l[2],$l[1]); + $SVG_devs{$d}{to} = SVG_tspec(1,1,@l); } else { my $t = $now + $off*21600; my @l = localtime($t); $l[2] = int($l[2]/6)*6; - $SVG_devs{$d}{from} = sprintf("%04d-%02d-%02d_%02d:00:00", - $l[5]+1900,$l[4]+1,$l[3],$l[2]); + $SVG_devs{$d}{from} = SVG_tspec(2,0,@l); @l = localtime($t+21600); $l[2] = int($l[2]/6)*6; - $SVG_devs{$d}{to} = sprintf("%04d-%02d-%02d_%02d:00:01", - $l[5]+1900,$l[4]+1,$l[3],$l[2]); + $SVG_devs{$d}{to} = SVG_tspec(2,1,@l); } - } elsif($zoom eq "day") { - if(AttrVal($FW_wname, "endPlotNow", undef) && !$st) { - my $t = int(($now + $off*86400 - 86400)/900.0)*900 + 900; + } elsif($zoom =~ m/^(\d+)?day/) { + my $nDays = $1 ? ($1-1) : 0; + if($endPlotNow) { + my $t = int(($now + ($off-$nDays-1)*86400)/900.0)*900 + 900; my @l = localtime($t); - $SVG_devs{$d}{from} = sprintf("%04d-%02d-%02d_%02d:%02d:00", - $l[5]+1900,$l[4]+1,$l[3],$l[2],$l[1]); - @l = localtime($t+86400); - $SVG_devs{$d}{to} = sprintf("%04d-%02d-%02d_%02d:%02d:01", - $l[5]+1900,$l[4]+1,$l[3],$l[2],$l[1]); + $SVG_devs{$d}{from} = SVG_tspec(1,0,@l); + @l = localtime($t+(1+$nDays)*86400); + $SVG_devs{$d}{to} = SVG_tspec(1,1,@l); } else { - my $t = $now + $off*86400; + my $t = $now + ($off-$nDays)*86400; my @l = localtime($t); - $SVG_devs{$d}{from} = sprintf("%04d-%02d-%02d_00:00:00", - $l[5]+1900,$l[4]+1,$l[3]); - @l = localtime($t+86400); - $SVG_devs{$d}{to} = sprintf("%04d-%02d-%02d_00:00:01", - $l[5]+1900,$l[4]+1,$l[3]); + $SVG_devs{$d}{from} = SVG_tspec(3,0,@l); + @l = localtime($t+(1+$nDays)*86400); + $SVG_devs{$d}{to} = SVG_tspec(3,1,@l); } } elsif($zoom eq "week") { my @l = localtime($now); my $start = (AttrVal($FW_wname, "endPlotToday", undef) ? 6 : $l[6]); my $t = $now - ($start*86400) + ($off*86400)*7; @l = localtime($t); - $SVG_devs{$d}{from} = sprintf("%04d-%02d-%02d_00:00:00", - $l[5]+1900,$l[4]+1,$l[3]); + $SVG_devs{$d}{from} = SVG_tspec(3,0,@l); @l = localtime($t+7*86400); - $SVG_devs{$d}{to} = sprintf("%04d-%02d-%02d_00:00:01", - $l[5]+1900,$l[4]+1,$l[3]); + $SVG_devs{$d}{to} = SVG_tspec(3,1,@l); } elsif($zoom eq "month") { my ($endDay, @l); @@ -678,12 +680,11 @@ SVG_calcOffsets($$) } $l[4] += $off; $l[4] += 12, $l[5]-- if($l[4] < 0); - $SVG_devs{$d}{from} = - sprintf("%04d-%02d-%02d_00:00:00", $l[5]+1900, $l[4]+1,$endDay); + $l[3] = $endDay; + $SVG_devs{$d}{from} = SVG_tspec(3,0,@l); $l[4]++; $l[4] = 0, $l[5]++ if($l[4] == 12); - $SVG_devs{$d}{to} = - sprintf("%04d-%02d-%02d_00:00:01", $l[5]+1900, $l[4]+1,$endDay); + $SVG_devs{$d}{to} = SVG_tspec(3,1,@l); } elsif($zoom eq "year") { my @l = localtime($now); @@ -1610,12 +1611,19 @@ sub plotAsPng(@) {