easyAQI

Get the Air Quality Index (AQI) for a location via open data sources.

It's "easy" because it strings together multiple lower-level APIs to give you a simple interface for AQI.

  1. Accepts a location in basically any string format (ie "downtown manhattan")
  2. Uses Nominatim to turn that into longitude and latitude
  3. Finds the closest sensor to you on OpenAQ
  4. Pulls the readings from OpenAQ
  5. Calculates the AQI via EPA's NowCAST algorithm
  6. Uses EPA's ranking to classify the severity of the score (ie "Unhealthy for Sensitive Groups")

Example usage

Create val@stevekrouse.easyAQI({ location: "brooklyn navy yard" }) // Returns { "aqi": 23.6, "severity": "Good" }

Forkable example: val.town/v/stevekrouse.easyAQIExample

Also useful for getting alerts when the AQI is unhealthy near you: https://www.val.town/v/stevekrouse.aqi

Readme
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import { nominatimSearch } from "https://esm.town/v/stevekrouse/nominatimSearch";
import { nowcastPMAQISeverity } from "https://esm.town/v/stevekrouse/nowcastPMAQISeverity";
import { openAQLocation as findOpenAQLocation } from "https://esm.town/v/stevekrouse/openAQLocation";
import { openAqNowcastAQI } from "https://esm.town/v/stevekrouse/openAqNowcastAQI";
export async function easyAQI({ location }: {
location: string;
}) {
const [geo] = await nominatimSearch({
q: location,
});
console.log("Searching for openAQ stations near: " + geo.display_name);
const openAQLocation = await findOpenAQLocation({
lat: parseFloat(geo.lat),
lon: parseFloat(geo.lon),
});
console.log("Pulling pm2.5 from station: " + openAQLocation.name);
const aqi = await openAqNowcastAQI({
location_id: openAQLocation.id,
});
return { aqi, severity: nowcastPMAQISeverity(aqi) };
}
👆 This is a val. Vals are TypeScript snippets of code, written in the browser and run on our servers. Create scheduled functions, email yourself, and persist small pieces of data — all from the browser.