So, at some point in the year between then and now, another guy rewrote it, using Google's weather API, which gives you XML, which he parses with XML::DOM.
I've moved the parts into subroutines, made it quiet for non-interactive uses (like crontab) and did a few minor checks. Also, I made it talk to Twitter, but that code isn't ready for the world yet.
(Links are in the code)
#!/usr/bin/perl
# $Id: hpsetdisp.pl 11 2006-03-22 01:21:03Z yaakov $
# hpsetdisp.pl
# Connects to a JetDirect equipped HP printer and uses
# HP's control language to set the ready message on the
# LCD display. Takes an IP address and message on the
# command line. My favorite message is "INSERT COIN".
# Keep in mind the limitations of the display when composing
# your clever verbiage.
#
# THIS PROGRAM IS PROVIDED WITH NO WARRANTY OF ANY KIND EXPRESSED OR IMPLIED
# THE AUTHOR CANNOT BE RESPONSIBLE FOR THE EFFECTS OF THIS PROGRAM
# IF YOU ARE UNCERTAIN ABOUT THE ADVISABILITY OF USING IT, DO NOT!
#
# Yaakov (http://kovaya.com/ )
#
# Modified by Garrett Hoofman
# 10/18/2007
# http://www.visionsofafar.com
# Modified by David Jacoby
# 12/10/2008
# http://varlogrant.blogspot.com/
use strict ;
use warnings ;
use 5.010 ;
use Getopt::Long ;
use IO::Interactive qw{ interactive } ;
use IO::Socket ;
use XML::DOM ;
use subs qw{ get_weather send_to_printer } ;
my $zip = '' ;
my $printer = '' ;
my $interactive = '' ;
my $rdymsg = "Ready" ;
GetOptions( 'zipcode=s' => \$zip,
'printer=s' => \$printer,
'interactive' => \$interactive, ) ;
chomp $printer ;
$zip !~ /\d/ and exit 0 ;
my $weather = get_weather $zip ;
$rdymsg = $weather =~ m{\d}mx ? $weather : '' ;
if ( $interactive ) {
say $rdymsg ;
}
if ( $printer ) {
send_to_printer $printer , $rdymsg ;
}
########## ########## ########## ########## ########## ########## ##########
sub get_weather {
my $rdymsg ;
my $parser = XML::DOM::Parser->new() ;
my $file = 'http://www.google.com/ig/api?weather=XXXXX&hl=en' ;
my $zip = shift ;
$zip =~ s{(\d{5})}{}mx ;
$zip = $1 ;
$file =~ s/XXXXX/$zip/mx ;
my $doc = $parser->parsefile( $file ) ;
for my $species ( $doc->getElementsByTagName( 'current_conditions' ) ) {
$rdymsg =
$species->getElementsByTagName( 'temp_f' )->item( 0 )
->getAttribute( 'data' )
. " Degrees F "
. $species->getElementsByTagName( 'condition' )->item( 0 )
->getAttribute( 'data' ) ;
}
return $rdymsg ;
}
########## ########## ########## ########## ########## ########## ##########
########## ########## ########## ########## ########## ########## ##########
sub send_to_printer {
my $printer = shift ;
my $msg = shift ;
my $socket = IO::Socket::INET->new( PeerAddr => $printer,
PeerPort => "9100",
Proto => "tcp",
Type => SOCK_STREAM
) or die "Could not create socket: $!" ;
my $data = <<EOJ
\e%-12345X\@PJL JOB
\@PJL RDYMSG DISPLAY="$rdymsg"
\@PJL EOJ
\e%-12345X
EOJ
;
print $socket $data ;
}
########## ########## ########## ########## ########## ########## ##########
No comments:
Post a Comment