#! /usr/bin/perl use strict; use diagnostics; use Tk; ##################################################### # Stellt Temperaturen oder Zahlen aus einem # # einfachen Logfile grafisch in einer Kurve dar # # # # (c) Martin Holz # # http://www.perl-newbie.de # ##################################################### # Pfad zum Logfile my $logfile = "/home/martin/.temperature.log"; # Zoom-Faktor my $zoom = 2; # Breite der Anzeige my $graph_width = 10000; # Logfile einlesen und in Arrays aufteilen ... open (LOG, "<$logfile"); my @temperature_log = ; close (LOG); my (@max_temp, @min_temp, @akt_temp); foreach (@temperature_log) { if ($_ =~ m/(\d\d\.\d) (\d\d\.\d) (\d\d\.\d)/i) { push (@max_temp, $1); push (@min_temp, $2); push (@akt_temp, $3); } } # Jetzt wird gezeichnet my $graph_window = MainWindow -> new; $graph_window -> title ("TempWatch by Martin Holz \"); my $button_bar = $graph_window -> Frame (-relief => 'raise') -> pack (-anchor => 'nw'); $button_bar -> Button (-text => 'Beenden', -command => sub {exit}) -> grid (-column => 0, -row => 0); $button_bar -> Button (-text => 'Als PostScript speichern', -command => \&saveas) -> grid (-column => 1, -row => 0); my $canvas = $graph_window -> Scrolled('Canvas') -> pack(-anchor => 'n'); my ($graph_max, $graph_min, $graph_akt, $v_scale, $v_scale_text); my $v_zero = 200; my $last_max_degree = 200; my $last_min_degree = 200; my $last_akt_degree = 200; my $timestamp = 30; my $last_timestamp = 30; my $meridian = $canvas -> createLine(0,$v_zero,$graph_width,$v_zero); my $meridian_text = $canvas -> createText(15,210, -text => "0°C"); # Legende $canvas -> createLine(10,240,20,240, -fill => 'red'); $canvas -> createText(30,240, -text => "= maximale Temperatur", -anchor => 'w'); $canvas -> createLine(10,255,20,255, -fill => 'green'); $canvas -> createText(30,255, -text => "= minimale Temperatur", -anchor => 'w'); $canvas -> createLine(10,270,20,270, -fill => 'blue'); $canvas -> createText(30,270, -text => "= aktuelle Temperatur", -anchor => 'w'); for (my $i = 200 - (10*$zoom); $i > 0; $i = $i - (10*$zoom)) { $v_scale = $canvas -> createLine(0,$i,$graph_width,$i, -fill => 'gray80'); my $scale_degree = (200 - $i)/$zoom; $v_scale_text = $canvas -> createText(15,$i, -text => "$scale_degree°C"); } my $cnt = -1; foreach (@akt_temp) { $cnt++; $timestamp = $timestamp+(10*$zoom); chomp $max_temp[$cnt]; chomp $min_temp[$cnt]; chomp $akt_temp[$cnt]; my $max_degree = $max_temp[$cnt] * $zoom; $max_degree = $v_zero - $max_degree; my $min_degree = $min_temp[$cnt] * $zoom; $min_degree = $v_zero - $min_degree; my $akt_degree = $akt_temp[$cnt] * $zoom; $akt_degree = $v_zero - $akt_degree; # Kurven zeichnen ... $graph_max = $canvas -> createLine($last_timestamp,$last_max_degree,$timestamp,$max_degree,-fill => 'red'); $graph_min = $canvas -> createLine($last_timestamp,$last_min_degree,$timestamp,$min_degree,-fill => 'green'); $graph_akt = $canvas -> createLine($last_timestamp,$last_akt_degree,$timestamp,$akt_degree,-fill => 'blue'); $last_max_degree = $max_degree; $last_min_degree = $min_degree; $last_akt_degree = $akt_degree; $last_timestamp = $timestamp; } MainLoop; sub saveas { my $save_file = $graph_window -> getSaveFile ( -defaultextension => ".ps", -filetypes => [['PostScript', '.ps'],], -initialfile => "temperatures_graph.ps", ); my $postscript = $canvas->postscript(-file => "$save_file"); }