close

最近 PM 2.5 這個議題非常的熱門,這兩年也陸續有 LASS4U、空氣盒子... 等類似的產品出現,也幫助民眾瞭解空汙對於我們所造成的影響。其中在台灣的LASS (Location Aware Sensing System, http://lass-net.org/) 一套開源和公益的「環境感測器網路系統」帶來許多有意義的資料並幫助民眾一起監控環境的空氣品質;LASS4U 是筆者認為在眾多專案中硬體規格與完整度最高的,除了可感測 CO2、Temperature、Humidity 、PM2.5, (PM1、PM10) 外,並加入觸控螢幕讓使用者不用開啟網頁或是手機 App,便可得知即時資訊。


當然,在這空污這麼熱門的議題,NAS 當然也是不可或缺的角色!因為資料的儲存也是很重要的,接下來我將簡單介紹,如何透過 NAS 的 Node-Red 將 LASS4U 的資料導入到 NAS 之中,並透過 NAS 強大的 IoT 系統,處理空污的資料。

首先,需要準備(如果不清楚如何安裝 Node-Red or Freeboard, 可以參考先前的文章):

  1. QNAP NAS

  2. Node-Red

  3. Freeboard or Dashboard


從 LASS4U 那邊,可以取得相關的 MQTT 的資訊:
MQTT Host: gpssensor.ddns.net:1883
MQTT Topic: LASS/Test/LASS4U

此時就可以直接透過 Node-Red 建立一個 MQTT node, 並新增 server 和填入 LASS4U topic:

MQTT_LASS4U

成功建立 MQTT 連線後,接者找尋手邊 LASS4U 的編號:

LASS4U_No

目前手上的版本是 FT2_0018.

接著要開始來處理 LASS4U 的資料,下圖是透過 Node-Red 新增的 function node.

Screen Shot 2017-02-13 at 12.12.57 PM

此 node 主要用來處理透過 LASS4U 的 MQTT 訂閱 的資料,因為 LASS4U 是將所有裝置的資料,都打向 LASS/Test/LASS4U 這個 topic,所以如果要處理多台 LASS4U 時,可以透過 function node 多輸出的特性來建立各個不同的資料流。
if(msg.payload.indexOf("FT2_0118")!=-1){
return [msg, null];
}else if(msg.payload.indexOf("FT2_0004")!=-1){
return [null, msg];
}

2, 4 主要是分別將 FT2_0118 和 FT2_0004 兩台裝置分別導向兩個不同的輸出.

LASS4U_Node

透過 debug node, 可以簡查一下是否有正常抓取到 LASS4U 的資料.
以下是從 LASS4U 抓取 FT2_0118 這台裝置的環境資料:

|ver_format=3|FAKE_GPS=1|app=LASS4U|ver_app=beta|device_id=FT2_0118|date=2017-02-13|time=04:23:57|device=Ameba|gps_lon=24.796937|gps_lat=121.005882|s_t2=21.41|s_h2=50.61|s_d0=10.00|s_g8=664.00|s_d2=8.00|s_d1=10.00

各個欄位資料定義:
date: 日期
time: 時間
gps_lon: 此裝置目前設定的 GPS 位置
gps_lat: 此裝置目前設定的 GPS 位置
s_t2: 目前溫度
s_h2: 目前濕度
s_g8: 目前二氧化碳濃度
s_d2: 目前 PM 2.5
s_d1: 目前 PM 1.0

取得資料各個欄位的定義後,接著需要再一次處理 LASS4U 的資料,並將所需要的感測資料處理後,推送到 Dashboard 並呈現相關資料。

首先,需要透過 split node 將 LASS4U 的資料先做切割,並推送到 Process Sensor Data 進行處理;第二步,就是將處理好的資料透過輸出 1~7,分別推送到 Dashboard。

LASS4U_Sensor

一樣透過 function node 來處理感測的資料:
var sensorData = msg.payload;
if(sensorData.indexOf("gps_lon")!=-1){
var sensorValue = sensorData.replace('gps_lon=', '')
msg.payload = sensorValue;

return [msg, null, null, null, null, null, null];
}else if(sensorData.indexOf("gps_lat")!=-1){
var sensorValue = sensorData.replace('gps_lat=', '')
msg.payload = sensorValue;

return [null, msg, null, null, null, null, null];
}else if(sensorData.indexOf("s_t2")!=-1){
var sensorValue = sensorData.replace('s_t2=', '')
msg.payload = sensorValue;

return [null, null, msg, null, null, null, null];
}else if(sensorData.indexOf("s_h2")!=-1){
var sensorValue = sensorData.replace('s_h2=', '')
msg.payload = sensorValue;

return [null, null, null, msg, null, null, null];
}else if(sensorData.indexOf("s_g8")!=-1){
var sensorValue = sensorData.replace('s_g8=', '')
msg.payload = sensorValue;

return [null, null, null, null, msg, null, null];
}else if(sensorData.indexOf("s_d2")!=-1){
var sensorValue = sensorData.replace('s_d2=', '')
msg.payload = sensorValue;

return [null, null, null, null, null, msg, null];
}else if(sensorData.indexOf("s_d1")!=-1){
var sensorValue = sensorData.replace('s_d1=', '')
msg.payload = sensorValue;

return [null, null, null, null, null, msg, null];
}

1:  取得分割資料, 會依續將分割的資料分別傳送進來.
2~6: 處理 gps_lon 的資料,並將 gps_lon= 的字串去除.
6, 11, 16...: 主要是對應 function node 的各個輸出位置
return [msg, null, null, null, null, null, null]; //輸出 1
return [null, null, null, msg, null, null, null]; //輸出 4


成功後,我們可以看到 LASS4U 的資料,呈現在 NAS 的 Dashboard 上了。

LASS4U_Dashboard

後續:除了可以即時呈現 LASS4U 的資料到 NAS 外,透過 Node-Red 也可以快速的將資料處理並且傳送到後端資料庫和前端網頁,甚至也可以將資料處理分析後,傳送到雲端的服務平台,讓資料變的更多元化。

 
arrow
arrow
    全站熱搜

    tttt 發表在 痞客邦 留言(2) 人氣()