残念ながら、ここで使用しているLinkingデバイスは販売終了し、2023年8月でサイトもクローズされる模様。
はじめに
Raspberry Piで温度センサーを使う際の選択肢はいっぱいあります。USBモジュールを使うもよし、Raspberry PiらしくGPIOにセンサーモジュールを接続するもよし。
でも、できれば無線の温度センサーをあちこちにおいて各部屋の温度を計りたい。と思ってたら、Qiitaのトレンドに出てた しいたけを自動栽培してみた結果(前編) という投稿で、スマホ用に売られている Linkingデバイス というのを知りました。これをRaspberry Pi3 + 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 だけがこのサービスをサポートしています。しかし、ビーコンデータが暗号化されているようです。
どうやら、我々、サードパーティの開発者には、直接的にこのビーコンデータを扱うことは許されていないようです。
と書いてあり、購入した開閉センサーOshieruは、node-linkingでは使えないことが判明。しかしこれ、node-linkingだけでなく、たぶん公開されてるスマホ用SDKでも使えませんね。もったいない...
気を取り直して、まずは温度センサーを試します。
なお、この後に対応デバイスの詳細を書いてますが、実際に動作を確認したデバイスは限られています。購入の際はお気をつけください。
node-redカスタムノード node-red-contrib-linking-device を作る
はじめてのカスタムノード作成にチャレンジし、node-red-contrib-linking-deviceを作成しました。
対応Linkingデバイス
まずはデバイスの対応状況です。
対応を確認:
- 温度・湿度センサー: Tukeru TH
- 温度・湿度・大気圧センサー: Sizuku THA
- 照度センサー: Sizuku Lux (linking-sensorは非対応)
- ボタン: Pochiru(eco)
多分対応している (動作未確認)
- LED: Tomoru / Tomoruフルカラー
- LED: Sizuku LED
- ボタン: Pochiru
- 6軸センサー: Sizuku 6X (linking-scannerは非対応)
対応していない
- バイブレーション: 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 カテゴリーにノードが追加されます。
2.まず、linking-scannerノードをワークスペースにドラッグ&ドロップし、ダブルクリックして設定を開きます。
-
Start automatically at startup
をチェック - Intervalを60(秒)に設定
3.次に、debugノードをワークスペースにドラッグ&ドロップして、linking-scannerと接続します。
4.デプロイします。デバッグタブにLinkingデバイスからのビーコンデータが表示されれば正常動作してます。
上記設定だと、だいたい1分間隔で各センサからの以下のようなデータが表示されます。
msg: {
advertisement: object,
payload: {
device: "Sizuku_tha0141790",
service: "temperature",
data: 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(秒)に設定
2.次に、debugノードをワークスペースにドラッグ&ドロップして、linking-scannerと接続します。
3.デプロイします。デバッグタブにLinkingデバイスからのセンサーデータが表示されれば正常動作してます。
上記設定だと、だいたい1分間隔で各センサからの以下のようなデータが表示されます。advertisementがない意外は、linking-scannerと同じ内容です。
msg: {
payload: {
device: "Sizuku_tha0141790",
service: "temperature",
data: 25.625
},
topic: "Sizuku_tha0141790_temperature"
}
なお、linking-sensorでデータ収集を行う場合でも、接続がうまくいかない場合を考慮して、linking-scannerをバックアップとして併用するのをおすすめします。デバイスが接続中の場合はlinking-sensorが、接続できない場合はlinking-scannerがデータを収集します。
linking-ledでLEDを点灯する
このノードを使う場合、安定して接続できるぐらいデバイスが近くにある必要があります。
1.まず、linking-ledノードをワークスペースにドラッグ&ドロップし、ダブルクリックして設定を開きます。
- デバイスを選択
- しばらく時間がかかりますが、対応しているLEDの色・点灯パターンが読み込まれ、リストに表示されます。表示されない場合はリフレッシュボタンを押してください。
- ここでTestボタンを押してLEDを点灯させてみることもできます。
2.Injectノードをワークスペースにドラッグ&ドロップし、trueを出力するように設定して、linking-ledとつなげます。
3.Injectノードの左側をクリックすると、LEDが点灯します。
注意点:デバイスが接続されていない状態だと、点灯リクエストを出して実際にLEDが点灯するまで10〜20秒程度かかります。すぐに点灯させたい場合は、"Keep connection"オプションをチェックしておく必要があります。ただし、接続中はlinking-scannerでのセンサーデータの収集はできません。代わりにlinking-sensorを使う必要があります。
Beebotteで温度や湿度をグラフ表示
node-red-dashboard でセンサーデータを表示するのもありですが、ここではMQTTブローカーのBeebotteにデータを送ってクラウドで管理する方法を試してみました。このやり方だと、複数台のRaspberry Piで収集したデータを一括管理できるので、スケールしやすいというメリットがあります。
詳細は別記事にて:Raspberry Pi3で集めた無線温度センサーのデータを、MQTT brokerのBeebotteに送信して表示する
使ってみての感想・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のままで機能してるように見えません。また値はlinking-scanner経由でしか取れず、linking-sensoで接続して取得することがなぜか出来ません。そもそも気圧は部屋ごとに変わるものでもないので、気圧が知りたければ適当なWebサービスで値を取れば十分な気がしてきました。
- もしかするとSizukuのほうが電波が遠くまで届くかも
はっきり確かめたわけではないですが、自分の利用状況だと一番離れた部屋からはTukeruの電波が届きませんでした。ためしにSizukuに置き換えてみると大丈夫でした。
- Tukeruは設置向きで湿度の値が変わる
Tukeru × 3個、Sizuku × 1個を同じ場所において、値がどの程度そろうかを見てみました。
下のグラフで、オレンジの線がShizukuで、それ以外がTukeru。12時数分すぎに同じ位置においてます。
温度は4つともなかなかにそろった値をだしてるので問題ないのですが、湿度が若干ばらついてます。なお、使用してるセンサSHT20のスペックを見たら±3%。
最初、Tukeruが3つともSizukuより5%ほど高い湿度の値となってますが、ふと思いついて、Tukeruを穴が開いてる正面を上向きにして置いたら、グラフ右側のように1つを除いて湿度の値が近づきました。どうやらTukeruは上向きに置いたほうがいいようです。筐体の密閉性が高すぎて湿気がこもってる感じです。