campus-air-quality/
βββ config/
β βββ database.php
β βββ env.php
β βββ constants.php
βββ src/
β βββ Core/
β β βββ Database.php
β β βββ Router.php
β β βββ Session.php
β βββ Models/
β β βββ User.php
β β βββ AirQuality.php
β β βββ Location.php
β β βββ Notification.php
β β βββ Alert.php
β βββ Controllers/
β β βββ AuthController.php
β β βββ DashboardController.php
β β βββ AirQualityController.php
β β βββ LocationController.php
β β βββ UserController.php
β β βββ AnalyticsController.php
β β βββ NotificationController.php
β β βββ AlertController.php
β βββ Services/
β β βββ ApiClient.php
β β βββ NinjasClient.php
β β βββ AnalyticsService.php
β β βββ CacheService.php
β β βββ NotificationService.php
β β βββ WebPushService.php
β βββ Helpers/
β βββ functions.php
β βββ validator.php
βββ public/
β βββ index.php
β βββ assets/
β β βββ css/
β β βββ js/
β β βββ images/
β βββ service-worker.js
β βββ .htaccess
βββ views/
β βββ layouts/
β β βββ main.php
β βββ auth/
β β βββ login.php
β β βββ register.php
β βββ dashboard/
β β βββ index.php
β βββ air-quality/
β β βββ index.php
β βββ locations/
β β βββ index.php
β β βββ create.php
β β βββ edit.php
β βββ users/
β β βββ index.php
β β βββ create.php
β β βββ edit.php
β βββ alerts/
β β βββ index.php
β β βββ create.php
β β βββ edit.php
β βββ notifications/
β β βββ index.php
β βββ analytics/
β βββ index.php
βββ database/
β βββ migrations/
β β βββ schema.sql
β βββ seeders/
β βββ DatabaseSeeder.php
β βββ run-seeder.php
βββ storage/
β βββ cache/
β βββ logs/
βββ .env.example
βββ .gitignore
βββ composer.json
βββ generate-vapid.php
βββ README.md
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(100) UNIQUE NOT NULL,
email VARCHAR(150) UNIQUE NOT NULL,
password VARCHAR(255),
full_name VARCHAR(200),
role ENUM('admin', 'staff', 'student') DEFAULT 'student',
google_id VARCHAR(255) UNIQUE,
avatar VARCHAR(255),
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);CREATE TABLE locations (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(200) NOT NULL,
description TEXT,
latitude DECIMAL(10, 8) NOT NULL,
longitude DECIMAL(11, 8) NOT NULL,
building VARCHAR(100),
floor VARCHAR(50),
is_active BOOLEAN DEFAULT TRUE,
created_by INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL
);CREATE TABLE air_quality_records (
id INT AUTO_INCREMENT PRIMARY KEY,
location_id INT NOT NULL,
aqi INT NOT NULL,
pm25 DECIMAL(10, 2),
pm10 DECIMAL(10, 2),
o3 DECIMAL(10, 2),
no2 DECIMAL(10, 2),
so2 DECIMAL(10, 2),
co DECIMAL(10, 2),
temperature DECIMAL(5, 2),
humidity DECIMAL(5, 2),
status ENUM('good', 'moderate', 'unhealthy_sensitive', 'unhealthy', 'very_unhealthy', 'hazardous'),
api_source VARCHAR(50),
recorded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (location_id) REFERENCES locations(id) ON DELETE CASCADE,
INDEX idx_location_time (location_id, recorded_at)
);CREATE TABLE alerts (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
location_id INT,
alert_type ENUM('aqi_threshold', 'pm25_threshold', 'location_specific'),
threshold_value INT,
is_active BOOLEAN DEFAULT TRUE,
notify_email BOOLEAN DEFAULT TRUE,
notify_push BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (location_id) REFERENCES locations(id) ON DELETE SET NULL
);CREATE TABLE notifications (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
title VARCHAR(255) NOT NULL,
message TEXT NOT NULL,
type ENUM('email', 'push', 'both') DEFAULT 'push',
status ENUM('pending', 'sent', 'failed') DEFAULT 'pending',
air_quality_record_id INT,
sent_at TIMESTAMP NULL,
error_message TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (air_quality_record_id) REFERENCES air_quality_records(id) ON DELETE SET NULL
);CREATE TABLE api_cache (
id INT AUTO_INCREMENT PRIMARY KEY,
cache_key VARCHAR(255) UNIQUE NOT NULL,
cache_value TEXT NOT NULL,
api_source VARCHAR(50),
expires_at TIMESTAMP NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_key_expires (cache_key, expires_at)
);CREATE TABLE push_subscriptions (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
endpoint TEXT NOT NULL,
p256dh_key TEXT NOT NULL,
auth_token TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);# Database
DB_HOST=localhost
DB_NAME=campus_air_quality
DB_USER=root
DB_PASS=
# API Keys (Hanya API Ninjas yang digunakan)
NINJAS_API_KEY=your_ninjas_key_here
# Google OAuth (Optional)
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret
GOOGLE_REDIRECT_URI=http://localhost/campus-air-quality/public/auth/google-callback
# Web Push VAPID
VAPID_PUBLIC_KEY=your_vapid_public_key
VAPID_PRIVATE_KEY=your_vapid_private_key
VAPID_SUBJECT=mailto:admin@campus.ac.id
# Email (PHPMailer)
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your_email@gmail.com
SMTP_PASS=your_app_password
SMTP_FROM=noreply@campus.ac.id
SMTP_FROM_NAME=Campus Air Quality
# App
APP_URL=http://localhost/campus-air-quality/public
APP_NAME=Campus Air Quality Monitor
TIMEZONE=Asia/Jakarta
# Cache
CACHE_TTL=3600{
"require": {
"php": ">=7.4",
"phpmailer/phpmailer": "^6.8",
"web-token/jwt-framework": "^3.2",
"minishlink/web-push": "^8.0",
"vlucas/phpdotenv": "^5.5",
"guzzlehttp/guzzle": "^7.5"
},
"autoload": {
"psr-4": {
"App\\": "src/"
},
"files": [
"src/Helpers/functions.php"
]
}
}- Login/Register dengan password hash
- Google OAuth 2.0
- Session management
- Role-based access (admin, staff, student)
- Users: Manajemen user (admin/staff only)
- Locations: Manajemen lokasi monitoring (gedung, lantai, koordinat)
- Air Quality Records: Data kualitas udara real-time
- Alerts: Pengaturan notifikasi threshold
- Notifications: History notifikasi
- Analytics: Dashboard analitik dengan metrik & rekomendasi
- API Ninjas: Data lengkap kualitas udara (PM2.5, PM10, O3, NO2, SO2, CO)
- Perhitungan AQI otomatis dari pollutant data
- Cache response dengan TTL (file & database)
- API key disimpan aman di .env
- Web Push dengan Service Worker + VAPID
- Email fallback (PHPMailer)
- Log status di tabel notifications
- Time-series: Tren AQI 24 jam/7 hari/30 hari
- Bar chart: Perbandingan kualitas per lokasi
- Pie chart: Distribusi status udara (good/moderate/unhealthy)
- Heatmap: PM2.5 per gedung
- Overall Statistics: AQI rata-rata, PM2.5, PM10, dan pollutant lainnya
- Status Distribution: Pie chart distribusi kualitas udara
- Trend Analysis: Line chart tren AQI harian dengan PM2.5
- Location Analytics: Bar chart perbandingan AQI per lokasi
- Peak Hours Analysis: Identifikasi jam-jam dengan polusi tertinggi
- Pollutant Correlation: Statistik detail setiap pollutant (avg, min, max, std dev)
- AI Recommendations: Rekomendasi otomatis berdasarkan data analitik
- Export to CSV: Download laporan lengkap dalam format CSV
- Period Comparison: Bandingkan perubahan kualitas udara antar periode
- Real-time AQI per lokasi
- Alert system otomatis
- Historical data analysis
- Export data (CSV/PDF)
- Role-Based Access Control:
- Admin: Full access ke semua fitur
- Staff: Akses Locations & Users (read-only untuk Users)
- Student: Hanya Dashboard, Air Quality, Alerts, Notifications
- CSS Framework: Bootstrap 5 / Tailwind CSS
- Chart Library: Chart.js
- Icons: Font Awesome / Feather Icons
- Maps: Leaflet.js (untuk peta lokasi)
# Download XAMPP dari: https://www.apachefriends.org/
# Install dengan komponen:
# - Apache
# - MySQL
# - PHP (minimal 7.4)
# - phpMyAdmin# Copy folder project ke:
C:\xampp\htdocs\campus-air-quality
# Struktur folder:
C:\xampp\htdocs\campus-air-quality\
βββ config\
βββ src\
βββ public\
βββ views\
βββ database\
βββ ...# Download Composer untuk Windows:
https://getcomposer.org/Composer-Setup.exe
# Install dan restart terminal
# Verifikasi instalasi:
composer --version# Buka Command Prompt atau PowerShell
# Navigate ke folder project:
cd C:\xampp\htdocs\campus-air-quality
# Install dependencies:
composer install# 1. Start XAMPP Control Panel
# 2. Start Apache dan MySQL
# 3. Buka browser: http://localhost/phpmyadmin
# 4. Create Database:
# - Klik "New" di sidebar
# - Database name: campus_air_quality
# - Collation: utf8mb4_general_ci
# - Klik "Create"
# 5. Import Schema:
# - Klik database "campus_air_quality"
# - Tab "Import"
# - Choose file: C:\xampp\htdocs\campus-air-quality\database\migrations\schema.sql
# - Klik "Go"# Buka Command Prompt di folder project:
cd C:\xampp\htdocs\campus-air-quality
# Run seeder untuk generate data:
php database\seeders\run-seeder.php
# Output:
# β
Seeding users... Done! (5 users created)
# β
Seeding locations... Done! (4 locations created)
# β
Seeding air quality records... Done! (XX records created)
# β
Database seeded successfully!# 1. Copy .env.example ke .env:
copy .env.example .env
# 2. Edit .env dengan Notepad atau VS Code:
# Minimal configuration untuk XAMPP:
DB_HOST=localhost
DB_NAME=campus_air_quality
DB_USER=root
DB_PASS=
DB_PORT=3306
NINJAS_API_KEY=your_ninjas_key_here
APP_URL=http://localhost/campus-air-quality/public
APP_NAME=Campus Air Quality Monitor
TIMEZONE=Asia/Jakarta
CACHE_TTL=3600# File sudah ada di public/.htaccess
# Pastikan isinya:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]# 1. Buka XAMPP Control Panel
# 2. Apache β Config β httpd.conf
# 3. Cari baris: #LoadModule rewrite_module modules/mod_rewrite.so
# 4. Hapus tanda # (uncomment)
# 5. Save file
# 6. Restart Apache di XAMPP Control Panel# Di Command Prompt:
cd C:\xampp\htdocs\campus-air-quality
php generate-vapid.php
# Keys akan otomatis di-update ke .envURL: http://localhost/campus-air-quality/public
Demo Login:
- Admin: admin@campus.ac.id / password123
- Staff: staff1@campus.ac.id / password123
- Student: student1@campus.ac.id / password123
Error: "Internal Server Error"
# 1. Check Apache error log:
C:\xampp\apache\logs\error.log
# 2. Pastikan mod_rewrite enabled
# 3. Check .htaccess di folder public/Error: "Database connection failed"
# 1. Pastikan MySQL running di XAMPP
# 2. Check .env:
DB_HOST=localhost # Bukan 127.0.0.1
DB_PORT=3306 # Default MySQL port
DB_USER=root
DB_PASS= # Kosong untuk default XAMPPError: "Composer command not found"
# 1. Install Composer dari https://getcomposer.org/
# 2. Restart terminal/command prompt
# 3. Verifikasi: composer --versionError: "Class not found"
# Run composer autoload:
cd C:\xampp\htdocs\campus-air-quality
composer dump-autoloadPort 80 atau 3306 sudah digunakan
# Apache Port (80):
# - XAMPP Control Panel β Apache Config β httpd.conf
# - Ubah: Listen 80 β Listen 8080
# - Restart Apache
# - Akses: http://localhost:8080/campus-air-quality/public
# MySQL Port (3306):
# - XAMPP Control Panel β MySQL Config β my.ini
# - Ubah: port=3306 β port=3307
# - Update .env: DB_PORT=3307
# - Restart MySQLcd /home/febriari/Documents/work/campus-air-qualitycomposer install# Buat database MySQL
mysql -u root -p
CREATE DATABASE campus_air_quality;
exit;
# Import schema
mysql -u root -p campus_air_quality < database/migrations/schema.sql
# Run PHP Seeder (Recommended - Dynamic password generation)
php database/run-seeder.php
# Atau gunakan static SQL seed (Alternative)
mysql -u root -p campus_air_quality < database/seeds/seed_data.sqlKeunggulan PHP Seeder:
- β
Password di-generate dinamis dengan
password_hash()(bukan static) - β Data lebih realistis dengan randomization
- β Generate data 7 hari terakhir otomatis
- β Mudah di-customize sesuai kebutuhan
# Copy .env.example ke .env
cp .env.example .env
# Edit .env dan isi konfigurasi:
# - Database credentials
# - API Keys (AQICN, AirVisual, API Ninjas)
# - Google OAuth (optional)
# - SMTP untuk email (optional)# Gunakan script PHP built-in
php generate-vapid.php
# Script akan otomatis:
# 1. Generate VAPID public & private keys
# 2. Update file .env dengan keys baru
# 3. Tampilkan keys untuk verifikasi<VirtualHost *:80>
DocumentRoot "/home/febriari/Documents/work/campus-air-quality/public"
ServerName campus-air.local
<Directory "/home/febriari/Documents/work/campus-air-quality/public">
AllowOverride All
Require all granted
</Directory>
</VirtualHost>cd public
php -S localhost:8000URL: http://localhost:8000
atau http://campus-air.local (jika pakai Apache)
Demo Login:
- Admin: admin@campus.ac.id / password123
- Staff: staff1@campus.ac.id / password123
- Student: student1@campus.ac.id / password123
- Daftar di: https://api-ninjas.com/
- Free tier: 50,000 requests/bulan
- Paste key ke
.env:NINJAS_API_KEY=your_key - API ini menyediakan data lengkap:
- PM2.5, PM10 (Particulate Matter)
- O3 (Ozone)
- NO2 (Nitrogen Dioxide)
- SO2 (Sulfur Dioxide)
- CO (Carbon Monoxide)
- AQI dihitung otomatis dari pollutant data
- β PHP Native (Tanpa Framework)
- β OOP dengan Class & Function
- β MySQL Database
- β Bootstrap 5 untuk Frontend
- β Composer untuk library utilities
- β Login/Logout/Register
- β Password hashing (password_hash & password_verify)
- β Google OAuth 2.0 (Optional)
- β Session management
- β Role-based access (admin, staff, student)
- β 7 Tabel domain (users, locations, air_quality_records, alerts, notifications, api_cache, push_subscriptions)
- β Dynamic PHP Seeder dengan password_hash()
- β
3 Entitas CRUD Penuh:
- Locations: Create, Read, Update, Delete (Admin/Staff only)
- Alerts: Create, Read, Update, Delete
- Users: Create, Read, Update, Delete (Admin only untuk write, Staff read-only)
- β Relasi foreign key & index
- β Role-based access control pada semua CRUD
- β API Ninjas: Data kualitas udara lengkap (PM2.5, PM10, O3, NO2, SO2, CO)
- β Perhitungan AQI otomatis dari pollutant data
- β API key disimpan di .env
- β Cache response (file & database) dengan TTL
- β Error handling & fallback mechanism
- β Web Push (Service Worker + VAPID)
- β Email Fallback (PHPMailer)
- β Log ke tabel notifications dengan status (sent/failed)
- β Alert system otomatis berdasarkan threshold
- β Time-series: Tren AQI 7/24 jam
- β Bar Chart: Perbandingan kualitas per lokasi
- β Pie Chart: Distribusi status udara
- β Data grafik dari database sendiri
- β Admin: Full CRUD user management
- β Staff: View-only user list
- β User List: Tabel dengan role badges & status
- β Add/Edit User: Form dengan role selector
- β Toggle Status: Activate/Deactivate user
- β Prevent Self-Delete: Admin tidak bisa hapus diri sendiri
- β Statistics Dashboard: User count per role
- β AnalyticsService: Service untuk perhitungan metrik & statistik
- β Overall Statistics: AQI, PM2.5, PM10, dan pollutant metrics
- β Status Distribution: Pie chart distribusi kualitas udara
- β Trend Analysis: Line chart tren harian (AQI & PM2.5)
- β Location Analytics: Perbandingan kualitas per lokasi
- β Peak Hours Analysis: Identifikasi jam puncak polusi
- β Pollutant Statistics: Tabel detail avg/min/max/std dev
- β AI Recommendations: Rekomendasi otomatis berdasarkan data
- β Period Comparison: Perbandingan perubahan antar periode
- β CSV Export: Download laporan lengkap
- β Multiple Period: Filter 7/14/30 hari
- β Password hashing dengan password_hash()
- β Prepared statements (SQL injection prevention)
- β CSRF token untuk forms
- β XSS filtering pada input (htmlspecialchars)
- β .env tidak di-commit ke repo
- β Session security (httponly, secure flags)
- Login ke aplikasi
- Klik menu "Air Quality"
- Klik tombol "Fetch Data" pada modal
- Pilih lokasi dari dropdown
- Data akan diambil dari API Ninjas dan tersimpan ke database
- Tabel akan menampilkan data dengan kolom:
- AQI, PM2.5, PM10, O3, NO2, SO2, CO
- Status (Good/Moderate/Unhealthy)
- Source (API Ninjas)
- Recorded At
- Klik menu "Alerts" β "Create Alert"
- Pilih tipe alert (AQI Threshold / PM2.5 / Location Specific)
- Set threshold value
- Pilih notifikasi (Email/Push/Both)
- Save
- Admin:
- Klik menu "Users" β "Add User"
- Isi form (username, email, password, role)
- Klik "Save User"
- Edit/Delete user dari list
- Toggle status (Active/Inactive)
- Staff:
- Hanya bisa view user list
- Tidak ada akses create/edit/delete
- Klik menu "Analytics"
- Pilih periode analisis (7/14/30 hari)
- Lihat berbagai metrik:
- Overall Stats: Cards dengan AQI, PM2.5, max AQI, total records
- Recommendations: Alert box berisi rekomendasi berdasarkan data
- Status Distribution: Pie chart distribusi kualitas udara
- Trend Analysis: Line chart tren AQI & PM2.5 harian
- Location Analytics: Bar chart AQI per lokasi
- Peak Hours: Bar chart jam-jam dengan polusi tertinggi
- Pollutant Stats: Tabel detail statistik setiap pollutant
- Location Details: Tabel lengkap analitik per lokasi
- Export laporan dengan klik "Export CSV"
- Dashboard menampilkan:
- Bar chart perbandingan AQI antar lokasi
- Pie chart distribusi status kualitas udara
- Real-time AQI cards per lokasi
campus-air-quality/
βββ config/ β
Database, env, constants
βββ src/
β βββ Core/ β
Database, Router, Session
β βββ Models/ β
User, Location, AirQuality, Alert, Notification
β βββ Controllers/ β
Auth, Dashboard, Location, Alert, AirQuality, Notification, User, Analytics
β βββ Services/ β
API Ninjas Client, Cache, WebPush, Notification, Analytics
β βββ Helpers/ β
Helper functions, validator
βββ public/ β
index.php, .htaccess, service-worker.js, assets
βββ views/ β
Login, Register, Dashboard, Locations, Users, Alerts, Notifications, Air Quality, Analytics
βββ database/ β
Schema & dynamic PHP seeder
βββ storage/ β
Cache & logs
βββ .env.example β
Template environment
βββ composer.json β
Dependencies
βββ generate-vapid.php β
VAPID key generator
βββ README.md β
Dokumentasi lengkap
Total: 45+ files PHP Native dengan OOP, Role-Based Access Control & Advanced Analytics
# 1. Test login dengan berbagai role
URL: /auth/login
Admin:
Email: admin@campus.ac.id
Password: password123
Akses: Full access ke semua menu
Staff:
Email: staff1@campus.ac.id
Password: password123
Akses: Dashboard, Air Quality, Locations, Users (read-only), Alerts, Notifications
Student:
Email: student1@campus.ac.id
Password: password123
Akses: Dashboard, Air Quality, Alerts, Notifications (tidak bisa akses Locations & Users)
# 2. Test CRUD Locations (Admin/Staff only)
- Create: /locations/create
- Edit: /locations/{id}/edit
- Delete: POST /locations/{id}/delete
- Student akan di-redirect ke dashboard jika akses
# 3. Test CRUD Alerts
- Create: /alerts/create
- Edit: /alerts/{id}/edit
- Delete: POST /alerts/{id}/delete
# 4. Test User Management (Admin full, Staff read-only)
- Create: /users/create (Admin only)
- Edit: /users/{id}/edit (Admin only)
- Delete: POST /users/{id}/delete (Admin only)
- List: /users (Admin & Staff)
- Toggle Status: POST /users/{id}/toggle-status (Admin only)
# 5. Test API Integration
- Air Quality β Pilih location β "Fetch Data"
- Lihat data tersimpan di tabel dengan 11 kolom:
AQI, PM2.5, PM10, O3, NO2, SO2, CO, Status, Source, Recorded At
# 6. Test Grafik
- Dashboard akan otomatis load:
* Bar Chart (comparison per lokasi)
* Pie Chart (distribution status)
# 7. Test Role-Based Access
- Login sebagai student β Menu "Locations" & "Users" tidak muncul
- Login sebagai staff β Menu "Users" muncul tapi hanya view
- Login sebagai admin β Full access semua fitur
# 8. Test Analytics Dashboard
- Klik menu "Analytics"
- Pilih periode: 7 hari / 14 hari / 30 hari
- Verifikasi charts: Status Pie, Trend Line, Location Bar, Peak Hours Bar
- Check Recommendations Alert Box
- Verifikasi Pollutant Statistics Table
- Test Export CSV: klik "Export CSV" β file downloaded
- Check Period Comparison: lihat % change (β atau β)# Cek config di .env
DB_HOST=localhost
DB_NAME=campus_air_quality
DB_USER=root
DB_PASS=
# Pastikan MySQL running
sudo systemctl start mysql# Install composer dependencies
composer install# Pastikan API keys sudah benar di .env
# Test manual API:
curl "https://api.waqi.info/feed/jakarta/?token=YOUR_TOKEN"-
Overall Statistics:
- Total records dalam periode
- Average/Max/Min AQI
- Average untuk semua pollutants (PM2.5, PM10, O3, NO2, SO2, CO)
-
Status Distribution:
- Persentase distribusi kualitas udara
- Good, Moderate, Unhealthy Sensitive, Unhealthy, Very Unhealthy, Hazardous
-
Location Analytics:
- AQI rata-rata per lokasi
- Jumlah kondisi "unhealthy" per lokasi
- Identifikasi lokasi yang memerlukan perhatian khusus
-
Trend Analysis:
- Tren harian AQI dan PM2.5
- Record count per hari
- Visualisasi perubahan kualitas udara
-
Peak Hours Analysis:
- Identifikasi jam-jam dengan polusi tertinggi
- Average AQI per jam
- Rekomendasi waktu untuk aktivitas outdoor
-
Pollutant Correlation:
- Statistik detail: Average, Min, Max, Standard Deviation
- Untuk semua pollutants: PM2.5, PM10, O3, NO2, SO2, CO
-
Period Comparison:
- Perbandingan periode saat ini vs periode sebelumnya
- Persentase perubahan (improvement/degradation)
Sistem akan memberikan rekomendasi otomatis berdasarkan:
- Level AQI rata-rata (Good/Moderate/Unhealthy)
- Level PM2.5 (perbandingan dengan standar WHO 15 ΞΌg/mΒ³)
- Lokasi dengan kualitas udara terburuk
- Jam puncak polusi
- Frekuensi data monitoring
Laporan CSV mencakup:
- Header dengan metadata (tanggal generate, periode)
- Overall Statistics (semua metrik)
- Status Distribution (count & percentage)
- Location Analytics (detail per lokasi)
- Daily Trend (tren harian)
- Recommendations (semua rekomendasi dengan priority)
MIT License - Bebas digunakan untuk project kampus