Twitter Weather Station

Posted by Fred C (W6BSD) on Jul 16 2011

Create your own weather station on Twitter.

Installation

With a few simple steps and the following code, you can have weather information for where you live automatically updated to your twitter account. The following steps and python program are for a Unix/Linux/Mac environment. I am sure they can easily be adapted to Windows.

Save the following program on you computer under the name of your choice. You can also choose to download this program from here. Don't forget to set the execute mode for this file with:

chmod a+x
/usr/local/bin/twitter_weather.py

Update the variable USERNAME and PASSWORD with the username and password of your twitter account.

Update the variable URL with the XML file for your city. A list of supported cities can be found at http://www.weather.gov/xml/current_obs/. Be careful to use the XML and not the RSS link

Create a crontab entry in you system to update the weather every few hours. A reasonable value will be every 6 hours.

1 */6 * * * /usr/local/bin/twitter_weather.py

Now you have weather information updated 4 times a day.

The source code

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from xml.etree import ElementTree as ET
import urllib2
import twitter

# information that need to be modified
# Source for the city codes at http://www.weather.gov/xml/current_obs/
URL = 'http://www.weather.gov/xml/current_obs/KSFO.xml'
USERNAME='weathertest'
PASSWORD='*******'
# end of modifiable informtion

class Weather:
    def __init__(self, url):
        fd = urllib2.urlopen(url)
        tree = ET.parse(fd)
        self.root = tree.getroot()
        fd.close()

    def get(self, key):
        return self.root.find(key).text

    def temp_f(self):
        return self.get('temp_f')

    def weather(self):
        return self.get('weather')

    def wind_dir(self):
        return self.get('wind_dir')

    def humidity(self):
        return self.get('relative_humidity')

    def wind_degrees(self):
        return self.get('wind_degrees')

    def wind_mph(self):
        return self.get('wind_mph')

    def pressure(self):
        return self.get('pressure_mb')

    def twit(self):
        weather = "%s %sF" % (self.weather(), self.temp_f())
        pressure = "Pressure: %s mb" % (self.pressure())
        humidity = "Humidity: %s" % (self.humidity())
        wind = "Wind: %s %s\" %s MPH" % (self.wind_dir(),
                                         self.wind_degrees(),
                                         self.wind_mph())
        return ' - '.join((weather, pressure, humidity, wind))

def main():
    try:
        weather = Weather(URL)
        tw = twitter.Api(username=USERNAME, password=PASSWORD)
        tw.PostUpdate(weather.twit().decode('utf-8'))
    except Exception, why:
        print str(why)

if __name__ == "__main__":
    main()

If you are using this program you can post a comment here or send me an email and I will follow your weather station from the ones I am already running on twitter.

Some examples

Twitter Weather Bot

Here is the Sockeris machine based on a 100 Mhz 486 class processor. That I use to run all the twitter weather stations I manage. It's run OpenBSD embedded in a 64Mb flash card and Python 2.7 and easily manage a dozen of twitter accounts.


 Python      Twitter