-
Notifications
You must be signed in to change notification settings - Fork 40
/
Copy pathmesonet-parser.py
79 lines (62 loc) · 2.76 KB
/
mesonet-parser.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
from RMParserFramework.rmParser import RMParser # Mandatory include for parser definition
from RMUtilsFramework.rmLogging import log # Optional include for logging
from RMUtilsFramework.rmTimeUtils import rmCurrentTimestamp
import json # Your parser needed libraries
class Mesonet(RMParser):
parserName = "Mesonet"
parserDescription = "The Oklahoma Mesonet is a world-class network of environmental monitoring stations."
parserEnabled = True
parserInterval = 3600
parserDebug = True
params = {'StationId': 'ALTU'}
def isEnabledForLocation(self, timezone, lat, long):
return Mesonet.parserEnabled
# The function that will be executed must have this name
def perform(self):
# downloading data from a URL convenience function since other python libraries can be used
URL = "https://lab.zanek.net/api/currentobservations_final"
stationID = self.params['StationId']
data = self.openURL(URL)
if data is None:
return
stationsData = json.loads(data.read())
if stationsData is None:
self.lastKnownError = "Error: Invalid response from server"
return
timestamp = rmCurrentTimestamp()
for station in stationsData:
if station['STID'] == stationID:
try:
rain = self.__toFloat(station.get("RAIN"))
except:
rain = None
try:
tmin = self.__toFloat(station.get("TMIN"))
tmax = self.__toFloat(station.get("TMAX"))
except:
self.lastKnownError = "Error: No minimum or maximum temperature can be retrieved"
return
try:
pressure = self.__toFloat(station.get("PRES"))
except:
pressure = None
try:
wind = self.__toFloat(station.get("WSPD"))
except:
wind = None
try:
dew = self.__toFloat(station.get("TDEW"))
except:
dew = None
self.addValue(RMParser.dataType.MINTEMP, timestamp, tmin)
self.addValue(RMParser.dataType.MAXTEMP, timestamp, tmax)
self.addValue(RMParser.dataType.RAIN, timestamp, rain)
self.addValue(RMParser.dataType.PRESSURE, timestamp, pressure)
self.addValue(RMParser.dataType.WIND, timestamp, wind)
self.addValue(RMParser.dataType.DEWPOINT, timestamp, dew)
if self.parserDebug:
log.debug(self.result)
def __toFloat(self, value):
if value is None:
return value
return float(value)