Source code for pywws.YoWindow
#!/usr/bin/env python
"""
Generate YoWindow XML file.
usage: python pywws/YoWindow.py [options] data_dir output_file
options are:
-h or --help display this help
-v or --verbose increase amount of reassuring messages
data_dir is the root directory of the weather data
output_file is the YoWindow XML file to be written
"""
import getopt
import logging
import sys
from datetime import datetime, timedelta
import DataStore
from Logger import ApplicationLogger
from TimeZone import Local, utc
from WeatherStation import apparent_temp
[docs]class YoWindow(object):
"""
Class to write YoWindow XML file.
For file spec see http://yowindow.com/doc/yowindow_pws_format.xml
"""
def __init__(self, calib_data):
self.logger = logging.getLogger('pywws.YoWindow')
self.data = calib_data
# compute local midnight
self.midnight = datetime.utcnow().replace(tzinfo=utc).astimezone(
Local).replace(hour=0, minute=0, second=0).astimezone(
utc).replace(tzinfo=None)
self.day = timedelta(hours=24)
self.hour = timedelta(hours=1)
self.last_update = None
[docs] def write_file(self, file_name, data=None):
if not data:
data = self.data[self.data.before(datetime.max)]
data_hour = self.data[self.data.nearest(data['idx'] - self.hour)]
while data['idx'] < self.midnight:
self.midnight -= self.day
while data['idx'] >= self.midnight + self.day:
self.midnight += self.day
data_midnight = self.data[self.data.before(self.midnight)]
of = open(file_name, 'w')
of.write('<response>\n')
of.write(' <current_weather>\n')
if data['temp_out'] != None:
of.write(' <temperature unit="c">\n')
of.write(' <current value="%.1f"/>\n' % (data['temp_out']))
if data['hum_out'] != None and data['wind_ave'] != None:
of.write(' <feels_like value="%.1f"/>\n' % (
apparent_temp(
data['temp_out'], data['hum_out'], data['wind_ave'])))
of.write(' </temperature>\n')
if data['hum_out'] != None:
of.write(' <humidity value="%d"/>\n' % (data['hum_out']))
of.write(' <pressure value="%.1f" trend="%.1f" unit="hPa"/>\n' % (
data['rel_pressure'],
data['rel_pressure'] - data_hour['rel_pressure']))
if data['wind_ave'] != None:
of.write(' <wind>\n')
of.write(' <speed value="%.1f" unit="m/s"/>\n' % (
data['wind_ave']))
if data['wind_dir'] != None and data['wind_dir'] < 16:
of.write(' <direction value="%.0f"/>\n' % (
data['wind_dir'] * 22.5))
if data['wind_gust'] != None:
of.write(' <gusts value="%.1f" unit="m/s"/>\n' % (
data['wind_gust']))
of.write(' </wind>\n')
of.write(' <sky>\n')
of.write(' <precipitation>\n')
of.write(' <rain>\n')
of.write(' <rate value="%.1f" unit="mm"/>\n' % (
max(data['rain'] - data_hour['rain'], 0.0)))
of.write(' <daily_total value="%.1f" unit="mm"/>\n' % (
max(data['rain'] - data_midnight['rain'], 0.0)))
of.write(' </rain>\n')
of.write(' </precipitation>\n')
of.write(' </sky>\n')
of.write(' <auto_update>\n')
if self.last_update:
interval = (data['idx'] - self.last_update).seconds
else:
interval = data['delay'] * 60
self.last_update = data['idx']
of.write(' <interval value="%d"/>\n' % (interval))
of.write(' </auto_update>\n')
of.write(' </current_weather>\n')
of.write('</response>\n')
of.close()
[docs]def main(argv=None):
if argv is None:
argv = sys.argv
try:
opts, args = getopt.getopt(argv[1:], "hv", ['help', 'verbose'])
except getopt.error, msg:
print >>sys.stderr, 'Error: %s\n' % msg
print >>sys.stderr, __doc__.strip()
return 1
# process options
verbose = 0
for o, a in opts:
if o == '-h' or o == '--help':
print __doc__.strip()
return 0
elif o == '-v' or o == '--verbose':
verbose += 1
# check arguments
if len(args) != 2:
print >>sys.stderr, "Error: 2 arguments required"
print >>sys.stderr, __doc__.strip()
return 2
logger = ApplicationLogger(verbose)
return YoWindow(DataStore.calib_store(args[0])).write_file(args[1])
if __name__ == "__main__":
sys.exit(main())