#!/usr/bin/perl use strict; use warnings; use Tk; use Tk::Chart; use Tk::Chart::Lines; use Tk::Canvas::GradientColor; use Tk::Pane; use DBI; use utf8; use Tk::DateEntry; use POSIX qw/strftime/; use Time::Local; my ($mw, $pane); my (@data0, @data1, @data2, @data3); #my $datemin = '2012-01-16 05:59:06'; #my $datemax = '2012-01-16 10:07:32'; my $datemin; my $datemax; my $color_start = '#ffffff'; #my $color_end = '#DF776F'; my $color_end = '#bbbbbb'; &dates; #print "datemin = $datemin datemax=$datemax\n"; #my $date; my ($chart0, $chart1, $chart2, $chart3, $xlabelskip); my ($powermax, $powermin, $poweravg); my ($speedmax, $speedmin, $speedavg, $powersum); my ($battmax, $battmin, $battavg); my ($powersunmax, $powersunmin, $powersunavg, $powersunsum); my (@timeline, @speed, @power, @v_acc, @powersun); &update_data; &create_mw; &set_charts; &render; MainLoop(); exit; sub draw_charts { $chart0->clearchart; $chart1->clearchart; $chart2->clearchart; $chart3->clearchart; $chart0->destroy; $chart1->destroy; $chart2->destroy; $chart3->destroy; $mw->destroy; &create_mw; &update_data; &set_charts; &render; } sub render { $chart0->plot(\@data0); #u akb $chart1->plot(\@data1); #sun p $chart2->plot(\@data2); #wind p $chart3->plot(\@data3); #wind speed } sub create_mw { $mw = MainWindow->new(); $mw->geometry( "840x800" ); #$mw->resizable(1,1); $mw->title("SA wind generation from $datemin to $datemax"); $mw->optionAdd("*font", "*utf-8"); $mw->fontCreate('giant_rus', -family => 'nimbus sans l', -weight => 'normal', -size=>int(-13*13/10)); $mw->fontCreate('tiny_rus', -family => 'nimbus sans l', -weight => 'normal', -size=>int(-12*12/10)); $pane = $mw->Scrolled(qw/Pane -scrollbars e -width 990 -height 960/)->pack; my $dateframe=$pane->Frame()->pack(-side=>'top', -anchor=>'nw', -padx=>'15'); my $datelabel = $dateframe->Label(-text => 'Диапазон: ', -font => 'giant_rus')->pack(-side => 'left'); my @daynames=(); foreach (0..6) { push @daynames,strftime("%a",0,0,0,1,1,1,$_); } my $datebegin = $dateframe->DateEntry( -font => 'giant_rus', -daynames => \@daynames, -todaybackground => 'green', -textvariable => \$datemin, -formatcmd => sub { sprintf ("%d-%02d-%02d 00:00:00",$_[0],$_[1],$_[2]);}, -width => 18 )->pack(-side => 'left'); my $dateend = $dateframe->DateEntry( -font => 'giant_rus', -daynames => \@daynames, -todaybackground => 'green', -textvariable => \$datemax, -formatcmd => sub { sprintf ("%d-%02d-%02d 00:00:00",$_[0],$_[1],$_[2]);}, -width => 18 )->pack(-side => 'left'); my $buttonok = $dateframe->Button( -text=>'Ok', -command=> \&draw_charts )->pack(-side => 'left'); } sub set_charts{ $chart0 = $pane->Lines( -title => "U акб min: $battmin max: $battmax avg: $battavg (m/s)", -titlefont => 'giant_rus', -textfont => 'tiny_rus', -titleheight => '5', -xlabelfont => 'tiny_rus', -ylabelfont => 'tiny_rus', -ylabel => 'V', -boxaxis => 1, -yticknumber => 5, -linewidth => 2, -bezier => 1, -alltickview => 1, -pointline => 0, -markers => [10, 9, 9], -xtickheight => 5, -ylongticks => 1, -ylongtickscolor => 'white', -xlongticks => 1, -xlongtickscolor => 'white', -width => 800, -height => 220, -yminvalue => $battmin, -ymaxvalue => $battmax, -xlabelskip => $xlabelskip, #)->pack(qw / -fill both -expand 1/); )->pack(); $chart0->enabled_gradientcolor(); $chart0->set_gradientcolor( -start_color => $color_start, -end_color => $color_end, -type => 'linear_vertical', ); $chart3 = $pane->Lines( -title => "Солнцегенерация min: $powersunmin max: $powersunmax avg: $powersunavg (Wt) sum: $powersunsum (kWt*h)", -titlefont => 'giant_rus', -textfont => 'tiny_rus', -titleheight => '5', -xlabelfont => 'tiny_rus', -ylabelfont => 'tiny_rus', -ylabel => 'P', -boxaxis => 1, -yticknumber => 5, -linewidth => 2, -bezier => 1, -alltickview => 1, -pointline => 0, -markers => [10, 9, 9], -xtickheight => 5, -ylongticks => 1, -ylongtickscolor => 'white', -xlongticks => 1, -xlongtickscolor => 'white', -width => 800, -height => 220, -yminvalue => $powersunmin, -ymaxvalue => $powersunmax, -xlabelskip => $xlabelskip, -colordata => [ qw(orange) ], #)->pack(qw / -fill both -expand 1 /); )->pack(); $chart3->enabled_gradientcolor(); $chart3->set_gradientcolor( -start_color => $color_start, -end_color => $color_end, -type => 'linear_vertical', ); $chart2 = $pane->Lines( -title => "Ветрогенерация min: $powermin max: $powermax avg: $poweravg (Wt) sum: $powersum (kWt*h)", -titlefont => 'giant_rus', -textfont => 'tiny_rus', -titleheight => '5', -xlabelfont => 'tiny_rus', -ylabelfont => 'tiny_rus', -ylabel => 'P', -boxaxis => 1, -yticknumber => 5, -linewidth => 2, -bezier => 1, -alltickview => 1, -pointline => 0, -markers => [10, 9, 9], -xtickheight => 5, -ylongticks => 1, -ylongtickscolor => 'white', -xlongticks => 1, -xlongtickscolor => 'white', -width => 800, -height => 220, -yminvalue => $powermin, -ymaxvalue => $powermax, -xlabelskip => $xlabelskip, -colordata => [ qw(blue) ], #)->pack(qw / -fill both -expand 1 /); )->pack(); $chart2->enabled_gradientcolor(); $chart2->set_gradientcolor( -start_color => $color_start, -end_color => $color_end, -type => 'linear_vertical', ); $chart1 = $pane->Lines( -title => "Скорость ветра min: $speedmin max: $speedmax avg: $speedavg (m/s)", -titlefont => 'giant_rus', -textfont => 'tiny_rus', -titleheight => '5', -xlabelfont => 'tiny_rus', -ylabelfont => 'tiny_rus', -ylabel => 'V', -boxaxis => 1, -yticknumber => 5, -linewidth => 2, -bezier => 1, -alltickview => 1, -pointline => 0, -markers => [10, 9, 9], -xtickheight => 5, -ylongticks => 1, -ylongtickscolor => 'white', -xlongticks => 1, -xlongtickscolor => 'white', -width => 800, -height => 220, -yminvalue => $speedmin, -ymaxvalue => $speedmax, -xlabelskip => $xlabelskip, -colordata => [ qw(green) ], )->pack(); $chart1->enabled_gradientcolor(); $chart1->set_gradientcolor( -start_color => $color_start, -end_color => $color_end, -type => 'linear_vertical', ); } sub dates { my $dbfile = 'wind.db'; my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","",""); # my $sth; $sth = $dbh->prepare("select datetime('now','localtime', '-1 day'), datetime('now','localtime');"); $sth->execute(); while (my @result = $sth->fetchrow_array()) { $datemin = $result[0]; $datemax = $result[1]; } $sth->finish; $dbh->disconnect; } sub update_data{ ($speedmax, $speedmin, $speedavg) = (0,0,0); ($powermax, $powermin, $poweravg, $powersum) = (0,0,0,0); ($powersunmax, $powersunmin, $powersunavg, $powersunsum) = (0,0,0,0); @data0 =(); @data1 = (); @data2 = (); @data3 = (); @timeline = (); @speed = (); @power = (); @v_acc = (); @powersun = (); #print "sub datemax=$datemax datemin=$datemin\n"; my $count; my $dbfile = 'wind.db'; my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","",""); # my $sth; $sth = $dbh->prepare(" SELECT max(speed), min(speed), avg(speed), max(power), min(power), avg(power), sum(power/60/60*10)/1000, max(v_acc), min(v_acc), avg(v_acc), max(sun_power_output), min(sun_power_output), avg(sun_power_output), sum(sun_power_output/60/60*10)/1000 from wind where ((date < '$datemax') and (date > '$datemin')) ;"); $sth->execute(); while (my @result = $sth->fetchrow_array()) { ($speedmax, $speedmin, $speedavg, $powermax, $powermin, $poweravg, $powersum, $battmax, $battmin, $battavg, $powersunmax, $powersunmin, $powersunavg, $powersunsum) = @result; # = $result[0]; } $sth->finish; $speedavg= sprintf("%.2f", $speedavg); $poweravg = sprintf("%.3f", $poweravg); $powersum = sprintf("%.3f", $powersum); $battavg = sprintf("%.2f", $speedavg); $powersunavg = sprintf("%.3f", $powersunavg); $powersunsum = sprintf("%.3f", $powersunsum); $sth = $dbh->prepare(" SELECT strftime(\'%H:%M',date), speed, power, v_acc, sun_power_output FROM wind WHERE ((date < '$datemax') and (date > '$datemin')) ;"); $sth->execute(); $count = 0; while (my @result = $sth->fetchrow_array()) { push (@timeline,$result[0]); push (@speed,$result[1]); if ($result[2] > 30){ push (@power,$result[2]); } else { push (@power, 0); } push (@v_acc,$result[3]); push (@powersun,$result[4]); $count++; } $sth->finish; $dbh->disconnect; $xlabelskip = int($count/12); $xlabelskip = 1 if ($xlabelskip < 1); @data0 = (\@timeline, \@v_acc); @data1 = (\@timeline, \@speed); @data2 = (\@timeline, \@power); @data3 = (\@timeline, \@powersun); }