2026年9月6日 星期日

Node-Red 抓取 opendata 的資料集產生AQI 空氣品質指

Node-Red 抓取 opendata 的資料集產生AQI 空氣品質指標




實現透過 Node-RED 抓取環境部 OpenData(空氣品質 AQI)資料,最核心的流程為:注入觸發(Inject) → HTTP 請求(http request) → 解析 JSON 資料(Function) → 輸出顯示(Debug 或 Dashboard 儀表板)

結構說明

  1. 統計測站總數 (ui_text)

    • API 抓取資料後,會自動計算全部的測站數量(例如 84 個),並在 Dashboard 最上方顯示:「統計資訊:全台共有 84 個觀測站」。

  2. 站名選單 (ui_dropdown)

    • 會將全台所有測站名稱(包含縣市標示,如:士林 (臺北市)古亭 (臺北市)基隆 (基隆市) ... 等)自動加入下拉式選單。

  3. 即時切換 AQI 儀表板 (ui_gauge)

    • 當您在下拉選單中選擇任一站名(如:選擇「萬華」或「彰化」),儀表板標題與指標會立即更新為該站點的 AQI 數據空氣品質狀態(如:良好、普通)

[{"id":"b7d023d3cb4f2077","type":"inject","z":"7dcbc129c166026e","name":"每15分鐘自動更新","props":[],"repeat":"900","crontab":"","once":true,"onceDelay":0.1,"topic":"","x":170,"y":160,"wires":[["6ceb34e3772b6260"]]},{"id":"6ceb34e3772b6260","type":"http request","z":"7dcbc129c166026e","name":"抓取環境部 AQI API","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://data.moenv.gov.tw/api/v2/aqx_p_432?api_key=846e44e1-8cc5-4893-ad87-c79d2d383706&limit=1000&sort=ImportDate%20desc&format=JSON","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":400,"y":160,"wires":[["e40334474b756f29"]]},{"id":"e40334474b756f29","type":"function","z":"7dcbc129c166026e","name":"解析站名列表與總數","func":"var records = msg.payload.records || msg.payload || [];\nflow.set('aqiData', records);\n\nvar siteOptions = [];\nfor (var i = 0; i < records.length; i++) {\n    if (records[i].sitename) {\n        // ui_dropdown 支援直接以 \"顯示名稱\": \"傳遞數值\" 作為 Key-Value 物件\n        var item = {};\n        var labelName = records[i].sitename + \" (\" + (records[i].county || \"\") + \")\";\n        item[labelName] = records[i].sitename;\n        siteOptions.push(item);\n    }\n}\n\n// 1. 輸出測站總數\nvar msgCount = { payload: \"全台共有 \" + records.length + \" 個觀測站\" };\n\n// 2. 更新下拉選單(透過 msg.options 傳遞 Key-Value 陣列)\nvar msgDropdown = { options: siteOptions };\n\n// 3. 預設顯示第一個站名 (例如:基隆) 的 AQI\nvar defaultSite = records.length > 0 ? records[0].sitename : \"士林\";\nvar defaultAqi = records.length > 0 ? (parseInt(records[0].aqi) || 0) : 0;\nvar defaultStatus = records.length > 0 ? (records[0].status || \"\") : \"\";\nvar msgGauge = { \n    payload: defaultAqi, \n    topic: defaultSite + \" (空氣品質: \" + defaultStatus + \")\" \n};\n\nreturn [msgCount, msgDropdown, msgGauge];","outputs":3,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":650,"y":160,"wires":[["e1aed051ea6e4521","ea69f409aa5bec92"],["d2c7d42892ab5129"],["327d3a3f6cdce004"]]},{"id":"d2c7d42892ab5129","type":"ui_dropdown","z":"7dcbc129c166026e","name":"選擇測站","label":"選擇觀測站:","tooltip":"","place":"請選擇測站","group":"ce3f28d47263c160","order":2,"width":"6","height":"1","passthru":false,"multiple":false,"options":[],"payload":"","topic":"topic","topicType":"msg","className":"","x":400,"y":260,"wires":[["5b90367519b9ab1a"]]},{"id":"5b90367519b9ab1a","type":"function","z":"7dcbc129c166026e","name":"依選擇站名查詢 AQI","func":"var selectedSite = msg.payload;\nvar records = flow.get('aqiData') || [];\nvar aqiValue = 0;\nvar statusStr = \"未知\";\n\nfor (var i = 0; i < records.length; i++) {\n    if (records[i].sitename === selectedSite) {\n        aqiValue = parseInt(records[i].aqi) || 0;\n        statusStr = records[i].status || \"\";\n        break;\n    }\n}\n\nmsg.payload = aqiValue;\nmsg.topic = selectedSite + \" (空氣品質: \" + statusStr + \")\";\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":650,"y":260,"wires":[["327d3a3f6cdce004"]]},{"id":"e1aed051ea6e4521","type":"ui_text","z":"7dcbc129c166026e","group":"ce3f28d47263c160","order":1,"width":"6","height":"1","name":"測站總數","label":"統計資訊:","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":880,"y":120,"wires":[]},{"id":"327d3a3f6cdce004","type":"ui_gauge","z":"7dcbc129c166026e","name":"AQI 指示表","group":"ce3f28d47263c160","order":3,"width":"6","height":"6","gtype":"gage","title":"{{msg.topic}} AQI 指數","label":"AQI","format":"{{value}}","min":0,"max":"300","colors":["#00e400","#ffff00","#ff0000"],"seg1":"50","seg2":"100","diff":false,"className":"","x":880,"y":260,"wires":[]},{"id":"ea69f409aa5bec92","type":"debug","z":"7dcbc129c166026e","name":"debug 7","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":860,"y":60,"wires":[]},{"id":"ce3f28d47263c160","type":"ui_group","name":"Default","tab":"58d31a26312867b7","order":1,"disp":true,"width":6,"collapse":false,"className":""},{"id":"58d31a26312867b7","type":"ui_tab","name":"AQI Home","icon":"dashboard","disabled":false,"hidden":false},{"id":"a8740c13122a5163","type":"global-config","env":[],"modules":{"node-red-dashboard":"3.6.6"}}]

沒有留言:

張貼留言

Node-Red 抓取 opendata 的資料集產生AQI 空氣品質指

Node-Red 抓取 opendata 的資料集產生AQI 空氣品質指標 實現透過 Node-RED 抓取環境部 OpenData(空氣品質 AQI)資料,最核心的流程為: 注入觸發(Inject) → HTTP 請求(http request) → 解析 JSON 資料(Fu...