Skip to content
← Public packages

@kentcdodds/environment

Weather, air quality, sun/moon, and outdoor environment snapshots.

src/aqi.ts

69 lines · 1.7 KB · TypeScript
import airQualityLookup from './air-quality.ts'

/** Default outdoor air-quality lookup location for Kent's home. */
export const HOME_AIR_QUALITY_LOCATION = 'Highland, UT'

export type AirQualityLookupParams = {
	location?: string
	latitude?: number
	longitude?: number
	date?: string
	hour?: number | null
	hourlyLimit?: number
}

export type AirQualitySummary = {
	location: string
	date: string
	usAqi: number | null
	category: string
	europeanAqi: number | null
	pm25: number | null
	pm10: number | null
	peakHour: string | null
	summary: string
}

/** Full Open-Meteo air-quality lookup for a location or coordinates. */
export async function getAirQuality(params: AirQualityLookupParams = {}) {
	return airQualityLookup(params)
}

/** Air-quality lookup for Kent's home location in Highland, UT. */
export async function getHomeAirQuality(
	params: Omit<
		AirQualityLookupParams,
		'location' | 'latitude' | 'longitude'
	> = {},
) {
	return airQualityLookup({
		location: HOME_AIR_QUALITY_LOCATION,
		...params,
	})
}

/** Compact AQI summary for briefings and automations. */
export async function summarizeAirQuality(
	params: AirQualityLookupParams = {},
) {
	const result = await airQualityLookup({
		location: params.location ?? HOME_AIR_QUALITY_LOCATION,
		latitude: params.latitude,
		longitude: params.longitude,
		date: params.date,
		hour: params.hour,
		hourlyLimit: params.hourlyLimit,
	})

	return {
		location: result.location.displayName,
		date: result.date,
		usAqi: result.daily.maxUsAqi,
		category: result.daily.maxUsCategory,
		europeanAqi: result.daily.maxEuropeanAqi,
		pm25: result.daily.avgPm25,
		pm10: result.daily.avgPm10,
		peakHour: result.daily.peakHour?.time ?? null,
		summary: result.summary,
	} satisfies AirQualitySummary
}