def laseregg_read(base_url, device, key): url = base_url.strip("/") + '/lasereggs/' + device params = {} params['key'] = key session = requests.session() try: response = session.get(url, params=params, headers={}) response.raise_for_status() except requests.exceptions.RequestException as err: logging.error(err) return -1, -1 data = json.loads(response.content).get('info.aqi') ts = (datetime.now(timezone.utc) - datetime.strptime(data['ts'], '%Y-%m-%dT%H:%M:%SZ').replace( tzinfo=timezone.utc)).total_seconds() pm25 = data['data'].get('pm25') pm10 = data['data'].get('pm10') if pm25 is None: pm25_aqi = -1 else: pm25_aqi = float(aqi.to_aqi([(aqi.POLLUTANT_PM25, min(500.4, pm25))])) if pm10 is None: pm10_aqi = -1 else: pm10_aqi = float(aqi.to_aqi([(aqi.POLLUTANT_PM10, min(604, pm10))])) aqi_us = max(pm25_aqi, pm10_aqi) return ts, aqi_us
def compute_aqi(self): aqi_25 = aqi.to_aqi([(aqi.POLLUTANT_PM25, str(self.state.aqdata['pm25 standard']))]) aqi_100 = aqi.to_aqi([(aqi.POLLUTANT_PM10, str(self.state.aqdata['pm100 standard']))]) self.state.aqdata['pm25 aqi'] = int(aqi_25) self.state.aqdata['pm100 aqi'] = int(aqi_100)
def upload_measurement(): data = request.json app.logger.debug(f"Received data: {data}") data_points = transform_data(data["sensordatavalues"]) node_tag = "unknown" if "esp8266id" in data: node_tag = f"esp8266-{data['esp8266id']}" elif "raspiid" in data: node_tag = f"raspi-{data['raspiid']}" aqi_value = float( aqi.to_aqi([(aqi.POLLUTANT_PM10, data_points["SDS_P1"]), (aqi.POLLUTANT_PM25, data_points["SDS_P2"])])) data_points["AQI_value"] = aqi_value data_points["AQI_category"] = get_aqi_category(aqi_value) app.logger.debug(f"Writing data: {data_points}") write_api.write( bucket=influxdb_bucket, record=[{ "measurement": influxdb_measurement, "tags": { "node": node_tag }, "fields": data_points }], ) return jsonify({"success": "true"})
def test_to_aqi(self): """Test AQI conversion""" self.assertEqual( aqi.to_aqi([(aqi.POLLUTANT_O3_8H, '0.077'), (aqi.POLLUTANT_PM25, '35.9'), (aqi.POLLUTANT_CO_8H, '8.4')], algo=aqi.ALGO_EPA), 104)
def get_points(sensor_id): purple_query = requests.get( f"https://www.purpleair.com/json?show={sensor_id}") purple_query.raise_for_status() purple = purple_query.json() for sensor in purple["results"]: if (sensor["ID"] == int(sensor_id)): return [{ "measurement": "purpleair", "tags": { "location": sensor["Label"], "sensor": sensor_id }, "fields": { "temp_f": float(sensor["temp_f"]), "humidity": float(sensor["humidity"]), "pm2_5": float(sensor["pm2_5_atm"]), "pm1_0": float(sensor["pm1_0_atm"]), "pm10_0": float(sensor["pm10_0_atm"]), "aqi": aqi.to_aqi([(aqi.POLLUTANT_PM25, sensor["pm2_5_atm"]), (aqi.POLLUTANT_PM10, sensor["pm10_0_atm"])]) } }]
async def async_update(self): """Get the latest data from REST API and update the state.""" try: await self.rest_client.async_update() except LuftdatenError: value = None return value = self.rest_client.data try: parsed_json = json.loads(value) if not isinstance(parsed_json, dict): _LOGGER.warning("JSON result was not a dictionary") return except ValueError: _LOGGER.warning("REST result could not be parsed as JSON") _LOGGER.debug("Erroneous JSON: %s", value) return sensordata_values = parsed_json['sensordatavalues'] pm25 = 0 pm10 = 0 for sensordata_value in sensordata_values: if sensordata_value['value_type'] == 'PMS_P1': pm25 = sensordata_value['value'] elif sensordata_value['value_type'] == 'PMS_P2': pm10 = sensordata_value['value'] self._state = int( aqi.to_aqi([ (aqi.POLLUTANT_PM25, pm25), (aqi.POLLUTANT_PM10, pm10), ]))
def calculateAQI(lst): myaqi = aqi.to_aqi([(aqi.POLLUTANT_CO_8H, str(lst[0])), (aqi.POLLUTANT_PM25, str(lst[1])), (aqi.POLLUTANT_O3_8H, str(lst[2])), (aqi.POLLUTANT_SO2_1H, str(lst[3])), (aqi.POLLUTANT_NO2_1H, str(lst[4]))]) return myaqi
def test_to_aqi(self): """Test AQI conversion""" self.assertEqual( aqi.to_aqi([ (aqi.POLLUTANT_O3_8H, '0.077'), (aqi.POLLUTANT_PM25, '40.9'), (aqi.POLLUTANT_CO, '8.4') ]), 104)
def aqiScore(pm25, pm10): aqi_pi = '0' try: aqi_pi = str( aqi.to_aqi([(aqi.POLLUTANT_PM25, pm25), (aqi.POLLUTANT_PM10, pm10)])) except: aqi_pi = '499' return aqi_pi
def aqiDataConverter(pm2_5Data, pm10Data): aqiData = [] for i in range(len(pm2_5Data)): aqiData.append([ pm2_5Data[i][0], aqi.to_aqi([(aqi.POLLUTANT_PM25, pm2_5Data[i][1]), (aqi.POLLUTANT_PM10, pm10Data[i][1])]) ]) return aqiData
def AQI(): no2 = aqi.to_aqi([(aqi.POLLUTANT_no2_1h, str(no2))]) #ppb co = aqi.to_aqi([(aqi.POLLUTANT_co_8h, str(co))]) #ppm o3 = aqi.to_aqi([(aqi.POLLUTANT_o3_1h, str(o3))]) #ppm, 8hr so2 = aqi.to_aqi([(aqi.POLLUTANT_so2_1h, str(so2))]) #ppb pm1 = aqi.to_aqi([(aqi.POLLUTANT_PM1, str(pm1))]) pm2 = aqi.to_aqi([(aqi.POLLUTANT_PM25, str(pm2))]) #ug/m^3 pm10 = aqi.to_aqi([(aqi.POLLUTANT_PM10, str(pm10))]) #ug/m^3
def test_to_aqi(self): """Test AQI conversion""" self.assertEqual( aqi.to_aqi([ (aqi.POLLUTANT_O3_8H, '0.077'), (aqi.POLLUTANT_PM25, '35.9'), (aqi.POLLUTANT_CO_8H, '8.4') ], algo=aqi.ALGO_EPA), 104)
def calculate_aqi(co,no2,dust_density): factors = [] if co > 0: factors.append((aqi.POLLUTANT_CO_8H,co)) if no2 > 0: factors.append((aqi.POLLUTANT_NO2_1H,no2)) if dust_density > 0 and dust_density < 400: factors.append((aqi.POLLUTANT_PM25,dust_density)) try: return aqi.to_aqi(factors) except: return -99
def prepare_data(soup, location_code, location_info): rows = soup.select("#cltNormal table tr") ths = rows[0].find_all("th") headings = [heading.text.encode("utf-8").strip().lower().replace(" ","_").replace(".","") for heading in ths] tds = rows[1].find_all("td") air_data = [] for i, row in enumerate(rows[1:]): tds = row.find_all("td") # parse dates from ugly unicode table data date_string = tds[0].text scrape_date = DateDecoder(date_string, timezone='Asia/Hong_Kong') # replace scraped date value with SQL timestamp values = [scrape_date.sqlTimestamp()] # type check table values. for td in tds[1:]: value = td.text try: value = float(value) except ValueError: # there may be a better value to use ??? value = 0 values.append(value) # create dict with row values to normalized header keys air_data.append( dict(zip(headings, values)) ) # calculate aqi if (air_data[i]["pm25"]) != "-": calculated_aqi = int(aqi.to_aqi([ (aqi.POLLUTANT_PM25, air_data[i]["pm25"]) ])) else: calculated_aqi = "0" # append additional info to each hours record air_data[i]["aqi"] = calculated_aqi air_data[i]["location"] = location_info[0] air_data[i]["health_range"] = health_range(calculated_aqi) #air_data[i]["loc_code"] = location # dict with meta values and 24 hour records in 'data' list data = { "data": air_data, "timestamp": calendar.timegm(datetime.now().utctimetuple()), "location": location_info[0], "raw_source": location_info[1], "location_code": location_code } return data
def get_aqi(data: AwairDict) -> int: """ Returns the AQI for a given PM2.5 numbe """ pm25 = data["pm25"] pm10 = data["pm10_est"] algorithm = aqilib.ALGO_EPA # algorithm = aqilib.ALGO_MEP # China Ministry of Health ret = aqilib.to_aqi([(aqilib.POLLUTANT_PM25, pm25), (aqilib.POLLUTANT_PM10, pm10)], algo=algorithm) return int(ret)
def calculate_aqi(HOST): try: url = 'http://' + HOST + '/v1/current_conditions' print(f"# Querying {url}") response = requests.get(url, timeout=5, allow_redirects=False) except: sys.exit("Failed to fetch data from AirLink device") airlink_json_values = response.json()['data']['conditions'][0] myaqi = aqi.to_aqi([ (aqi.POLLUTANT_PM10, airlink_json_values['pm_10']), (aqi.POLLUTANT_PM25, airlink_json_values['pm_2p5']), ]) print( f"# AirLink Device ID (MAC address): {response.json()['data']['did']}") print( f"AQI is {myaqi} (Raw values pm_10: {airlink_json_values['pm_10']} pm_2p5: {airlink_json_values['pm_2p5']})" )
def plot_period_aqi_data(self, period, n_bins, title): pm_data = yield self.aqi_storage.last_period_pm_data(period) if not pm_data: defer.returnValue(None) t_end = time.time() t_start = t_end - period t, pm_25, pm_10 = np.transpose(pm_data) aqi_data = [ int( aqi.to_aqi([(aqi.POLLUTANT_PM25, pm[0]), (aqi.POLLUTANT_PM10, pm[1])])) for pm in zip(pm_25, pm_10) ] plot = self.plot_aqi_data(aqi_data, t, t_start, t_end, n_bins, title) defer.returnValue(plot)
def update_dust(): try: con = sl.connect(DB_NAME, detect_types=sl.PARSE_DECLTYPES | sl.PARSE_COLNAMES) cursorObj = con.cursor() except Exception as error: logging.error("update_dust DB " + str(error)) while True: dust_data = None try: dust_data = DUST_SENSOR.get_sensor_data() except Exception, exc: logging.error(exc) status_dust = False if (dust_data and dust_data[0] and dust_data[1]): aqi_index = aqi.to_aqi([(aqi.POLLUTANT_PM25, dust_data[0]), (aqi.POLLUTANT_PM10, dust_data[1])]) status_dust = True else: status_dust = False now = datetime.datetime.now() if status_dust: try: sqlite_insert_with_param = """INSERT INTO 'dust_info' ('timestamp','pm25','pm10','aqi_index') VALUES (?, ?, ?, ?);""" data_tuple = (now, dust_data[0], dust_data[1], int(aqi_index)) cursorObj.execute(sqlite_insert_with_param, data_tuple) con.commit() logging.info("dust data added successfully \n") except Exception as error: logging.error("Insert " + str(error)) time.sleep(SAMPLING_INTERVAL)
def calc_aqi_from_purpleair(json_dict): global AVG_LAT, AVG_LONG aqis, lats, longs = [], [], [] for result in json_dict['results']: if result['pm2_5_atm']: # I haven't tested how this works if pm10 is missing this_aqi = aqi.to_aqi([(aqi.POLLUTANT_PM25, result['pm2_5_atm']), (aqi.POLLUTANT_PM10, result['pm10_0_atm'])]) aqis.append(this_aqi) # I chose sensors from the public map, they all had valid Lat/Lon if result['Lat']: lats.append(result['Lat']) if result['Lon']: longs.append(result['Lon']) # Stick average AQI into JSON so that PyPortal's `json_path` can find it json_dict['avg_aqi'] = sum(aqis) / len(aqis) if len(lats) > 0 and len(longs) > 0: # Update global value of avg lat/long so we can update the caption AVG_LAT = sum(lats) / len(lats) AVG_LONG = sum(longs) / len(longs)
def statedashboard(name=""): name = str(name) include = 0 if request.method == 'POST': vari = request.form['name'] #Removing extra whitespaces and converting spaces into + to pass into url. #name = "+".join(name.split()) if len(vari) == 0: include = 1 else: #Removing extra whitespaces and converting spaces into + to pass into url. vari = "+".join(vari.split()) if vari not in statesList: return redirect(url_for('citydash', name=vari)) else: return redirect(url_for('statedashboard', name=vari)) url = 'https://api.ambeedata.com/latest/by-city' headers = {'x-api-key': x_api_key, 'Content-type': 'application/json'} city_data = [] for city_name in common_list[name]: querystring = {"city": city_name} response = requests.request("GET", url, headers=headers, params=querystring) list_of_data = json.loads(response.text) print(list_of_data) temp_data = { "city_name": city_name, "status": str(list_of_data['stations'][0]['aqiInfo']['category']), "cur_aqi": str(list_of_data['stations'][0]['AQI']), "PM25": str(list_of_data['stations'][0]['PM25']), "PM10": str(list_of_data['stations'][0]['PM10']), "CO": str(list_of_data['stations'][0]['CO']), "SO2": str(list_of_data['stations'][0]['SO2']) } city_data.append(temp_data) lat = 0 lon = 0 # source contain json data from api latLon = urllib.request.urlopen( 'http://api.openweathermap.org/geo/1.0/direct?q=' + name + '&limit=1&appid=' + api).read() latLonData = json.loads(latLon) stateData = [] if len(latLonData) == 0: stateData = [ 'Error', 'Sorry! The Data for ' + name + ' is not available.' ] elif latLonData[0]['name'].find('State') == -1: if name not in statesList: return redirect(url_for('citydash', name=name)) if len(latLonData) > 0: lat = str(latLonData[0]['lat']) lon = str(latLonData[0]['lon']) state = urllib.request.urlopen( 'http://api.openweathermap.org/data/2.5/air_pollution?lat=' + str(lat) + '&lon=' + str(lon) + '&appid=' + api).read() stateData = json.loads(state) stateData = stateData['list'][0]['components'] weather = urllib.request.urlopen( 'http://api.openweathermap.org/data/2.5/weather?lat=' + str(lat) + '&lon=' + str(lon) + '&appid=' + api + '&units=metric').read() weatherData = json.loads(weather) weatherData = weatherData['main'] sDate = datetime.date.today() - datetime.timedelta(days=31) sDateformatted = sDate.strftime('%d/%m/%Y') eDate = datetime.date.today() - datetime.timedelta(days=1) eDateformatted = eDate.strftime('%d/%m/%Y') sUNIX = int( time.mktime( datetime.datetime.strptime(sDateformatted, "%d/%m/%Y").timetuple())) eUNIX = int( time.mktime( datetime.datetime.strptime(eDateformatted, "%d/%m/%Y").timetuple())) history = urllib.request.urlopen( 'http://api.openweathermap.org/data/2.5/air_pollution/history?lat=' + str(lat) + '&lon=' + str(lon) + '&start=' + str(sUNIX) + '&end=' + str(eUNIX) + '&appid=' + api).read() historyData = json.loads(history) error = [] stateHistoryData = [] if 'cod' in historyData: error = ['404'] else: error = ['10000'] if error[0] == '404': stateHistoryData = [ 'Error', 'Sorry! The requested city data is not available.' ] else: hData1 = historyData['list'] prevDate = '0' count = 1 aqiData = [] coData = [] noData = [] no2Data = [] o3Data = [] so2Data = [] pm2_5Data = [] pm10Data = [] nh3Data = [] for tData in hData1: tCO = float(tData['components']['co']) tNO = float(tData['components']['no']) tNO2 = float(tData['components']['no2']) tO3 = float(tData['components']['o3']) tSO2 = float(tData['components']['so2']) tPM2_5 = float(tData['components']['pm2_5']) tPM10 = float(tData['components']['pm10']) tNH3 = float(tData['components']['nh3']) tDate = datetime.datetime.fromtimestamp(int(tData['dt'])) tDatef = tDate.strftime('%d/%m/%Y') if prevDate == tDatef: coData[len(coData) - 1][1] = round( (count * (coData[len(pm2_5Data) - 1][1]) + tCO) / (count + 1), 2) noData[len(noData) - 1][1] = round( (count * (noData[len(pm2_5Data) - 1][1]) + tNO) / (count + 1), 2) no2Data[len(no2Data) - 1][1] = round( (count * (no2Data[len(pm2_5Data) - 1][1]) + tNO2) / (count + 1), 2) o3Data[len(o3Data) - 1][1] = round( (count * (o3Data[len(pm2_5Data) - 1][1]) + tO3) / (count + 1), 2) so2Data[len(so2Data) - 1][1] = round( (count * (so2Data[len(pm2_5Data) - 1][1]) + tSO2) / (count + 1), 2) pm2_5Data[len(pm2_5Data) - 1][1] = round( (count * (pm2_5Data[len(pm2_5Data) - 1][1]) + tPM2_5) / (count + 1), 2) pm10Data[len(pm10Data) - 1][1] = round( (count * (pm10Data[len(pm2_5Data) - 1][1]) + tPM10) / (count + 1), 2) nh3Data[len(nh3Data) - 1][1] = round( (count * (nh3Data[len(pm2_5Data) - 1][1]) + tNH3) / (count + 1), 2) count = count + 1 else: coData.append([tDatef, tCO]) noData.append([tDatef, tNO]) no2Data.append([tDatef, tNO2]) o3Data.append([tDatef, tO3]) so2Data.append([tDatef, tSO2]) pm2_5Data.append([tDatef, tPM2_5]) pm10Data.append([tDatef, tPM10]) nh3Data.append([tDatef, tNH3]) prevDate = tDatef count = 1 aqiData = [] for i in range(len(pm2_5Data)): aqiData.append([ pm2_5Data[i][0], aqi.to_aqi([(aqi.POLLUTANT_PM25, pm2_5Data[i][1]), (aqi.POLLUTANT_PM10, pm10Data[i][1])]) ]) stateHistoryData = [ aqiData, coData, noData, no2Data, o3Data, so2Data, pm2_5Data, pm10Data, nh3Data, latLonData[0]['name'] ] error = [] if include == 1: error = [ 'Error', 'Please enter a place in searchbox to search for air pollution details of required place.' ] return render_template('statedashboard.html', citydata=city_data, aqiData=stateData, weatherData=weatherData, historyData=stateHistoryData)
def statedashboard(name=""): name = str(name) if request.method == 'POST': name = request.form['name'] #Removing extra whitespaces and converting spaces into + to pass into url. name = "+".join(name.split()) lat = 0 lon = 0 # source contain json data from api latLon = urllib.request.urlopen( 'http://api.openweathermap.org/geo/1.0/direct?q=' + name + '&limit=1&appid=' + api).read() latLonData = json.loads(latLon) stateData = [] if len(latLonData) == 0: stateData = [ 'Error', 'Sorry! The Data for ' + name + ' is not available.' ] elif latLonData[0]['name'].find('State') == -1: if name not in statesList: return redirect(url_for('citydash', name=name)) if len(latLonData) > 0: lat = str(latLonData[0]['lat']) lon = str(latLonData[0]['lon']) state = urllib.request.urlopen( 'http://api.openweathermap.org/data/2.5/air_pollution?lat=' + str(lat) + '&lon=' + str(lon) + '&appid=' + api).read() stateData = json.loads(state) stateData = stateData['list'][0]['components'] weather = urllib.request.urlopen( 'http://api.openweathermap.org/data/2.5/weather?lat=' + str(lat) + '&lon=' + str(lon) + '&appid=' + api + '&units=metric').read() weatherData = json.loads(weather) weatherData = weatherData['main'] sDate = datetime.date.today() - datetime.timedelta(days=31) sDateformatted = sDate.strftime('%d/%m/%Y') eDate = datetime.date.today() - datetime.timedelta(days=1) eDateformatted = eDate.strftime('%d/%m/%Y') sUNIX = int( time.mktime( datetime.datetime.strptime(sDateformatted, "%d/%m/%Y").timetuple())) eUNIX = int( time.mktime( datetime.datetime.strptime(eDateformatted, "%d/%m/%Y").timetuple())) history = urllib.request.urlopen( 'http://api.openweathermap.org/data/2.5/air_pollution/history?lat=' + str(lat) + '&lon=' + str(lon) + '&start=' + str(sUNIX) + '&end=' + str(eUNIX) + '&appid=' + api).read() historyData = json.loads(history) error = [] stateHistoryData = [] if 'cod' in historyData: error = ['404'] else: error = ['10000'] if error[0] == '404': stateHistoryData = [ 'Error', 'Sorry! The requested city data is not available.' ] else: hData1 = historyData['list'] prevDate = '0' count = 1 aqiData = [] coData = [] noData = [] no2Data = [] o3Data = [] so2Data = [] pm2_5Data = [] pm10Data = [] nh3Data = [] for tData in hData1: tCO = float(tData['components']['co']) tNO = float(tData['components']['no']) tNO2 = float(tData['components']['no2']) tO3 = float(tData['components']['o3']) tSO2 = float(tData['components']['so2']) tPM2_5 = float(tData['components']['pm2_5']) tPM10 = float(tData['components']['pm10']) tNH3 = float(tData['components']['nh3']) tDate = datetime.datetime.fromtimestamp(int(tData['dt'])) tDatef = tDate.strftime('%d/%m/%Y') if prevDate == tDatef: coData[len(coData) - 1][1] = round( (count * (coData[len(pm2_5Data) - 1][1]) + tCO) / (count + 1), 2) noData[len(noData) - 1][1] = round( (count * (noData[len(pm2_5Data) - 1][1]) + tNO) / (count + 1), 2) no2Data[len(no2Data) - 1][1] = round( (count * (no2Data[len(pm2_5Data) - 1][1]) + tNO2) / (count + 1), 2) o3Data[len(o3Data) - 1][1] = round( (count * (o3Data[len(pm2_5Data) - 1][1]) + tO3) / (count + 1), 2) so2Data[len(so2Data) - 1][1] = round( (count * (so2Data[len(pm2_5Data) - 1][1]) + tSO2) / (count + 1), 2) pm2_5Data[len(pm2_5Data) - 1][1] = round( (count * (pm2_5Data[len(pm2_5Data) - 1][1]) + tPM2_5) / (count + 1), 2) pm10Data[len(pm10Data) - 1][1] = round( (count * (pm10Data[len(pm2_5Data) - 1][1]) + tPM10) / (count + 1), 2) nh3Data[len(nh3Data) - 1][1] = round( (count * (nh3Data[len(pm2_5Data) - 1][1]) + tNH3) / (count + 1), 2) count = count + 1 else: coData.append([tDatef, tCO]) noData.append([tDatef, tNO]) no2Data.append([tDatef, tNO2]) o3Data.append([tDatef, tO3]) so2Data.append([tDatef, tSO2]) pm2_5Data.append([tDatef, tPM2_5]) pm10Data.append([tDatef, tPM10]) nh3Data.append([tDatef, tNH3]) prevDate = tDatef count = 1 aqiData = [] for i in range(len(pm2_5Data)): aqiData.append([ pm2_5Data[i][0], aqi.to_aqi([(aqi.POLLUTANT_PM25, pm2_5Data[i][1]), (aqi.POLLUTANT_PM10, pm10Data[i][1])]) ]) stateHistoryData = [ aqiData, coData, noData, no2Data, o3Data, so2Data, pm2_5Data, pm10Data, nh3Data, latLonData[0]['name'] ] return render_template('statedashboard.html', aqiData=stateData, weatherData=weatherData, historyData=stateHistoryData)
def get_aqi(so2, co): query = [(aqi.POLLUTANT_CO_8H, co), (aqi.POLLUTANT_SO2_1H, so2)] return aqi.to_aqi(query)
now = datetime.now() current_time = now.strftime("%H:%M:%S") print("Current Time = " + str(current_time)) #Waiting calibratrion period print("Waking up, calibrating for 10 seconds...") time.sleep(10) values = cmd_query_data() if values is not None and len(values) == 2: if values[0] is not None and values[1] is not None: if not values[0] == " 0.0" and not values[1] == " 0.0": pm25 = values[0] pm10 = values[1] myaqi = aqi.to_aqi([(aqi.POLLUTANT_PM25, pm25), (aqi.POLLUTANT_PM10, pm10)]) #print("Total AQI: ", str(myaqi), ", PM2.5: ", pm25, ", PM10: ", pm10) print(" PM2.5 = " + str(pm25)) print(" PM10 = " + str(pm10)) #temp = sense.get_temperature() #temp = round(temp, 1) temp = 0 #print("Temperature C: " + str(temp)) #humidity = sense.get_humidity() #humidity = round(humidity, 1) humidity = 0 #print("Humidity: " + str(humidity)) #pressure = sense.get_pressure()
def pollutant_to_aqi(pollutant): return lambda conc: float(aqi.to_aqi([(pollutant, conc)]))
import aqi myaqi = aqi.to_aqi([(aqi.POLLUTANT_PM25, '102'), (aqi.POLLUTANT_PM10, '192')]) print("myAQI=", myaqi)
def statedashboard(name=""): name = str(name) if request.method == 'POST': name = request.form['name'] #Removing extra whitespaces and converting spaces into + to pass into url. name = "+".join(name.split()) if name not in statesList: return redirect(url_for('citydash', name=name)) lat = 0 lon = 0 if (name == 'Telangana' or name == 'telangana'): latLonData = [[{ 'name': 'Telangana', 'lat': '18.1124', 'lon': '79.0193' }]] elif (name == 'Lakshadweep' or name == 'lakshadweep'): latLonData = [[{ 'name': 'Lakshadweep', 'lat': '10.57', 'lon': '72.64' }]] else: latLonData = [] latLonDataCall(name, latLonData) if len(latLonData[0]) == 0: stateAqi = 0 stateData = [ 'Error', 'Sorry! The Data for ' + name + ' is not available.' ] weatherData = [] historyData = [] else: lat = str(latLonData[0][0]['lat']) lon = str(latLonData[0][0]['lon']) stateData = [] t1 = threading.Thread(target=stateDataCall, args=(lat, lon, stateData)) t1.start() weatherData = [] t2 = threading.Thread(target=weatherDataCall, args=(lat, lon, weatherData)) t2.start() stateHistoryData = [] t3 = threading.Thread(target=historyDataCall, args=(lat, lon, latLonData[0], stateHistoryData)) t3.start() t1.join() stateData = stateData[0]['list'][0]['components'] stateAqi = aqi.to_aqi([(aqi.POLLUTANT_PM25, stateData['pm2_5']), (aqi.POLLUTANT_PM10, stateData['pm10'])]) t2.join() t3.join() return render_template('statedashboard.html', stateAqi=stateAqi, aqiData=stateData, weatherData=weatherData[0], historyData=stateHistoryData)
time.sleep(1) logger.info('Reading sensors...') # Read air quality try: aqdata = pm25.read() except Exception as e: logger.warning('Unable to read air quality data. Skipping.') logger.exception("Exception occurred") # Convert PM values to AQI try: current_aqi = aqi.to_aqi([ (aqi.POLLUTANT_PM25, aqdata["pm25 env"]), (aqi.POLLUTANT_PM10, aqdata["pm100 env"]), ]) except Exception as e: logger.warning('PM conversion failed. Skipping.') logger.exception("Exception occurred") # Read Si7021 try: temp_data = sensor.temperature humidity_data = sensor.relative_humidity except Exception as e: logger.warning('Si7021 read error. Reloading library. Skipping.') logger.exception("Exception occurred") # Data collected, let's send it in! try:
def get_aqi(self): myaqi = aqi.to_aqi([(aqi.POLLUTANT_PM25, self.PM_2_5_conctrt_std), (aqi.POLLUTANT_PM10, self.PM_10_conctrt_std)]) return str(myaqi)
def get_aqi(so2,co): query = [(aqi.POLLUTANT_CO_8H,co), (aqi.POLLUTANT_SO2_1H,so2)] return aqi.to_aqi(query)
# print('Sleep device...') sensor.sleep(sleep=True) # Turn off fan and diode # print('Wake-up device...') sensor.sleep(sleep=False) # Turn on fan and diode # print('Mesure for 30 secs...') time.sleep(30) # Allow time for the sensor to measure properly # print('Query data...') result = sensor.query() # print('Sleep device...') sensor.sleep() # Turn off fan and diode return result if result else (0, 0) if __name__ == '__main__': pm25, pm10 = mesure() aqi = int(aqi.to_aqi([ (aqi.POLLUTANT_PM25, pm25), (aqi.POLLUTANT_PM10, pm10), ])) print('Result: AQI: {}, PM2.5: {}, PM10: {}'.format(aqi, pm25, pm10)) data = {'aqi': aqi, 'pm10': pm10, 'pm25': pm25} x = datetime.datetime.now() print (x) if aqi != 0: r = requests.post(url=url, data=data, verify=False) print (r.text)
def statevsstate(): PollutantsData1 = [] PollutantsData2 = [] if request.method == 'GET': return render_template('statevsstate.html', data1=PollutantsData1, len1=len(PollutantsData1), data2=PollutantsData2, len2=len(PollutantsData2)) if request.method == 'POST': if len(request.form) == 1: name = request.form['name'] #Removing extra whitespaces and converting spaces into + to pass into url. name = "+".join(name.split()) if name not in statesList: return redirect(url_for('citydash', name=name)) else: return redirect(url_for('statedashboard', name=name)) if len(request.form) == 2: state1 = request.form['state1'] state2 = request.form['state2'] if len(state1) == 0 or len(state2) == 0: PollutantsData1 = [ 'Error', 'Please enter state names in the respective boxes to compare.' ] PollutantsData2 = ['Error'] return render_template('statevsstate.html', data1=PollutantsData1, len1=len(PollutantsData1), data2=PollutantsData2, len2=len(PollutantsData2)) #Removing extra whitespaces and converting spaces into + to pass into url. state1 = "+".join(state1.split()) state2 = "+".join(state2.split()) stateAqi = [] #For state 1 lat1 = 0 lon1 = 0 #For state 2 lat2 = 0 lon2 = 0 if (state1 == 'Telangana' or state1 == 'telangana'): latLonData1 = [[{ 'name': 'Telangana', 'lat': '18.1124', 'lon': '79.0193' }]] elif (state1 == 'Lakshadweep' or state1 == 'lakshadweep'): latLonData1 = [[{ 'name': 'Lakshadweep', 'lat': '10.57', 'lon': '72.64' }]] else: latLonData1 = [] state1Thread = threading.Thread(target=latLonDataCall, args=(state1, latLonData1)) state1Thread.start() if (state2 == 'Telangana' or state2 == 'telangana'): latLonData2 = [[{ 'name': 'Telangana', 'lat': '18.1124', 'lon': '79.0193' }]] elif (state2 == 'Lakshadweep' or state2 == 'lakshadweep'): latLonData2 = [[{ 'name': 'Lakshadweep', 'lat': '10.57', 'lon': '72.64' }]] else: latLonData2 = [] state2Thread = threading.Thread(target=latLonDataCall, args=(state2, latLonData2)) state2Thread.start() state1Thread.join() state2Thread.join() if len(latLonData1[0]) == 0: stateAqi = ['Not Found', 'Not Found'] PollutantsData1 = [ 'Error', 'Sorry! The Data for ' + state1 + ' is not available.' ] PollutantsData2 = ['Error'] elif state1 not in statesList: stateAqi = ['Not Found', 'Not Found'] PollutantsData1 = [ 'Error', 'Sorry! This page only shows state related data. Please enter a state name.' ] PollutantsData2 = ['Error'] elif len(latLonData2[0]) == 0: stateAqi = ['Not Found', 'Not Found'] PollutantsData1 = ['Error'] PollutantsData2 = [ 'Error', 'Sorry! The data for ' + state2 + ' is not available.' ] elif state2 not in statesList: stateAqi = ['Not Found', 'Not Found'] PollutantsData1 = ['Error'] PollutantsData2 = [ 'Error', 'Sorry! This page only shows state related data. Please enter a state name.' ] else: lat1 = str(latLonData1[0][0]['lat']) lon1 = str(latLonData1[0][0]['lon']) lat2 = str(latLonData2[0][0]['lat']) lon2 = str(latLonData2[0][0]['lon']) PollutantsData1 = [] PollutantsData2 = [] s1t1 = threading.Thread(target=historyDataCall, args=(lat1, lon1, latLonData1[0], PollutantsData1)) s1t1.start() stateData1 = [] s1t2 = threading.Thread(target=stateDataCall, args=(lat1, lon1, stateData1)) s1t2.start() s2t1 = threading.Thread(target=historyDataCall, args=(lat2, lon2, latLonData2[0], PollutantsData2)) s2t1.start() stateData2 = [] s2t2 = threading.Thread(target=stateDataCall, args=(lat2, lon2, stateData2)) s2t2.start() s1t2.join() stateData1 = stateData1[0]['list'][0]['components'] stateAqi.append( aqi.to_aqi([(aqi.POLLUTANT_PM25, stateData1['pm2_5']), (aqi.POLLUTANT_PM10, stateData1['pm10'])])) s2t2.join() stateData2 = stateData2[0]['list'][0]['components'] stateAqi.append( aqi.to_aqi([(aqi.POLLUTANT_PM25, stateData2['pm2_5']), (aqi.POLLUTANT_PM10, stateData2['pm10'])])) s1t1.join() s2t1.join() return render_template('statevsstate.html', stateAqi=stateAqi, data1=PollutantsData1, len1=len(PollutantsData1), data2=PollutantsData2, len2=len(PollutantsData2))
def cityvscity(): PollutantsData1 = [] PollutantsData2 = [] include = 0 if request.method == 'GET': return render_template('cityvscity.html', data1=PollutantsData1, len1=len(PollutantsData1), data2=PollutantsData2, len2=len(PollutantsData2)) if request.method == 'POST': if len(request.form) == 1: vari = request.form['name'] #Removing extra whitespaces and converting spaces into + to pass into url. #name = "+".join(name.split()) if len(vari) == 0: include = 1 else: #Removing extra whitespaces and converting spaces into + to pass into url. vari = "+".join(vari.split()) if vari not in statesList: return redirect(url_for('citydash', name=vari)) else: return redirect(url_for('statedashboard', name=vari)) elif len(request.form) == 2: city1 = request.form['city1'] city2 = request.form['city2'] if len(city1) == 0 or len(city2) == 0: PollutantsData1 = [ 'Error', 'Please enter city names in the respective boxes to compare.' ] PollutantsData2 = ['Error'] return render_template('cityvscity.html', data1=PollutantsData1, len1=len(PollutantsData1), data2=PollutantsData2, len2=len(PollutantsData2)) else: city1 = 'ahmedabad' city2 = 'surat' #Removing extra whitespaces and converting spaces into + to pass into url. city1 = "+".join(city1.split()) city2 = "+".join(city2.split()) url = 'https://api.ambeedata.com/latest/by-city' headers = {'x-api-key': x_api_key, 'Content-type': 'application/json'} city_data = [] querystring = {"city": city1} response = requests.request("GET", url, headers=headers, params=querystring) list_of_data = json.loads(response.text) temp_data = { "city_name": city1, "cur_aqi": str(list_of_data['stations'][0]['AQI']) } city_data.append(temp_data) querystring = {"city": city2} response = requests.request("GET", url, headers=headers, params=querystring) list_of_data_1 = json.loads(response.text) temp_data_1 = { "city_name": city2, "cur_aqi": str(list_of_data_1['stations'][0]['AQI']) } city_data.append(temp_data_1) #For city 1 lat = 0 lon = 0 latLon = urllib.request.urlopen( 'http://api.openweathermap.org/geo/1.0/direct?q=' + city1 + '&limit=1&appid=' + api).read() latLonData = json.loads(latLon) if len(latLonData) == 0: PollutantsData1 = [ 'Error', 'Sorry! The Data for ' + city1 + ' is not available.' ] elif latLonData[0]['name'].find('State') != -1: PollutantsData1 = [ 'Error', 'Sorry! This page only shows city related data. Please enter a city name.' ] else: lat = str(latLonData[0]['lat']) lon = str(latLonData[0]['lon']) sDate = datetime.date.today() - datetime.timedelta(days=31) sDateformatted = sDate.strftime('%d/%m/%Y') eDate = datetime.date.today() - datetime.timedelta(days=1) eDateformatted = eDate.strftime('%d/%m/%Y') sUNIX = int( time.mktime( datetime.datetime.strptime(sDateformatted, "%d/%m/%Y").timetuple())) eUNIX = int( time.mktime( datetime.datetime.strptime(eDateformatted, "%d/%m/%Y").timetuple())) history = urllib.request.urlopen( 'http://api.openweathermap.org/data/2.5/air_pollution/history?lat=' + str(lat) + '&lon=' + str(lon) + '&start=' + str(sUNIX) + '&end=' + str(eUNIX) + '&appid=' + api).read() historyData = json.loads(history) error = [] if 'cod' in historyData: error = ['404'] else: error = ['10000'] if error[0] == '404': PollutantsData1 = [ 'Error', 'Sorry! The requested city data is not available.' ] else: hData1 = historyData['list'] prevDate = '0' count = 1 aqiData = [] coData = [] noData = [] no2Data = [] o3Data = [] so2Data = [] pm2_5Data = [] pm10Data = [] nh3Data = [] for tData in hData1: tCO = float(tData['components']['co']) tNO = float(tData['components']['no']) tNO2 = float(tData['components']['no2']) tO3 = float(tData['components']['o3']) tSO2 = float(tData['components']['so2']) tPM2_5 = float(tData['components']['pm2_5']) tPM10 = float(tData['components']['pm10']) tNH3 = float(tData['components']['nh3']) tDate = datetime.datetime.fromtimestamp(int(tData['dt'])) tDatef = tDate.strftime('%d/%m/%Y') if prevDate == tDatef: coData[len(coData) - 1][1] = round( (count * (coData[len(pm2_5Data) - 1][1]) + tCO) / (count + 1), 2) noData[len(noData) - 1][1] = round( (count * (noData[len(pm2_5Data) - 1][1]) + tNO) / (count + 1), 2) no2Data[len(no2Data) - 1][1] = round( (count * (no2Data[len(pm2_5Data) - 1][1]) + tNO2) / (count + 1), 2) o3Data[len(o3Data) - 1][1] = round( (count * (o3Data[len(pm2_5Data) - 1][1]) + tO3) / (count + 1), 2) so2Data[len(so2Data) - 1][1] = round( (count * (so2Data[len(pm2_5Data) - 1][1]) + tSO2) / (count + 1), 2) pm2_5Data[len(pm2_5Data) - 1][1] = round( (count * (pm2_5Data[len(pm2_5Data) - 1][1]) + tPM2_5) / (count + 1), 2) pm10Data[len(pm10Data) - 1][1] = round( (count * (pm10Data[len(pm2_5Data) - 1][1]) + tPM10) / (count + 1), 2) nh3Data[len(nh3Data) - 1][1] = round( (count * (nh3Data[len(pm2_5Data) - 1][1]) + tNH3) / (count + 1), 2) count = count + 1 else: coData.append([tDatef, tCO]) noData.append([tDatef, tNO]) no2Data.append([tDatef, tNO2]) o3Data.append([tDatef, tO3]) so2Data.append([tDatef, tSO2]) pm2_5Data.append([tDatef, tPM2_5]) pm10Data.append([tDatef, tPM10]) nh3Data.append([tDatef, tNH3]) prevDate = tDatef count = 1 aqiData = [] for i in range(len(pm2_5Data)): aqiData.append([ pm2_5Data[i][0], aqi.to_aqi([(aqi.POLLUTANT_PM25, pm2_5Data[i][1]), (aqi.POLLUTANT_PM10, pm10Data[i][1])]) ]) PollutantsData1 = [ aqiData, coData, noData, no2Data, o3Data, so2Data, pm2_5Data, pm10Data, nh3Data, latLonData[0]['name'] ] #For city 2 lat = 0 lon = 0 latLon = urllib.request.urlopen( 'http://api.openweathermap.org/geo/1.0/direct?q=' + city2 + '&limit=1&appid=' + api).read() latLonData = json.loads(latLon) if len(latLonData) == 0: PollutantsData2 = [ 'Error', 'Sorry! The data for ' + city2 + ' is not available.' ] elif latLonData[0]['name'].find('State') != -1: PollutantsData2 = [ 'Error', 'Sorry! This page only shows city related data. Please enter a city name.' ] else: lat = str(latLonData[0]['lat']) lon = str(latLonData[0]['lon']) sDate = datetime.date.today() - datetime.timedelta(days=31) sDateformatted = sDate.strftime('%d/%m/%Y') eDate = datetime.date.today() - datetime.timedelta(days=1) eDateformatted = eDate.strftime('%d/%m/%Y') sUNIX = int( time.mktime( datetime.datetime.strptime(sDateformatted, "%d/%m/%Y").timetuple())) eUNIX = int( time.mktime( datetime.datetime.strptime(eDateformatted, "%d/%m/%Y").timetuple())) history = urllib.request.urlopen( 'http://api.openweathermap.org/data/2.5/air_pollution/history?lat=' + str(lat) + '&lon=' + str(lon) + '&start=' + str(sUNIX) + '&end=' + str(eUNIX) + '&appid=' + api).read() historyData = json.loads(history) error = [] if 'cod' in historyData: error = ['404'] else: error = ['10000'] if error[0] == '404': PollutantsData2 = [ 'Error', 'Sorry! The requested city data is not available.' ] else: hData1 = historyData['list'] prevDate = '0' count = 1 coData = [] noData = [] no2Data = [] o3Data = [] so2Data = [] pm2_5Data = [] pm10Data = [] nh3Data = [] for tData in hData1: tCO = float(tData['components']['co']) tNO = float(tData['components']['no']) tNO2 = float(tData['components']['no2']) tO3 = float(tData['components']['o3']) tSO2 = float(tData['components']['so2']) tPM2_5 = float(tData['components']['pm2_5']) tPM10 = float(tData['components']['pm10']) tNH3 = float(tData['components']['nh3']) tDate = datetime.datetime.fromtimestamp(int(tData['dt'])) tDatef = tDate.strftime('%d/%m/%Y') if prevDate == tDatef: coData[len(coData) - 1][1] = round( (count * (coData[len(pm2_5Data) - 1][1]) + tCO) / (count + 1), 2) noData[len(noData) - 1][1] = round( (count * (noData[len(pm2_5Data) - 1][1]) + tNO) / (count + 1), 2) no2Data[len(no2Data) - 1][1] = round( (count * (no2Data[len(pm2_5Data) - 1][1]) + tNO2) / (count + 1), 2) o3Data[len(o3Data) - 1][1] = round( (count * (o3Data[len(pm2_5Data) - 1][1]) + tO3) / (count + 1), 2) so2Data[len(so2Data) - 1][1] = round( (count * (so2Data[len(pm2_5Data) - 1][1]) + tSO2) / (count + 1), 2) pm2_5Data[len(pm2_5Data) - 1][1] = round( (count * (pm2_5Data[len(pm2_5Data) - 1][1]) + tPM2_5) / (count + 1), 2) pm10Data[len(pm10Data) - 1][1] = round( (count * (pm10Data[len(pm2_5Data) - 1][1]) + tPM10) / (count + 1), 2) nh3Data[len(nh3Data) - 1][1] = round( (count * (nh3Data[len(pm2_5Data) - 1][1]) + tNH3) / (count + 1), 2) count = count + 1 else: coData.append([tDatef, tCO]) noData.append([tDatef, tNO]) no2Data.append([tDatef, tNO2]) o3Data.append([tDatef, tO3]) so2Data.append([tDatef, tSO2]) pm2_5Data.append([tDatef, tPM2_5]) pm10Data.append([tDatef, tPM10]) nh3Data.append([tDatef, tNH3]) prevDate = tDatef count = 1 aqiData = [] for i in range(len(pm2_5Data)): aqiData.append([ pm2_5Data[i][0], aqi.to_aqi([(aqi.POLLUTANT_PM25, pm2_5Data[i][1]), (aqi.POLLUTANT_PM10, pm10Data[i][1])]) ]) PollutantsData2 = [ aqiData, coData, noData, no2Data, o3Data, so2Data, pm2_5Data, pm10Data, nh3Data, latLonData[0]['name'] ] error = [] if include == 1: error = [ 'Error', 'Please enter a place in searchbox to search for air pollution details of required place.' ] return render_template('cityvscity.html', citydata=city_data, data1=PollutantsData1, len1=len(PollutantsData1), data2=PollutantsData2, len2=len(PollutantsData2))
def main(): # Create the I2C interface. i2c = busio.I2C(board.SCL, board.SDA) # 128x32 OLED Display reset_pin = DigitalInOut(board.D4) display = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c, reset=reset_pin) # Clear the display. display.fill(0) display.show() width = display.width height = display.height # prepare scrolling display dline1 = dline2 = dline3 = "" while True: aqi_cnx = mysql.connector.connect(user=cur_user, password=cur_pwd, host='sequoia', database='airquality') aqi_cursor = aqi_cnx.cursor() # Fetch data from mySQL database data_fetch = "SELECT * FROM pm25data WHERE ts >= date_sub(now(),interval 1 hour)" aqi_cursor.execute(data_fetch) ds1_records = aqi_cursor.fetchall() ds1DF = pd.DataFrame(ds1_records) try: ds1DF.columns = [ 'observation', 'ts', 'pm25', 'pm100', 'mtempc', 'mtempf', 'mpress', 'mrh' ] except ValueError as e: print("Caught ValueError: %s" % e) time.sleep(10) continue meanpm25 = statistics.mean(ds1DF['pm25']) meanpm100 = statistics.mean(ds1DF['pm100']) cur_aqi = aqi.to_aqi([(aqi.POLLUTANT_PM25, meanpm25), (aqi.POLLUTANT_PM10, meanpm100)]) data_fetch = "SELECT * FROM pm25data ORDER BY observation DESC LIMIT 1" aqi_cursor.execute(data_fetch) ds2_records = aqi_cursor.fetchall() ds2DF = pd.DataFrame(ds2_records) try: ds2DF.columns = [ 'observation', 'ts', 'pm25', 'pm100', 'mtempc', 'mtempf', 'mpress', 'mrh' ] except ValueError as e: print("Caught ValueError: %s" % e) time.sleep(10) continue aqi_cursor.close() aqi_cnx.close() cur_tempc = ds2DF['mtempc'] cur_tempf = ds2DF['mtempf'] cur_press = ds2DF['mpress'] cur_rh = ds2DF['mrh'] dline1 = "%0.2f C %0.2f F" % (cur_tempc, cur_tempf) dline2 = "%0.2f hPa %0.2f RH" % (cur_press, cur_rh) dline3 = "AQI %d" % cur_aqi print(dline1) print(dline2) print("%s\n" % dline3) display.fill(0) display.text(dline1, 5, 0, 1) display.text(dline2, 5, 11, 1) display.text(dline3, 5, 22, 1) display.show() time.sleep(120)
def statevsstate(): PollutantsData1 = [] PollutantsData2 = [] if request.method == 'GET': return render_template('statevsstate.html', data1=PollutantsData1, len1=len(PollutantsData1), data2=PollutantsData2, len2=len(PollutantsData2)) if request.method == 'POST': state1 = request.form['state1'] state2 = request.form['state2'] else: state1 = 'Gujarat' state2 = 'Maharashtra' #Removing extra whitespaces and converting spaces into + to pass into url. state1 = "+".join(state1.split()) state2 = "+".join(state2.split()) #For state 1 lat = 0 lon = 0 latLon = urllib.request.urlopen( 'http://api.openweathermap.org/geo/1.0/direct?q=' + state1 + '&limit=1&appid=' + api).read() latLonData = json.loads(latLon) if len(latLonData) == 0: PollutantsData1 = [ 'Error', 'Sorry! The Data for ' + state1 + ' is not available.' ] elif latLonData[0]['name'].find('State') == -1: PollutantsData1 = [ 'Error', 'Sorry! This page only shows state related data. Please enter a state name.' ] else: lat = str(latLonData[0]['lat']) lon = str(latLonData[0]['lon']) sDate = datetime.date.today() - datetime.timedelta(days=31) sDateformatted = sDate.strftime('%d/%m/%Y') eDate = datetime.date.today() - datetime.timedelta(days=1) eDateformatted = eDate.strftime('%d/%m/%Y') sUNIX = int( time.mktime( datetime.datetime.strptime(sDateformatted, "%d/%m/%Y").timetuple())) eUNIX = int( time.mktime( datetime.datetime.strptime(eDateformatted, "%d/%m/%Y").timetuple())) history = urllib.request.urlopen( 'http://api.openweathermap.org/data/2.5/air_pollution/history?lat=' + str(lat) + '&lon=' + str(lon) + '&start=' + str(sUNIX) + '&end=' + str(eUNIX) + '&appid=' + api).read() historyData = json.loads(history) error = [] if 'cod' in historyData: error = ['404'] else: error = ['10000'] if error[0] == '404': PollutantsData1 = [ 'Error', 'Sorry! The requested state data is not available.' ] else: hData1 = historyData['list'] prevDate = '0' count = 1 coData = [] noData = [] no2Data = [] o3Data = [] so2Data = [] pm2_5Data = [] pm10Data = [] nh3Data = [] for tData in hData1: tCO = float(tData['components']['co']) tNO = float(tData['components']['no']) tNO2 = float(tData['components']['no2']) tO3 = float(tData['components']['o3']) tSO2 = float(tData['components']['so2']) tPM2_5 = float(tData['components']['pm2_5']) tPM10 = float(tData['components']['pm10']) tNH3 = float(tData['components']['nh3']) tDate = datetime.datetime.fromtimestamp(int(tData['dt'])) tDatef = tDate.strftime('%d/%m/%Y') if prevDate == tDatef: coData[len(coData) - 1][1] = round( (count * (coData[len(pm2_5Data) - 1][1]) + tCO) / (count + 1), 2) noData[len(noData) - 1][1] = round( (count * (noData[len(pm2_5Data) - 1][1]) + tNO) / (count + 1), 2) no2Data[len(no2Data) - 1][1] = round( (count * (no2Data[len(pm2_5Data) - 1][1]) + tNO2) / (count + 1), 2) o3Data[len(o3Data) - 1][1] = round( (count * (o3Data[len(pm2_5Data) - 1][1]) + tO3) / (count + 1), 2) so2Data[len(so2Data) - 1][1] = round( (count * (so2Data[len(pm2_5Data) - 1][1]) + tSO2) / (count + 1), 2) pm2_5Data[len(pm2_5Data) - 1][1] = round( (count * (pm2_5Data[len(pm2_5Data) - 1][1]) + tPM2_5) / (count + 1), 2) pm10Data[len(pm10Data) - 1][1] = round( (count * (pm10Data[len(pm2_5Data) - 1][1]) + tPM10) / (count + 1), 2) nh3Data[len(nh3Data) - 1][1] = round( (count * (nh3Data[len(pm2_5Data) - 1][1]) + tNH3) / (count + 1), 2) count = count + 1 else: coData.append([tDatef, tCO]) noData.append([tDatef, tNO]) no2Data.append([tDatef, tNO2]) o3Data.append([tDatef, tO3]) so2Data.append([tDatef, tSO2]) pm2_5Data.append([tDatef, tPM2_5]) pm10Data.append([tDatef, tPM10]) nh3Data.append([tDatef, tNH3]) prevDate = tDatef count = 1 aqiData = [] for i in range(len(pm2_5Data)): aqiData.append([ pm2_5Data[i][0], aqi.to_aqi([(aqi.POLLUTANT_PM25, pm2_5Data[i][1]), (aqi.POLLUTANT_PM10, pm10Data[i][1])]) ]) PollutantsData1 = [ aqiData, coData, noData, no2Data, o3Data, so2Data, pm2_5Data, pm10Data, nh3Data, latLonData[0]['name'] ] #For state 2 lat = 0 lon = 0 latLon = urllib.request.urlopen( 'http://api.openweathermap.org/geo/1.0/direct?q=' + state2 + '&limit=1&appid=' + api).read() latLonData = json.loads(latLon) if len(latLonData) == 0: PollutantsData2 = [ 'Error', 'Sorry! The data for ' + state2 + ' is not available.' ] elif latLonData[0]['name'].find('State') == -1: PollutantsData2 = [ 'Error', 'Sorry! This page only shows state related data. Please enter a state name.' ] else: lat = str(latLonData[0]['lat']) lon = str(latLonData[0]['lon']) sDate = datetime.date.today() - datetime.timedelta(days=31) sDateformatted = sDate.strftime('%d/%m/%Y') eDate = datetime.date.today() - datetime.timedelta(days=1) eDateformatted = eDate.strftime('%d/%m/%Y') sUNIX = int( time.mktime( datetime.datetime.strptime(sDateformatted, "%d/%m/%Y").timetuple())) eUNIX = int( time.mktime( datetime.datetime.strptime(eDateformatted, "%d/%m/%Y").timetuple())) history = urllib.request.urlopen( 'http://api.openweathermap.org/data/2.5/air_pollution/history?lat=' + str(lat) + '&lon=' + str(lon) + '&start=' + str(sUNIX) + '&end=' + str(eUNIX) + '&appid=' + api).read() historyData = json.loads(history) error = [] if 'cod' in historyData: error = ['404'] else: error = ['10000'] if error[0] == '404': PollutantsData2 = [ 'Error', 'Sorry! The requested state data is not available.' ] else: hData1 = historyData['list'] prevDate = '0' count = 1 coData = [] noData = [] no2Data = [] o3Data = [] so2Data = [] pm2_5Data = [] pm10Data = [] nh3Data = [] for tData in hData1: tCO = float(tData['components']['co']) tNO = float(tData['components']['no']) tNO2 = float(tData['components']['no2']) tO3 = float(tData['components']['o3']) tSO2 = float(tData['components']['so2']) tPM2_5 = float(tData['components']['pm2_5']) tPM10 = float(tData['components']['pm10']) tNH3 = float(tData['components']['nh3']) tDate = datetime.datetime.fromtimestamp(int(tData['dt'])) tDatef = tDate.strftime('%d/%m/%Y') if prevDate == tDatef: coData[len(coData) - 1][1] = round( (count * (coData[len(pm2_5Data) - 1][1]) + tCO) / (count + 1), 2) noData[len(noData) - 1][1] = round( (count * (noData[len(pm2_5Data) - 1][1]) + tNO) / (count + 1), 2) no2Data[len(no2Data) - 1][1] = round( (count * (no2Data[len(pm2_5Data) - 1][1]) + tNO2) / (count + 1), 2) o3Data[len(o3Data) - 1][1] = round( (count * (o3Data[len(pm2_5Data) - 1][1]) + tO3) / (count + 1), 2) so2Data[len(so2Data) - 1][1] = round( (count * (so2Data[len(pm2_5Data) - 1][1]) + tSO2) / (count + 1), 2) pm2_5Data[len(pm2_5Data) - 1][1] = round( (count * (pm2_5Data[len(pm2_5Data) - 1][1]) + tPM2_5) / (count + 1), 2) pm10Data[len(pm10Data) - 1][1] = round( (count * (pm10Data[len(pm2_5Data) - 1][1]) + tPM10) / (count + 1), 2) nh3Data[len(nh3Data) - 1][1] = round( (count * (nh3Data[len(pm2_5Data) - 1][1]) + tNH3) / (count + 1), 2) count = count + 1 else: coData.append([tDatef, tCO]) noData.append([tDatef, tNO]) no2Data.append([tDatef, tNO2]) o3Data.append([tDatef, tO3]) so2Data.append([tDatef, tSO2]) pm2_5Data.append([tDatef, tPM2_5]) pm10Data.append([tDatef, tPM10]) nh3Data.append([tDatef, tNH3]) prevDate = tDatef count = 1 aqiData = [] for i in range(len(pm2_5Data)): aqiData.append([ pm2_5Data[i][0], aqi.to_aqi([(aqi.POLLUTANT_PM25, pm2_5Data[i][1]), (aqi.POLLUTANT_PM10, pm10Data[i][1])]) ]) PollutantsData2 = [ aqiData, coData, noData, no2Data, o3Data, so2Data, pm2_5Data, pm10Data, nh3Data, latLonData[0]['name'] ] return render_template('statevsstate.html', data1=PollutantsData1, len1=len(PollutantsData1), data2=PollutantsData2, len2=len(PollutantsData2))