スイッチボットの温湿度計より温湿度を取得し、Node-Redで表示するものを作成しました。
使用する物
- raspberrypi
- スイッチボットの温湿度計
- Node-red
Node-red
まず初めにraspberrypiでNode-Redを起動し、「BLE BeaconScannerノード」をインストールします。BeaconScannerを使用するには以下をあらかじめにインストールしておく必要があります。
sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev
sudo setcap cap_net_raw+eip $(eval readlink -f `which node`)
次にbeaconScannerノードをフローに配置します。debugノードを繋げるとBLEから送られてくる信号をいくつも見ることが出来ます。

そうしたらswitchノードにて温湿度計の信号のみに限定します。msg.payload.addressで今回使う温湿度計のIDを入力しました。このノードの後ろにdebugノードをつけることで温湿度計の信号を見ることが出来ます。

送られてきた信号からobjectを開いてみるとこのようになっていました。0~12のどこかに温度と湿度を表している箇所があります。
先ほど取得したデータと温度と湿度が変わったタイミングのデータを比べて変わった箇所を調べます。
どうやら[11]が温度、[12]が湿度を表しているようです。[10]はおそらくバッテリー残量だと思います。
スイッチボットは±温度を1バイト(0〜255)で表すために、基準点を128にしているようです。そのため実際の温度データ[11] -128で温度を出すことが出来ます。
そこでファンクションノードを追加し以下を入力します。
const buf = msg.payload.other;
if (!buf || buf.length < 13) {
node.warn("buffer間違っている");
return null;
}
// Bufferから温湿度読み取り(bufはNode.jsのBuffer型)
const temperature = buf[11] - 128;
const humidity = buf[12];
msg.payload = {
temperature: temperature,
humidity: humidity
};
return msg;
これで温度と湿度を取得できました。

ダッシュボードで表示
最後にダッシュボードにて先ほど取得した温度と湿度の表示を行います。ファンクションノードの後ろにダッシュボードのui_textノードを2つ配置します。片方が温度表示、もう片方が湿度表示です。

温度のValue formatは {{msg.payload.temperature}} ℃
湿度は {{msg.payload.humidity}} %

このようにダッシュボードで表示することが出来ました。

ダッシュボードの見た目を変えてみる
数字だけではかなり簡素なのでメーターで表示してみたいと思います。先ほどは「ui_text」ノードを使用していましたが、「ui_gaugeノード」を使用します。

Value formatは先ほどとほとんど変わらず、℃や%を外した
{{msg.payload.temperature}}
{{msg.payload.humidity}} です。
温度計であるためマイナスも対応できるようにminを-20 maxを50に設定します。色は暑いときはオレンジ寒いときは青になるようにします。

湿度はmin0 max100で色は湿度が上がるにつれて青色になるようにします。

実際のメーターはこのようになりました。
まとめ
今回はスイッチボットの温湿度計より温湿度を取得し、Node-Red、ダッシュボードで表示するものを作成しました。受け取ったデータから温度湿度を表している部分を見つけ出すところに少々時間がかかりましたが、うまく表示させることが出来ました。