How to integrate pywws with various weather services

This guide gives brief instructions on how to use pywws with some other weather services and software. It is not comprehensive, and most services (such as Twitter) are covered in more detail elsewhere.

YoWindow

YoWindow is a weather display widget that can display data from an internet source, or from your weather station. To display data from your station pywws needs to write to a local file, typically every 48 seconds when new data is received. This is easy to do:

  1. Stop all pywws software

  2. Copy the yowindow.xml example template to your text template directory.

  3. If you haven’t already done so, edit weather.ini and set the local_files entry in the [paths] section to a suitable directory for your yowindow file.

  4. Add the yowindow template to the [live] tasks in weather.ini. Set its flags to 'L' so the result is copied to your local directory instead of being uploaded to an ftp site:

    [live]
    text = [('yowindow.xml', 'L')]
    
  5. Restart pywws live logging.

You can check the file is being updated every 48 seconds by using more or cat to dump it to the screen.

Finally configure yowindow to use this file. See http://yowindow.com/pws_setup.php for instructions on how to do this.

Twitter

See How to configure pywws to post messages to Twitter for full instructions.

Other “services”

The remaining weather service uploads are handled by modules in the pywws.service sub-package.

pywws.service.cwop Upload weather data to Citizen Weather Observer Program.
pywws.service.metoffice Upload weather data to UK Met Office “WOW”.
pywws.service.mqtt Upload weather data to MQTT message broker.
pywws.service.openweathermap Upload weather data to Open Weather Map.
pywws.service.pwsweather Upload weather data to PWS Weather.
pywws.service.temperaturnu Upload current temperature to temperatur.nu.
pywws.service.underground Upload data to Weather Underground.
pywws.service.wetterarchivde Upload weather data to wetter.com.

These each use a separate thread to upload the data so that a slow or not responding service doesn’t delay other processing or uploads.

The service uploaders are all used in a similar fashion:

  1. Create an account with the service.

  2. Stop all pywws software.

  3. Run the service module directly to initialise its entry in weather.ini. For example:

    python -m pywws.service.underground /home/jim/weather/data
    
  4. Edit weather.ini and add your account details to the appropriate section (e.g. [underground]).

  5. Run the service module directly (with high verbosity) to make sure your account details are correct:

    python -m pywws.service.underground -vvv /home/jim/weather/data
    

    Each service’s server software responds differently to correct or incorrect uploads. You should be able to tell from the response if it was successful or not.

  6. Edit weather.ini and add the service to the [logged] (and optionally [live]) sections, e.g.:

    [logged]
    services = ['underground']
    
    [live]
    services = ['underground']
    
  7. Restart pywws live logging.

Many of the services will upload the last seven days of data (referred to as “catchup” mode) when first run. This may take an hour or more, but the use of separate threads means this doesn’t adversely affect the rest of pywws.

Writing your own uploader

If you’d like to send data to a service which is not (yet) included in pywws you can write your own uploader module and put it in your modules directory. You should start by copying one of the existing modules from pywws.service. Choose one with an API most like the service you want to upload to. Give the module a one word lowercase name that will be used as the uploader service name.

Testing the module is a little different from before:

python ~/weather/modules/myservice.py -vvv ~/weather/data

where ~/weather/modules/myservice.py is the full path of your new module.

Note what sort of response you get from the server. Some servers, such as Weather Underground, send a single word 'success' response to indicate success, and a longer string indicating the cause of any failure. Other servers use HTTP response codes to indicate failure. Your module’s upload_data method must return a (bool, str) tuple where the bool value indicates success (if True) and the str value contains any message from the server. (If the server returns no message this string should be set to 'OK'.) Under normal operation pywws will log this message whenever it changes.

Once your uploader is working you could contribute it to pywws if it’s likely to be useful to other people. Don’t forget to document it fully, then either send it to Jim or create a GitHub pull request. See Contributing to pywws for instructions on doing this.


Comments or questions? Please subscribe to the pywws mailing list http://groups.google.com/group/pywws and let us know.