owm.py: add rain/precipitation data
[chrisu/seepark.git] / owm.py
1 #!/usr/bin/python3
2
3 # needs ~/seepark.ini with
4 # [openweathermap]
5 # apikey=...
6 # cityid=..
7 # 3319578 for Obsteig, AT
8
9 from pprint import pprint
10 import requests
11 import configparser
12 import os
13 import datetime
14
15 baseurl = 'http://api.openweathermap.org/data/2.5/weather'
16 debug = False
17
18 def getweather(apikey, cityid):
19     query = baseurl + '?units=metric&APPID={}&id={}&lang=de'.format(apikey, cityid)
20     try:
21         response = requests.get(query)
22         if response.status_code != 200:
23             response = 'N/A'
24             return response
25         else:
26             weatherdata = response.json()
27             return weatherdata
28     except requests.exceptions.RequestException as error:
29         print (error)
30         sys.exit(1)
31
32
33 def fromtimestamp(timestamp, format):
34     return datetime.datetime.fromtimestamp(timestamp).strftime(format)
35
36
37 # https://stackoverflow.com/questions/7490660/converting-wind-direction-in-angles-to-text-words
38 def degToCompass(num):
39     if num is None:
40         return 'N/A'
41     val=int((num/22.5)+.5)
42     arr=["N","NNO","NO","ONO","O","OSO", "SO", "SSO","S","SSW","SW","WSW","W","WNW","NW","NNW"]
43     return arr[(val % 16)]
44
45
46 def extractweatherdata(w):
47     data = dict(
48         datetime = w.get('dt'),
49         sunrise = w.get('sys').get('sunrise'),
50         sunset = w.get('sys').get('sunset'),
51         temp = w.get('main').get('temp'),
52         pressure = w.get('main').get('pressure'),
53         humidity = w.get('main').get('humidity'),
54         visibility = w.get('visibility'),
55         weather=w['weather'][0]['description'],
56         sky=w['weather'][0]['main'],
57         windspeed=w.get('wind').get('speed'),
58         winddegrees=w.get('wind').get('deg'),
59         cloudiness=w.get('clouds').get('all'),
60         rain=w.get('rain'),
61     )
62
63     data['sunrise_t'] = fromtimestamp(data['sunrise'], '%H:%M:%S')
64     data['sunset_t'] = fromtimestamp(data['sunset'], '%H:%M:%S')
65     data['date'] = fromtimestamp(data['datetime'], '%Y-%m-%d')
66     data['time'] = fromtimestamp(data['datetime'], '%H:%M:%S')
67     data['winddirection'] = degToCompass(data['winddegrees'])
68     if not data['rain'] is None:
69         data['precipitation']=data['rain'].get('3h')
70     else:
71         data['precipitation']='N/A'
72
73     return data
74         
75
76 def main():
77     config = configparser.ConfigParser()
78     config.read(os.path.expanduser('~/seewasser.ini'))
79     apikey = config.get('openweathermap', 'apikey');
80     cityid = config.get('openweathermap', 'cityid');
81
82     weather_raw = getweather(apikey, cityid)
83     if debug:
84         pprint(weather_raw)
85     weather = extractweatherdata(weather_raw)
86     if debug:
87         pprint(weather)
88     # TODO:
89     # write to db
90     # write to csv
91     
92     # output like wetter.at.pl
93     print(
94         weather['date'] + ';' +
95         weather['time'] + ';' +
96         weather['sunrise_t'] + ';' +
97         weather['sunset_t'] + ';' +
98         str(weather['temp']) + ';' +
99         str(weather['precipitation']) + ' mm/h;' +
100         str(weather['windspeed']) + ' km/h ' + weather['winddirection'] + ';' +
101         weather['weather'] + ';' +
102         str(weather['cloudiness'])
103     )
104
105     
106 if __name__ == '__main__':
107     main()