LoginSignup
4
6

More than 5 years have passed since last update.

Raspberry Pi3で集めた無線温度センサーのデータを、MQTT brokerのBeebotteに送信して表示する

Last updated at Posted at 2018-08-28

はじめに

オススメ!1600円の無線(BLE)温度センサーをRaspberry Pi3 + node-redで活用する という投稿で書きましたが、自宅の各部屋に無線の温度・湿度センサーを設置し、Raspberry Pi3で値を取得しています。
取得したデータの処理・表示ですが、IoTがはやりなのでBeebotteというMQTTブローカーを使ってみました。

BeebotteのDashboardでこんな感じで温度・湿度のグラフ表示が可能です。

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

正直、Beebotteのグラフ表示は見た目が今一つなのですが、無料アカウントでも一日5000件という比較的多めのデータを扱え、履歴が3ヶ月分保存できるのが魅力で選びました。

Beebotte側の初期設定

チャンネルlinkingの作成

  • https://beebotte.com でアカウント作成
  • Beebotteにログイン後、左側のメニューでChannelsを選ぶ
  • 右上のCreate Newを選ぶ
    • Channel Namelinkingを設定。Channel Descriptionは適当に入力
    • Resource Nameには{デバイス名}_{センサー名}を登録。データの種類は temperaturehumidityなどを設定。
    • たとえばTukeru THの場合、Tukeru_th012345_temperatureTukeru_th012345_humidityの2つのリソースを登録することになります。
  • Create channelを押して終了

スクリーンショット 2018-08-25 午前11.27.44.png

Channel Tokenの確認

  • Beebotteの左側のメニューで、Channelsを選ぶ
  • linkingを選択
  • 画面の上のほうにChannel Token:token_xxxxxxxと表示されるので、赤色で表示されている"Token_xxxxxx"の部分をメモ。これは後でnode-redの設定に必要です。

Node-RED側の設定

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

以下を参考にインストールします:
オススメ!1600円の無線(BLE)温度センサーをRaspberry Pi3 + node-redで活用する

linking-scannerノードを設置

ダブルクリックして設定ダイアログを開き、以下の設定を行います
- 起動時に自動で開始するをチェック
- 出力間隔30 * Beebotteのリソース数 かそれ以上の値にします。Tukeru THを1つ使う場合は60秒、2つなら120秒が目安となります。後で書きますがBeebotte側のデータ書き込み総数制限を超えないようにするためです。

Changeノートで、msgの内容をMQTT書き込み用に加工

そのままMQTT outノードにセンサーデータを送ると、データは揮発性のPublish扱いとなり、履歴がBeebotteサーバーに記録されません。履歴を記録するには、msg.payload.write = true を追加する必要があります。
また、payloadにはdata, write以外の情報は不要なので削除します。

Changeノードを設置して、以下の設定を行います。

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

MQTT outノードを設置

まず最初の画面を設定。QoSは0か1にします(画面は1ですが、0で十分です)。BeebotteはQoS 2に対応していないので、2を設定するとデプロイ時にMQTTノードが正常終了しない現象が出ます。
最期に、サーバーの右端にある鉛筆アイコンをクリックします。

スクリーンショット 2018-08-25 午前11.11.16.png

接続タブを以下のように設定

スクリーンショット 2018-08-25 午前11.07.23.png

セキュリティタブでは、ユーザー名としてBeebotteのChannel Tokenを設定します。

スクリーンショット 2018-08-25 午前11.07.39.png

各ノードを接続

以下のようにノードを接続します。最初は動作確認のために、debugノードも入れておくのをおすすめします。

スクリーンショット 2018-08-25 午前11.21.33.png

デプロイ後、Beebotteにデータが来ていることを確認

  • まずNode-REDのフローでlinking-scannerのステータスがscanning. found: 1などとなっていればデバイスをスキャンできています。
  • Beebotteの左側のメニューで、Channelsを選ぶ
  • linkingを選択
  • 各リソースの値の内容と、それがいつ設定されたかが以下のように表示されます。データが来ていなければ、これまでの設定内容を再度確認。

スクリーンショット 2018-08-25 午前11.22.48.png

Beebotteのグラフ表示の設定

Beebotte側でグラフを表示してくれるDashboardの設定を行います。

  • Beebotteにログイン後、左側のメニューでDashboardsを選ぶ
  • 右上のCreate Dashboardを選ぶ
  • New Dashboardと表示されている文字を、適当なタイトルに置き換え。Descriptionも適当に入力
  • 後はAdd Widgetで好きな表示パーツを追加していきます。Gauge Meterでメータ表示。複数のセンサーの温度などを一緒に表示する場合はMulti Line Chartがお勧めです
  • 設定後、右上のSave Changesを忘れずに押します。これを忘れると、せっかくの設定が消えてしまいます。

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

データ書き込みの頻度に注意

Beebotteの無料アカウントだと、データ書き込みは一日5000件までの制限があります。

自分の場合、センサーが温度・湿度 ☓ 4個 + 気圧 ☓ 1個 なので計9種類のデータ。したがって、各データあたり3分おきぐらいの書き込み頻度が限界となります。linking-scanner や linking-sensor の出力間隔設定をその値にしておきます(ちなみに設定は秒単位です)。

BeebotteのAccount Usage画面で、データ書き込み状況が以下のように表示されるので、赤い制限ラインを超えない利用状況なのを確認します。ちなみに見てわかるように、出力間隔の設定を忘れてて一回盛大に超過してしまいました。

スクリーンショット 2018-08-25 午前11.57.58.png

しばらくグラフを眺めて思ったこと

家の各部屋の温度・湿度を取り始めて思ったのが、冷房をつけるとしばらくして湿度がどんどん上がっていく点。今ひとつ快適さが足りないのはこのせいかと、エアコンを除湿モードで動かしてみましたが、ほとんど変化なし。

調べてみると、安いエアコンの除湿モードは飾りのようなもので、中高級機種でないと期待するような除湿はできないらしい。今度エアコン買い換えるときは、日立の「カラッと除湿」対応機種にしようと決意しました。

体感温度・不快指数の表示

温度だけでは快適さの指標にならないことがわかったので、体感温度・不快指数を表示してみることにしました。

計算はCASIOのサイトを参考:

作成したfunctionノードをエクスポートしたものがこちら。linking-scannerと上記Changeノードの間にはさみます。

[{"id":"6810a45f.b628ec","type":"function","z":"2b09d8bf.0e4648","name":" Sensible temperature and THI","func":"const device = msg.payload.device;\n\nif (msg.payload.service === 'humidity') {\n    context.set(device + '_humidity', msg.payload.data);\n} else if (msg.payload.service === 'temperature') {\n    const humidity = context.get(device + '_humidity');\n    if (humidity != null) {\n        // context.set(device + '_humidity', null);\n\n        const temperature = msg.payload.data;\n        \n        const thi = 0.81 * temperature + 0.01 * humidity * (0.99 * temperature - 14.3) + 46.3;\n\n        node.send({\n            topic: 'linking/' + device + '_thi',\n            payload : {\n                data: thi\n            }\n        });\n\n        // Missenard\n        const sensitivetemp = temperature - 1 / 2.3 * (temperature - 10) * (0.8 - humidity / 100);\n\n        node.send({\n            topic: 'linking/' + device + '_sensitivetemp',\n            payload: {\n                data: sensitivetemp\n            }\n        });\n    }\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":630,"y":260,"wires":[["89df693f.9a7a38"]]}]

Beebotteでの表示はこんな感じです。見たところ不快指数が快適さの目安としてわかりやすい値に思えました。扇風機も併用すれば、不快指数「やや暑い」の限界に近い80弱でもなんとか。エアコンだけだと不快指数75以上はきついです。

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

ただ、ここまで項目数が多くなると、Beebotteの書き込み上限を考慮して10分おきの更新となります。これはちょっと間隔長すぎるので、Beebotte以外でいいのがないか検討中です。

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6