Started adding the ability to configure rain bucket type. Also, allows hardware-specific additions to the command line of configure.py

This commit is contained in:
Tom Keffer
2011-10-21 21:57:48 +00:00
parent d65a6b8939
commit 28ea1222dc
2 changed files with 158 additions and 134 deletions

View File

@@ -19,7 +19,6 @@ import configobj
import user.extensions #@UnusedImport
import weewx.archive
import weewx.stats
import weewx.VantagePro
usagestr = """%prog: config_path [Options]
@@ -29,27 +28,19 @@ Arguments:
config_path: Path to the configuration file to be used."""
def main():
parser = OptionParser(usage=usagestr)
parser.add_option("--create-database", action="store_true", dest="create_database", help="To create the main database archive")
parser.add_option("--create-stats", action="store_true", dest="create_stats", help="To create the statistical database")
parser.add_option("--backfill-stats", action="store_true", dest="backfill_stats", help="To backfill the statistical database from the main database")
parser.add_option("--reconfigure-database",action="store_true", dest="reconfig_database",help="To reconfigure the main database archive")
parser.add_option("--configure-VantagePro",action="store_true", dest="configure_VP", help="To configure a VantagePro weather station")
parser.add_option("--clear-VantagePro", action="store_true", dest="clear_VP", help="To clear the memory of the VantagePro weather station")
parser.add_option("--query-VantagePro", action="store_true", dest="query_VP", help="To query configuration of the VantagePro weather station")
(options, args) = parser.parse_args()
if len(args) < 1:
print "Missing argument(s)."
print parser.parse_args(["--help"])
sys.exit(weewx.CMD_ERROR)
config_path = args[0]
# Set defaults for the system logger:
syslog.openlog('configure', syslog.LOG_PID|syslog.LOG_CONS)
# This is a bit of a cludge. Get the path for the configuration file:
for arg in sys.argv[1:]:
if arg[0] != '-':
config_path = arg
break
else:
sys.stderr.write("Missing configuration file")
sys.exit(weewx.CMD_ERROR)
# Try to open up the given configuration file. Declare an error if unable to.
try :
config_dict = configobj.ConfigObj(config_path, file_error=True)
@@ -57,6 +48,25 @@ def main():
print "Unable to open configuration file ", config_path
syslog.syslog(syslog.LOG_CRIT, "main: Unable to open configuration file %s" % config_path)
sys.exit(weewx.CONFIG_ERROR)
# Now put together the command options:
parser = OptionParser(usage=usagestr)
parser.add_option("--create-database", action="store_true", dest="create_database", help="To create the main database archive")
parser.add_option("--create-stats", action="store_true", dest="create_stats", help="To create the statistical database")
parser.add_option("--backfill-stats", action="store_true", dest="backfill_stats", help="To backfill the statistical database from the main database")
parser.add_option("--reconfigure-database",action="store_true", dest="reconfig_database",help="To reconfigure the main database archive")
# Get the hardware type from the configuration dictionary
# (this will be a string such as "VantagePro"),
# then import the appropriate module:
stationType = config_dict['Station']['station_type']
station_mod = __import__('weewx.'+ stationType)
# Add its options to the list:
getattr(station_mod, stationType).getOptionGroup(parser)
# Now we are ready to parse the command line:
(options, args) = parser.parse_args()
if options.create_database:
createMainDatabase(config_dict)
@@ -69,15 +79,9 @@ def main():
if options.reconfig_database:
reconfigMainDatabase(config_dict)
if options.configure_VP:
configureVP(config_dict)
if options.clear_VP:
clearVP(config_dict)
if options.query_VP:
queryVP(config_dict)
# Now run any hardware specific options:
getattr(station_mod, stationType).runOptions(config_dict, options, args)
def createMainDatabase(config_dict):
"""Create the main weewx archive database"""
@@ -137,62 +141,4 @@ def reconfigMainDatabase(config_dict):
newArchiveFilename = oldArchiveFilename + ".new"
weewx.archive.reconfig(oldArchiveFilename, newArchiveFilename)
def configureVP(config_dict):
"""Configure a VantagePro as per the configuration file."""
print "Configuring VantagePro..."
# Open up the weather station:
station = weewx.VantagePro.VantagePro(**config_dict['VantagePro'])
old_archive_interval = station.archive_interval
new_archive_interval = config_dict['VantagePro'].as_int('archive_interval')
if old_archive_interval == new_archive_interval:
print "Old archive interval matches new archive interval (%d seconds). Nothing done" % old_archive_interval
else:
print "VantagePro old archive interval is %d seconds, new one is %d" % (old_archive_interval, new_archive_interval)
print "Proceeding will erase old archive records."
ans = raw_input("Are you sure you want to proceed? (y/n) ")
if ans == 'y' :
station.setArchiveInterval(new_archive_interval)
print "Archive interval now set to %d." % (new_archive_interval,)
# The Davis documentation implies that the log is cleared after
# changing the archive interval, but that doesn't seem to be the
# case. Clear it explicitly:
station.clearLog()
print "Archive records cleared."
else:
print "Nothing done."
station.closePort()
def clearVP(config_dict):
"""Clear the archive memory of a VantagePro"""
print "Clearing the archive memory of the VantagePro..."
# Open up the weather station:
station = weewx.VantagePro.VantagePro(**config_dict['VantagePro'])
print "Proceeding will erase old archive records."
ans = raw_input("Are you sure you wish to proceed? (Y/n) ")
if ans == 'Y':
station.clearLog()
print "Archive records cleared."
else:
print "Nothing done."
station.closePort()
def queryVP(config_dict):
"""Query the configuration of the VantagePro"""
print "Querying..."
# Open up the weather station:
station = weewx.VantagePro.VantagePro(**config_dict['VantagePro'])
summary = station.getSummary()
station.closePort()
print summary
main()

View File

@@ -9,12 +9,12 @@
#
"""classes and functions for interfacing with a Davis VantagePro or VantagePro2"""
import datetime
import serial
import socket
import struct
import syslog
import datetime
import time
import socket
from weewx.crc16 import crc16
import weeutil.weeutil
@@ -632,18 +632,14 @@ class VantagePro(object):
syslog.syslog(syslog.LOG_ERR, "VantagePro: Max retries exceeded while setting time")
raise weewx.RetriesExceeded("While setting console time")
def setArchiveInterval(self, archive_interval):
def setArchiveInterval(self, archive_interval_minutes):
"""Set the archive interval of the VantagePro.
archive_interval: The new interval to use in seconds. Must be one of
60, 300, 600, 900, 1800, 3600, or 7200
archive_interval_minutes: The new interval to use in minutes. Must be one of
1, 5, 10, 15, 30, 60, or 120
"""
# Convert to minutes:
archive_interval_minutes = int(archive_interval / 60)
if archive_interval_minutes not in (1, 5, 10, 15, 30, 60, 120):
raise weewx.ViolatedPrecondition, "VantagePro: Invalid archive interval (%f)" % archive_interval
raise weewx.ViolatedPrecondition, "VantagePro: Invalid archive interval (%f)" % archive_interval_minutes
command = 'SETPER %d\n' % archive_interval_minutes
@@ -653,7 +649,7 @@ class VantagePro(object):
assert(len(rx_list) == 0)
self.archive_interval = archive_interval_minutes * 60
syslog.syslog(syslog.LOG_NOTICE, "VantagePro: archive interval set to %d" % (self.archive_interval,))
syslog.syslog(syslog.LOG_NOTICE, "VantagePro: archive interval set to %d minutes" % (self.archive_interval_minutes,))
def clearLog(self):
"""Clear the internal archive memory in the VantagePro."""
@@ -695,16 +691,16 @@ class VantagePro(object):
wind_unit_code = (unit_bits & 0xC0) >> 6
setup_bits = ord(_buffer[0x2B])
wind_cup_type = (setup_bits & 0x08) >> 3
rain_bucket_type = (setup_bits & 0x30) >> 4
self.wind_cup_type = (setup_bits & 0x08) >> 3
self.rain_bucket_type = (setup_bits & 0x30) >> 4
self.barometer_unit = VantagePro.barometer_unit_dict[barometer_unit_code]
self.temperature_unit = VantagePro.temperature_unit_dict[temperature_unit_code]
self.elevation_unit = VantagePro.elevation_unit_dict[elevation_unit_code]
self.rain_unit = VantagePro.rain_unit_dict[rain_unit_code]
self.wind_unit = VantagePro.wind_unit_dict[wind_unit_code]
self.wind_cup_size = VantagePro.wind_cup_dict[wind_cup_type]
self.rain_bucket_size = VantagePro.rain_bucket_dict[rain_bucket_type]
self.wind_cup_size = VantagePro.wind_cup_dict[self.wind_cup_type]
self.rain_bucket_size = VantagePro.rain_bucket_dict[self.rain_bucket_type]
def getRX(self) :
"""Returns reception statistics from the console.
@@ -1232,42 +1228,124 @@ _archive_map={'interval' : _null_int,
'readClosed' : _null,
'readOpened' : _null}
if __name__ == '__main__':
import configobj
from optparse import OptionParser
#===============================================================================
# Routines for configuring and querying the VP2.
# These are called dynamically from the configure.py utility.
#===============================================================================
import optparse
def getOptionGroup(parser):
usagestr = """%prog: config_path
group = optparse.OptionGroup(parser," Options for Davis Vantage weather station",
"These options are specific to the Davis Vantage series of weather stations")
group.add_option("--query", action="store_true", dest="query",
help="To query the configuration of your weather station")
group.add_option("--set-archive-interval", dest="new_interval_minutes", type="int", metavar="INTERVAL-IN-MINUTES",
help="To set a new archive interval")
group.add_option("--set-bucket-type", dest="new_bucket_type", type="int", metavar="BUCKET-CODE",
help="To set a new rain bucket type; bucket codes are "+str(VantagePro.rain_bucket_dict))
group.add_option("--clear", action="store_true", dest="clear",
help="To clear the memory of your weather station")
parser.add_option_group(group)
Configuration utility for a Davis VantagePro.
def runOptions(config_dict, options, args):
Sets the archive time interval. In the future, may set other
things such as altitude, lat, lon, etc.
Arguments:
config_path: Path to the configuration file to be used."""
parser = OptionParser(usage=usagestr)
(options, args) = parser.parse_args()
if len(args) < 1:
print "Missing argument(s)."
print parser.parse_args(["--help"])
exit()
print "new bucket type", options.new_bucket_type
config_path = args[0]
syslog.openlog('VantagePro_configuration', syslog.LOG_PID|syslog.LOG_CONS, syslog.LOG_USER|syslog.LOG_INFO)
try :
config_dict = configobj.ConfigObj(config_path, file_error=True)
except IOError:
print "Unable to open configuration file ", config_path
exit()
if options.query:
query(config_dict)
if options.new_interval_minutes is not None:
set_new_archive_interval(config_dict, options.new_interval_minutes)
if options.new_bucket_type is not None:
set_new_bucket_type(config_dict, options.new_bucket_type)
if options.clear:
clear(config_dict)
ans = raw_input("about to configure VantagePro. OK (y/n)? ")
if ans == 'y' :
def query(config_dict):
"""Query the configuration of the VantagePro"""
print "Querying..."
try:
# Open up the weather station:
station = VantagePro(**config_dict['VantagePro'])
station.config(config_dict)
print "Done."
else :
print "Nothing done."
station = weewx.VantagePro.VantagePro(**config_dict['VantagePro'])
summary = station.getSummary()
print summary
finally:
station.closePort()
def set_new_archive_interval(config_dict, new_interval_minutes):
"""Set a new archive interval on the console."""
print "Setting new archive interval..."
try:
# Open up the weather station:
station = weewx.VantagePro.VantagePro(**config_dict['VantagePro'])
old_interval_minutes=int(station.archive_interval/60)
print "Old archive interval is %d" % old_interval_minutes
if old_interval_minutes == new_interval_minutes:
print "Old archive interval matches new archive interval (%d minutes). Nothing done." % old_interval_minutes
else:
print "VantagePro old archive interval is %d minutes, new one is %d" % (old_interval_minutes, new_interval_minutes)
print "Proceeding will erase old archive records."
ans = raw_input("Are you sure you want to proceed? (Y/n) ")
if ans == 'Y' :
station.setArchiveInterval(new_interval_minutes)
print "Archive interval now set to %d." % (new_interval_minutes,)
# The Davis documentation implies that the log is cleared after
# changing the archive interval, but that doesn't seem to be the
# case. Clear it explicitly:
station.clearLog()
print "Archive records cleared."
else:
print "Nothing done."
finally:
station.closePort()
def set_new_bucket_type(config_dict, new_bucket_type):
print "Setting new rain bucket type..."
try:
# Open up the weather station:
station = weewx.VantagePro.VantagePro(**config_dict['VantagePro'])
print "\nRain bucket type is currently", station.rain_bucket_type
if station.rain_bucket_type == new_bucket_type:
print "New bucket type is the same as the old one (%d). Nothing done." % station.rain_bucket_type
else:
print "VantagePro old bucket type is %d (%s), new one is %d (%s)" % (station.rain_bucket_type, station.rain_bucket_size,
new_bucket_type, VantagePro.rain_bucket_dict[new_bucket_type])
print "Proceeding will change the bucket type."
ans = raw_input("Are you sure you want to proceed? (Y/n) ")
if ans == 'Y' :
print "to be done"
print "Also need to execute NEWSETUP"
else:
print "Nothing done."
finally:
station.closePort()
def clear(config_dict):
"""Clear the archive memory of a VantagePro"""
print "Clearing the archive memory of the VantagePro..."
try:
# Open up the weather station:
station = weewx.VantagePro.VantagePro(**config_dict['VantagePro'])
print "Proceeding will erase old archive records."
ans = raw_input("Are you sure you wish to proceed? (Y/n) ")
if ans == 'Y':
station.clearLog()
print "Archive records cleared."
else:
print "Nothing done."
finally:
station.closePort()