Hyperlocal AQI: รู้คุณภาพอากาศระดับซอยของคุณ
สถานีตรวจวัดอากาศของกรมควบคุมมลพิษในกรุงเทพฯ มีเพียง ~30 สถานีสำหรับพื้นที่ 1,569 ตร.กม. ความห่างระหว่างสถานีเฉลี่ย 5–8 km ทำให้ค่า AQI ที่ได้ไม่ตรงกับคุณภาพอากาศในซอยของคุณ Hyperlocal AQI Network รวมข้อมูลจากหลายแหล่งเพื่อความละเอียดระดับชุมชน
Data Source 1: Air4Thai API (กรมควบคุมมลพิษ)
กรมควบคุมมลพิษให้ REST API สาธารณะ:
python import requests def get_air4thai_data(station_id='71t'): url = f'http://air4thai.pcd.go.th/services/getNewAQI_JSON.php' params = {'stationID': station_id, 'param': 'PM25'} r = requests.get(url, params=params, timeout=10) data = r.json() return { 'station': data['stationID'], 'pm25': float(data['AQILast']['PM25']['value']), 'aqi': float(data['AQILast']['PM25']['aqi']), 'time': data['AQILast']['date'] + ' ' + data['AQILast']['time'] }
สถานี Bangkok ใกล้เคียง: 71t (Silom), 12t (Don Mueang), 69t (Ladprao), 27t (Samrong)
Data Source 2: PurpleAir Sensor
PurpleAir PA-II (~5,500 บาท, dual laser sensor) ให้ข้อมูลทุก 2 นาที ผ่าน API:
python import requests def get_purpleair_sensor(sensor_id: int, api_key: str): url = f'https://api.purpleair.com/v1/sensors/{sensor_id}' headers = {'X-API-Key': api_key} fields = 'pm2.5,pm2.5_cf_1,humidity,temperature' r = requests.get(url, headers=headers, params={'fields': fields}) data = r.json()['sensor'] # Apply CF=1 correction for indoor sensors pm25_corrected = data['pm2.5_cf_1'] * 0.524 - 0.0862 * data['humidity'] + 5.75 return pm25_corrected
PurpleAir ใช้ US EPA correction factor สำหรับข้อมูลที่ถูกต้องกว่า raw reading
Data Source 3: OpenAQ + IQAir Community Data
python def get_openaq_bangkok(): url = 'https://api.openaq.org/v3/locations' params = { 'coordinates': '13.7563,100.5018', 'radius': 15000, # 15km radius 'limit': 20 } r = requests.get(url, params=params) return r.json()['results']
รวมสถานีจาก Berkeley Earth, IQAir เพิ่ม data density
Data Fusion: Kriging Interpolation
รวมข้อมูลจากหลายสถานีสร้าง continuous PM2.5 map ด้วย Ordinary Kriging:
python from pykrige.ok import OrdinaryKriging import numpy as np # Points: [(lat, lon, pm25), ...] latitudes = np.array([lats]) longitudes = np.array([lons]) pm25_values = np.array([pm25s]) OK = OrdinaryKriging(longitudes, latitudes, pm25_values, variogram_model='spherical', enable_plotting=False) # Create Bangkok grid 10x10 km, 100m resolution grid_lon = np.linspace(100.45, 100.60, 150) grid_lat = np.linspace(13.65, 13.85, 200) pm25_map, variance = OK.execute('grid', grid_lon, grid_lat)
Home Assistant Dashboard: Real-Time Bangkok PM2.5 Map
แสดง map overlay บน Lovelace ด้วย map-card + custom tile layer: - Color gradient: เขียว (<25), เหลือง (25–50), ส้ม (50–100), แดง (100–150), ม่วง (>150) - แสดง sensor locations พร้อมค่า PM2.5 real-time - Alert เมื่อ PM2.5 ที่ PurpleAir ของบ้านเกิน threshold ที่กำหนด - Comparison: บ้าน vs สถานีใกล้ที่สุด vs ค่าเฉลี่ย Bangkok
ประโยชน์จริงในกรุงเทพ
ช่วงวิกฤต PM2.5 มกราคม–มีนาคม ข้อมูล hyperlocal ช่วย: - รู้ว่าควรออกไปออกกำลังกายเวลาใด (PM2.5 ต่ำสุดในวัน) - เปรียบเทียบ PM2.5 ตามเส้นทางผ่านซอยต่างๆ ก่อนขับรถ - ตัดสินใจเปิด ERV intake หรือปิดผนึกบ้านโดยดูจากข้อมูล real-time