aboutsummaryrefslogtreecommitdiff
path: root/weather.lua
diff options
context:
space:
mode:
authorAdrian C. (anrxc) <anrxc@sysphere.org>2009-07-29 18:46:43 +0200
committerAdrian C. (anrxc) <anrxc@sysphere.org>2009-07-29 18:46:43 +0200
commit3eefddf8ab4ef32f2db34c4769609322063c6bb5 (patch)
tree28021f42e2d8518173a4b58c617eda4f61789249 /weather.lua
parent95dd8de34d404e10a05169e381f382881097af89 (diff)
downloadvicious-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.
Diffstat (limited to 'weather.lua')
-rw-r--r--weather.lua66
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
+-- }}}