The Ozon3
Perl module is a lightweight interface to the World Air Quality Index (WAQI) API, designed to fetch real-time air quality data based on geographic coordinates. Modeled after the Python Ozon3
library, it provides a robust way to retrieve Air Quality Index (AQI) and pollutant metrics with optional rate limiting.
Key Features
- WAQI API Integration: Connects to
https://api.waqi.info/
to retrieve air quality data. - Rate Limiting: Supports up to 1000 API calls per second using
Schedule::RateLimiter
(optional). - Error Handling: Comprehensive checks for invalid tokens, rate limits, and API errors.
- Data Extraction: Returns detailed AQI, pollutant levels (e.g., PM2.5, PM10, NO2), and health implications.
Core Components
Initialization (new
)
- Requires a WAQI API token.
- Sets up
LWP::UserAgent
for HTTP requests andSchedule::RateLimiter
for throttling. - Validates the token by querying the API with a test request for London.
Fetching Data (get_air_quality
)
- Takes latitude and longitude as inputs.
- Constructs a URL with escaped parameters and the API token.
- Returns a hashref containing AQI, pollutant concentrations, station details, and health implications.
Data Processing (_extract_live_data
)
- Extracts metrics like AQI, PM2.5, PM10, CO, and meteorological data (e.g., temperature, humidity).
- Normalizes pollutant names (e.g.,
pm25
topm2.5
). - Converts AQI into human-readable meanings and health implications.
Utility Methods
_check_token_validity
: Verifies the API token._check_and_get_data_obj
: Handles HTTP responses and API errors._aqi_meaning
: Maps AQI values to categories (e.g., “Good,” “Unhealthy”) and health risks._as_float
: Ensures numeric values are properly formatted.
Usage Example
use Ozon3;
my $ozon3 = Ozon3->new(token => 'your_waqi_token');
my $aq = $ozon3->get_air_quality(37.7749, -122.4194); # San Francisco
if ($aq) {
print "AQI: $aq->{aqi} ($aq->{aqi_meaning})\n";
print "PM2.5: $aq->{pm2.5} µg/m³\n";
}
Dependencies
LWP::UserAgent
: For HTTP requests.JSON::MaybeXS
: For parsing API responses.URI::Escape
: For URL encoding.Schedule::RateLimiter
: Optional, for rate limiting.
Notes
- The module gracefully handles missing dependencies or failed initializations.
- Rate limiting is optional; if
Schedule::RateLimiter
fails, the module proceeds without it. - Comprehensive error messages aid debugging (e.g., invalid tokens, unknown stations).
Conclusion
The Ozon3
module is a reliable tool for developers needing air quality data in Perl applications. Its robust error handling and flexible design make it suitable for both small scripts and large systems.
Source: Adapted from the Ozon3 Python library by Ozon3Org.