Multi-Sensor AQI Fusion: เกินกว่าแค่ PM2.5
การวัดคุณภาพอากาศภายในบ้านด้วย sensor เพียงชนิดเดียว เช่น PM2.5 ให้ภาพที่ไม่ครบถ้วน อาคารที่ PM2.5 ต่ำอาจยังมี CO2 สูงจาก occupancy หรือ TVOC สูงจากเฟอร์นิเจอร์ใหม่ Multi-Sensor Fusion รวมสัญญาณหลายแหล่งสร้าง Indoor Air Quality (IAQ) Score ที่สมบูรณ์
Sensor Stack ที่แนะนำ
| Sensor | Parameter | Accuracy | ราคา (THB) | |--------|-----------|----------|------------| | SDS011 | PM2.5, PM10 | ±15% | 600 | | BME680 | Temp, Humid, TVOC, bVOC | ±15% TVOC | 350 | | SCD40 | CO2 (NDIR) | ±50 ppm | 1,200 | | SGP41 | NOₓ Index | - | 800 | ทั้งหมด interface ผ่าน I2C/UART กับ ESP32 หรือ Raspberry Pi
Kalman Filter สำหรับ PM2.5
SDS011 มี noise สูงในสภาพอากาศ Bangkok (ความชื้นสูง) Kalman Filter ลด noise และ smooth การเปลี่ยนแปลงกะทันหัน:
python class KalmanFilter: def __init__(self, process_variance=1e-3, measurement_variance=1e-1): self.estimate = 0 self.error = 1 self.Q = process_variance self.R = measurement_variance def update(self, measurement): # Predict self.error += self.Q # Update K = self.error / (self.error + self.R) self.estimate += K * (measurement - self.estimate) self.error = (1 - K) * self.error return self.estimate kf_pm25 = KalmanFilter(process_variance=1e-4, measurement_variance=0.5) smoothed = kf_pm25.update(raw_pm25_reading)
ผลลัพธ์: ลด noise จาก ±8 μg/m³ เหลือ ±2 μg/m³ ใน 95% percentile
IAQ Composite Score Algorithm
คำนวณ IAQ Score 0–500 โดยใช้ weighted sum:
python def calculate_iaq_score(pm25, co2, tvoc, temp, humid): # Normalize each parameter to 0-100 sub-score pm_score = min(100, pm25 / 75.0 * 100) # 75 μg/m³ = AQI 150 co2_score = min(100, max(0, (co2 - 400) / (2000 - 400) * 100)) tvoc_score = min(100, tvoc / 500.0 * 100) # 500 ppb = poor temp_score = min(100, abs(temp - 24) / 8 * 100) # ideal 24°C humid_score = min(100, abs(humid - 50) / 30 * 100) # ideal 50% iaq = (pm_score * 0.40 + co2_score * 0.30 + tvoc_score * 0.15 + temp_score * 0.10 + humid_score * 0.05) return iaq
น้ำหนัก: PM2.5 (40%) เป็นหลักเนื่องจากผลต่อสุขภาพสูงสุด, CO2 (30%) บ่งบอก ventilation, TVOC (15%), อุณหภูมิและความชื้น (15%)
Home Assistant YAML Integration
yaml template: - sensor: - name: "IAQ Composite Score" unit_of_measurement: "IAQ" state: > {% set pm25 = states('sensor.pm25_kalman_filtered') | float %} {% set co2 = states('sensor.scd40_co2') | float %} {% set tvoc = states('sensor.bme680_tvoc') | float %} {{ [((pm25/75)*40) + ((co2-400)/1600*30) + (tvoc/500*15), 0] | max | round(1) }}
LINE OA Broadcast Automation
ส่ง LINE OA ถึงสมาชิกในบ้านเมื่อ IAQ เกินเกณฑ์: | IAQ Score | ระดับ | การแจ้งเตือน | |-----------|-------|-------------| | 0–25 | ดีมาก | ไม่แจ้ง | | 26–50 | ดี | ไม่แจ้ง | | 51–100 | ปานกลาง | แจ้งเตือน LINE ช่วงเช้า | | 101–150 | ไม่ดี | แจ้งเตือนทันที + เปิด purifier | | >150 | อันตราย | Critical Alert + ปิด outdoor intake |