RD嘴炮

2016-11-27 Ubuntu Core 黑客松

OLYMPUS DIGITAL CAMERA

Ubuntu Core 黑客松

這次代表公司參加 Ubuntu 黑客松的活動

主要是 Ubuntu 要推廣新的 IoT OS: Ubuntu Core

支援 x86, ARM(ex: Raspberry Pi)

運氣不錯,利用 “天台聚落” 這個 idea, 得到了一等獎

有趣的是,一等獎的獎品是自家 NAS…

所以,就捐出去了 XD

 

謎之學弟:你好像很適合比賽….XD

也很開心,台大創創這次的競賽,”天台聚落” 獲得下一階段的入圍.

NAS 氣象站

2016-08-14-15-08-30

有想過把自己 NAS 變成氣象站嗎?

其實很容易,你只需要透過 NAS 本身內建的 Docker (or Container Station),就可以達成自己在家架設一台專業的氣象站。

首先,需要準備:

  1. Weather Station WH2080 + 顯示面板 + USB
  2. NAS (需要支援 docker)
  3. Weather Station image for docker
  4. MQTT Server

如下圖,將 WH2080 的顯示面板透過 USB 插入到 NAS 上,透過 NAS 將氣象站資訊推送到 MQTT,最後透過 Node-Red 處理相關的資料後,就可以呈現氣象站的資料; 如果要儲存到資料庫或是雲端服務,再透過 Node-Red 處理資料並上傳或儲存到雲端或資料庫裡。

qnap_weather_station

 

將氣象站顯示面板連結到 NAS 後,直接建立新的 docker image,記得把 “your-mqtt-server” 換成自己架設好的 MQTT Server 喔!

# docker run -t -i --cap-add=SYS_ADMIN --privileged --security-opt seccomp:unconfined -v /dev/bus/usb:/dev/bus/usb jarvischung/weather-station node /root/weather.js your-mqtt-server

此 docker image 基本上已經自動設置好 USB 與 氣象站的資訊,每分鐘會透過USB的方式,將氣象站資料取得,並註冊 “jarvis-weather-station” 到發送到 MQTT Server,接下來可以透過 Node-Red MQTT node 註冊 “jarvis-weather-station” 後,就可以取得氣象站資料。

目前氣象站的 JSON 格式:

{
'rf.delay': 27,
'rf.hum_in': 43,
'rf.temp_in': 28.1,
'rf.hum_out': 51,
'rf.temp_out': 24.1,
'rf.abs_pressure': 1017.5,
'rf.wind_ave': 0,
'rf.wind_gust': 0,
'rf.wind_dir': 2880,
'rf.rain': 1687.2,
'rf.status': {
b1: false,
b2: false,
b3: false,
b4: false,
b5: false,
lost_sensor_contact: false,
rain_overflow: false,
b8: false
}
}

下圖是 Node-Red 目前處理的方式,處理的流程為:

MQTT –> Parsing JSON –> Node-Red Dashboard

screen_shot_2016-11-09_at_2_14_30_pm

如需要上面Node-Red Flow的檔案,可以直接在此下載(不含MQTT Server及DB的相關Flow)。

Node-Red Dashboard 呈現的畫面(當資料密度太細時,不太建議用 Node-Red Dashboard,會處理的非常緩慢)

pasted_image_09_11_2016__2_29_pm

 

有沒有覺得將氣象站連接 NAS 很簡單呢?!

之後會再介紹如何將資訊站的資料上傳到 WU Weather,為 open data 盡一點心力!

下圖是我目前將氣象站的資料分享到 WU Weather 上,名稱是 IMIAOLI3

pasted_image_09_11_2016__2_47_pm

當NAS遇見IoT – LightBlue Bean/Bean+

2016-11-02-11-24-14

今天要來介紹 Punch Through 所推出的 LightBlue Bluetooth BLE 方案的 start kit,目前推出的兩種裝置,都是透過 BLE 方式進行連結。

beanfamily-white-backg-border

出處:Punch Through

Bean 和 Bean+ (土豆和土豆進化版?)都是透過募資平台,然後經過一連串的研發、製作、測試,最後量產的產品,基本上去年年底下單到出貨,大概也歷經半年之久。

LightBlue Bean+

LightBlue Bean+

Bean 與 Bean+ 最大的差別,應該就是支持的 I/O 以及加入了 Grove 接口,並且從原本 Bean 使用的不能充電的鈕扣電池,改為可充電式鋰電池。另外最大的差別,我想就是 Bean 之前並沒有提供快速接口,甚至要使用還必需先準備烙鐵,把需要用的節點先焊上才可以使用。

出處:https://socialwearablesciid2015.wordpress.com/

出處:https://socialwearablesciid2015.wordpress.com/

軟體方面,Bean 系列都可以透過任何平台來進行開發,甚至還可以透過手機進行程式的修改,可以說非常的方便使用。至於 Bluetooth 最重要的 profile 竟然還支援多種類型,包含:

  • iBeacon: 支援 Apple 的 iBeacon
  • MIDI: 可將 MIDI 訊號導入至 Bean
  • HID: 可透過無線鍵盤、滑鼠,甚至還可以透過支援 HID 的藍芽遊戲手把來進行控制
  • ANCS: 可以接收 iOS 的訊息,類似 iWatch 的方式
  • OBSERVER: 用來傳送訊息到各種不同的裝置
出處:Punch Through

出處:Punch Through

讓我們開始整合 Bean/Bean+ 到 NAS 吧!

在開始與 Bean/Bean+ 進行連線之前,需要先準備 BLE USB 裝置,在這邊我使用的是 SENSE 推出的  BLE 裝置,記得一定要有支援 BLE (Bluetooth LE) 功能的喔!

USB BLE + NAS

USB BLE + NAS

如果要確定是否有安裝成功,可以透過 SSH 進到 NAS,利用 lsusb 將目前的 USB 裝置列出,目前我使用的是 “Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)”

 [~] # lsusb
Bus 001 Device 002: ID 8087:8008 Intel Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 8087:8000 Intel Corp.
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 002: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 003 Device 003: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 003 Device 004: ID 1005:b155 Apacer Technology, Inc.
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub

確認 USB 正確安裝成功後,接著安裝 Bean + Node-Red 的 docker image,此連結的 image 主要是已經將所需要的 Bean SDK 和 Node-Red 怖署完成的版本(連結包含相關教學)。

在這邊需要特別注意的是,無法直接透過 Container Station 的管理頁面進行 image 的佈署,要直接透過下面的指令去產生 image,最主要是要將 USB 相關裝置的資訊 pass-through 到 image 裡使用。

 [~] # docker run -t -i --name qbean_test --cap-add=SYS_ADMIN --privileged --net=host -v /dev/bus/usb:/dev/bus/usb -v /run/dbus:/run/dbus -v /var/run/dbus:/var/run/dbus jarvischung/qbean bash

建立完成後的 image,可以透過 http://your-nas-ip:1880 開啟 Node-Red,並且可以看到已經預設安裝好的 LightBlue Bean Node-Red 模組。從下面的 node 模組可以發現,Bean/Bean+ 預設是支援溫度、三軸以及 RGB LED 感測器的功能,下面會一一介紹。

安裝好的LightBlue Bean模組

安裝好的LightBlue Bean模組

除了已經安裝好的相關模組外,為了快速取得目前手上的 Bean/Bean+ 裝置相關的 UUID,可以透過 http://your-nas-ip:1880/bleScan/ 已經透過 Node-Red 建立好的 BLE Scan API 取得現有的裝置資訊。

預設產生好的 BLE Scan API

預設產生好的 BLE Scan API

呼叫此 API 後,需要等待約 30s 的時間,如果 USB BLE 與 Bean/Bean+ 有正確開啟,基本上會取得 Bean/Bean+ 相關裝置的資訊(此 API 並不會列出非 Bean/Bean+ 裝置)。

透過 Node-Red 產生 BLE Scan API

透過 Node-Red 產生 BLE Scan API

取得 Bean/Bean+ 裝置的 UUID 後,我們要開始來設定 Bean node。下圖是新增 Bean node 的頁面,UUID 部份就是剛剛透過 BLE API 取得的資訊; Connection部份有兩種模式:

  • “connection on event”: 代表當有事件時,才會進行 Bean/Bean+ 的連線(使用此方式,還需要設定 Timeout 的時間,也就是 event 結束後,多久的時間會自動斷線)。
  • “constantly connected”: 一旦 deploy 後,Bean/Bean+ 會直接連線,不會斷開。
新增 Bean config

新增 Bean config

為什麼要分兩種連線方式呢?

主要是 BLE 雖然省電,畢竟並不是每一種狀況都需要讓 startkit 都在工作模式下,透過此方式也可以讓 Bean/Bean+ 更省電喔!

下圖是直接使用 Node-Red 拉好的 flow,可以快速的取得 Bean/Bean+ 裝置內建的溫度感測器資訊。

透過 Node-Red 取得 Bean/Bean+ 溫度資訊

透過 Node-Red 取得 Bean/Bean+ 溫度資訊

換試另一個三軸感測器的 node,可以馬上取得資訊。

透過 Node-Red 取得 Bean/Bean+ 三軸感測器資訊

透過 Node-Red 取得 Bean/Bean+ 三軸感測器資訊

如果想要改變 Bean/Bean+ 裝置上 RGB LED 的顏色,直接將 inject node 改送 red string 即可以改變狀置的 RGB LED 顏色。支援的格式有:

  • 格式 1: 送進 node 的字串可以有 “Red”, “Green”, “Blue” 以及 “Off”
  • 格式 2: 送進 node 的字串可以是 RGB 數值的組合,例如:0,255,255 或是255,0,255
改變 Bean+ 的 RGB LED

改變 Bean+ 的 RGB LED

是不是覺得 NAS 整合 start kit 很方便啊!未來會分享更多 Bean/Bean+ 相關裝置的應用,像是:

  • 如何透過手機簡單的使用 Bean/Bean+
  • 如何自訂 scratch,更方便的取得其它感測器的資訊

當NAS遇見IoT – Particle Photon

2016-10-20-09-50-11

Particle公司擁有完善的開源物聯網硬體及平台,從2013年開始,就首先推出了基於TI CC3000的CORTEX M3的物聯網開發板。

目前推出的系列有:

  • Particle Core
  • Particle Photon
  • Particle Electron

其中,Particle Electron是基於3G連網為主的開發板,Core 和 Photon 都是使用wifi做為連結的方式。

Particle不管是韌體、軟體甚至硬體部份,目前都是開源的,開發者可以自行下載並客製屬於自己的物聯網硬體及平台:

首先,要讓Photon與QNAP NAS整合,需要先安裝相關的服務:

Step 1: 安裝 Container Station

Step 2: 透過 Container Station 安裝 Node-Red (原生的 Node-Red 預設並不支援 Particle 模組,需要請安裝此版本)

Step 3: 安裝完成後,可直接開啟 Node-Red 管理頁面,如下圖所示 (http://your-nas-ip:1880, 預設port為1880)

screen-shot-2016-10-20-at-10-53-45-am

Step 4: 成功開啟 Node-Red 後,可以找到 Particle 相關的 node 模組。目前支援三種類別,event, function 和 variable

screen-shot-2016-10-20-at-10-55-25-am

Step 5: 接下來,開始設置 Particle Photon之前,需要安裝相關的設定環境 (透過command line進行flash,可參考此方式)。

# how to install the particle-cli
$ npm install -g particle-cli
$ particle login

Step 6: 更新 Photon (注意:需要進入DFU mode)

如何進入DFU mode

  1. 從裝置上找到兩個按鈕,並同時按下 RESET 和  SETUP 按鈕
  2. 先放開 RESET 按鈕,並持續按壓住 SETUP
  3. 當燈號變為閃爍”黃燈“時,代表裝置已進入 DFU mode
$ particle update

particle update info

更新成功後,可以透過下面指令查詢目前版本

$ particle identify
Your device id is 2xx02b000xxxxxxxxx30xx3x
Your system firmware version is 0.5.2

Step 7: 第一次拿 Photon 需要先設定 wifi,並且連到 Particle Cloud (如果需要直接透過手機連結 Photon,可以參考此方式)。

連結 USB 啟動 Photon,第一次使用會持續閃爍”藍燈

$ particle setup

登入 Particle Cloud → 設定無線網路 → 命名你的 Photon → 成功設定好 Photon
一旦無線網路設定完成,可以發現從原本的閃爍的藍燈,會轉變成呼吸燈,代表已經成功連上 Particle Cloud.

particle setup

Step 8: 列出目前的 Particle 裝置,下面圖示可以看到剛剛設定完成的 Jarvis-NAS-Photon,後面的2d0xxxxxxxxxxx037是裝置id,可以先紀錄下來,等會會使用到。

$ particle list

particle list

設定好 Particle 裝置 以及 NAS後,開始串接裝置與 Node-Red。

首先,登入 Particle Build,這邊需要做兩件事情:
1. 放進測試用的原始碼,測試 event, function 以及 variable.
2. 取得存取相關 API 權限的 access token,之後要放到 Node-Red 使用。

我們先來將下面的測試的原始碼放進剛剛設置好的 Photon,功能主要是能夠透過event發送LED狀態、可透過function取得控制LED狀態以及目前LED狀態為何。

int ledStatus = 0;
int ledPin = D7;

// LED function
int getLedStatus(String cmd);
int setLedStatus(String cmd);

void setup() {
pinMode(ledPin, OUTPUT);

// Set a variable let user can get LED status.
Particle.variable("ledstatus", ledStatus);

// Set function let user can call it.
Particle.function("getLedStatus", getLedStatus);
Particle.function("setLedStatus", setLedStatus);
}

void loop() {
ledStatus = digitalRead(ledPin);

// Publish event to Particle cloud.
Particle.publish("ledstatus", String(ledStatus));

delay(5000);
}

int getLedStatus(String cmd){
ledStatus = digitalRead(ledPin);

return ledStatus;
}

int setLedStatus(String cmd){
if(cmd == "true"){
digitalWrite(ledPin, HIGH);
}else{
digitalWrite(ledPin, LOW);
}
}

貼上程式碼後,就可以進行燒錄的動作,如下圖:
Particle build & flash

可以順便注意一下,當燒錄過程中,裝置的 LED 狀態會有黃藍燈一起亮,然後閃爍並連線,最後轉換成呼吸燈,代表燒錄成功。

現在已經完成裝置上的設定,接下來就是要取得存取相關 API 權限的 access token,之後要放到 Node-Red 使用,如下圖:
get token

取得 access token 後,將此 token 放進 Node-Red 提供的 Particle node 裡,
首先先建立一個新的 Particle Cloud config,接下來填入相關資料,例如:Name, Device ID, Event

Create new Particle config for Node-Red

完成後,如下圖,填上剛剛設定上去的 Event 名稱”ledstatus”,再將輸出的 node 與 Particle node 串接起來。

fill-in info

所輸出 event 的結果….

node-red output

Particle 除了透過網頁的方式取得裝置相關的資訊外,也可以透過 REST API 的方式取得目前裝置的狀態資訊

# GET
https://api.particle.io/v1/devices/2d002bxxxxxxxxxx03037?access_token=e2bd9e98axxxxxxxxxxf1970916xxxxxxx

particle rest api
取得 ledstatus variable 狀態

# GET
https://api.particle.io/v1/devices/2d002bxxxxxxxxxx03037/ledstatus?access_token=e2bd9e98axxxxxxxxxxf1970916xxxxxxx

particle

取得目前LED狀態,透過 Particle function

# POST
curl https://api.particle.io/v1/devices/2d002b00xxxxxxxxx53xx037/getLedStatus \
     -d access_token=e2bd9e98xxxxxxxxxxxxx19709xxxxxxxxxx6c92c
 
{
  "id": "2d002b000a47353235303037",
  "last_app": "",
  "connected": true,
  "return_value": 1
}

設定 LED 狀態 setLedStatus

# POST, args=true -> LED On; args=false -> LED off
curl https://api.particle.io/v1/devices/2d002b00xxxxxxxxx53xx037/setLedStatus \
     -d access_token=e2bd9e98xxxxxxxxxxxxx19709xxxxxxxxxx6c92c \
     -d "args=true"
 
{
  "id": "2d002b000a47353235303037",
  "last_app": "",
  "connected": true,
  "return_value": 536959528
}

除了可以透過 REST API 方式取得與控制裝置外,也可以透過 Node-Red 的方式控制,透過 inject node 來控制 LED 的開關.
node-red control led

透過 Node-Red 來控制裝置並不難,如果又不想要花錢申請雲端平台的話,又剛好 NAS 又支援 docker,其實自己搞一個 IoT 的簡易服務也並不難。

之後會針對更多 Particle 相關的應用介紹,包含:
1. 建置自己的 Particle Cloud
2. 整合水質感測裝置,打造屬於自己的魚缸監控系統
3. 介紹一下擁有 3G module 的 Particle Electron