前端玩轉大數據 - 家庭温濕度數據採集與分析

語言: CN / TW / HK

夏日已至,氣温升高,又到了一年難熬的梅雨季節。作為一名技術宅,我望了眼藏在角落裏吃灰的樹莓派,便萌生了通過樹莓派完成數據採集,經過大數據處理,得到可視化家庭温濕度報表的想法。

最終的效果如下,我產出了兩個看版,第一個可以看到最近1小時每分鐘的温濕度情況,第二個可以看到一天每小時的温濕度情況。

大數據處理流程概覽

首先,我們先來了解一下大數據處理的主要步驟,主要為數據產生、數據採集與存儲、數據分析與處理、數據應用4個步驟,通過訪問阿里雲大數據產品官網,可以瞭解到這些信息:

  1. 數據產生:業務系統每天產生的大量業務數據、日誌,存儲在各自獨立的數據源裏。

  2. 數據採集與存儲:通過DataWorks提供數據集成服務,可以將多種數據源類型,根據設定的調度任務,定時同步系統的數據至MaxCompute。

  3. 數據分析與處理:完成數據採集後,可以在MaxCompute中對數據進行離線處理(俗稱ETL過程,Extract-Transform-Load);也可以結合Flink和Hologres對數據進行實時處理。

  4. 數據應用:數據加工完成後,可以通過報表進行可視化展示與分享。

圖片來源: http://www.aliyun.com/product/bigdata/ide

我整理出了本次實現案例的數據開發方案,如下圖所示:

  • 數據產生:樹莓派連接温濕度傳感器,間隔2秒讀取數據,並實時上報到SLS日誌服務進行存儲。

  • 數據採集與存儲:使用數據集成工具,將SLS日誌服務的數據同步至MaxCompute。

  • 數據分析與處理:遵循數倉規範,在DataWorks裏完成數據開發。

  • 數據應用:將開發完成的數據關聯到QuickBI,進行可視化報表搭建。

接下來,我們按照這個流程逐步實現。

一、數據產生

概覽:使用樹莓派連接温濕度傳感器,基於JavaScript我們可以快捷完成數據的讀取,隨後基於阿里雲SLS服務,將採集到的數據實時上報並存儲。

什麼是樹莓派

圖片來源: http://www.raspberrypi.com/products/raspberry-pi-4-model-b/

樹莓派於2012年問世,外形只有信用卡大小,它是一款基於ARM的微型電腦主板,卻具有電腦的所有基本功能,此外還具有GPIO接口能力,可以很方便完成與硬件的通信。

它出現的本意並非撼動消費者市場,而是以低廉的價格去促進計算機教育,做出好玩的實驗,這是樹莓派流行的主要原因。

什麼是GPIO編程

GPIO(General-Purpose IO Ports),即通用IO接口。GPIO主要分為輸入和輸出兩種功能。可以實現一些簡單設備的控制。比如在輸入模式下,將該IO連接傳感器,可以用於檢測外部狀態;當作為輸出時,可以通過輸出高/低電平來控制外部設備的運轉。

樹莓派天然支持GPIO編程,以樹莓派4B為例,它提供了40個接口,其中21個為GPIO接口,見下圖圈出來的位置。

圖片來源: http://pinout.xyz/

樹莓派目前提供多種編程語言的開發SDK,這極大地降低了我們操作硬件的成本,我們不需要掌握電位變化的基礎知識,只需要調用API便可以輕鬆讀取數據,接下來我們來介紹本文的核心 -- DHT11温濕度傳感器。

DHT11温濕度傳感器

DHT11温濕度傳感器,可以測量20-90%的濕度區間, 0~50℃的温度區間,採樣週期 >= 1秒/次,外觀如下圖所示:

圖片來源: http://developer.aliyun.com/ article/843529

它包含三個針腳,分別是電源正負極、一個數據針腳。通過將信號針腳與樹莓派的某一個GPIO針腳連接,便可以源源不斷的讀取信息。

採集與上報數據

我們按照下圖將樹莓派與傳感器進行連接,其中傳感器的數據針腳連接到樹莓派的編號為21的GPIO針腳。

連接成功後,我們基於開源項目 node-dth-sensor 來完成傳感器數據的獲取,只需要編寫簡單的JavaScript代碼,調用 read 方法,就可以獲取到温濕度數據,如下所示:

const sensor = require("node-dht-sensor");
const SENSOR_TYPE = 11; // 傳感器類型,本例為DHT11型號傳感器,因此賦值為11
const GPIO_PIN = 21;// GPIO針腳編號,本例中連接到了21編號,這裏根據實際連線情況需要變化參數。
sensor.read(SENSOR_TYPE, GPIO_PIN, function (err, temperature, humidity) {
if (!err) {
console.log("temperature", temperature, "humidity", humidity);
}
});

隨後,我們結合阿里雲SLS日誌服務,每隔2秒,做一次數據上報,示意代碼如下:

const sensor = require("node-dht-sensor");
const SLS = require("./sls"); // 基於sls日誌服務的sdk做簡單封裝
const projectName = "自定義";
const logStoreName = "自定義";
const reporter = new SLS(projectName);
const SENSOR_TYPE = 11; // 傳感器類型,本例為DHT11型號傳感器,因此賦值為11
const GPIO_PIN = 21; // GPIO針腳編號,本例中連接到了21編號,這裏根據實際連線情況需要變化參數。
setInterval(() => {
sensor.read(SENSOR_TYPE, GPIO_PIN, function (err, temperature, humidity) {
if (!err) {
reporter.put(logStoreName, {
temperature,
humidity,
});
}
});
}, 2000);

最後,我們使用pm2運行該段腳本,使其在後台常駐運行:

$ pm2 start dht11.js

進入SLS日誌服務控制枱,檢查是否有數據上報成功:

二、數據採集與存儲

概覽:這一節我們的目標是將SLS的日誌數據採集並存儲到MaxCompute裏,本案例中我們為了儘可能實時地看到數據情況,將數據採集的頻率設置為5分鐘/次,實現近實時數據採集,也可以大致滿足我們的需求。

第一步:建立需要存儲同步後的數據的表,按照數倉規範,存放業務源頭數據的表,我們需要將其命名為ods_前綴,其英文全稱為Operational Data Store,在數據分析與處理章節,我們會詳細介紹。

第二步: 使用數據集成工具完成數據同步,獲取SLS裏的上報時間需要將採集字段命名為 __receive_time__

第三步: 設置任務調度時間,每5分鐘執行一次,每次獲取執行時向前5分鐘的數據,在調度配置裏使用 $[yyyymmddhh24miss] 參數表達當前時間(精確到秒),使用 $[yyyymmddhh24miss-1/24/60*5] 參數表達當前時間的前5分,提交任務,進入到運維中心後,便可以看到調度任務已經在等待中了。

第四步: 使用臨時查詢工具,檢查數據是否成功同步。

三、數據分析與處理

概覽:在Dataworks裏進行數據處理,依據數倉建設規範分別構建ODS層、DWD層、DWS層、ADS層。根據上報的温濕度明細數據,計算出最近1小時每分鐘的温濕度數據、每天每小時的温濕度數據。

首先,在數據分析處理之前,需要先明確最終需要產出的結果是什麼:

  • 最近1小時每分鐘的温濕度情況

  • 每小時的温濕度變化情況以及是否舒適

  • 每日舒適率

以下是個人的定義,不一定嚴謹,僅供參考:

  • 舒適區間:人體感覺適宜的温度在22到26度之間,相對濕度在40%到70%,在這樣的温度和濕度的環境下人體感覺相對比較舒服。

  • 舒適率:(舒適小時數 / 當天已統計小時數) * 100%,例如 上午10:00,當天共統計10個小時,其中舒適小時數為5個小時,因此當天舒適率為 (5/10)*100% = 50%

隨後我們進行數據處理階段,數據處理階段是非常靈活的,為了儘可能讓數據資產規範可持續消費,應當遵循一定規範進行建設,目前業界普遍按照維度建模和數倉建模的思路來組織整個開發過程,具體如下:

  • 第一步:構建ODS層,目標是1比1完整接入,不考慮易用性,僅僅要求全。這一步將SLS日誌同步到ods_sensor表裏

  • 第二步:構建DWD層,目標是加入規範,數據清洗,拼接相關字段,讓數據好用。這一步將ods_sensor裏的日期時間戳轉化為標準的date格式,並且完成是否為舒適數據的判斷,最終生產為dwd_sensor表

  • 第三步:構建DWS層,目標是對數據適度彙總,讓數據易用。這一步根據dwd_sensor表,生產出最近1小時和每小時的輕度彙總表,分別為dws_sensor_latest_1h和dws_sensor_1day

  • 第四步:構建ASD層,與業務直接關聯的需求在此完成,上述舒適率便是一個個性化需求,因此放在這裏構建,產出ads_comfort_rate_day

最終構建後的數倉結構如下(在dataworks裏以可視化方式呈現表依賴關係):

四、數據應用

概覽:這一步只需要將產出的數據表,關聯到Quick BI中,便可以快捷搭建出可視化看板。

第一步:新建數據源,與MaxCompute形成關聯,隨後便可以獲取到所有的表信息

第二步: 新建數據集,將MaxCompute表在這裏進一步加工,例如調整名稱,字段類型調整,展示格式調整。

第三步: 搭建看板,挑選適合的圖表,將字段關聯,你還可以增加各種過濾器進行篩選。

五、小結

通過採集温濕度數據並進行可視化處理,讓沉睡已久的樹莓派重新煥發生機,整個過程是充滿樂趣的。提及日常生活,我們每天每個人其實都在不斷地產生數據,大數據離我們並不遠,運動手環、智能家居、購物推薦其實都在無形應用着這些數據,我們既是生產者,亦是消費者。

希望本文可以喚起大家動手進行大數據處理的熱情,採集並消費身邊的數據,人人都可以做大數據分析。

關注 「Alibaba F2E」 微信公眾號 把握阿里巴巴前端新動向