はじめに
今回は、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本 にして
それぞれ
- 温度ゲージ
- 湿度ゲージ
- 照度ゲージ
- エネルギーゲージ
- ドアコンタクト(テキスト)
に接続しました。
ダッシュボード

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