-        try:
-            desired_data = config['station']['desired_data']
-        except:
-            # desired_data malformed or missing, setting default
-            desired_data = 'air_temp,snow_depth'
-
-        # 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))
-    exit(1)
-except Exception as exc:
-    log.critical("Exception occurred in config parsing: '%s'" % (exc))
-    exit(1)
-
-# all sections/values present in config file, final sanity check
-try:
-    for key in config.sections():
-        for subkey in config[key]:
-            if not len(config[key][subkey]):
-                raise ValueError;
-except ValueError as exc:
-    log.critical("Config value '%s.%s' is empty" % (key, subkey))
-    exit(1)
-
-# INFOEX FIELDS
-#
-# This won't earn style points in Python, but here we establish a couple
-# of helpful mappings variables. The reason this is helpful is that the
-# end result is simply an ordered set, the CSV file. But we still may
-# want to manipulate the values arbitrarily before writing that file.
-#
-# Also note that the current Auto Wx InfoEx documentation shows these
-# keys in a graphical table with the "index" beginning at 1, but here we
-# sanely index beginning at 0.
-fmap = {}                           ; final_data     = [None] * 29
-fmap['Location UUID'] = 0           ; final_data[0]  = infoex['location_uuid']
-fmap['obDate'] = 1                  ; final_data[1]  = None
-fmap['obTime'] = 2                  ; final_data[2]  = None
-fmap['timeZone'] = 3                ; final_data[3]  = 'Pacific'
-fmap['tempMaxHour'] = 4             ; final_data[4]  = None
-fmap['tempMaxHourUnit'] = 5         ; final_data[5]  = 'F'
-fmap['tempMinHour'] = 6             ; final_data[6]  = None
-fmap['tempMinHourUnit'] = 7         ; final_data[7]  = 'F'
-fmap['tempPres'] = 8                ; final_data[8]  = None
-fmap['tempPresUnit'] = 9            ; final_data[9]  = 'F'
-fmap['precipitationGauge'] = 10     ; final_data[10] = None
-fmap['precipitationGaugeUnit'] = 11 ; final_data[11] = 'in'
-fmap['windSpeedNum'] = 12           ; final_data[12] = None
-fmap['windSpeedUnit'] = 13          ; final_data[13] = 'mph'
-fmap['windDirectionNum'] = 14       ; final_data[14] = None
-fmap['hS'] = 15                     ; final_data[15] = None
-fmap['hsUnit'] = 16                 ; final_data[16] = 'in'
-fmap['baro'] = 17                   ; final_data[17] = None
-fmap['baroUnit'] = 18               ; final_data[18] = 'inHg'
-fmap['rH'] = 19                     ; final_data[19] = None
-fmap['windGustSpeedNum'] = 20       ; final_data[20] = None
-fmap['windGustSpeedNumUnit'] = 21   ; final_data[21] = 'mph'
-fmap['windGustDirNum'] = 22         ; final_data[22] = None
-fmap['dewPoint'] = 23               ; final_data[23] = None
-fmap['dewPointUnit'] = 24           ; final_data[24] = 'F'
-fmap['hn24Auto'] = 25               ; final_data[25] = None
-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/MesoWest fields that this program supports to
-# their InfoEx counterpart
-iemap = {}
-
-if data['provider'] == 'nrcs':
-    iemap['PREC'] = 'precipitationGauge'
-    iemap['TOBS'] = 'tempPres'
-    iemap['SNWD'] = 'hS'
-    iemap['PRES'] = 'baro'
-    iemap['RHUM'] = 'rH'
-    iemap['WSPD'] = 'windSpeedNum'
-    iemap['WDIR'] = 'windDirectionNum'
-    # unsupported by NRCS:
-    # windGustSpeedNum
-elif data['provider'] == 'mesowest':
-    iemap['precip_accum'] = 'precipitationGauge'
-    iemap['air_temp'] = 'tempPres'
-    iemap['snow_depth'] = 'hS'
-    iemap['pressure'] = 'baro'
-    iemap['relative_humidity'] = 'rH'
-    iemap['wind_speed'] = 'windSpeedNum'
-    iemap['wind_direction'] = 'windDirectionNum'
-    iemap['wind_gust'] = 'windGustSpeedNum'
-
-# override units if user selected metric
-#
-# NOTE: to update this, use the fmap<->final_data mapping laid out above
-#
-# NOTE: this only 'works' with MesoWest for now, as the MesoWest API
-#       itself handles the unit conversion; in the future, we will also
-#       support NRCS unit conversion, but this must be done by this
-#       program.
-if data['units'] == 'metric':
-    final_data[fmap['tempPresUnit']] = 'C'
-    final_data[fmap['hsUnit']] = 'm'
-    final_data[fmap['windSpeedUnit']] = 'm/s'
-    final_data[fmap['windGustSpeedNumUnit']] = 'm/s'
-
-# floor time to nearest hour
-dt = datetime.datetime.now()
-end_date = dt - datetime.timedelta(minutes=dt.minute % 60,
-                                   seconds=dt.second,
-                                   microseconds=dt.microsecond)
-begin_date = end_date - datetime.timedelta(hours=3)
-
-# get the data
-log.debug("Getting %s data from %s to %s" % (str(desired_data),
-    str(begin_date), str(end_date)))
-
-time_all_elements = time.time()
-
-# NRCS-specific code
-if data['provider'] == 'nrcs':
-    transport = zeep.transports.Transport(cache=zeep.cache.SqliteCache())
-    client = zeep.Client(wsdl=data['source'], transport=transport)
-
-    for elementCd in desired_data:
-        time_element = time.time()
-
-        # get the last three hours of data for this elementCd
-        tmp = client.service.getHourlyData(
-                stationTriplets=[data['station_id']],
-                elementCd=elementCd,
-                ordinal=1,
-                beginDate=begin_date,
-                endDate=end_date)
-
-        log.info("Time to get elementCd '%s': %.3f sec" % (elementCd,
-            time.time() - time_element))
-
-        values = tmp[0]['values']
-
-        # sort and isolate the most recent
-        #
-        # NOTE: we do this because sometimes there are gaps in hourly data
-        #       in NRCS; yes, we may end up with slightly inaccurate data,
-        #       so perhaps this decision will be re-evaluated in the future
-        if values:
-            ordered = sorted(values, key=lambda t: t['dateTime'], reverse=True)
-            infoex['wx_data'][elementCd] = ordered[0]['value']
-        else:
-            infoex['wx_data'][elementCd] = None