Weather widget written and included, by request.

The widget uses 'wget' to grab the information. The Lua socket library
would be nicer, of course, but let's not introduce external libraries
at this point. Wget will write to stdout with a timeout of 5s. This
has the potential to block everything else in case of problems... But
let's not introduce temporary files at this point. Besides having to
handle files, operations while running on battery power are to be
avoided.
This commit is contained in:
Adrian C. (anrxc) 2009-07-29 18:46:43 +02:00
parent 95dd8de34d
commit 3eefddf8ab
1 changed files with 66 additions and 0 deletions

66
weather.lua Normal file
View File

@ -0,0 +1,66 @@
----------------------------------------------------------
-- Licensed under the GNU General Public License version 2
-- * Copyright (C) 2009 Adrian C. <anrxc_sysphere_org>
----------------------------------------------------------
-- {{{ Grab environment
local io = { popen = io.popen }
local string = { match = string.match }
-- }}}
-- Weather: provides weather information for a requested station
module("vicious.weather")
-- {{{ Weather widget type
function worker(format, station)
-- US National Oceanic and Atmospheric Administration
-- * Station codes: http://www.rap.ucar.edu/weather/surface/stations.txt
local noaa = "http://weather.noaa.gov/pub/data/observations/metar/decoded/"
-- Get info from a weather station
local f = io.popen("wget --timeout=5 -o /dev/null -O - "..noaa..station..".TXT")
local ws = f:read("*all")
f:close()
-- Setup tables
local weather = {
["{city}"] = "N/A",
["{wind}"] = "N/A",
["{windmph}"] = "N/A",
["{sky}"] = "N/A",
["{weather}"] = "N/A",
["{tempf}"] = "N/A",
["{tempc}"] = "N/A",
["{humid}"] = "N/A",
["{press}"] = "N/A"
}
-- Check if there was a timeout or a problem with the station
if ws == nil then
return weather
else
weather["{city}"] = -- City and/or area
string.match(ws, "^(.+)%,.*%([%u]+%)") or weather["{city}"]
weather["{wind}"] = -- Wind direction and degrees if available
string.match(ws, "Wind:[%s][%a]+[%s][%a]+[%s](.+)[%s]at.+$") or weather["{wind}"]
weather["{windmph}"] = -- Wind speed in MPH if available
string.match(ws, "Wind:[%s].+[%s]at[%s]([%d]+)[%s]MPH") or weather["{windmph}"]
weather["{sky}"] = -- Sky conditions if available
string.match(ws, "Sky[%s]conditions:[%s](.-)[%c]") or weather["{sky}"]
weather["{weather}"] = -- Weather conditions if available
string.match(ws, "Weather:[%s](.-)[%c]") or weather["{weather}"]
weather["{tempf}"] = -- Temperature in fahrenheit
string.match(ws, "Temperature:[%s]([%d%.]+).*[%c]") or weather["{tempf}"]
weather["{tempc}"] = -- Temperature in celsius
string.match(ws, "Temperature:[%s][%d%.]+[%s]F[%s]%(([%d%.]+)[%s]C%)[%c]") or weather["{tempc}"]
weather["{humid}"] = -- Relative humidity in percent
string.match(ws, "Relative[%s]Humidity:[%s]([%d]+)%%") or weather["{humid}"]
weather["{press}"] = -- Pressure in hPa
string.match(ws, "Pressure[%s].+%((.+)[%s]hPa%)") or weather["{press}"]
end
return weather
end
-- }}}