Readme
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.
- Accepts a location in basically any string format (ie "downtown manhattan")
- Uses Nominatim to turn that into longitude and latitude
- Finds the closest sensor to you on OpenAQ
- Pulls the readings from OpenAQ
- Calculates the AQI via EPA's NowCAST algorithm
- Uses EPA's ranking to classify the severity of the score (ie "Unhealthy for Sensitive Groups")
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
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.