Journal

Hyperlocal AQI Network: รวม PurpleAir + Air4Thai API สร้าง PM2.5 Map กรุงเทพฯ ระดับชุมชน

Hyperlocal AQI Network: Combining PurpleAir + Air4Thai API for Neighborhood-Level Bangkok PM2.5 Mapping

12 พฤษภาคม 2569 · 2 นาที

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

คำถามที่พบบ่อย

PurpleAir sensor คุ้มค่าไหมสำหรับบ้านทั่วไป?
PurpleAir PA-II ราคา ~5,500 บาท แพงกว่า SDS011 แต่ให้ข้อมูลที่ถูกต้องกว่ามากเพราะมี dual laser cross-validation และ calibration ที่ดีกว่า ถ้าต้องการแชร์ข้อมูลกับชุมชนและ contribute ไปยัง PurpleAir map สาธารณะด้วย คุ้มมาก
Air4Thai API ใช้ฟรีไหมต้องสมัครไหม?
ใช้ฟรีไม่ต้อง API key เป็น public endpoint แต่ควรใช้อย่าง responsible ไม่ query บ่อยกว่าทุก 5–10 นาที เพื่อไม่กดดัน server ของกรมควบคุมมลพิษ
Kriging ต่างจากการ average ค่าจากสถานีใกล้ที่สุดอย่างไร?
Kriging ใช้ statistical model ที่คำนึง spatial correlation ระหว่างจุด ให้ interpolation ที่ smooth และ physically realistic กว่า nearest-neighbor averaging และยังให้ variance estimate ที่บอกว่าส่วนไหนของ map มี uncertainty สูง