Codice sorgente per pywws.SetWeatherStation

#!/usr/bin/env python

# pywws - Python software for USB Wireless Weather Stations
# http://github.com/jim-easterbrook/pywws
# Copyright (C) 2008-13  Jim Easterbrook  jim@jim-easterbrook.me.uk

# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

"""Set some weather station parameters
::

%s

"""

__docformat__ = "restructuredtext en"
__usage__ = """
 usage: python -m pywws.SetWeatherStation [options]
 options are:
  -h   | --help           display this help
  -c   | --clock          set weather station clock to computer time
                          (unlikely to work)
  -p f | --pressure f     set relative pressure to f hPa
  -r n | --read_period n  set logging interval to n minutes
  -v   | --verbose        increase error message verbosity
  -z   | --zero_memory    clear the weather station logged reading count
"""
__doc__ %= __usage__
__usage__ = __doc__.split('\n')[0] + __usage__

from datetime import datetime, timedelta
import getopt
import logging
import sys
import time

from pywws.Logger import ApplicationLogger
from pywws import WeatherStation

[documenti]def bcd_encode(value): hi = value // 10 lo = value % 10 return (hi * 16) + lo
[documenti]def main(argv=None): if argv is None: argv = sys.argv try: opts, args = getopt.getopt( argv[1:], "hcp:r:vz", ['help', 'clock', 'pressure=', 'read_period=', 'verbose', 'zero_memory']) except getopt.error, msg: print >>sys.stderr, 'Error: %s\n' % msg print >>sys.stderr, __usage__.strip() return 1 # process options clock = False pressure = None read_period = None verbose = 0 zero_memory = False for o, a in opts: if o in ('-h', '--help'): print __usage__.strip() return 0 elif o in ('-c', '--clock'): clock = True elif o in ('-p', '--pressure'): pressure = int((float(a) * 10.0) + 0.5) elif o in ('-r', '--read_period'): read_period = int(a) elif o in ('-v', '--verbose'): verbose += 1 elif o in ('-z', '--zero_memory'): zero_memory = True # check arguments if len(args) != 0: print >>sys.stderr, "Error: No arguments required" print >>sys.stderr, __usage__.strip() return 2 logger = ApplicationLogger(verbose) # open connection to weather station ws = WeatherStation.weather_station() # set data to be sent to station data = [] # set relative pressure if pressure: ptr = ws.fixed_format['rel_pressure'][0] data.append((ptr, pressure % 256)) data.append((ptr+1, pressure // 256)) # set read period if read_period: data.append((ws.fixed_format['read_period'][0], read_period)) # reset data count if zero_memory: ptr = ws.fixed_format['data_count'][0] data.append((ptr, 1)) data.append((ptr+1, 0)) # set clock if clock: print "Clock setting is not known to work on any model of weather station." print "If it works for you, please let Jim Easterbrook know." print "waiting for exact minute" now = datetime.now() if now.second >= 55: time.sleep(10) now = datetime.now() now += timedelta(minutes=1) ptr = ws.fixed_format['date_time'][0] data.append((ptr, bcd_encode(now.year - 2000))) data.append((ptr+1, bcd_encode(now.month))) data.append((ptr+2, bcd_encode(now.day))) data.append((ptr+3, bcd_encode(now.hour))) data.append((ptr+4, bcd_encode(now.minute))) time.sleep(59 - now.second) # send it all in one go if data: ws.write_data(data)
if __name__ == "__main__": sys.exit(main())