###### 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/):

2. 在這個地圖介面上可隨意移動縮放, 請先移到台灣區域:

在地圖上的每個框框就是一個觀測站, 框框內的數值就該觀測站最新的 AQI 指數, 只要把滑鼠游標移到方框上, 就會像是上圖那樣顯示觀測站的名稱以及 36 小時的歷史資料。
1. 請在代表觀測站的方框上按一下, 就會進入該觀測站的詳細頁面:

1. 在詳細節面上往下捲動, 就會看到 API 的入口:

你可以按一下這個大大的 json:api 圖示, 也可以直接連到 [API 主頁](https://aqicn.org/api/):

請按其中的 data-platform token 連結。

填入你的 email 和姓名後按下 Submit 即可申請權杖, 系統會寄一封確認信給你, 所以請到你剛剛輸入的 email 信箱, 就會收到一封像是這樣的信件:

按一下 Confirm your email address 就會轉回 API 網頁。
1. 此網頁會提供你權杖 (token), 並且給你一個測試用的 API 連結:

這個測試用的 API 連結可以讓你查詢中國北京的 AQI 指數, 只要照著這個格式, 替換掉不同的觀測站或是城市名稱, 就可以查詢不同地區的 AQI 指數。
## 查詢觀測站名稱
要取得觀測站的名稱, 可以再觀測站的詳細頁面中從網址找到。舉例來說, 剛剛我們就從 WAQI 的首頁地圖中找到士林觀測站的詳細頁面:

如果你觀察網址列, 可以看到他的網址長這樣:

其中, 在 city/ 後面就是觀測站的名稱, 他是以『國家/地區』的格式呈現, 如果我們用這裡的 taiwan/shihlin 替換掉測試用的 API 連結中的 beijing, 就會得到以下的結果:

你回得到 JSON 格式的資料, 只要解析這裡的內容, 就可以取得 AQI 指數了。
:::warning
你會發現在觀測站的詳細頁面中出現的名稱與網址中的不一樣, 以剛剛的士林站為例, 頁面上顯是的士林拼法是 shilin, 但是網址中顯示的是 shihlin, 這是因為台灣的羅馬拼音系統是通用拼音系統, 與中國使用的漢語拼音不一樣, 請以網址中顯示的為準。
:::
## 解析 JSON 資料
我們取得的 JSON 資料其實很單純, 大致如下:

主要的物件中有 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) # 每半小時更新一次燈號
```