From: Alexander Vasarab Date: Tue, 30 Jun 2020 20:49:49 +0000 (-0700) Subject: Reduce configuration complexity X-Git-Tag: v2.0.0^2~16 X-Git-Url: https://wylark.com/src/infoex-autowx.git/commitdiff_plain/6980e4fef8dad4b47cb03b879860b5981c1e67cc?ds=sidebyside;hp=f41647a44c410ccf016776389d07b89d65519889 Reduce configuration complexity This commit cleans up the configuration file format expectations. Whereas before there was separate [nrcs]/[mesowest] sections, there is now one [station] section. It also unifies the configuration options between the two in the config file, as well as the code. Much cleaner and simpler. --- diff --git a/README.md b/README.md index 8dde3f0..beee3aa 100644 --- a/README.md +++ b/README.md @@ -52,20 +52,22 @@ created earlier): Configuration File ------------------ -The configuration file is separated into two parts, the -[nrcs]/[mesowest] portion, and the [infoex] portion. +The configuration file is separated into two parts, the [station] +portion, and the [infoex] portion. -The [nrcs]/[mesowest] values describe which weather station's data -you're after. See the next section in this README for instructions on -obtaining these values. +The [station] values describe which weather station's data you're after. +See the next section in this README for instructions on obtaining these +values. The [infoex] values describe your credentials for the InfoEx automated weather station FTP server and other InfoEx-related configuration options. -`[nrcs]` -`station_triplet = [The NRCS identifier for a particular SNOTEL site]` -`desired_data = [A comma-delimited list of NRCS elements you're interested in]` +`[station]` +`type = [Either mesowest or nrcs]` +`token = [MesoWest API token -- ignored when type is nrcs]` +`station_id = [The NRCS/MesoWest identifier for a particular station]` +`desired_data = [A comma-delimited list of fields you're interested in]` `[infoex]` `host = [InfoEx FTP host address]` @@ -74,11 +76,12 @@ options. `csv_filename = [Arbitrary name of the file that will be uploaded to InfoEx]` `location_uuid = [The UUID used by InfoEx to identify your automated Wx site]` -Finding Your NRCS values ------------------------- +Finding Your NRCS `station` values +---------------------------------- -To complete the [nrcs] configuration section, you must fill in the -attributes of the NRCS SNOTEL site from which you want to import data. +To complete the [station] configuration section for an NRCS station, you +must fill in the attributes of the NRCS SNOTEL site from which you want +to import data. Here are the steps to do that: @@ -94,7 +97,7 @@ Here are the steps to do that: 4-digit number). 3. Combine your Station ID, state abbreviation, and the network type - "SNTL" to get your station triplet (`station_triplet`, in the + "SNTL" to get your NRCS station triplet (`station_id`, in the configuration file). For example: 655:OR:SNTL @@ -103,9 +106,9 @@ Here are the steps to do that: of Oregon (OR). SNTL just represents that the station is in the SNOTEL network and is used internally by NRCS. -Once you have your station triplet, fill in the field in your -configuration file. Now you must select which data you'd like to pull -from NRCS to push into InfoEx. +Once you have your station ID, fill in the field in your configuration +file. Now you must select which data you'd like to pull from NRCS to +push into InfoEx. For that, visit the NRCS web service: @@ -121,23 +124,23 @@ configuration file as the `desired_data` value. For example: -`station_triplet = 655:OR:SNTL` +`station_id = 655:OR:SNTL` `desired_data = TOBS,PREC` indicates that I'd like to import "AIR TEMPERATURE OBSERVED" and "PRECIPITATION ACCUMULATION" from the NRCS SNOTEL site at Mud Ridge, OR, into InfoEx. -Finding your MesoWest values ----------------------------- +Finding your MesoWest `station` values +-------------------------------------- MesoWest has great documentation which can be found here: https://developers.synopticdata.com/mesonet/v2/getting-started/ -To complete the [mesowest] configuration section, you must fill in the -attributes of the MesoWest station ID from which you want to import -data. Here are the steps to do that: +To complete the [station] configuration section for a MesoWest station, +you must fill in the attributes of the MesoWest station ID from which +you want to import data. Here are the steps to do that: 1. Firstly, get set up with MesoWest's API by going to the above 'Getting Started' link. Once you're set up, you can copy a token from diff --git a/config-mesowest.ini.example b/config-mesowest.ini.example deleted file mode 100644 index 78b5a14..0000000 --- a/config-mesowest.ini.example +++ /dev/null @@ -1,12 +0,0 @@ -[mesowest] -token = -stid = -desired_data = -units = - -[infoex] -host = -uuid = -api_key = -csv_filename = -location_uuid = diff --git a/config-nrcs.ini.example b/config-nrcs.ini.example deleted file mode 100644 index 449132e..0000000 --- a/config-nrcs.ini.example +++ /dev/null @@ -1,10 +0,0 @@ -[nrcs] -station_triplet = -desired_data = - -[infoex] -host = -uuid = -api_key = -csv_filename = -location_uuid = diff --git a/config.ini.example b/config.ini.example new file mode 100644 index 0000000..17544ae --- /dev/null +++ b/config.ini.example @@ -0,0 +1,14 @@ +[station] +type = # (mesowest|nrcs) # +token = # MesoWest API token (ignored for NRCS) # +station_id = # NRCS/MesoWest Station ID # +desired_data = # Comma-separated list of values # +units = # (english|metric) (ignored for NRCS) # + +[infoex] +host = # InfoEx FTP host address # +uuid = # InfoEx-supplied UUID # +api_key = # InfoEx-supplied API Key # +csv_filename = # Name of file to upload to InfoEx FTP # +location_uuid = # InfoEx-supplied Location UUID # + diff --git a/infoex-autowx.py b/infoex-autowx.py index 5f35d0e..3d8762c 100755 --- a/infoex-autowx.py +++ b/infoex-autowx.py @@ -71,16 +71,11 @@ parser.add_option("--dry-run", config = configparser.ConfigParser(allow_no_value=False) if not options.config: - print("Please specify a configuration file via --config") + print("Please specify a configuration file via --config.") sys.exit(1) config.read(options.config) -if 'nrcs' in config and 'mesowest' in config: - print("Both MesoWest and NRCS configuration option specified, " - "please choose just one.") - sys.exit(1) - log.debug('STARTING UP') try: @@ -94,14 +89,18 @@ try: } data = dict() + data['provider'] = config['station']['type'] + + if data['provider'] not in ['nrcs', 'mesowest']: + print("Please specify either nrcs or mesowest as the station type.") + sys.exit(1) - if 'nrcs' in config: - data['provider'] = 'nrcs' + if data['provider'] == 'nrcs': data['source'] = 'https://www.wcc.nrcs.usda.gov/awdbWebService/services?WSDL' - data['stationID'] = config['nrcs']['station_triplet'] + data['station_id'] = config['station']['station_id'] try: - desired_data = config['nrcs']['desired_data'].split(',') + desired_data = config['station']['desired_data'].split(',') except: # desired_data malformed or missing, setting default desired_data = [ @@ -110,21 +109,19 @@ try: 'PREC' # PRECIPITATION ACCUMULATION (in) ] - if 'mesowest' in config: - data['provider'] = 'mesowest' - #data['source'] = 'https://api.synopticdata.com/v2/stations/latest' + if data['provider'] == 'mesowest': data['source'] = 'https://api.synopticdata.com/v2/stations/timeseries' - data['stationID'] = config['mesowest']['stid'] - data['units'] = config['mesowest']['units'] + data['station_id'] = config['station']['station_id'] + data['units'] = config['station']['units'] try: - desired_data = config['mesowest']['desired_data'] + desired_data = config['station']['desired_data'] except: # desired_data malformed or missing, setting default desired_data = 'air_temp,snow_depth' - # construct full API URL - data['source'] = data['source'] + '?token=' + config['mesowest']['token'] + '&within=60&units=' + data['units'] + '&stid=' + data['stationID'] + '&vars=' + desired_data + # construct full API URL (sans start/end time, added later) + data['source'] = data['source'] + '?token=' + config['station']['token'] + '&within=60&units=' + data['units'] + '&stid=' + data['station_id'] + '&vars=' + desired_data except KeyError as e: log.critical("%s not defined in %s" % (e, options.config)) @@ -184,7 +181,7 @@ fmap['hn24AutoUnit'] = 26 ; final_data[26] = 'in' fmap['hstAuto'] = 27 ; final_data[27] = None fmap['hstAutoUnit'] = 28 ; final_data[28] = 'in' -# one final mapping, the NRCS fields that this program supports to +# one final mapping, the NRCS/MesoWest fields that this program supports to # their InfoEx counterpart iemap = {} @@ -220,7 +217,7 @@ if data['provider'] == 'nrcs': # get the last three hours of data for this elementCd tmp = client.service.getHourlyData( - stationTriplets=[data['stationID']], + stationTriplets=[data['station_id']], elementCd=elementCd, ordinal=1, beginDate=begin_date,