I’ve operated a [Weather Underground](http://www.wunderground.com/) [Personal Weather Station](http://www.wunderground.com/weatherstation/about.asp) (PWS) [[KMEBERWI7](http://www.wunderground.com/personal-weather-station/dashboard?ID=KMEBERWI7#history)] off-and-on (hardware issues notwithstanding) for as long as I can remember, and I thought it was about time to finally do an Alfred↔PWS mashup. My personal requirements were quite modest:
– 5 reading history (including most current)
– Ability to copy all the current day’s readings as CSV
– Quickly get to my PWS data w/o a bookmark
[Alfred](http://www.alfredapp.com/) makes all this possible via customized workflows that support many scripting environments, including Python. Here’s a quick preview before going into the details:
It’s a fairly simple workflow:
– Grab today’s “raw” data (and clean it up)
– Select the last 5 entries
– Connect a URL action and use the full CSV as clipboard contents for any copy action
The full Python code is below and [on github](https://github.com/hrbrmstr/alfred-pws), and you can hit that github link or [Packal](http://www.packal.org/workflow/pws-history) for the compiled workflow. It’s been tested on Mavericks, but more eyes are always welcome.
Customizing the workflow for your own/favorite PWS is as simple as changing the `station` variable.
There’s plenty of room for improvement, including
– performing a background download of the PWS data
– using a sparkline graph as the icon
– customizing which data fields are returned
– providing commands to get/set your/favorite PWS
– providing options for the “copy” return type (currently CSV, but potentially XML or JSON)
Don’t hesitate to post issues or pull requests and check back for updates (as I’m sure some of those improvements will be making their way into the workflow).
import re import csv import sys import datetime from lib import requests from workflow import Workflow, web from StringIO import StringIO # retrieve today's history for station "X" def get_wx_data(station): tdy = datetime.datetime.today() # construct the URL for "today" url = 'http://www.wunderground.com/weatherstation/WXDailyHistory.asp?ID=%s&day=%d&month=%d&year=%d&graphspan=day&format=1' % (station, tdy.day, tdy.month, tdy.year) r = web.get(url) # get the data r.raise_for_status() # report any errors return(re.sub("\n\n", "\n", re.sub("^\n|<br>", "", r.text))) # clean up the output & pass it back to main control # main workflow control def main(wf): station = "KMEBERWI7" # change to use your own/favorite station resp = get_wx_data(station) # only want last 5 readings, change this to whatever you want max = 5 i=0 for row in reversed(list(csv.reader(StringIO(resp)))): wf.add_item(title=row[0] + " | " + row[1] + "F | " + row[3] + "in | " + row[8] + "%", subtitle=station, # so you know where you're getting data from arg=station, # passed as query to URL action - http://www.wunderground.com/personal-weather-station/dashboard?ID={query}#history valid=True, # it can be opened in the browser icon="/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/ToolbarInfo.icns", # info icon copytext=resp) # get the whole CSV file in a copy if (i==max): break i += 1 # output to alfred wf.send_feedback() if __name__ == u"__main__": wf = Workflow() sys.exit(wf.run(main))
One Trackback/Pingback
[…] history (including most current) Ability to copy all the current day’s readings as […], Security Bloggers Network, hrbrmstr, […]