kopia lustrzana https://github.com/sq9atk/sr0wx
				
				
				
			
		
			
				
	
	
		
			140 wiersze
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			140 wiersze
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
| #!/usr/bin/python -tt
 | |
| # -*- coding: utf-8 -*-
 | |
| 
 | |
| import urllib2
 | |
| import logging
 | |
| import json
 | |
| import socket
 | |
| 
 | |
| from pprint import pprint
 | |
| 
 | |
| # LISTA STACJI Z NUMERAMI
 | |
| # http://api.gios.gov.pl/pjp-api/rest/station/findAll
 | |
| 
 | |
| from sr0wx_module import SR0WXModule
 | |
| 
 | |
| class AirPollutionSq9atk(SR0WXModule):
 | |
|     """Klasa pobierająca info o zanieczyszczeniach powietrza"""
 | |
| 
 | |
|     def __init__(self, language, service_url, city_id=1, station_id=3):
 | |
|         self.__language = language
 | |
|         self.__service_url = service_url
 | |
|         self.__station_id = station_id
 | |
|         self.__logger = logging.getLogger(__name__)
 | |
| 
 | |
|         self.__stations_url = "station/findAll/"
 | |
|         self.__station_url = "station/sensors/"
 | |
|         self.__sensor_url = "data/getData/"
 | |
|         self.__index_url = "aqindex/getIndex/"
 | |
| 
 | |
|     def getJson(self, url):
 | |
|         self.__logger.info("::: Odpytuję adres: " + url)
 | |
|         
 | |
|         try:
 | |
|             data = urllib2.urlopen(url, None, 45)
 | |
|             return json.load(data)
 | |
|         except urllib2.URLError, e:
 | |
|             print e
 | |
|         except socket.timeout:
 | |
|             print "Timed out!"
 | |
| 
 | |
|         return {}
 | |
| 
 | |
|     def getStationName(self):
 | |
|         url = self.__service_url + self.__stations_url
 | |
|         stationName = ''
 | |
|         for station in self.getJson(url):
 | |
|             if station['id'] == self.__station_id:
 | |
|                 stationName = station['stationName']
 | |
|         return stationName
 | |
| 
 | |
|     def getSensorValue(self, sensorId):
 | |
|         url = self.__service_url + self.__sensor_url + str(sensorId)
 | |
|         data = self.getJson(url)
 | |
|         if data['values'][0]['value'] > 0: # czasem tu schodzi null
 | |
|             value = data['values'][0]['value'] 
 | |
|         else:
 | |
|             value = data['values'][1]['value']
 | |
|         return [
 | |
|             data['key'],
 | |
|             value
 | |
|         ]
 | |
| 
 | |
|     def getLevelIndexData(self):
 | |
|         url = self.__service_url + self.__index_url + str(self.__station_id)
 | |
|         return self.getJson(url)
 | |
| 
 | |
|     def getSensorsData(self):
 | |
|         url = self.__service_url + self.__station_url + str(self.__station_id)
 | |
|         levelIndexArray = self.getLevelIndexData()
 | |
|         sensors = []
 | |
|         for row in self.getJson(url):
 | |
|             value = self.getSensorValue(row['id'])
 | |
|             if(value[1]>1): # czasem tu schodzi none
 | |
|                 qualityIndexName = self.mbstr2asci(value[0]) + "IndexLevel"
 | |
|                 if levelIndexArray.has_key(qualityIndexName):
 | |
|                     index = levelIndexArray[qualityIndexName]['indexLevelName']
 | |
|                 else:
 | |
|                     index = 'empty'
 | |
|                 sensors.append([
 | |
|                     row['id'],
 | |
|                     qualityIndexName,
 | |
|                     self.mbstr2asci(row['param']['paramName']),
 | |
|                     value[1],
 | |
|                     self.mbstr2asci(index)
 | |
|                 ])
 | |
|         if len(sensors) > 0:
 | |
|             return sensors
 | |
|         else:
 | |
|             raise Exception("brak danych pomiarowych")
 | |
| 
 | |
|     def prepareMessage(self, data):
 | |
|         levels =  {
 | |
|             'bardzo_dobry'  :'poziom_bardzo_dobry _ ',
 | |
|             'dobry'         :'poziom_dobry _ ',
 | |
|             'dostateczny'   :'poziom_dostateczny _ ',
 | |
|             'umiarkowany'   :'poziom_umiarkowany _ ',
 | |
|             'zly'           :'poziom_zl_y _ ', # ten jest chyba nieuzywany
 | |
|             'zl_y'           :'poziom_zl_y _ ',
 | |
|             'bardzo_zly'    :'poziom_bardzo_zl_y _ ', # ten też jest chyba nieuzywany
 | |
|             'bardzo_zl_y'    :'poziom_bardzo_zl_y _ ',
 | |
|             'empty'          : ''
 | |
|         }
 | |
|         message = " "
 | |
|         for row in data:
 | |
|             message += " " + row[2]
 | |
|             message += " " + self.__language.read_micrograms( int(row[3]) )
 | |
|             message += " " + levels[row[4]]
 | |
|         return message
 | |
| 
 | |
| 
 | |
|     def get_data(self):
 | |
|         self.__logger.info("::: Pobieram informacje o skażeniu powietrza...")
 | |
|         self.__logger.info("::: Przetwarzam dane...\n")
 | |
| 
 | |
|         sensorsData = self.getSensorsData()
 | |
|         valuesMessage = self.prepareMessage(sensorsData)
 | |
| 
 | |
|         message = " "
 | |
|         message = " _ informacja_o_skaz_eniu_powietrza _ "
 | |
|         message += " stacja_pomiarowa " + self.mbstr2asci(self.getStationName()) + " _ "
 | |
|         message += valuesMessage
 | |
|         print "\n"
 | |
|         return {
 | |
|             "message": message,
 | |
|             "source": "powietrze_malopolska_pl",
 | |
|         }
 | |
| 
 | |
|     def mbstr2asci(self, string):
 | |
|         """Zwraca "bezpieczną" nazwę dla wyrazu z polskimi znakami diakrytycznymi"""
 | |
|         return string.lower().\
 | |
|             replace(u'ą',u'a_').replace(u'ć',u'c_').\
 | |
|             replace(u'ę',u'e_').replace(u'ł',u'l_').\
 | |
|             replace(u'ń',u'n_').replace(u'ó',u'o_').\
 | |
|             replace(u'ś',u's_').replace(u'ź',u'x_').\
 | |
|             replace(u'ż',u'z_').replace(u' ',u'_').\
 | |
|             replace(u'-',u'_').replace(u'(',u'').\
 | |
|             replace(u')',u'').replace(u'.',u'').\
 | |
|             replace(u',',u'')
 | |
| 
 |