#
 # 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
 #
 # 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
 fmap = {}                           ; final_data     = [None] * 29
 fmap['Location UUID'] = 0           ; final_data[0]  = infoex['location_uuid']
 fmap['obDate'] = 1                  ; final_data[1]  = None
 fmap = {}                           ; final_data     = [None] * 29
 fmap['Location UUID'] = 0           ; final_data[0]  = infoex['location_uuid']
 fmap['obDate'] = 1                  ; final_data[1]  = None
         #       it means we have to handle this part differently for each.
         #
         # NOTE: Also unlike NRCS, MesoWest provides more granular data; NRCS
         #       it means we have to handle this part differently for each.
         #
         # NOTE: Also unlike NRCS, MesoWest provides more granular data; NRCS
     #           getStationElements and temporarily store the
     #           storedUnitCd. But that's pretty network-intensive and
     #           may not even be worth it if there's only e.g. one or two
     #           getStationElements and temporarily store the
     #           storedUnitCd. But that's pretty network-intensive and
     #           may not even be worth it if there's only e.g. one or two
     with open(infoex['csv_filename'], 'rb') as f:
         log.debug("uploading FTP file '%s'" % (infoex['host']))
         ftp = FTP(infoex['host'], infoex['uuid'], infoex['api_key'])
     with open(infoex['csv_filename'], 'rb') as f:
         log.debug("uploading FTP file '%s'" % (infoex['host']))
         ftp = FTP(infoex['host'], infoex['uuid'], infoex['api_key'])