sr0wx/openweather_sq9atk.py

196 wiersze
8.7 KiB
Python
Executable File

#!/usr/bin/python -tt
# -*- coding: utf-8 -*-
import urllib2
import logging
from datetime import datetime
import json as JSON
import socket
from sr0wx_module import SR0WXModule
class OpenWeatherSq9atk(SR0WXModule):
"""Klasa pobierająca dane o promieniowaniu"""
def __init__(self, language, api_key, lat, lon, service_url):
self.__service_url = service_url
self.__lat = lat
self.__lon = lon
self.__api_key = api_key
self.__language = language
self.__logger = logging.getLogger(__name__)
self.events = {
200: 'burza_z_lekkimi_opadami_deszczu', # thunderstorm with light rain
201: 'burza_z_opadami_deszczu', # thunderstorm with rain
202: 'burza_z_silnymi_opadami_deszczu', # thunderstorm with heavy rain
210: 'niewielka_burza', # light thunderstorm
211: 'burza', # thunderstorm
212: 'silna_burza', # heavy thunderstorm
221: 'przelotna_burza', # ragged thunderstorm
230: 'burza_z_lekką_mżawką', # thunderstorm with light drizzle
231: 'burza_z_mżawką', # thunderstorm with drizzle
232: 'burza_z_silną_mżawką', # thunderstorm with heavy drizzle
300: 'lekka_mzawka', # light intensity drizzle
301: 'mzawka', # drizzle
302: 'silna_mzawka', # heavy intensity drizzle
310: 'lekki_mzacy_deszcz', # light intensity drizzle rain
311: 'mzacy_deszcz', # drizzle rain
312: 'silny_mzacy_deszcz', # heavy intensity drizzle rain
313: 'ulewa_z_mzawka', # shower rain and drizzle
314: 'silna_ulewa_z_mzawka', # heavy shower rain and drizzle
321: 'ulewa_z_mzawka', # shower drizzle
500: 'lekkie_opady_deszczu', # light rain 10d
501: 'umiarkowane_opady_deszczu ', # moderate rain 10d
502: 'intensywne_opady_deszczu', # heavy intensity rain 10d
503: 'bardzo_intensywne_opady_deszczu', # very heavy rain 10d
504: 'oberwanie_chmury', # extreme rain 10d
511: 'marznacy_deszcz', # freezing rain
520: 'lekka_ulewa', # light intensity shower rain 09d
521: 'ulewa', # shower rain 09d
522: 'silna_ulewa', # heavy intensity shower rain 09d
531: 'przelotna_ulewa', # ragged shower rain 09d
600: 'niewielkie_opady_sniegu', #light snow
601: 'opady_sniegu', #snow
602: 'intensywne_opady_sniegu', #heavy snow
611: 'snieg_z_deszczem', #sleet
612: 'snieg_z_deszczem', #shower sleet
615: 'snieg_z_niewielkim_deszczem', #light rain and snow
616: 'snieg_z_deszczem', #rain and snow
620: 'lekka_sniezyca', #light shower snow
621: 'śniezyca', #showersnow
622: 'intensywna_sniezyca', #heavy shower snow
701: 'zamglenia', # mist
711: 'zadymienie', # smoke
721: 'mgla', # haze
731: 'kusz_i_piach', # sand, dust whirls
741: 'mgla', # fog
751: 'piasek', # sand
761: 'pyl', # dust
762: 'pyl_wulkaniczny', # volcanic ash
771: 'szkwaly', # squalls
781: 'tornado', # tornado
800: 'bezchmurnie',
801: 'lekkie_zachmurzenie',
802: 'niewielkie_zachmurzenie',
803: 'zachmurzenie_umiarkowane',
804: 'pochmurno'
}
def downloadFile(self, url):
try:
webFile = urllib2.urlopen(url, None, 30)
return webFile.read()
except urllib2.URLError, e:
print e
except socket.timeout:
print "Timed out!"
return ""
def getHour(self):
time = ":".join([str(datetime.now().hour), str(datetime.now().minute)])
datetime_object = datetime.strptime(time, '%H:%M')
time_words = self.__language.read_datetime(datetime_object, '%H %M')
return time_words
def getWeather(self, json):
message = ' _ ';
for row in json:
if row['id'] in self.events:
message += ' ' + self.events[row['id']] + ' '
return message
def getClouds(self, json):
msg = ' ';
if json['all'] > 0:
msg += ' _ pokrywa_chmur ' + self.__language.read_percent( int(json['all']) )
return msg
def getMainConditions(self, json):
msg = ' _ '
msg += ' temperatura ' + self.__language.read_temperature( int(json['temp']) )
msg += ' cisnienie ' + self.__language.read_pressure( int(json['pressure']) )
msg += ' wilgotnosc ' + self.__language.read_percent( int(json['humidity']) )
return msg
def getVisibility(self, json):
msg = ' _ ';
msg += ' widocznosc ' + self.__language.read_distance( int(json/1000) )
return msg
def getWind(self, json):
msg = ' _ ';
msg += ' predkosc_wiatru '
msg += ' ' + self.__language.read_speed( int(json['speed']) )
msg += ' ' + self.__language.read_speed( int(json['speed']/1000*3600),'kmph')
if 'deg' in json:
msg += ' _ wiatr '
if 0 <= json['deg'] <= 23: msg += ' polnocny '
if 23 <= json['deg'] <= 67: msg += ' polnocno wschodni '
if 67 <= json['deg'] <= 112: msg += ' wschodni '
if 112 <= json['deg'] <= 157: msg += ' poludniowo wschodni '
if 157 <= json['deg'] <= 202: msg += ' poludniowy '
if 202 <= json['deg'] <= 247: msg += ' poludniowo zachodni '
if 247 <= json['deg'] <= 292: msg += ' zachodni '
if 292 <= json['deg'] <= 337: msg += ' polnocno zachodni '
if 337 <= json['deg'] <= 360: msg += ' polnocny '
msg += self.__language.read_degrees( int(json['deg']) )
return msg
def get_data(self):
self.__logger.info("::: Pobieram aktualne dane pogodowe...")
weather_service_url = self.__service_url + 'weather?lat=' + str(self.__lat) + '&lon='+str(self.__lon) + '&units=metric&appid=' + self.__api_key
self.__logger.info( weather_service_url )
weatherJson = JSON.loads( self.downloadFile(weather_service_url) )
self.__logger.info("::: Pobieram dane prognozy pogody...")
forecast_service_url = self.__service_url + 'forecast?lat=' + str(self.__lat) + '&lon='+str(self.__lon) + '&units=metric&appid=' + self.__api_key
self.__logger.info( forecast_service_url )
forecastJsonAll = JSON.loads( self.downloadFile(forecast_service_url) )
self.__logger.info("::: Przetwarzam dane...\n")
message = "".join([ \
" stan_pogody_z_godziny ",
self.getHour(), \
self.getWeather( weatherJson['weather'] ), \
self.getClouds( weatherJson['clouds'] ), \
self.getMainConditions( weatherJson['main'] ), \
#self.getVisibility( weatherJson['visibility'] ), \
self.getWind( weatherJson['wind'] ), \
])
forecastJson = forecastJsonAll['list'][1]
message += "".join([ \
" _ prognoza_na_nastepne cztery godziny ",
self.getWeather( forecastJson['weather'] ), \
self.getClouds( forecastJson['clouds'] ), \
self.getMainConditions( forecastJson['main'] ), \
self.getWind( forecastJson['wind'] ), \
])
forecastJson = forecastJsonAll['list'][4]
message += "".join([ \
" _ prognoza_na_nastepne dwanascie godzin ",
self.getWeather( forecastJson['weather'] ), \
self.getClouds( forecastJson['clouds'] ), \
self.getMainConditions( forecastJson['main'] ), \
self.getWind( forecastJson['wind'] ), \
])
return {
"message": message,
"source": "open_weather_map",
}