dockapps/wmWeather/Src/GrabWeather
2014-10-05 19:18:49 +01:00

213 lines
6.1 KiB
Perl
Executable file

#!/usr/bin/perl
#
# Grabs the latest local weather conditions from the National Weather Service (NWS).
# Uses the decoded METAR reports.
#
# Need to give the 4-character METAR station code on the Command Line. E.g.;
#
# GrabWeather KLAM
#
require "ctime.pl";
#
# Change to users home directory. We used to dump into /tmp
# but using home dir instead avoids multiple users interfering
# with one another. (Yeah, we could "unique-ize" the filenames, but
# this is easier for now...)
#
$home = (getpwuid($<))[7];
$ok = chdir() || chdir($home);
#
# Check to see if .wmWeatherReports exists.
# If not, make it and move to it.
#
if ( !(-e ".wmWeatherReports") ){
mkdir(".wmWeatherReports", 0775);
}
chdir(".wmWeatherReports");
$StationID = $ARGV[0];
$HTMLFileName = "$StationID.TXT";
$URL = "ftp://weather.noaa.gov/data/observations/metar/decoded/$HTMLFileName";
$DataFileName = "$StationID.dat";
#
# I think some of these wget command line options may cause problems
# for some people? Dont know why... (Perhaps they have a ~/.wgetrc file
# that overrides command line options?).
#
$GrabCmd = "wget --proxy=off --passive-ftp --tries 0 -q -O $home/.wmWeatherReports/$StationID.TXT $URL";
system "$GrabCmd";
#
# Parse HTML File.
#
$Temp = -999.0;
$Chill = -999.0;
$DewPnt = -999.0;
$Pressure = -999.0;
$Hum = -999.0;
$Flag = 0;
open(TmpFile, "$HTMLFileName");
while (<TmpFile>){
chop;
if ($Flag == 0) { $StationInfo = $_; };
if ($Flag == 1) { $UpdateTime = $_; };
if ($_ =~ /^Sky conditions:/ ){ $SkyConditions = $_; $SkyConditions =~ s/Sky conditions: (.*)/\1/; }
if ($_ =~ /^Temperature:/ ){ $Temp = $_; $Temp =~ s/Temperature:\s*(\-{0,1}[0-9.]{1,}).*/\1/; }
if ($_ =~ /^Windchill:/ ){ $Chill = $_; $Chill =~ s/Windchill:\s*(\-{0,1}[0-9.]{1,}).*/\1/; }
if ($_ =~ /^Dew Point:/ ){ $DewPnt = $_; $DewPnt =~ s/Dew Point:\s*(\-{0,1}[0-9.]{1,}).*/\1/; }
if ($_ =~ /^Pressure \(.*\):/ ){ $Pressure = $_; $Pressure =~ s/Pressure \(.*\):\s*([0-9.]{2,}).*/\1/; }
if ($_ =~ /^Relative Humidity:/ ){ $Hum = $_; $Hum =~ s/Relative Humidity:\s*(\d{1,})\%.*/\1/; }
if ($_ =~ /^ob: / ){ $CodedMETAR = $_; $CodedMETAR =~ s/ob: (.*)/\1/; }
++$Flag;
}
close(TmpFile);
#
# Isolate the Wind groups out of the coded METAR report.
# There may be two groups - the normal one and a variability set.
#
$WindGroup = $CodedMETAR;
$WindGroup =~ s/ RMK\s.*$//;
$VarWindGroup = $WindGroup;
if ($WindGroup =~ /.*\s\w{3}\d{2,3}KT\s\d{3}V\d{3}\s.*/ ) {
$VarWindGroup =~ s/.*\s\w{3}\d{2,3}KT\s(\d{3}V\d{3})\s.*/\1/;
$VarFlag = 1;
} elsif ($WindGroup =~ /.*\s\w{3}\d{2,3}MPS\s\d{3}V\d{3}\s.*/ ) {
$VarWindGroup =~ s/.*\s\w{3}\d{2,3}MPS\s(\d{3}V\d{3})\s.*/\1/;
$VarFlag = 1;
} elsif ($WindGroup =~ /.*\s\w{3}\d{2,3}G\d{2,3}KT\s(\d{2,3}V\d{2,3})\s.*/ ) {
$VarWindGroup =~ s/.*\s\w{3}\d{2,3}G\d{2,3}KT\s(\d{2,3}V\d{2,3})\s.*/\1/;
$VarFlag = 1;
} elsif ($WindGroup =~ /.*\s\w{3}\d{2,3}G\d{2,3}MPS\s(\d{2,3}V\d{2,3})\s.*/ ) {
$VarWindGroup =~ s/.*\s\w{3}\d{2,3}G\d{2,3}MPS\s(\d{2,3}V\d{2,3})\s.*/\1/;
$VarFlag = 1;
} else {
$VarWindGroup = "";
$VarFlag = 0;
}
$Direction1 = $VarWindGroup; $Direction1 =~ s/(\d{3})V\d{3}/\1/;
$Direction2 = $VarWindGroup; $Direction2 =~ s/\d{3}V(\d{3})/\1/;
$GustFlag = 0;
if ($WindGroup =~ /.*\s\w{3}\d{2,3}KT\s.*/ ) {
$WindGroup =~ s/.*\s(\w{3}\d{2,3}KT)\s.*/\1/;
$Direction = $WindGroup; $Direction =~ s/(\w{3})\d{2,3}KT/\1/;
$Speed = $WindGroup; $Speed =~ s/\w{3}(\d{2,3})KT/\1/;
} elsif ($WindGroup =~ /.*\s\w{3}\d{2,3}MPS\s.*/ ) {
$WindGroup =~ s/.*\s(\w{3}\d{2,3}MPS)\s.*/\1/;
$Direction = $WindGroup; $Direction =~ s/(\w{3})\d{2,3}MPS/\1/;
$Speed = $WindGroup; $Speed =~ s/\w{3}(\d{2,3})MPS/\1/;
$Speed *= 1.942;
} elsif ($WindGroup =~ /.*\s\w{3}\d{2,3}G\d{2,3}KT\s.*/ ) {
$WindGroup =~ s/.*\s(\w{3}\d{2,3}G\d{2,3}KT)\s.*/\1/;
$Direction = $WindGroup; $Direction =~ s/(\w{3})\d{2,3}G\d{2,3}KT/\1/;
$Speed1 = $WindGroup; $Speed1 =~ s/\w{3}(\d{2,3})G\d{2,3}KT/\1/;
$Speed2 = $WindGroup; $Speed2 =~ s/\w{3}\d{2,3}G(\d{2,3})KT/\1/;
$GustFlag = 1;
} elsif ($WindGroup =~ /.*\s\w{3}\d{2,3}G\d{2,3}MPS\s.*/ ) {
$WindGroup =~ s/.*\s(\w{3}\d{2,3}G\d{2,3}MPS)\s.*/\1/;
$Direction = $WindGroup; $Direction =~ s/(\w{3})\d{2,3}G\d{2,3}MPS/\1/;
$Speed1 = $WindGroup; $Speed1 =~ s/\w{3}(\d{2,3})G\d{2,3}MPS/\1/;
$Speed2 = $WindGroup; $Speed2 =~ s/\w{3}\d{2,3}G(\d{2,3})MPS/\1/;
$Speed1 *= 1.942; $Speed2 *= 1.942;
$GustFlag = 1;
} else {
$WindGroup = "";
}
#
# Get the Time out of the coded Metar Report.
#
$UniversalTime = $CodedMETAR;
if ($UniversalTime =~ /$StationID \d{1,2}\d{2}\d{2}Z/ ){
$UniversalTime =~ s/$StationID (\d{1,2})(\d{2})(\d{2})Z .*/\2:\3/;
} else {
$UniversalTime = "99:99";
}
#
# Write out the stuff we need to the Data File. This is the file that will
# be read by wmWeather.
#
if ($Flag > 0){
open(TmpFile, ">$DataFileName");
print TmpFile "$StationInfo\n";
print TmpFile "$UpdateTime\n";
print TmpFile "$SkyConditions\n";
print TmpFile "$UniversalTime\n";
print TmpFile "$Temp\n";
print TmpFile "$DewPnt\n";
print TmpFile "$Chill\n";
print TmpFile "$Pressure\n";
print TmpFile "$Hum\n";
if ($Direction eq "" ){
print TmpFile "-9999\n";
} elsif ($Direction =~ /VRB/ ){
print TmpFile "999\n";
} elsif ($VarFlag) {
$Direction += 0;
print TmpFile "-$Direction\n";
} else {
$Direction += 0;
print TmpFile "$Direction\n";
}
if ($WindGroup eq "" ) {
print TmpFile "-9999\n";
} elsif ($GustFlag) {
$AvgSpeed = ($Speed1 + $Speed2)/2.0;
$AvgSpeed *= 1.15155;
print TmpFile "-$AvgSpeed\n";
} else {
$Speed += 0;
$Speed *= 1.15155;
print TmpFile "$Speed\n";
}
close(TmpFile);
}