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
 ------------------
 
 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.
 
 
 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]`  
 
 `[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]`  
 
 `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:
 
 
 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
    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
    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.
 
    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 that, visit the NRCS web service:
 
@@ -121,23 +124,23 @@ configuration file as the `desired_data` value.
 
 For example:
 
 
 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.
 
 `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/
 
 
 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
 
 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:
 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)
 
     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:
 log.debug('STARTING UP')
 
 try:
@@ -94,14 +89,18 @@ try:
     }
 
     data = dict()
     }
 
     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['source'] = 'https://www.wcc.nrcs.usda.gov/awdbWebService/services?WSDL'
-        data['stationID'] = config['nrcs']['station_triplet']
+        data['station_id'] = config['station']['station_id']
 
         try:
 
         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 = [
         except:
             # desired_data malformed or missing, setting default
             desired_data = [
@@ -110,21 +109,19 @@ try:
                     'PREC'  # PRECIPITATION ACCUMULATION (in)
                     ]
 
                     '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['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:
 
         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'
 
         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))
 
 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'
 
 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 = {}
 
 # 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(
 
         # 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,
                 elementCd=elementCd,
                 ordinal=1,
                 beginDate=begin_date,