###### tags: `FM617A` # 使用 WAQI 取得 AQI 空氣品質指數 環保署原本提供有 https://opendata.epa.gov.tw/ 提供 API 讓大家取得 AQI 空氣品質指數, 不過現在已經改版到 https://data.epa.gov.tw/, 但如果你是使用像是 ESP8266 跑 MicroPython, 新版的 API 在 https 通訊時就會讓記憶體超小的為控制板遇到 TLS record 太大的問題, 無法使用。 為了解決以上問題, 我們可以改用 [WAQI 網站](http://waqi.info/), 這個網站不但提供有 API 可讓程式讀取 AQI 指數, 而且還包含了全世界的觀測站, 其中台灣的 AQI 指數一樣是從環保署的資料更新, 而且 API 介面也很簡單。 ## 申請 API 權杖 要使用 WAQI 網站的 API, 需要先申請權杖: 1. 進入 [WAQI 網站](http://waqi.info/): ![](https://i.imgur.com/CkOf44J.png) 2. 在這個地圖介面上可隨意移動縮放, 請先移到台灣區域: ![](https://i.imgur.com/EoJAktV.png) 在地圖上的每個框框就是一個觀測站, 框框內的數值就該觀測站最新的 AQI 指數, 只要把滑鼠游標移到方框上, 就會像是上圖那樣顯示觀測站的名稱以及 36 小時的歷史資料。 1. 請在代表觀測站的方框上按一下, 就會進入該觀測站的詳細頁面: ![](https://i.imgur.com/Vs4Tzsa.png) 1. 在詳細節面上往下捲動, 就會看到 API 的入口: ![](https://i.imgur.com/DRrY2tB.png) 你可以按一下這個大大的 json:api 圖示, 也可以直接連到 [API 主頁](https://aqicn.org/api/): ![](https://i.imgur.com/gQo9DbP.png) 請按其中的 data-platform token 連結。 ![](https://i.imgur.com/mJ91bLG.png) 填入你的 email 和姓名後按下 Submit 即可申請權杖, 系統會寄一封確認信給你, 所以請到你剛剛輸入的 email 信箱, 就會收到一封像是這樣的信件: ![](https://i.imgur.com/oaVWLNQ.png) 按一下 Confirm your email address 就會轉回 API 網頁。 1. 此網頁會提供你權杖 (token), 並且給你一個測試用的 API 連結: ![](https://i.imgur.com/VrYcsy6.png) 這個測試用的 API 連結可以讓你查詢中國北京的 AQI 指數, 只要照著這個格式, 替換掉不同的觀測站或是城市名稱, 就可以查詢不同地區的 AQI 指數。 ## 查詢觀測站名稱 要取得觀測站的名稱, 可以再觀測站的詳細頁面中從網址找到。舉例來說, 剛剛我們就從 WAQI 的首頁地圖中找到士林觀測站的詳細頁面: ![](https://i.imgur.com/G0x9G43.png) 如果你觀察網址列, 可以看到他的網址長這樣: ![](https://i.imgur.com/o0PL9t8.png) 其中, 在 city/ 後面就是觀測站的名稱, 他是以『國家/地區』的格式呈現, 如果我們用這裡的 taiwan/shihlin 替換掉測試用的 API 連結中的 beijing, 就會得到以下的結果: ![](https://i.imgur.com/cnYsp8p.png) 你回得到 JSON 格式的資料, 只要解析這裡的內容, 就可以取得 AQI 指數了。 :::warning 你會發現在觀測站的詳細頁面中出現的名稱與網址中的不一樣, 以剛剛的士林站為例, 頁面上顯是的士林拼法是 shilin, 但是網址中顯示的是 shihlin, 這是因為台灣的羅馬拼音系統是通用拼音系統, 與中國使用的漢語拼音不一樣, 請以網址中顯示的為準。 ::: ## 解析 JSON 資料 我們取得的 JSON 資料其實很單純, 大致如下: ![](https://i.imgur.com/dCQ7c7I.png) 主要的物件中有 status 和 data 兩個子物件, status 是狀態, 可以告訴我們 API 執行是否成功?而真正的資料就在 data 物件中的 aqi 欄位, 可以直接取得數值。其他像是 city 欄位中的 name 欄位, 就是測站的名稱, 因此, 我們可以使用 MicroPython 程式快速取得這些資料: ```python >>> j = res.json() >>> print(j['data']['aqi']) 44 >>> print(j['data']['city']['name']) Shilin, Taiwan (士林) ``` 以下我們就可以撰寫一個簡單的程式, 依據 AQI 指數模擬類似網站上不同程度空氣品質顏色的燈號了: ```python= from machine import Pin, PWM import time, network, urequests # 連線 Wifi 網路 sta_if = network.WLAN(network.STA_IF) sta_if.active(True) sta_if.connect("Wi-Fi 基地台", "Wi-Fi 密碼") while not sta_if.isconnected(): pass print("Wifi已連上") rLED = PWM(Pin(12)) # 控制紅燈 gLED = PWM(Pin(13)) # 控制綠燈 bLED = PWM(Pin(15)) # 控制藍燈 while True: # 取得 AQI 空污指數 res = urequests.get("AQI 網址") j = res.json() # 載入並解析 JSON 格式資料 print("測站名稱:", j['data']['city']['name']) print("發布時間:", j['data']['time']['s']) print("AQI:", j['data']['aqi']) print("PM2.5:", j['data']['iaqi']['pm25']['v']) AQI = j['data']['aqi'] # 將 AQI 空污指數轉為整數, 以便比較大小 if AQI <= 50: gLED.duty(1023); rLED.duty(0) # 空氣品質良好顯示綠燈 elif 51 < AQI <= 100: gLED.duty(300); rLED.duty(1023) # 空氣品質普通顯示黃燈 else: gLED.duty(0); rLED.duty(1023) # 空氣品質不佳顯示紅燈 time.sleep(1800) # 每半小時更新一次燈號 ```