Reduce configuration complexity
authorAlexander Vasarab <alexander@wylark.com>
Tue, 30 Jun 2020 20:49:49 +0000 (13:49 -0700)
committerAlexander Vasarab <alexander@wylark.com>
Tue, 30 Jun 2020 20:51:57 +0000 (13:51 -0700)
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.

README.md
config-mesowest.ini.example [deleted file]
config-nrcs.ini.example [deleted file]
config.ini.example [new file with mode: 0644]
infoex-autowx.py

index 8dde3f0887cbe4f5dcb0b9d6a00ac5f8f1cca45a..beee3aac9299edb75ad63c346a64e17b575bba54 100644 (file)
--- 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 (file)
index 78b5a14..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-[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>
diff --git a/config-nrcs.ini.example b/config-nrcs.ini.example
deleted file mode 100644 (file)
index 449132e..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-[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>
diff --git a/config.ini.example b/config.ini.example
new file mode 100644 (file)
index 0000000..17544ae
--- /dev/null
@@ -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 #
+
index 5f35d0e658b5e6ab83c0c13d857c01f750b0f545..3d8762c81b58c97eeecc8af10583a835435801c9 100755 (executable)
@@ -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,