diff options
author | Adrian C. (anrxc) <anrxc@sysphere.org> | 2009-07-29 18:46:43 +0200 |
---|---|---|
committer | Adrian C. (anrxc) <anrxc@sysphere.org> | 2009-07-29 18:46:43 +0200 |
commit | 3eefddf8ab4ef32f2db34c4769609322063c6bb5 (patch) | |
tree | 28021f42e2d8518173a4b58c617eda4f61789249 | |
parent | 95dd8de34d404e10a05169e381f382881097af89 (diff) | |
download | vicious-legacy-3eefddf8ab4ef32f2db34c4769609322063c6bb5.tar.xz |
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.
-rw-r--r-- | weather.lua | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/weather.lua b/weather.lua new file mode 100644 index 0000000..30224b6 --- /dev/null +++ b/weather.lua @@ -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 +-- }}} |