Exemple #1
0
    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)
Exemple #4
0
    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
Exemple #5
0
    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
Exemple #6
0
    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)