RaspberryPi
BLE
node-red
Raspberrypi3
Linking
0

オススメ!1600円の無線(BLE)温度センサーをRaspberry Pi3 + node-redで活用する

Raspberry Pi3とLinkingデバイス

はじめに

Raspberry Piで温度センサーを使う際の選択肢はいっぱいあります。USBモジュールを使うもよし、Raspberry PiらしくGPIOにセンサーモジュールを接続するもよし。

でも、できれば無線の温度センサーをあちこちにおいて各部屋の温度を計りたい。と思ってたら、Qiitaのトレンドに出てた しいたけを自動栽培してみた結果(前編) という投稿で、スマホ用に売られている Linkingデバイス というのを知りました。これをRaspberry Pi3 + node-redで誰でも簡単に使えるようにしてみます。

どのくらい簡単かというと、このようにノード配置しただけでセンサーのデータを取れるレベルです。

スクリーンショット 2018-08-23 午後5.56.54.png

特徴

  • 1600円で電池駆動の無線温度・湿度センサーを設置できる。工作も不要
  • node-redを使うことで、プログラムも原則不要

Linkingデバイスとは

DocomoがいわゆるIoT関連で主導してるっぽい Project Linking 用のデバイスです: Linkingデバイス一覧

  • BLE(Bluetooth Low Energy)対応で、ボタン電池で動作。100日単位の電池寿命
  • 温度・湿度だけでなく、いろんなセンサーやボタンがある。しかも、ほとんどのセンサーに点灯制御できるLEDがついてる。
  • コンシューマー製品なので、基盤むき出しとかではないちゃんとした見た目
  • 低価格。たとえば、温度センサーTukeruは1600円。これは、Zigbee対応の中国製品 Xiaomi temperature and humidity sensor とほぼ同じ値段。技適マークつくだけで下手すりゃ数倍の値段になる製品とか多い中、これはすばらしい。

と、結構いい事ずくめなんですが、Docomo主導なので当然のようにiOSとAndroidのみ対応 (SDK有り)。
Raspberry PiでもAndroid thingsのせれば使えるけど、なんとかLinuxで使えないかと思って念の為検索したらありました!

  • Linkingデバイスにアクセスできるnode.js用モジュール node-linking

ドキュメントもすごく丁寧で最高です。Bluetoothまわりに詳しくなくてもこれなら使える。

これはもうRaspberry pi + node-redでやって見るしかないと、温度・湿度センサーのTukeruと、開閉センサーのOshieruを早速注文。大体3営業日ぐらいで届きました。

ちなみに、Linkingデバイスはほとんどが 株式会社Braveridge の製品のようです。検索すると、「九州・福岡から、日本のIoT業界をけん引!ブレイブリッジ 小橋氏」とかの記事があって、個人的にもちょっと応援したい感じです。

購入前の注意事項:対応デバイスは要チェック

注文後にnode-linkingのドキュメントを全部読んだら、なんと

開閉センサー情報サービス (serviceId: 6)
今のところ、Oshieru だけがこのサービスをサポートしています。しかし、ビーコンデータが暗号化されているようです。
どうやら、我々、サードパーティの開発者には、直接的にこのビーコンデータを扱うことは許されていないようです。

振動センサー情報サービス (serviceId: 8)
今のところ、Kizuku だけがこのサービスをサポートしています。しかし、ビーコンデータが暗号化されているようです。
どうやら、我々、サードパーティの開発者には、直接的にこのビーコンデータを扱うことは許されていないようです。

ということで、購入した開閉センサーOshieruは、node-linkingでは使えないことが判明。しかしこれ、node-linkingだけでなく、たぶん公開されてるスマホ用SDKでも使えませんね。もったいない...

気を取り直して、まずは温度センサーを試します。

なお、この後に対応デバイスの詳細を書いてますが、実際に動作を確認したデバイスは限られています。購入の際はお気をつけください。

node-redカスタムノード node-red-contrib-linking-device を作る

はじめてのカスタムノード作成にチャレンジし、node-red-contrib-linking-deviceを作成しました。

対応Linkingデバイス

まずはデバイスの対応状況です。

対応を確認:

  • 温度・湿度センサー: Tukeru TH
  • 温度・湿度・大気圧センサー: Sizuku THA

多分対応している (動作未確認)

  • LED: Tomoru / Tomoruフルカラー
  • LED: Sizuku LED
  • ボタン: Pochiru / Pochiru(eco)
  • 6軸センサー: Sizuku 6X (linking-scannerは非対応)
  • 照度センサー: Sizuku Lux (linking-sensorは非対応)

対応していない

  • バイブレーション: Furueru
  • 開閉センサー: Oshieru
  • 振動センサー: Kizuku
  • BLEAD-TSH-LK

node-redで使えるLinkingデバイス用ノード

Linkingデバイス用ノードは以下の3つです

  • linking-scanner

Linkingデバイスをスキャンし、ビーコンデータを出力します。Linkingデバイスが定期的に発信しているビーコンデータにはセンサーの情報が含まれているので、このノードを使うだけでセンサー情報の収集が可能です(ただし、接続が必要なデバイスもあります)。

また、接続できないぐらいデバイスが離れている場合は、このノードを使うしかないです。

  • linking-sensor

Linkingデバイスに接続して、センサー情報を取得します。比較的近くにデバスがある場合には、これを使って接続状態でセンサデータを取得すると、電池が長持ちする模様です。

  • linking-led

Linkingデバイスに接続して、LEDの点灯リクエストを出します。接続が必須のため、比較的近くにデバイスがある場合に利用できます。

node-redでのLinkingデバイス用ノードの使い方

例として、温度センサ Tukeru THを使用して温度と湿度のデータを取得し、それをnode-redのデバッグタブに表示してみます。

インストール

Raspberry Pi3でのインストールを前提として解説します。

なお、Raspberry Pi3自体の新規セットアップから行う場合はこちらをご参考: Raspberry Pi 3 (Stretch) 設定覚え書き: node-redでスマートホーム用

Bluooth関連ライブラリのインストール

ターミナルで以下を実行

sudo apt-get -y install bluetooth libbluetooth-dev libudev-dev

node-red-contrib-linking-deviceのインストール

ターミナルで以下を実行。node-redのWeb画面からインストールもできます。

cd ~/.node-red
npm install node-red-contrib-linking-device

node-redを再起動

node-red-stop && node-red-start

linking-scannerでセンサーデータを収集する

1.インストールすると、Node-REDのパレットの linking device カテゴリーにノードが追加されます。

スクリーンショット 2018-08-23 午後5.55.51.png

2.まず、linking-scannerノードをワークスペースにドラッグ&ドロップし、ダブルクリックして設定を開きます。

  • Start automatically at startup をチェック
  • Intervalを60(秒)に設定

スクリーンショット 2018-08-23 午後5.58.43.png

3.次に、debugノードをワークスペースにドラッグ&ドロップして、linking-scannerと接続します。

スクリーンショット 2018-08-23 午後5.56.54.png

4.デプロイします。デバッグタブにLinkingデバイスからのビーコンデータが表示されれば正常動作してます。

上記設定だと、だいたい1分間隔で各センサからの以下のようなデータが表示されます。

msg: {
  advertisement: object,
  payload: {
    device: "Sizuku_tha0141790",
    service: "temperature",
    value: 25.625
  },
  topic: "Sizuku_tha0141790_temperature"
}

advertisementはnode-linkingの LinkingAdvertisementオブジェクトそのままです。rssiやdistanceなどの詳細情報を取りたいときに参照します。

linking-sensorでセンサーデータを収集する

このノードを使う場合、安定して接続できるぐらいデバイスが近くにある必要があります。取れる情報は原則linking-scannerとほぼ同じですが、電池の持ちが良くなるのが利点です。

1.まず、linking-sensorノードをワークスペースにドラッグ&ドロップし、ダブルクリックして設定を開きます。

  • デバイスを選択
  • しばらく時間がかかりますが、センサーの対応状況が読み込まれ、battery以外はデフォルトでチェックされます
  • Start automatically at startup をチェック
  • Intervalを60(秒)に設定

スクリーンショット 2018-08-23 午後5.59.56.png

2.次に、debugノードをワークスペースにドラッグ&ドロップして、linking-scannerと接続します。

スクリーンショット 2018-08-23 午後5.59.32.png

3.デプロイします。デバッグタブにLinkingデバイスからのセンサーデータが表示されれば正常動作してます。

上記設定だと、だいたい1分間隔で各センサからの以下のようなデータが表示されます。advertisementがない意外は、linking-scannerと同じ内容です。

msg: {
  payload: {
    device: "Sizuku_tha0141790",
    service: "temperature",
    value: 25.625
  },
  topic: "Sizuku_tha0141790_temperature"
}

なお、linking-sensorでデータ収集を行う場合でも、接続がうまくいかない場合を考慮して、linking-scannerをバックアップとして併用するのをおすすめします。デバイスが接続中の場合はlinking-sensorが、接続できない場合はlinking-scannerがデータを収集します。

linking-ledでLEDを点灯する

このノードを使う場合、安定して接続できるぐらいデバイスが近くにある必要があります。

1.まず、linking-ledノードをワークスペースにドラッグ&ドロップし、ダブルクリックして設定を開きます。

  • デバイスを選択
  • しばらく時間がかかりますが、対応しているLEDの色・点灯パターンが読み込まれ、リストに表示されます。表示されない場合はリフレッシュボタンを押してください。
  • ここでTestボタンを押してLEDを点灯させてみることもできます。

スクリーンショット 2018-08-23 午後6.01.13.png

2.Injectノードをワークスペースにドラッグ&ドロップし、trueを出力するように設定して、linking-ledとつなげます。

スクリーンショット 2018-08-23 午後6.00.45.png

3.Injectノードの左側をクリックすると、LEDが点灯します。

注意点:デバイスが接続されていない状態だと、点灯リクエストを出して実際にLEDが点灯するまで10〜20秒程度かかります。すぐに点灯させたい場合は、"Keep connection"オプションをチェックしておく必要があります。ただし、接続中はlinking-scannerでのセンサーデータの収集はできません。代わりにlinking-sensorを使う必要があります。

Beebotteで温度や湿度をグラフ表示

node-red-dashboard でセンサーデータを表示するのもありですが、ここではMQTTブローカーのBeebotteにデータを送ってクラウドで管理する方法を試してみました。このやり方だと、複数台のRaspberry Piで収集したデータを一括管理できるので、スケールしやすいというメリットがあります。

これについては、後日投稿予定です。

使ってみての感想・Tips

linking-scannerでスキャン結果を受け取れる範囲は最大で5m程度

距離が離れると、scannerでbeaconを取得する頻度ががっくり下がります。間にさえぎるものが何も無くてもだいたい5m以上になるときつくなってくるので、それ以上はなれた場所を計測する際は複数のRaspberry Pi3が必要になりそうです。その場合も考慮して、Beebotteなどを使ってクラウドでデータを集中管理するのがよさそうです。

linking-scannerの編集ダイアログで、各デバイスの信号強度(RSSI)を表示しているので参考にしてください。自分の環境だと-80dBm台だと接続も安定。-95dBm以下はスキャンも含めてかなり厳しくなってくる感じです。

linking-sensor, linking-ledで接続できる距離は、Raspberry Pi3の場合数mまでが無難

距離が離れるととたんに接続が不安定になります。その場合はlinking-sensorは諦めてlinking-scannerでのセンサー値の読み込みに徹したほうがいいですね。

Raspberry Pi3本体の向きも気をつけたほうがいい

5m程度のシビアな距離になると、Raspberry Piの向きも影響するようです。アンテナは基板上面についるので、そちらがデバイスに向くようにしたほうがいいです。

また、Tukeruなどはボタン電池と金属クリップが本体下面にあるので、こちら側への電波の飛びは多分悪くなると思います。デバイスの向きも要注意です。

linking-sensor, linking-ledでの接続には時間がかかる

距離が近い場合でも接続時は10〜20秒程度時間がかかります。

バッテリー残量通知は動いてるのかどうか不明

node-linkingのドキュメントに以下のように書いてあります:

今のところ、このリクエストに対して通知を返してくれるのは Sizuku 6X だけのようです。しかし、chargeRequired は常に true、chargeLevel は常に 0 になります。このサービスがうまく機能しているか良く分かりません。

確かにバッテリー残量通知はビーコンデータにも入ってないようで、果たして動作してるのかどうかよくわかりません(バッテリーが減ってきたら通知されるのかも)。linking-sensorを使う場合は、batteryのチェックは除外しておくのがおすすめです(そのほうが接続が早くすみます)。

温度センサーは、Tukeru THとShizuku THAのどっちがいいか

Shizukuは大気圧センサーもついているかわりに、値段は700円高い2300円。両方使ってみての感想です。

  • Sizukuの大気圧センサーは正確ではない?

自分が購入したものは一日中値が1000のままで機能してるように見えません。そもそも気圧は部屋ごとに変わるものでもないので、気圧が知りたければ適当なWebサービスで値を取れば十分な気がしてきました。

  • もしかするとSizukuのほうが電波が遠くまで届くかも

はっきり確かめたわけではないですが、自分の利用状況だと一番離れた部屋からはTukeruの電波が届きませんでした。ためしにSizukuに置き換えてみると大丈夫でした。

  • Tukeruは設置向きで湿度の値が変わる

Tukeru × 3個、Sizuku × 1個を同じ場所において、値がどの程度そろうかを見てみました。

下のグラフで、オレンジの線がShizukuで、それ以外がTukeru。12時数分すぎに同じ位置においてます。

スクリーンショット 2018-08-18 午後1.03.15.png

温度は4つともなかなかにそろった値をだしてるので問題ないのですが、湿度が若干ばらついてます。なお、使用してるセンサSHT20のスペックを見たら±3%。
最初、Tukeruが3つともSizukuより5%ほど高い湿度の値となってますが、ふと思いついて、Tukeruを穴が開いてる正面を上向きにして置いたら、グラフ右側のように1つを除いて湿度の値が近づきました。どうやらTukeruは上向きに置いたほうがいいようです。筐体の密閉性が高すぎて湿気がこもってる感じです。