標籤彙整: QNAP

Domoticz + NAS

最近在找尋一套完整度較高的 IoT Service, 功能需要有:
1. Dashboard
2. 簡易的控制畫面
3. 歷史紀錄(天, 月, 年)
4. 可以整合 MQTT
5. Open Source
6. 在 NAS 上直接使用
7. 重要的是直接使用 docker 安裝,然後無痛直接使用它.

之前認為, Node-Red + 內建的 dashboard 功能已經夠完整, 可惜的是 Node-Red 內建的 dashboard 太吃資源, 一旦開啟歷史紀錄, 等於根本無法使用…XD

Freeboard 雖然簡單方便, 直接可以整合 Node-Red, 但多樣性不夠.

Domoticz 算是最近找到, 符合以上需求的 IoT Service.

Domoticz 相關 resources:
http://domoticz.com/wiki/Domoticz_Wiki_Manual
Docker: https://hub.docker.com/r/sdesbure/domoticz/

接下來開始來設定 Domoticz service

啟用 Domoticz service:

如果想要把資料存放在特定位置, 記得指向到該存放的位置:
-v /share/XXXXXX/domoticz:/config

成功啟動後, 可以透過網頁存取, http://your-ip:8181. 畫面是目前已經有設定好的感測器資料. 目前感測器的資料都是透過 MQTT + Virtual Sensor 來達成.

Domoticz 目前支援的裝置種類非常的多樣, 除了可以透過外接 USB 裝置的方式, 將 ZigBee, Z-wave, Wifi, BLE…, 透過各種不同的通訊方式將資料傳進 Domoticz 並管理.

整合 MQTT 是我會使用 Domoticz 真正的原因, 這樣一來我原先透過 MQTT 交換的感測裝置, 就可以透過 Node-Red 的方式重新導向到 Domoticz, 不用太多複雜的設定就可以完成, 資料處理部份可以使用 Node-Red 把所需要的資料分析整合起來.

目前整合的感測器有:

  1. 氣象站 (如何建立 Virtual Weather Device)
  2. 魚缸溫度, PH, EC, TDS
  3. 室內環境

接下來將透過 Domoticz 來建立 MQTT Hardware (Setup -> Hardware -> 選擇 type, 並找到 “MQTT Client Gateway with LAN interface” -> 設定相關資訊)

再安裝, Type: Dummy (Does nothing, use for virtual switches only), 用來建立虛擬裝置.

透過剛剛建立的 Dummy hardware 可以按下 “Create Virtual Sensors” 建立所需要的虛擬裝置,並與 MQTT Topic 整合起來.

建立成功的 Virtual Sensors, 可以從 device list 中找到. 記下欄位中的 Idx.

接下來要透過 Node-Red 把相關的資料透過 MQTT 傳至 Domoticz, Domoticz 將收到的 MQTT 資料透過 Idx 分別紀錄到對應的 device.

透過 Node-Red 將 Particle Cloud PH sensor device 資料透過 API 取得感測器資料, 再傳送到 topic: domoticz/in, 這個 topic 是給 Domoticz 使用, Domoticz 會監聽此 topic 一旦收到相對應的 JSON format 就會進行處理, 再分類給相關的 device.

傳送的 JSON format:

idx: 剛剛建立的 VS 裝置
nvalue: 0
svalue: PH sensor value

Domoticz 支援的裝置很多, 如果需要更多裝置的 JSON format, 可以參考官方的 Domoticz API/JSON URL’s wiki 網站.

Domoticz 的應用真的很多元, 蠻多功能都還在摸索, 有機會再分享了.

LASS4NAS

最近 PM 2.5 這個議題非常的熱門,這兩年也路續有 LASS4U, 空氣盒子… 等類似的產品出現,也幫助民眾瞭解空汙對於我們所造成的影響。

當然,在這空污這麼熱門的議題,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 多輸出的特性來建立各個不同的資料流。

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 來處理感測的資料:

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 也可以快速的將資料處理並且傳送到後端資料庫和前端網頁,甚至也可以將資料處理分析後,傳送到雲端的服務平台,讓資料變的更多元化。

 

Android Things + NAS

Android 最近也在 IoT 正火熱的時候,推出了 Android Things 的 preview 版本.

Android Things 基本上跟寫 mobile app 是差不多的,而且多了 Things Support Library 提供給開發者使用,非常的便利.

出自 https://developer.android.com/things/sdk/index.html

在第一次時間,也快速的測試 Android Things 是否可以連上 NAS,並透過 Node-Red + Dashboard 的方式,快速呈現 NAS IoT 的應用.

目前 Android Things 的 preview 版本,只有支援 3 種 IoT 開發裝置:

  • Intel Edison
  • NXP Pico i.MX6UL (台灣似乎不太好買到這一塊開發板)
  • Raspberry Pi 3

其它的開發裝置,未來應該會加入更多的選擇。

下面將開始介紹,如何使用 Android Things + NAS 的組合.

開始前,我們需要準備一些硬體工具:

  1. Raspberry Pi 3 + SD Card
  2. LED
  3. 電阻
  4. 開關
  5. 麵包板 + 跳線
  6. NAS 一台

軟體工具:

  1. Android Studio ( 需要使用 2.2 以上版本)
  2. Android adb debug tool
  3. Button and LED sample for Android Things

工具都準備完成後,可以先參考此連結,安裝 Android Things 到 Raspberry Pi 3上.

關於 Android Things image,這部份跟 Raspberry Pi 提供的 image 設定方式都一樣,只是跑在上面的作業系統不同.

完成後,將 Raspberry Pi 3 上電,過一會可以透過 adb 工具進行測試.

透過下面指令連到 Android Things, 成功連線會看到 connected to xxx 的訊息

$ adb connect "ip-address"
connected to xxxxx:5555

成功連線後,接下來就是開始來寫 Android Things 的 code.

將剛剛的範例先下載下來,並透過 Android Studio 進行編譯.

如果剛剛有透過 adb connect 連線成功,可以透過 Android Studio 直接編譯好的程式推送到 Android Things 上.

screen-shot-2016-12-30-at-5-37-49-pm

成功推送後,可以在 debug 的訊息欄裡面看到程式啟動成功的訊息.

12-30 10:01:48.665 20111-20111/com.example.androidthings.button I/ButtonActivity: Starting ButtonActivity
12-30 10:01:48.683 20111-20111/com.example.androidthings.button I/ButtonActivity: Configuring GPIO pins
12-30 10:01:48.690 20111-20111/com.example.androidthings.button I/ButtonActivity: Registering button driver

接著,我們要把剛剛準備好的 LED、電阻與 Button 接上,請參考下圖.

rpi3_schematics

來源: https://github.com/androidthings/sample-button

完成後,開啟 Android Things,再執行剛剛的程式,就可以直接透過按鈕控制 LED 的開關,按壓住按鈕 LED 燈會恆量,放開則熄滅. (臨時找不到按鈕開關,用觸摸式感測器代替)

2016-12-30-18-09-26

寫到這邊,先來講解一下 Things Support Library 多了些什麼!

從 gradle config 中可以發現,多了兩個 library.

第一行,主要用來處理按鈕事件的處理,主要是針對使用 GPIO 的按鈕進行處理.

第二行,是 Things Support Library, 主要是 Android Things 相關 dependency library.

Note: 目前 Android Things 提供用來處理硬體相關的 driver, 可以從 Android Things 的 GitHub 裡找到目前支援的類型有哪些(目前支援 12 種).

以下是使用 Things Support Library 來控制接上 GPIO 的按鈕.

1: PeripheralManagerService 是用來管理開發板上的硬體服務
4: 設定 LED GPIO pin, 目前是透過 BoardDefaults 取得使用 BCM6 的腳位(參考相關 pin out)
5: 設定 pin out 為低電位
10: 使用 driver-button library 來控制按鈕的狀態,使用 BCM21 作為輸入,並且預設當按下按鈕為高電位(PRESSED_WHEN_HIGH)
14: 註冊按鈕, 並且使用 KeyEvent 的方式處理按壓事件.

成功註冊按鈕後,可以透過 onKeyDown 和 onKeyUp callback 來處理按鈕的事件.

2, 14: 當按下或放開按鈕時的 callback.
30: 主要是用來處理當按鈕按下後,設定 LED 為高電位或低電位.

以上是如何透過按鈕來控制 LED 的亮滅,那我們要如何將 LED 的狀態傳回到 NAS 並將 LED 狀態進行回傳呢?其實很簡單,我們可以實作 MQTT 在 Android Things上,並將 LED 狀態回傳.

首先,先將 MQTT library 加入到 gradle config.

以下是如何實作 MQTT publish 和 subscribe,並將資料回傳到 MQTT Server

1, 19, 24, 29: 實作 MqttCallback
8: 資料暫存到 memory, 如果不使用此方式,會有錯誤訊息.
9: 連線資訊, 包含 MQTT server 位置, clientId
11: 套用 MqttCallback
12: subscribe PiLEDStatus
19: 連線失敗 callback
24: 收到 PiLEDStatus 的訊息

修改剛剛的 setLedValue, 並加上 MQTT 訊息的推送.

8 – 13: 建立 MQTT message 容器
15: publish PiLEDStatus 並將訊息送到 MQTT Server

完成 MQTT 的實作後,再一次編譯程式,並推送至 Android Things.

接下來,開啟 NAS 的 Node-Red,建立一個 MQTT Node, 並 subscribe PiLEDStatus, 把輸出指向 Node-Red Dashboard.

screen-shot-2016-12-31-at-12-07-22-am

完成 Node-Red 的佈署後,可以即時的觀察每次按壓按鈕的狀態.

2016-12-30-18-19-37

Android Things 目前雖然還是 preview 的版本,但依照目前的 support library 完整性還蠻高的,而且 image 的大小也壓縮在 200MB 上下,看來算是輕量化的 Android Things,希望未來正式的版本推出後,支援的功能可以更多.