2021年8月20日 星期五

台中市11站監控PM2.5中的大里國中站PM2.5資料擷取

 台中市11站監控PM2.5中的大里國中站PM2.5資料擷取


https://www.airq.org.tw/Home/realtime10m




資料格式

17: object

ID: "412_10002"

City: "臺中市"

Address: "臺中市大里區國中路365號"

Name: "大里高中"

Latitude: "24.0951235"

Longitude: "120.6789632"

SensorType: "PM2.5"

Value: "5.71"

StartTime: "2021/8/19 下午 07:50:40"

EndTime: "2021/8/19 下午 08:00:40"

 [{"id":"7a496973.0db868","type":"inject","z":"38c96cc5.454e14","name":"Click","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"7200","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":90,"y":60,"wires":[["d7bffa10.db0958"]]},{"id":"c2624101.0480d","type":"ui_switch","z":"38c96cc5.454e14","name":"","label":"啟動讀取opendata","tooltip":"","group":"9d7c6798.9fc5e8","order":61,"width":"2","height":"1","passthru":true,"decouple":"false","topic":"","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":110,"y":100,"wires":[["d7bffa10.db0958"]]},{"id":"559d5560.1885bc","type":"ui_gauge","z":"38c96cc5.454e14","name":"PM2.5","group":"9d7c6798.9fc5e8","order":62,"width":0,"height":0,"gtype":"gage","title":"大里區 細懸浮微粒(PM2.5)指標","label":"(μg/m3)","format":"{{value}}","min":0,"max":"71","colors":["#00b500","#e6e600","#ca3838"],"seg1":"35","seg2":"59","x":550,"y":260,"wires":[]},{"id":"d7bffa10.db0958","type":"http request","z":"38c96cc5.454e14","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://www.airq.org.tw/Home/realtime10m","tls":"","persist":false,"proxy":"","authType":"","x":240,"y":60,"wires":[["a1699e3e.367bf","d01fa14d.c3dca","6e2ea64c.85d278"]]},{"id":"a1699e3e.367bf","type":"debug","z":"38c96cc5.454e14","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":450,"y":60,"wires":[]},{"id":"d01fa14d.c3dca","type":"function","z":"38c96cc5.454e14","name":"找出大里國中 PM2.5  , PublishTime","func":"\nvar a = msg.payload;\na.forEach(function(e,i){\n    if(e.Name=='大里高中')\n    {\n        msg.PM25 = e['Value'];\n        msg.PublishTime = e['StartTime'];\n    }\n});\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":160,"y":200,"wires":[["56ac0e9.34235f","8dbd6d12.10c86","18edab.dbb47255","f9f9d05.6516f3","270687e6.8220a8"]]},{"id":"56ac0e9.34235f","type":"debug","z":"38c96cc5.454e14","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"PM25","targetType":"msg","statusVal":"","statusType":"auto","x":470,"y":180,"wires":[]},{"id":"8dbd6d12.10c86","type":"function","z":"38c96cc5.454e14","name":"PM2.5資料","func":"msg.payload=msg.PM25;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":390,"y":260,"wires":[["559d5560.1885bc","e90ddad6.75c9c8"]]},{"id":"e90ddad6.75c9c8","type":"debug","z":"38c96cc5.454e14","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":570,"y":300,"wires":[]},{"id":"58ec0859.8014c8","type":"comment","z":"38c96cc5.454e14","name":"PM2.5開放資料網址","info":"南投地區PM2.5開放資料網址如下:\n\nhttp://www.airq.org.tw/Home/AboutData_ZH\n\nJSON 格式 API(更新頻率:每 10分鐘)\n\nhttp://www.airq.org.tw/Home/realtime10m\n","x":110,"y":20,"wires":[]},{"id":"a5b5f26d.c3afc","type":"DataIn","z":"38c96cc5.454e14","collection":"7a14aca8.b15994","name":"PM2.5","update":false,"path":"/","x":670,"y":140,"wires":[]},{"id":"6e2ea64c.85d278","type":"function","z":"38c96cc5.454e14","name":"set global temp","func":"context.global.temp=msg.payload;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":440,"y":20,"wires":[[]]},{"id":"18edab.dbb47255","type":"debug","z":"38c96cc5.454e14","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"PublishTime","targetType":"msg","statusVal":"","statusType":"auto","x":490,"y":220,"wires":[]},{"id":"b7db3840.90f4a8","type":"ui_text","z":"38c96cc5.454e14","group":"9d7c6798.9fc5e8","order":63,"width":0,"height":0,"name":"發行時間","label":"發行時間","format":"{{msg.payload}}","layout":"row-center","x":560,"y":340,"wires":[]},{"id":"7afd9739.644998","type":"debug","z":"38c96cc5.454e14","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":570,"y":380,"wires":[]},{"id":"f9f9d05.6516f3","type":"function","z":"38c96cc5.454e14","name":"發行時間","func":"msg.payload=msg.PublishTime;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":380,"y":340,"wires":[["b7db3840.90f4a8","7afd9739.644998"]]},{"id":"b3fa1448.ed6908","type":"comment","z":"38c96cc5.454e14","name":"","info":"https://www.ntepb.gov.tw/sub/content/index.aspx?Parser=1,17,511,494,496\n\n0-11\t12-23\t24-35\t\n低\t    低\t    低\n36-41\t42-47\t48-53\n中\t    中\t    中\n54-58   59-64\t65-70\t\n高\t    高\t    高\n>71\n非常高","x":370,"y":300,"wires":[]},{"id":"a3889d5a.2287e","type":"change","z":"38c96cc5.454e14","name":"","rules":[{"t":"set","p":"datapath","pt":"msg","to":"/myRootTest","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":510,"y":140,"wires":[["a5b5f26d.c3afc","13764a3d.b30696"]]},{"id":"6990d7f2.19f1f8","type":"change","z":"38c96cc5.454e14","name":"","rules":[{"t":"set","p":"datapath","pt":"msg","to":"/myRootTest","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":290,"y":400,"wires":[["f68835a3.8114c8"]]},{"id":"f68835a3.8114c8","type":"DataOut","z":"38c96cc5.454e14","collection":"7a14aca8.b15994","name":"PM2.5","path":"/","error":false,"x":450,"y":420,"wires":[["a21b5c7a.65c7d","d5d97848.c9e668"]]},{"id":"a21b5c7a.65c7d","type":"debug","z":"38c96cc5.454e14","name":"","active":true,"console":"false","complete":"false","x":590,"y":420,"wires":[]},{"id":"9596cdb2.d5fb5","type":"json","z":"38c96cc5.454e14","name":"","property":"payload","action":"str","pretty":false,"x":350,"y":140,"wires":[["a3889d5a.2287e","c755c089.5f086"]]},{"id":"c755c089.5f086","type":"debug","z":"38c96cc5.454e14","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":490,"y":100,"wires":[]},{"id":"13764a3d.b30696","type":"debug","z":"38c96cc5.454e14","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":690,"y":100,"wires":[]},{"id":"d5d97848.c9e668","type":"ui_text","z":"38c96cc5.454e14","group":"9d7c6798.9fc5e8","order":6,"width":"0","height":"0","name":"","label":"PM2.5訊息","format":"{{msg.payload}}","layout":"row-center","x":570,"y":460,"wires":[]},{"id":"270687e6.8220a8","type":"function","z":"38c96cc5.454e14","name":"PM2.5資料","func":"msg.payload=['大里國中',msg.PM25,msg.PublishTime];\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":210,"y":140,"wires":[["9596cdb2.d5fb5"]]},{"id":"e9f95dc2.fe72a","type":"inject","z":"38c96cc5.454e14","name":"Click","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"7200","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":110,"y":400,"wires":[["6990d7f2.19f1f8"]]},{"id":"f7360032.548b8","type":"ui_switch","z":"38c96cc5.454e14","name":"","label":"啟動資料庫開關","tooltip":"","group":"9d7c6798.9fc5e8","order":61,"width":"2","height":"1","passthru":true,"decouple":"false","topic":"","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":120,"y":360,"wires":[["6990d7f2.19f1f8"]]},{"id":"9d7c6798.9fc5e8","type":"ui_group","name":"Main","tab":"89e51ea1.a64af","order":1,"disp":true,"width":"6","collapse":false},{"id":"7a14aca8.b15994","type":"json-db-collection","name":"DATA_PM25","collection":"DATA","save":false},{"id":"89e51ea1.a64af","type":"ui_tab","name":"Dashboard","icon":"dashboard"}]

2021年8月19日 星期四

使用氣象局opendata資料 依據22縣市的下拉式選單取得天氣狀況

使用氣象局opendata資料 依據22縣市的下拉式選單取得天氣狀況






 





[{"id":"6dfe150e.34997c","type":"inject","z":"76e4593f.be8138","name":"","props":[{"p":"payload","v":"","vt":"date"},{"p":"topic","v":"","vt":"string"}],"repeat":"7200","crontab":"","once":false,"topic":"","payload":"","payloadType":"date","x":120,"y":60,"wires":[["c2230b66.657a58"]]},{"id":"6fb353fd.56cefc","type":"debug","z":"76e4593f.be8138","name":"temp request result","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":509,"y":62,"wires":[]},{"id":"cb8f5638.8c35e8","type":"function","z":"76e4593f.be8138","name":"set global temp","func":"context.global.temp=msg.payload.records;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":500,"y":100,"wires":[["58bbd98d.c23908"]]},{"id":"b389c015.761a2","type":"http in","z":"76e4593f.be8138","name":"city","url":"/city","method":"get","upload":false,"swaggerDoc":"","x":90,"y":420,"wires":[["fcffbd85.31821"]]},{"id":"74e7f25f.d88afc","type":"http response","z":"76e4593f.be8138","name":"http out","x":620,"y":420,"wires":[]},{"id":"fcffbd85.31821","type":"function","z":"76e4593f.be8138","name":"city name to number","func":"\nvar cityname;\n\ncontext.global.locationnumber=0;\ntry {\n    cityname=msg.payload.cityname;\n   \n   if(cityname.indexOf('嘉義縣')!=-1 ||cityname.indexOf('嘉義縣')!=-1 )\n{\n    context.global.locationnumber=0;\n   \n}\nelse if(cityname.indexOf('新北市')!=-1)\n{\n    context.global.locationnumber=1;\n   \n}\nelse if(cityname.indexOf('嘉義市')!=-1) //\n{\n    context.global.locationnumber=2;\n   \n}\nelse if(cityname.indexOf('新竹縣')!=-1 || cityname.indexOf('新竹縣')!=-1) \n{\n    context.global.locationnumber= 3;\n   \n}\nelse if(cityname.indexOf('新竹市')!=-1 || cityname.indexOf('新竹市')!=-1) \n{\n    context.global.locationnumber= 4;\n   \n}\nelse if(cityname.indexOf('臺北')!=-1 || cityname.indexOf('台北')!=-1) \n{\n    context.global.locationnumber= 5 ;\n   \n}\nelse if(cityname.indexOf('臺南')!=-1 || cityname.indexOf('台南')!=-1)  \n{\n    context.global.locationnumber= 6 ;\n   \n}\nelse if(cityname.indexOf('宜蘭')!=-1 ) \n{\n    context.global.locationnumber= 7 ;\n   \n}\nelse if(cityname.indexOf('苗栗')!=-1 ) \n{\n    context.global.locationnumber= 8 ;\n   \n}\n\nelse if(cityname.indexOf('雲林')!=-1 ) \n{\n    context.global.locationnumber= 9 ;\n   \n}\nelse if(cityname.indexOf('花蓮')!=-1 ) \n{\n    context.global.locationnumber= 10 ;\n   \n}\n\nelse if(cityname.indexOf('臺中')!=-1 || cityname.indexOf('台中')!=-1) \n{\n    context.global.locationnumber= 11 ;\n   \n}\n\nelse if(cityname.indexOf('臺東')!=-1 || cityname.indexOf('台東')!=-1) \n{\n    context.global.locationnumber= 12 ;\n   \n}\nelse if(cityname.indexOf('桃園')!=-1 || cityname.indexOf('桃園')!=-1) \n{\n    context.global.locationnumber= 13 ;\n   \n}\nelse if(cityname.indexOf('南投')!=-1 || cityname.indexOf('南投')!=-1) \n{\n    context.global.locationnumber= 14 ;\n   \n}\nelse if(cityname.indexOf('高雄')!=-1 || cityname.indexOf('高雄')!=-1) \n{\n    context.global.locationnumber= 15 ;\n   \n}\n\nelse if(cityname.indexOf('金門')!=-1 || cityname.indexOf('金門')!=-1) \n{\n    context.global.locationnumber= 16 ;\n   \n}\n\nelse if(cityname.indexOf('屏東')!=-1 || cityname.indexOf('屏東')!=-1) \n{\n    context.global.locationnumber= 17 ;\n   \n}\n\nelse if(cityname.indexOf('基隆')!=-1 || cityname.indexOf('基隆')!=-1) \n{\n    context.global.locationnumber= 18 ;\n   \n}\nelse if(cityname.indexOf('澎湖')!=-1 || cityname.indexOf('澎湖')!=-1) \n{\n    context.global.locationnumber= 19 ;\n   \n}\nelse if(cityname.indexOf('彰化')!=-1 || cityname.indexOf('彰化')!=-1) \n{\n    context.global.locationnumber= 20;\n   \n}\n\n\n\nelse if(cityname.indexOf('連江')!=-1 ) \n{\n    context.global.locationnumber= 21 ;\n   \n}\n\nelse  \n{\n    context.global.locationnumber= 11 ;\n   \n}\n   \n   \n}\n\ncatch(err) {\n    cityname=\"台中\";\n    context.global.locationnumber=11;\n}\n\n\n msg.payload= context.global.locationnumber;\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":260,"y":420,"wires":[["c9740d7f.e96bd","9fb41815.dbdcc8"]]},{"id":"c9740d7f.e96bd","type":"debug","z":"76e4593f.be8138","name":"city name to number result","active":true,"tosidebar":true,"console":false,"complete":"payload","statusVal":"","statusType":"auto","x":520,"y":460,"wires":[]},{"id":"7f46f572.4708ec","type":"http in","z":"76e4593f.be8138","name":"tempjson","url":"/tempjson","method":"get","swaggerDoc":"","x":100,"y":200,"wires":[["ecf2189c.210bf8"]]},{"id":"20dc5b2f.f22514","type":"http response","z":"76e4593f.be8138","name":"http out","x":480,"y":200,"wires":[]},{"id":"ecf2189c.210bf8","type":"function","z":"76e4593f.be8138","name":"show raw data","func":"//var loc=msg.payload.loc;\n//var rawdata=context.global.temp;\n//msg.payload=rawdata.cwbopendata.dataset[0].location;\n\nmsg.payload=context.global.temp;\nreturn msg;\n\n/*\nvar locationName=rawdata.cwbopendata.dataset[0].location[loc].locationName[0];\nvar period0max=rawdata.cwbopendata.dataset[0].location[loc].weatherElement[1].time[0].parameter[0].parameterName[0];\nvar period0min=rawdata.cwbopendata.dataset[0].location[loc].weatherElement[2].time[0].parameter[0].parameterName[0];\nvar period0start=rawdata.cwbopendata.dataset[0].location[loc].weatherElement[1].time[0].startTime[0];\nvar period0end=rawdata.cwbopendata.dataset[0].location[loc].weatherElement[1].time[0].endTime[0];\n\nvar  starthourtemp= period0start.split(\"T\");\nvar starthour=starthourtemp[1].split(\":\")[0];\nvar  endhourtemp= period0end.split(\"T\");\nvar endhour=endhourtemp[1].split(\":\")[0];\n\nmsg.payload={\"locationName\":locationName,\"time\":starthour+\"-\"+endhour, \"max\":period0max,\n\"min\":period0min};\nreturn msg;\n*/\n\n/*if(time.getHours()<18)\n{\nmsg.payload={\"locationName\":locationName,\"todaymax\":period1max, \"todaymin\":period1min,\n             \"tonightmax\":period2max, \"tonightmin\":period2min,\"tomorrowmax\":period3max, \"tomorrowmin\":period3min};\n}\nelse\nmsg.payload={\"locationName\":locationName,\"tonightmax\":period1max, \"tonightmin\":period1min,\n             \"todaymax\":period2max, \"tonightmin\":period2min,\"tomorrowmax\":period3max, \"tomorrowmin\":period3min};\n}\n\n*/\n\n\n\n\n//msg.payload=rawdata.cwbopendata.dataset[0].location[loc].weatherElement[1].time[1];\n\n\n\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":320,"y":200,"wires":[["20dc5b2f.f22514","6dd2ec78.7f5ea4"]]},{"id":"6dd2ec78.7f5ea4","type":"debug","z":"76e4593f.be8138","name":"temp data process","active":true,"console":"false","complete":"payload","x":530,"y":240,"wires":[]},{"id":"1e7d57a7.9bceb8","type":"function","z":"76e4593f.be8138","name":"List locationname","func":"var rawdata=context.global.temp;\nvar location=rawdata.location;\nvar citynumber=location.length;\nvar cityarray=[];\nvar i;\nfor (i=0; i<citynumber;i++)\n{\n    cityarray[i]=location[i].locationName;\n}\n\n msg.payload=cityarray;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":290,"y":320,"wires":[["16bc7465.39076c","58b981c3.6af63"]]},{"id":"16bc7465.39076c","type":"debug","z":"76e4593f.be8138","name":"List all locationnames ","active":true,"console":"false","complete":"payload","x":560,"y":360,"wires":[]},{"id":"9fb41815.dbdcc8","type":"function","z":"76e4593f.be8138","name":"max min","func":"var loc=msg.payload;\nvar rawdata=context.global.temp;\nvar locationName=rawdata.location[loc].locationName;\nvar period0max=rawdata.location[loc].weatherElement[4].time[2].parameter.parameterName;\nvar period0min=rawdata.location[loc].weatherElement[2].time[2].parameter.parameterName;\nvar period0start=rawdata.location[loc].weatherElement[4].time[2].startTime;\nvar period0end = rawdata.location[loc].weatherElement[2].time[2].endTime;\n\n\nmsg.payload={\"locationName地點\":locationName,\"time開始時間\":period0start+\"-迄\"+period0end, \"max最高溫度\":period0max,\n\"min最低溫度\":period0min};\n\n//msg.payload={\"locationName\":locationName,\"max\":period0max,\"min\":period0min};\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":460,"y":420,"wires":[["74e7f25f.d88afc"]]},{"id":"f862e33a.af1bd","type":"debug","z":"76e4593f.be8138","name":"report result","active":true,"console":"false","complete":"payload","x":630,"y":640,"wires":[]},{"id":"7aaca32e.e7578c","type":"inject","z":"76e4593f.be8138","name":"inject city options","props":[{"p":"payload","v":"","vt":"date"},{"p":"topic","v":"","vt":"string"}],"repeat":"7200","crontab":"","once":false,"topic":"","payload":"","payloadType":"date","x":150,"y":520,"wires":[["6064e36f.967cac"]]},{"id":"6064e36f.967cac","type":"function","z":"76e4593f.be8138","name":"set options","func":"var rawdata=context.global.temp;\n\nvar location=rawdata.location;\nvar citynumber=location.length;\nvar i;\n\nvar cityarray=[];\nfor (i=0; i<citynumber;i++)\n{\n    cityarray[i]=location[i].locationName;\n}\nmsg.options=cityarray;\nreturn msg;\n\n/*\nvar locationName=rawdata.cwbopendata.dataset[0].location[loc].locationName[0];\nvar period0max=rawdata.cwbopendata.dataset[0].location[loc].weatherElement[1].time[0].parameter[0].parameterName[0];\nvar period0min=rawdata.cwbopendata.dataset[0].location[loc].weatherElement[2].time[0].parameter[0].parameterName[0];\nvar period0start=rawdata.cwbopendata.dataset[0].location[loc].weatherElement[1].time[0].startTime[0];\nvar period0end=rawdata.cwbopendata.dataset[0].location[loc].weatherElement[1].time[0].endTime[0];\n\nvar  starthourtemp= period0start.split(\"T\");\nvar starthour=starthourtemp[1].split(\":\")[0];\nvar  endhourtemp= period0end.split(\"T\");\nvar endhour=endhourtemp[1].split(\":\")[0];\n\nmsg.payload={\"locationName\":locationName,\"time\":starthour+\"-\"+endhour, \"max\":period0max,\n\"min\":period0min};\nreturn msg;\n*/\n\n/*if(time.getHours()<18)\n{\nmsg.payload={\"locationName\":locationName,\"todaymax\":period1max, \"todaymin\":period1min,\n             \"tonightmax\":period2max, \"tonightmin\":period2min,\"tomorrowmax\":period3max, \"tomorrowmin\":period3min};\n}\nelse\nmsg.payload={\"locationName\":locationName,\"tonightmax\":period1max, \"tonightmin\":period1min,\n             \"todaymax\":period2max, \"tonightmin\":period2min,\"tomorrowmax\":period3max, \"tomorrowmin\":period3min};\n}\n\n*/\n\n\n\n\n//msg.payload=rawdata.cwbopendata.dataset[0].location[loc].weatherElement[1].time[1];\n\n\n\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":330,"y":520,"wires":[["e5f3a01.2868c6","72a0086d.a154c8"]]},{"id":"f2b37c12.b7a4d","type":"inject","z":"76e4593f.be8138","name":"inject city","props":[{"p":"payload","v":"","vt":"date"},{"p":"topic","v":"","vt":"string"}],"repeat":"","crontab":"","once":false,"topic":"","payload":"","payloadType":"date","x":120,"y":320,"wires":[["1e7d57a7.9bceb8"]]},{"id":"2a7c547e.122b1c","type":"function","z":"76e4593f.be8138","name":"report","func":"var loc=msg.payload;\nvar rawdata=context.global.temp;\nvar locationName=rawdata.location[loc].locationName;\nvar period0max=rawdata.location[loc].weatherElement[4].time[2].parameter.parameterName;\nvar period0min=rawdata.location[loc].weatherElement[2].time[2].parameter.parameterName;\nvar period0start=rawdata.location[loc].weatherElement[4].time[2].startTime;\nvar period0end = rawdata.location[loc].weatherElement[2].time[2].endTime;\n\nmsg.payload={地點:locationName,開始時間:period0start+\"-迄\"+period0end, \"最高溫度\":period0max,\n\"℃ 最低溫度\":period0min +  \"℃  \"};\n//msg.payload={\"locationName\":locationName,\"max\":period0max,\"min\":period0min};\nreturn msg;\n\n\n\n//var loc=msg.payload;\n//var rawdata=context.global.temp;\n//var locationName=rawdata.cwbopendata.dataset[0].location[loc].locationName[0];\n//var period0max=rawdata.cwbopendata.dataset[0].location[loc].weatherElement[1].time[0].parameter[0].parameterName[0];\n//var period0min=rawdata.cwbopendata.dataset[0].location[loc].weatherElement[2].time[0].parameter[0].parameterName[0];\n//var period0start=rawdata.cwbopendata.dataset[0].location[loc].weatherElement[1].time[0].startTime[0];\n//var period0end=rawdata.cwbopendata.dataset[0].location[loc].weatherElement[1].time[0].endTime[0];\n\n//var  starthourtemp= period0start.split(\"T\");\n//var starthour=starthourtemp[1].split(\":\")[0];\n//var  endhourtemp= period0end.split(\"T\");\n//var endhour=endhourtemp[1].split(\":\")[0];\n\n//msg.payload=locationName+starthour+\"到\"+endhour+\"點溫度最低\"+period0min+\"度最高\"+period0max+\"度\";\n//return msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":470,"y":640,"wires":[["f862e33a.af1bd","838e7155.243b1"]]},{"id":"9d567c76.3deee","type":"debug","z":"76e4593f.be8138","name":"selected city ","active":true,"console":"false","complete":"payload","x":630,"y":580,"wires":[]},{"id":"e5f3a01.2868c6","type":"ui_dropdown","z":"76e4593f.be8138","name":"","label":"city options","tooltip":"","place":"Select city","group":"e045c1fa.7a743","order":0,"width":0,"height":0,"passthru":true,"multiple":false,"options":[{"label":"嘉義縣","value":"0","type":"str"},{"label":"新北市","value":"1","type":"str"},{"label":"嘉義市","value":"2","type":"str"},{"label":"新竹縣","value":"3","type":"str"},{"label":"新竹市","value":"4","type":"str"},{"label":"臺北市","value":"5","type":"str"},{"label":"臺南市","value":"6","type":"str"},{"label":"宜蘭縣","value":"7","type":"str"},{"label":"苗栗縣","value":"8","type":"str"},{"label":"雲林縣","value":"9","type":"str"},{"label":"花蓮縣","value":"10","type":"str"},{"label":"臺中市","value":"11","type":"str"},{"label":"臺東縣","value":"12","type":"str"},{"label":"桃園市","value":"13","type":"str"},{"label":"南投縣","value":"14","type":"str"},{"label":"高雄市","value":"15","type":"str"},{"label":"金門縣","value":"16","type":"str"},{"label":"屏東縣","value":"17","type":"str"},{"label":"基隆市","value":"18","type":"str"},{"label":"澎湖縣","value":"19","type":"str"},{"label":"彰化縣","value":"20","type":"str"},{"label":"連江縣","value":"21","type":"str"}],"payload":"","topic":"","x":450,"y":580,"wires":[["9d567c76.3deee","5913e9c6.31c868"]]},{"id":"838e7155.243b1","type":"ui_text","z":"76e4593f.be8138","group":"e045c1fa.7a743","order":0,"width":0,"height":0,"name":"","label":"","format":"{{msg.payload}}","layout":"row-left","x":610,"y":680,"wires":[]},{"id":"c2230b66.657a58","type":"http request","z":"76e4593f.be8138","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=CWB-401C25FFF-1224-42150-B9D9-3735AAE117DBF&format=JSON","tls":"","persist":false,"proxy":"","authType":"","x":320,"y":60,"wires":[["6fb353fd.56cefc","cb8f5638.8c35e8"]]},{"id":"a0d2d442.2ca268","type":"comment","z":"76e4593f.be8138","name":"","info":"GET\n\nhttps://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=CWB-40C125FFF-1224-4250-B9D9-3735A1AE117DBF&format=JSON","x":310,"y":100,"wires":[]},{"id":"58bbd98d.c23908","type":"debug","z":"76e4593f.be8138","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":670,"y":100,"wires":[]},{"id":"58b981c3.6af63","type":"function","z":"76e4593f.be8138","name":"set global temploction","func":"context.global.temploction=msg.payload;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":520,"y":320,"wires":[["3165e6ac.b71e9a"]]},{"id":"3165e6ac.b71e9a","type":"debug","z":"76e4593f.be8138","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":710,"y":320,"wires":[]},{"id":"72a0086d.a154c8","type":"debug","z":"76e4593f.be8138","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"options","targetType":"msg","statusVal":"","statusType":"auto","x":510,"y":520,"wires":[]},{"id":"5913e9c6.31c868","type":"function","z":"76e4593f.be8138","name":"city name to number","func":"\nvar cityname;\n\ncontext.global.locationnumber=0;\ntry {\n    cityname=msg.payload;\n   \n   if(cityname.indexOf('嘉義縣')!=-1 ||cityname.indexOf('嘉義縣')!=-1 )\n{\n    context.global.locationnumber=0;\n   \n}\nelse if(cityname.indexOf('新北市')!=-1)\n{\n    context.global.locationnumber=1;\n   \n}\nelse if(cityname.indexOf('嘉義市')!=-1) //\n{\n    context.global.locationnumber=2;\n   \n}\nelse if(cityname.indexOf('新竹縣')!=-1 || cityname.indexOf('新竹縣')!=-1) \n{\n    context.global.locationnumber= 3;\n   \n}\nelse if(cityname.indexOf('新竹市')!=-1 || cityname.indexOf('新竹市')!=-1) \n{\n    context.global.locationnumber= 4;\n   \n}\nelse if(cityname.indexOf('臺北')!=-1 || cityname.indexOf('台北')!=-1) \n{\n    context.global.locationnumber= 5 ;\n   \n}\nelse if(cityname.indexOf('臺南')!=-1 || cityname.indexOf('台南')!=-1)  \n{\n    context.global.locationnumber= 6 ;\n   \n}\nelse if(cityname.indexOf('宜蘭')!=-1 ) \n{\n    context.global.locationnumber= 7 ;\n   \n}\nelse if(cityname.indexOf('苗栗')!=-1 ) \n{\n    context.global.locationnumber= 8 ;\n   \n}\n\nelse if(cityname.indexOf('雲林')!=-1 ) \n{\n    context.global.locationnumber= 9 ;\n   \n}\nelse if(cityname.indexOf('花蓮')!=-1 ) \n{\n    context.global.locationnumber= 10 ;\n   \n}\n\nelse if(cityname.indexOf('臺中')!=-1 || cityname.indexOf('台中')!=-1) \n{\n    context.global.locationnumber= 11 ;\n   \n}\n\nelse if(cityname.indexOf('臺東')!=-1 || cityname.indexOf('台東')!=-1) \n{\n    context.global.locationnumber= 12 ;\n   \n}\nelse if(cityname.indexOf('桃園')!=-1 || cityname.indexOf('桃園')!=-1) \n{\n    context.global.locationnumber= 13 ;\n   \n}\nelse if(cityname.indexOf('南投')!=-1 || cityname.indexOf('南投')!=-1) \n{\n    context.global.locationnumber= 14 ;\n   \n}\nelse if(cityname.indexOf('高雄')!=-1 || cityname.indexOf('高雄')!=-1) \n{\n    context.global.locationnumber= 15 ;\n   \n}\n\nelse if(cityname.indexOf('金門')!=-1 || cityname.indexOf('金門')!=-1) \n{\n    context.global.locationnumber= 16 ;\n   \n}\n\nelse if(cityname.indexOf('屏東')!=-1 || cityname.indexOf('屏東')!=-1) \n{\n    context.global.locationnumber= 17 ;\n   \n}\n\nelse if(cityname.indexOf('基隆')!=-1 || cityname.indexOf('基隆')!=-1) \n{\n    context.global.locationnumber= 18 ;\n   \n}\nelse if(cityname.indexOf('澎湖')!=-1 || cityname.indexOf('澎湖')!=-1) \n{\n    context.global.locationnumber= 19 ;\n   \n}\nelse if(cityname.indexOf('彰化')!=-1 || cityname.indexOf('彰化')!=-1) \n{\n    context.global.locationnumber= 20;\n   \n}\n\n\n\nelse if(cityname.indexOf('連江')!=-1 ) \n{\n    context.global.locationnumber= 21 ;\n   \n}\n\nelse  \n{\n    context.global.locationnumber= 11 ;\n   \n}\n   \n   \n}\n\ncatch(err) {\n    cityname=\"台中\";\n    context.global.locationnumber=11;\n}\n\n\n msg.payload= context.global.locationnumber;\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":280,"y":640,"wires":[["2a7c547e.122b1c","e2d638ea.5fe9f8"]]},{"id":"e2d638ea.5fe9f8","type":"debug","z":"76e4593f.be8138","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":430,"y":700,"wires":[]},{"id":"e045c1fa.7a743","type":"ui_group","name":"City temperature","tab":"55628e0d.1afc3","order":1,"disp":true,"width":"6"},{"id":"55628e0d.1afc3","type":"ui_tab","name":"Home","icon":"dashboard"}]

2021年8月15日 星期日

Node-Red 讀取 Opendata PM2.5 與 AQI指數 並展示於UI 介面上

 Node-Red 讀取 Opendata PM2.5 與 AQI指數 並展示於UI 介面上

到opendata 空氣品質指標(AQI) https://data.gov.tw/dataset/40448

資料資源下載網址
  空氣品質指標(AQI)-JSON  請求AQI 與 PM2.5 資料 並展示於UI介面上




Flow 說明

編號

Flow名稱

功能說明

1

時間戳 (inject)

每20秒出觸發一次事件



2

http請求

(http request)

GET方式

URL: https://data.epa.gov.tw/api/v1/aqx_p_432?limit=1000&api_key=9be7b239-557b-4c10-9775-78cadfc555e9&sort=ImportDate%20desc&format=json

返回: JSON對象





3

函數function

func1

擷取json的records欄位, 其他的欄位略去

msg.payload= msg.payload.records

return msg;



records欄位

4

函數function

Func2

 

var PM25,Status,PublishTime;

 

Array.from(msg.payload).forEach(function(e,i){   

          if(e.SiteName=='大里'){       

              PM25 = {payload:Number(e['PM2.5'])};                   

              Status={payload:e['Status']};       

              PublishTime={payload:e['PublishTime']};      

 }

});

 

return [PM25,Status,PublishTime];

 

結果如下

msg.pm25 : string[19]

"大里 PM2.5=2, AQI=23"

5

Dashboard的gauge

將[PM25,Status,PublishTime] 展示於UI上 (127.0.0.1:1881/ui)





6

UI 畫面

127.0.0.1:1880/ui

選擇Weather 

(若是有其他UI)



 

flow 如下

[{"id":"d5924d54.f83c5","type":"inject","z":"e77ab25e.410ae","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"20","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":100,"y":280,"wires":[["ec7fe911.1e39e8"]]},{"id":"c66cf4c8.bd6fb8","type":"function","z":"e77ab25e.410ae","name":"func2","func":"var PM25,Status,PublishTime;\n\nArray.from(msg.payload).forEach(function(e,i){    \n          if(e.SiteName=='大里'){        \n              PM25 = {payload:Number(e['PM2.5'])};                    \n              Status={payload:e['Status']};        \n              PublishTime={payload:e['PublishTime']};       \n }\n});\n\nreturn [PM25,Status,PublishTime];\n","outputs":3,"noerr":0,"initialize":"","finalize":"","x":390,"y":360,"wires":[["a2967363.2eeff","a1b76035.83887"],["2dc2d0c7.29192"],["96e772af.1d6fe"]]},{"id":"a2967363.2eeff","type":"debug","z":"e77ab25e.410ae","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":590,"y":300,"wires":[]},{"id":"ec7fe911.1e39e8","type":"http request","z":"e77ab25e.410ae","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://data.epa.gov.tw/api/v1/aqx_p_432?limit=1000&api_key=9be7b239-557b-4c10-9775-78cadfc555e9&sort=ImportDate%20desc&format=json","tls":"","persist":false,"proxy":"","authType":"","x":240,"y":280,"wires":[["e5a317a6.009a58","6621269c.675078"]]},{"id":"2dc2d0c7.29192","type":"ui_text","z":"e77ab25e.410ae","group":"91d3cfc5.c30bb","order":1,"width":0,"height":0,"name":"","label":"空氣品質","format":"{{msg.payload}}","layout":"row-left","x":580,"y":380,"wires":[]},{"id":"96e772af.1d6fe","type":"ui_text","z":"e77ab25e.410ae","group":"91d3cfc5.c30bb","order":2,"width":0,"height":0,"name":"","label":"發佈時間","format":"{{msg.payload}}","layout":"row-left","x":580,"y":420,"wires":[]},{"id":"a1b76035.83887","type":"ui_gauge","z":"e77ab25e.410ae","name":"","group":"91d3cfc5.c30bb","order":0,"width":0,"height":0,"gtype":"gage","title":"細懸浮微粒PM2.5","label":"units","format":"{{value}}","min":0,"max":"100","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":610,"y":340,"wires":[]},{"id":"e5a317a6.009a58","type":"debug","z":"e77ab25e.410ae","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":410,"y":260,"wires":[]},{"id":"6621269c.675078","type":"function","z":"e77ab25e.410ae","name":"func1","func":"msg.payload= msg.payload.records\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":230,"y":360,"wires":[["c66cf4c8.bd6fb8"]]},{"id":"91d3cfc5.c30bb","type":"ui_group","name":"IAQI","tab":"2e8eb9a2.9f45f6","order":4,"disp":true,"width":"12","collapse":false},{"id":"2e8eb9a2.9f45f6","type":"ui_tab","name":"Weather","icon":"Dashboard","disabled":false,"hidden":false}]

2021年8月13日 星期五

Node-Red 讀取 Opendata PM2.5 與 AQI指數

每小時提供各測站之空氣品質指標(AQI),原始資料版本公告於空氣品質監測網https://airtw.epa.gov.tw

到 https://data.gov.tw/dataset/40448 擷取空氣品質指標(AQI)-JSON檔案


程式方塊flow 如下



共有7個flow

1.時間戳 觸動flow 工作

2. http請求 :  GET  空氣品質指標(AQI)-JSON http://opendata.epa.gov.tw/webapi/Data/REWIQA/?$orderby=SiteName&$skip=0&$top=1000&format=json 

3. 擷取json的 msg.payload.records 的紀錄內容


function flow 設定如下

msg.payload= msg.payload.records

return msg;


最後擷取出84筆資料

4. 再一次=擷取84筆紀錄中的sitename="XX" 的PM2.5與AQI值


function flow 設定如下

var a = msg.payload;

a.forEach(function(e,i){

    if(e.SiteName=='大里')

    {

        msg.pm25 = '大里 PM2.5='+ e['PM2.5'];

        msg.pm25 =msg.pm25 + ',  AQI='+ e['AQI'];

    }

});

return msg;


5.  3個msg.payload 展示所得到的資料,作為debug用


Node-Red程式如下

[{"id":"b8c51aeb.89ef28","type":"inject","z":"2139582e.c1e758","name":"","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":210,"y":980,"wires":[["331563a5.f737ac"]]},{"id":"331563a5.f737ac","type":"http request","z":"2139582e.c1e758","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://data.epa.gov.tw/api/v1/aqx_p_432?limit=1000&api_key=9be7b239-557b-4c10-9775-78cadfc555e9&sort=ImportDate%20desc&format=json","tls":"","persist":false,"proxy":"","authType":"","x":380,"y":980,"wires":[["6c7e26f6.0cfa88","101403b2.cc745c"]]},{"id":"de56df8c.abd26","type":"debug","z":"2139582e.c1e758","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"pm25","x":690,"y":1100,"wires":[]},{"id":"97d429c0.720578","type":"function","z":"2139582e.c1e758","name":"","func":"var a = msg.payload;\na.forEach(function(e,i){\n    if(e.SiteName=='大里')\n    {\n        msg.pm25 = '大里 PM2.5='+ e['PM2.5'];\n        msg.pm25 =msg.pm25 + ',  AQI='+ e['AQI'];\n    }\n});\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":550,"y":1100,"wires":[["de56df8c.abd26"]]},{"id":"6c7e26f6.0cfa88","type":"debug","z":"2139582e.c1e758","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":590,"y":980,"wires":[]},{"id":"101403b2.cc745c","type":"function","z":"2139582e.c1e758","name":"","func":"msg.payload= msg.payload.records\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":510,"y":1020,"wires":[["8dcc7321.b964b","97d429c0.720578"]]},{"id":"8dcc7321.b964b","type":"debug","z":"2139582e.c1e758","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":690,"y":1020,"wires":[]}]

  清除項目編譯快取 執行 flutter clean 重新取得套件依賴 執行 flutter pub get 完整重新編譯並執行 flutter run 1. 新增專案套件 (pubspec.yaml) 在 Flutter 專案根目錄下的 pubspec.yaml 中,新增 ...