この記事では、Raspberry内のNode-REDでEnOcean製の電池レススイッチ(例:EWSDB E8221-A280)を活用してみました。そこで、スイッチから発信されるBLEアドバタイズ信号の構造と、それをNode-REDで受信・処理する方法について学んだことを書いていこうと思います。導入については参考の記事があるので記事の最後に載せておきます。
Node-REDでのフロー構成と基本的なプログラム
まず、以下のようなNode-REDのフローを作成しました。

- 左端のBLEスキャンノードでEnOceanスイッチの信号を受信します。(写真ではlink inノードを使用)
- その出力を
switchノード
に接続し、特定のスイッチIDに該当する場合だけ処理を続けるようにしています。 - さらに別の
switchノード
で「スイッチが押されたか(値が5)・離されたか(値が4)」を判定しています。
このように、スイッチが「誰から来た信号か」と「どういう状態か」の2つの条件を通った場合にのみ次のノードへ進みます。
EnOceanスイッチとは?
EnOceanスイッチは、電池を使わずボタンの物理動作から発電し、その電力でBluetooth Low Energy(BLE)アドバタイズ信号を発信する省電力な無線スイッチです。ボタンを押すたびに一時的に信号が発信されるため、これをRaspberry PiやNode-REDで受信・判定することで、さまざまな制御が可能になります。
BLEアドバタイズ信号のデータ構造
Node-RED上でBLEスキャンノード(例:node-red-contrib-noble
)を使用し、EnOceanスイッチを押すと以下のようなデータを受信します。

スイッチIDをフィルタする理由と設定
Node-REDでは、各ノード間を流れるメッセージが msg
オブジェクトとして扱われ、その中の payload
が主要なデータ本体になります。BLEスキャンノードが出力する msg.payload
内にある id
は、スイッチを識別するための一意のIDです。
なぜ msg.payload.id
を使うのか?
複数のスイッチがある環境では、どのスイッチからの信号かを判断する必要があります。そのため、switchノード
で msg.payload.id
を条件に設定し、特定のIDに一致する信号だけ処理するようにします。。
Node-REDでのフロー構成
① スイッチ識別のための設定
以下のように switchノード
で msg.payload.id
が目的のスイッチIDと一致する場合に処理を通すように設定します。
② 押下/開放状態の判定
スイッチが押されたのか、離されたのかの判定は msg.payload.other[6]
の数値によって行います:
5
→ 押下(ボタンが押された)4
→ 開放(ボタンが離された)
この条件も switchノード
で指定できます。
実践フロー例
以下は、実際にNode-RED上で構築したEnOceanスイッチ判定フローの例です。
- 左からBLEスキャンノード → ID判定(switch) → 状態判定(switch) → debugノードへ
- 各ステップごとに
debug
ノードで出力を確認しながら処理ができる構成です
まとめ
EnOceanスイッチは、BLEアドバタイズ信号の id
と other[6]
を解析することで、スイッチごとの識別と押下/開放の状態判断が可能です。Node-REDを使うことで、視覚的にわかりやすくこれらの処理を組み立てることができ、デバイス連携や通知処理などへの応用が広がります。
この仕組みを活かして家電制御、通知システム、カウントロジックなど、さらに実用的な仕組みへと発展させることができます。
参考
RaspberryPiへ導入については以下のリンクを参考にしてみてください。