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
Example #2
0
 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)
Example #3
0
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"})
Example #4
0
 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)
Example #5
0
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),
            ]))
Example #7
0
File: fun.py Project: bharara/AirQM
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
Example #8
0
 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)
Example #9
0
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
Example #10
0
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
Example #11
0
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
Example #12
0
 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)
Example #13
0
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
Example #14
0
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
Example #15
0
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)
Example #16
0
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']})"
    )
Example #17
0
    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)
Example #19
0
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)
Example #23
0
            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()
Example #24
0
 def pollutant_to_aqi(pollutant):
     return lambda conc: float(aqi.to_aqi([(pollutant, conc)]))
Example #25
0
import aqi
myaqi = aqi.to_aqi([(aqi.POLLUTANT_PM25, '102'), (aqi.POLLUTANT_PM10, '192')])

print("myAQI=", myaqi)
Example #26
0
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)
Example #27
0
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:
Example #28
0
    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)
Example #31
0
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))
Example #33
0
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))