Intern

Raspberry Pi + Node-RED + STM550B で温湿度センサー可視化!MQTTダッシュボード構築

はじめに

今回は、EnOcean STM550BのデータをRaspberry Piで受信して、Node-RED + MQTTを使ってPCに送り、さらにPCでダッシュボード表示する構成を紹介します。


システム構成

  • STM550B … 温度・湿度・照度・加速度・マグネット接点などを測れるEnOceanセンサー
  • Raspberry Pi 4 + Node-RED … BLEでSTM550Bのデータを受け取りMQTTで配信
  • PC + Node-RED … 受け取ったデータをダッシュボードで可視化
  • Mosquitto … MQTTブローカー

Raspberry Pi 側のNode-REDフロー

STM550Bのビーコンを受信した後、swhichノードでデバイスのIDを絞り出します。

上の写真のようにデータを取得することが出来ます。

Functionノードで受信したバッファを以下のようにパースして、
可読化+MQTTに送る形に変換します。

javascriptコードをコピーする<code>var Packet = msg.payload.other
var Temp = (Packet[8] * 256 + Packet[7]) / 100
var Humid = Packet[10] / 2
var Lux = Packet[13] * 256 + Packet[12]
var Energy = Packet[22] / 2
var contact = Packet[20]
if (contact == 2) { contact = "Close" } else { contact = "Open" }

var data = {
    "Temp": Temp + '°C',
    "Humid": Humid + '%',
    "Lux": Lux + 'lux',
    "Contact": contact,
    "Energy": Energy + '%'
}
msg.payload = data
return msg
</code>Code language: JavaScript (javascript)

このあと mqtt out ノードで指定のIPアドレスを設定し送ります。

🟦 PC 側のNode-REDフロー

MQTT In ノードでoutノードで送ったデータの送り先のIPアドレスを入れます

MQTTでパース済みのデータをそのまま受け取ります

このデータをダッシュボードに表示するために分解し、それぞれのゲージに流すfunctionを作成。

<code>let data = msg.payload;

let temperature = parseFloat(data.Temp);
let humidity    = parseFloat(data.Humid);
let lux         = parseInt(data.Lux);
let energy      = parseInt(data.Energy);
let contact     = data.Contact;

return [
    { payload: temperature },
    { payload: humidity },
    { payload: lux },
    { payload: energy },
    { payload: contact }
];
</code>Code language: JavaScript (javascript)

このfunctionの出力を 5本 にして
それぞれ

  1. 温度ゲージ
  2. 湿度ゲージ
  3. 照度ゲージ
  4. エネルギーゲージ
  5. ドアコンタクト(テキスト)

に接続しました。

ダッシュボード

まとめ

今回MQTTについて勉強するために今回の物を作成しました。

BLEセンサのように頻繁にデータが飛んでくるIoT環境にとても向いていることやMQTTはJSONでもテキストでも送れるが、受け取る側の構造を揃えないと正しく表示できない。またパブリッシャー、サブスクライバーの役割の違い・概念について学ぶことが出来ました。