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")
It uses blob storage to cache the openai location id for your location string to skip a couple steps for the next time.
@stevekrouse.
easyAQI({
location:
"brooklyn navy yard" })
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
Doing a triple-lookup for every run ("human-friendly" location name to lat/lng, lat/lng to list of stations, individual station data) is a decent amount of overhead, and more possibilities for an individual request to fail.
I'd recommend using val.town's SQLite feature to create a table matching
LOCATION
values to "openAQLocation IDs". Thus, if the location never changes for a user (likely), the first two queries can be skipped most runs.Great idea! What do you think of this implementation? https://www.val.town/pulls/bf6db21e-1d03-11ef-a060-cab58f78796a
That looks wonderful! Since your example "location" value has spaces in it, likely most users will follow suit. That means your blob cache key will have underscores for the first part of the key, and then spaces for the last half. That's not too big a deal, but you may want to do some light sanitizing on the user's input to make it consistent (all lower-case, all whitespaces to underscores, all non-alphanumeric characters removed) and a little more human-friendly if a user uses the "admin" tools to browse their blob objects.
great idea!
done and merged :)