def perform(self): URL = self.params.get("urlPath", None) d = self.openURL(URL) if d is None: return pwsContent = d.read() if pwsContent is None: return pwsContent = pwsContent.strip() pwsArray = pwsContent.split(" ") lat = float(pwsArray[160]) lon = -float(pwsArray[161]) distToPWS = self.distanceToStation(lat, lon) maxDist = self.params.get("maxAllowedDistance") if (distToPWS > maxDist): log.error("*** PWS Station too far from home!") return temperature = self.__toFloat(pwsArray[4]) mintemp = self.__toFloat(pwsArray[47]) maxtemp = self.__toFloat(pwsArray[46]) rh = self.__toFloat(pwsArray[5]) minrh = self.__toFloat(pwsArray[164]) maxrh = self.__toFloat(pwsArray[163]) wind = self.__toFloat(convertKnotsToMS( pwsArray[1])) # converted from knos to m/s solarradiation = self.__toFloat( pwsArray[127] ) # needs to be converted from watt/sqm*h to Joule/sqm if solarradiation is not None: solarradiation *= 0.0864 rain = self.__toFloat(pwsArray[7]) dewpoint = self.__toFloat(pwsArray[72]) pressure = self.__toFloat(pwsArray[50]) conditionIcon = self.conditionConvert(self.__toFloat(pwsArray[48])) #skycover ? timestamp = rmCurrentTimestamp() self.addValue(RMParser.dataType.TEMPERATURE, timestamp, temperature) self.addValue(RMParser.dataType.MINTEMP, timestamp, mintemp) self.addValue(RMParser.dataType.MAXTEMP, timestamp, maxtemp) self.addValue(RMParser.dataType.RH, timestamp, rh) self.addValue(RMParser.dataType.MINRH, timestamp, minrh) self.addValue(RMParser.dataType.MAXRH, timestamp, maxrh) self.addValue(RMParser.dataType.WIND, timestamp, wind) self.addValue(RMParser.dataType.RAIN, timestamp, rain) self.addValue(RMParser.dataType.DEWPOINT, timestamp, dewpoint) self.addValue(RMParser.dataType.PRESSURE, timestamp, pressure) self.addValue(RMParser.dataType.CONDITION, timestamp, conditionIcon) self.addValue(RMParser.dataType.SOLARRADIATION, timestamp, solarradiation) print self.result return
def perform(self): URL = self.params.get("urlPath", None) d = self.openURL(URL) if d is None: return pwsContent = d.read() if pwsContent is None: return pwsContent = pwsContent.strip() pwsArray = pwsContent.split(" ") lat = float(pwsArray[160]) lon = -float(pwsArray[161]) distToPWS = self.distanceToStation(lat, lon) maxDist = self.params.get("maxAllowedDistance") if(distToPWS > maxDist): log.error("*** PWS Station too far from home!") return temperature = self.__toFloat(pwsArray[4]) mintemp = self.__toFloat(pwsArray[47]) maxtemp = self.__toFloat(pwsArray[46]) rh = self.__toFloat(pwsArray[5]) minrh = self.__toFloat(pwsArray[164]) maxrh = self.__toFloat(pwsArray[163]) wind = self.__toFloat(convertKnotsToMS(pwsArray[1])) # converted from knos to m/s solarradiation = self.__toFloat(pwsArray[127]) # needs to be converted from watt/sqm*h to Joule/sqm if solarradiation is not None: solarradiation *= 0.0864 rain = self.__toFloat(pwsArray[7]) dewpoint = self.__toFloat(pwsArray[72]) pressure = self.__toFloat(pwsArray[50]) conditionIcon = self.conditionConvert(self.__toFloat(pwsArray[48])) #skycover ? timestamp = rmCurrentTimestamp() self.addValue(RMParser.dataType.TEMPERATURE, timestamp, temperature) self.addValue(RMParser.dataType.MINTEMP, timestamp, mintemp) self.addValue(RMParser.dataType.MAXTEMP, timestamp, maxtemp) self.addValue(RMParser.dataType.RH, timestamp, rh) self.addValue(RMParser.dataType.MINRH, timestamp, minrh) self.addValue(RMParser.dataType.MAXRH, timestamp, maxrh) self.addValue(RMParser.dataType.WIND, timestamp, wind) self.addValue(RMParser.dataType.RAIN, timestamp, rain) self.addValue(RMParser.dataType.DEWPOINT, timestamp, dewpoint) self.addValue(RMParser.dataType.PRESSURE, timestamp, pressure) self.addValue(RMParser.dataType.CONDITION, timestamp, conditionIcon) self.addValue(RMParser.dataType.SOLARRADIATION, timestamp, solarradiation) print self.result return
def perform(self): s = self.settings URL = "http://graphical.weather.gov/xml/sample_products/browser_interface/ndfdXMLclient.php" URLDaily = "http://graphical.weather.gov/xml/sample_products/browser_interface/ndfdBrowserClientByDay.php" URLParams = [("lat", s.location.latitude), ("lon", s.location.longitude)] + \ [ ("startDate", datetime.date.today().strftime("%Y-%m-%d")), #("endDate", (datetime.date.today() + datetime.timedelta(6)).strftime("%Y-%m-%d")), ("format", "24 hourly"), ("numDays", 6), ("Unit", "e") ] #----------------------------------------------------------------------------------------------- # # Get hourly data. # d = self.openURL(URL, URLParams) if d is None: return tree = e.parse(d) if tree.getroot().tag == 'error': log.error("*** No hourly information found in response!") self.lastKnownError = "Error: No hourly information found" tree.getroot().clear() del tree tree = None else: # We get them in English units need in Metric units maxt = self.__parseWeatherTag(tree, 'temperature', 'maximum') maxt = convertFahrenheitToCelsius(maxt) mint = self.__parseWeatherTag(tree, 'temperature', 'minimum', useStartTimes=False) # for mint we want the end-time to be saved in DB mint = convertFahrenheitToCelsius(mint) temp = self.__parseWeatherTag(tree, 'temperature', 'hourly') temp = convertFahrenheitToCelsius(temp) qpf = self.__parseWeatherTag(tree, 'precipitation', 'liquid') qpf = convertInchesToMM(qpf) dew = self.__parseWeatherTag(tree, 'temperature', 'dew point') dew = convertFahrenheitToCelsius(dew) wind = self.__parseWeatherTag(tree, 'wind-speed', 'sustained') wind = convertKnotsToMS(wind) # These are as percentages pop = self.__parseWeatherTag(tree, 'probability-of-precipitation', '12 hour') humidity = self.__parseWeatherTag(tree, 'humidity', 'relative') minHumidity = self.__parseWeatherTag(tree, 'humidity', 'minimum relative') maxHumidity = self.__parseWeatherTag(tree, 'humidity', 'maximum relative') tree.getroot().clear() del tree tree = None self.addValues(RMParser.dataType.MINTEMP, mint) self.addValues(RMParser.dataType.MAXTEMP, maxt) self.addValues(RMParser.dataType.TEMPERATURE, temp) self.addValues(RMParser.dataType.QPF, qpf) self.addValues(RMParser.dataType.DEWPOINT, dew) self.addValues(RMParser.dataType.WIND, wind) self.addValues(RMParser.dataType.POP, pop) self.addValues(RMParser.dataType.RH, humidity) self.addValues(RMParser.dataType.MINRH, minHumidity) self.addValues(RMParser.dataType.MAXRH, maxHumidity) #----------------------------------------------------------------------------------------------- # # Get daily data. # d = self.openURL(URLDaily, URLParams) tree = e.parse(d) if tree.getroot().tag == 'error': log.error("*** No daily information found in response!") self.lastKnownError = "Error: No daily information found" tree.getroot().clear() del tree tree = None else: conditions = self.__parseWeatherTag(tree, 'conditions-icon', 'forecast-NWS', 'icon-link') parsedConditions = [] for c in conditions: if c and len(c) >= 2: try: cv = self.conditionConvert(c[1].rsplit('.')[-2].rsplit('/')[-1]) except: cv = RMWeatherConditions.Unknown parsedConditions.append((c[0], cv)) tree.getroot().clear() del tree tree = None self.addValues(RMParser.dataType.CONDITION, parsedConditions) if self.parserDebug: log.debug(self.result)
def getHourlyData(self, URL, URLParams, headers): d = self.openURL(URL, URLParams, headers=headers) if d is None: return False try: tree = e.parse(d) except: return False if tree.getroot().tag == 'error': log.error("*** No hourly information found in response!") self.lastKnownError = "Retrying hourly data retrieval" tree.getroot().clear() del tree tree = None return False # Reset lastKnownError from a previous function call self.lastKnownError = "" # We get them in English units need in Metric units maxt = self.__parseWeatherTag(tree, 'temperature', 'maximum') maxt = convertFahrenheitToCelsius(maxt) mint = self.__parseWeatherTag(tree, 'temperature', 'minimum', useStartTimes=False) # for mint we want the end-time to be saved in DB mint = convertFahrenheitToCelsius(mint) temp = self.__parseWeatherTag(tree, 'temperature', 'hourly') temp = convertFahrenheitToCelsius(temp) qpf = self.__parseWeatherTag(tree, 'precipitation', 'liquid') qpf = convertInchesToMM(qpf) dew = self.__parseWeatherTag(tree, 'temperature', 'dew point') dew = convertFahrenheitToCelsius(dew) wind = self.__parseWeatherTag(tree, 'wind-speed', 'sustained') wind = convertKnotsToMS(wind) # These are as percentages pop = self.__parseWeatherTag(tree, 'probability-of-precipitation', '12 hour') pop = convertToInt(pop) humidity = self.__parseWeatherTag(tree, 'humidity', 'relative') humidity = convertToFloat(humidity) minHumidity = self.__parseWeatherTag(tree, 'humidity', 'minimum relative') minHumidity = convertToFloat(minHumidity) maxHumidity = self.__parseWeatherTag(tree, 'humidity', 'maximum relative') maxHumidity = convertToFloat(maxHumidity) tree.getroot().clear() del tree tree = None # Save self.addValues(RMParser.dataType.MINTEMP, mint) self.addValues(RMParser.dataType.MAXTEMP, maxt) self.addValues(RMParser.dataType.TEMPERATURE, temp) self.addValues(RMParser.dataType.QPF, qpf) self.addValues(RMParser.dataType.DEWPOINT, dew) self.addValues(RMParser.dataType.WIND, wind) self.addValues(RMParser.dataType.POP, pop) self.addValues(RMParser.dataType.RH, humidity) self.addValues(RMParser.dataType.MINRH, minHumidity) self.addValues(RMParser.dataType.MAXRH, maxHumidity) return True
def getHourlyData(self, URL, URLParams, headers): d = self.openURL(URL, URLParams, headers=headers) if d is None: return False try: tree = e.parse(d) except: return False #tree = e.parse("/tmp/noaa-fl-2019-06-04-1.xml") if tree.getroot().tag == 'error': log.error("*** No hourly information found in response!") self.lastKnownError = "Retrying hourly data retrieval" tree.getroot().clear() del tree tree = None return False # Reset lastKnownError from a previous function call self.lastKnownError = "" # We get them in English units need in Metric units # 2019-06-01: If we send that weather properties we want (qpf=qpf&mint=mint) in request URL NOAA response forgets # past hours in current day resulting in a forecast requested at the end of the day # having null/0 qpf forgetting the older values which could had more qpf so we need to process QPF first and # determine which entries don't have full days with qpf reported (especially current day) then completely skip # this day for the rest of the weather properties so we don't have a forecast entry with null/0 qpf # Algorithm allows multiple partial days to be skipped because incomplete but we currently only skip today # QPF needs to be the first tag parsed to build the skippedDays structure qpf = self.__parseWeatherTag(tree, 'precipitation', 'liquid', skippedDays=self.skippedDays, addToSkippedDays=True) qpf = convertInchesToMM(qpf) maxt = self.__parseWeatherTag(tree, 'temperature', 'maximum', skippedDays=self.skippedDays) maxt = convertFahrenheitToCelsius(maxt) mint = self.__parseWeatherTag( tree, 'temperature', 'minimum', useStartTimes=False, skippedDays=self.skippedDays ) # for mint we want the end-time to be saved in DB mint = convertFahrenheitToCelsius(mint) temp = self.__parseWeatherTag(tree, 'temperature', 'hourly', skippedDays=self.skippedDays) temp = convertFahrenheitToCelsius(temp) dew = self.__parseWeatherTag(tree, 'temperature', 'dew point', skippedDays=self.skippedDays) dew = convertFahrenheitToCelsius(dew) wind = self.__parseWeatherTag(tree, 'wind-speed', 'sustained', skippedDays=self.skippedDays) wind = convertKnotsToMS(wind) # These are as percentages pop = self.__parseWeatherTag(tree, 'probability-of-precipitation', '12 hour', skippedDays=self.skippedDays) pop = convertToInt(pop) humidity = self.__parseWeatherTag(tree, 'humidity', 'relative', skippedDays=self.skippedDays) humidity = convertToFloat(humidity) minHumidity = self.__parseWeatherTag(tree, 'humidity', 'minimum relative', skippedDays=self.skippedDays) minHumidity = convertToFloat(minHumidity) maxHumidity = self.__parseWeatherTag(tree, 'humidity', 'maximum relative', skippedDays=self.skippedDays) maxHumidity = convertToFloat(maxHumidity) if self.parserDebug: tree.write('noaa-' + str(rmTimestampToDateAsString(rmCurrentTimestamp())) + ".xml") tree.getroot().clear() del tree tree = None # Save self.addValues(RMParser.dataType.MINTEMP, mint) self.addValues(RMParser.dataType.MAXTEMP, maxt) self.addValues(RMParser.dataType.TEMPERATURE, temp) self.addValues(RMParser.dataType.QPF, qpf) self.addValues(RMParser.dataType.DEWPOINT, dew) self.addValues(RMParser.dataType.WIND, wind) self.addValues(RMParser.dataType.POP, pop) self.addValues(RMParser.dataType.RH, humidity) self.addValues(RMParser.dataType.MINRH, minHumidity) self.addValues(RMParser.dataType.MAXRH, maxHumidity) return True