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:
parent
95dd8de34d
commit
3eefddf8ab
|
@ -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
|
||||
-- }}}
|
Loading…
Reference in New Issue