summaryrefslogtreecommitdiffstats
path: root/weather.lua
diff options
context:
space:
mode:
Diffstat (limited to 'weather.lua')
-rwxr-xr-xweather.lua121
1 files changed, 121 insertions, 0 deletions
diff --git a/weather.lua b/weather.lua
new file mode 100755
index 0000000..9364167
--- /dev/null
+++ b/weather.lua
@@ -0,0 +1,121 @@
+#!/usr/bin/env lua
+-- load the http socket module
+http = require("socket.http")
+-- load the json module
+json = require("json")
+
+api_url = "http://api.openweathermap.org/data/2.5/weather?"
+
+-- http://openweathermap.org/help/city_list.txt , http://openweathermap.org/find
+cityid = "2878676"
+
+-- metric or imperial
+cf = "metric"
+
+-- get an open weather map api key: http://openweathermap.org/appid
+apikey = "3df14dd57e705f30c04157c2f6260939"
+
+-- measure is °C if metric and °F if imperial
+measure = '°' .. (cf == 'metric' and 'C' or 'F')
+wind_units = (cf == 'metric' and 'kph' or 'mph')
+
+-- Unicode weather symbols to use
+icons = {
+ ["01"] = "☀️",
+ ["02"] = "🌤",
+ ["03"] = "🌥",
+ ["04"] = "☁",
+ ["09"] = "🌧",
+ ["10"] = "🌦",
+ ["11"] = "🌩",
+ ["13"] = "🌨",
+ ["50"] = "🌫",
+}
+
+currenttime = os.date("!%Y%m%d%H%M%S")
+
+file_exists = function (name)
+ f=io.open(name,"r")
+ if f~=nil then
+ f:close()
+ return true
+ else
+ return false
+ end
+end
+
+if file_exists("/etc/conky/weather.json") then
+ cache = io.open("/etc/conky/weather.json","r")
+ data = json.decode(cache:read())
+ cache:close()
+ timepassed = os.difftime(currenttime, data.timestamp)
+else
+ timepassed = 6000
+end
+
+makecache = function (s)
+ cache = io.open("/etc/conky/weather.json", "w+")
+ s.timestamp = currenttime
+ save = json.encode(s)
+ cache:write(save)
+ cache:close()
+end
+
+if timepassed < 3600 then
+ response = data
+else
+ print (("%sid=%s&units=%s&APPID=%s"):format(api_url, cityid, cf, apikey))
+ weather = http.request(("%sid=%s&units=%s&APPID=%s"):format(api_url, cityid, cf, apikey))
+ print(weather)
+ if weather then
+ response = json.decode(weather)
+ makecache(response)
+ else
+ response = data
+ end
+end
+
+math.round = function (n)
+ return math.floor(n + 0.5)
+end
+
+degrees_to_direction = function (d)
+ val = math.round(d/22.5)
+ directions={"N","NNE","NE","ENE",
+ "E","ESE", "SE", "SSE",
+ "S","SSW","SW","WSW",
+ "W","WNW","NW","NNW"}
+ return directions[val % 16]
+end
+
+temp = response.main.temp
+conditions = response.weather[1].description
+icon2 = response.weather[1].id
+icon = response.weather[1].icon:sub(1, 2)
+humidity = response.main.humidity
+wind = response.wind.speed
+deg = degrees_to_direction(response.wind.deg)
+sunrise = os.date("%H:%M %p", response.sys.sunrise)
+sunset = os.date("%H:%M %p", response.sys.sunset)
+
+conky_text = [[
+${font Symbola:size=48}%s ${voffset -10}${font :size=20}${color1}%s${font}${voffset -5}%s${color}
+${alignc}${voffset 28} %s
+
+${alignc}Humidity: ${color1}%s%%${color}
+${alignc}Wind: ${color1}%s%s %s${color}
+
+${alignc}${font Symbola:size=20}─⯊─${font}
+${alignc}${color1}%s${color} | ${color1}%s${color}
+]]
+io.write((conky_text):format(icons[icon],
+ math.round(temp),
+ measure,
+ conditions,
+ humidity,
+ math.round(wind),
+ wind_units,
+ deg,
+ sunrise,
+ sunset)
+)