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.
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]`
`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:
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
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:
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
+++ /dev/null
-[mesowest]
-token = <MesoWest token>
-stid = <MesoWest Station ID>
-desired_data = <Comma-separated list of MesoWest station variable names>
-units = <english|metric>
-
-[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>
+++ /dev/null
-[nrcs]
-station_triplet = <NRCS Station ID>
-desired_data = <Comma-separated list of NRCS elementCd values>
-
-[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>
--- /dev/null
+[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 #
+
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:
}
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 = [
'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))
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 = {}
# 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,