blog home »

4200wx.pl

plain text source
hide syntax highlighting
hide line numbers


1    #!/usr/local/bin/perl -w
2   
3      # $Id: 4200wx.pl 2 2008-07-10 00:05:58Z yaakov $
4   
5      # Current Weather Condition on an HP 4200 Printer 
6      
7      # This program gets METAR weather conditions from teh NOAA webiste and uses
8      # Geo::METAR to parse the result.  It then hard formats the result so it
9      # looks reasonably good on the 4200's display.
10     #
11     # The program need to know the four-letter ICAO airport code for your area,
12     # as well as the IP address of the target printer.  I run this program as a
13     # cron job at 10 minute intervals.  You can change the "WEATHER CONDITIONS"
14     # heading to reflect your cities name.  You will have to pad it properly
15     # to center it.
16     #
17     # THIS PROGRAM IS PROVIDED WITH NO WARRANTY OF ANY KIND EXPRESSED OR IMPLIED
18     # THE AUTHOR CANNOT BE RESPONSIBLE FOR THE EFFECTS OF THIS PROGRAM
19     # IF YOU ARE UNCERTAIN ABOUT THE ADVISABILITY OF USING IT, DO NOT!
20     #
21     # Yaakov (http://kovaya.com/)
22  
23   use strict;
24  
25   use LWP::Simple;
26   use IO::Socket;
27  
28   use Geo::METAR;
29   my $m = new Geo::METAR;
30  
31   my $wx = getmetar('KORD');          # Put your ICAO code here
32   setdisplay($wx'169.254.10.10');   # This should be your printer's IP
33  
34   sub getmetar {
35     my $icao = shift;
36     my $page = get("http://weather.noaa.gov/cgi-bin/mgetmetar.pl?cccc=$icao"or exit;
37  
38     $page =~ /($icao .+)/;
39     my $report = $1;
40  
41     $m->metar($report);
42  
43     my $wx;
44       $wx = " WEATHER CONDITIONS ";   # This can be edited to localize it.
45                                       # Keep it the same length and center
46                                       # the text in the quotes with spaces.
47  
48       my $temp = $m->TEMP_F."F/".$m->TEMP_C."C";
49       my $pad = (20 - length $temp)/2;
50       $wx .= " " x $pad.$temp." " x $pad;
51  
52       my $vis = $m->VISIBILITY;
53       $vis =~ /(\d+)/;
54       my $atmos = "visibility $1 mi.";
55       $pad = (20 - length $atmos)/2;
56       $wx .= " " x $pad.$atmos." " x $pad;
57  
58       my $wspd = $m->WIND_MPH;
59       my $wind = "Wind $wspd mph";
60       $pad = (20 - length $wind)/2;
61       $wx .= " " x $pad.$wind." " x $pad;
62       
63   return $wx;
64  
65   }
66  
67   sub setdisplay {
68  
69     my $rdymsg = shiftmy $peeraddr = shift;
70     my $socket = IO::Socket::INET->new(
71         PeerAddr  => $peeraddr,
72         PeerPort  => "9100",
73         Proto     => "tcp",
74         Type  => SOCK_STREAM
75     ) or die "Could not create socket: $!";
76  
77   my $data = <<EOJ
78   \e%-12345X\@PJL JOB
79   \@PJL RDYMSG DISPLAY="$rdymsg"
80   \@PJL EOJ
81   \e%-12345X
82   EOJ
83   ;
84  
85     print $socket $data;
86  
87   }