EnOcean(エンオーシャン)とは

EnOceanはワイヤレス通信技術の一種で、エネルギーハーベスティングを利用して動作する無線センサーネットワークシステムである。電池不要で省エネルギーなデバイスを使用し、スイッチ、センサー、アクチュエーターなどの情報を送受信ることができる。省配線化や環境に優しいソリューションとして使用され、スマートホームやビルディングオートメーションなどの分野で数多く利用されている。
エナジーハーベスティング(energy harvesting)とは、太陽光や照明光、機械の発する振動、熱などのエネルギー(エナジー)を採取(ハーベスティング)し、電力を得る技術を意味します。特に身の回りにあるわずかなエネルギー(エナジー)を電力に変換し活用することを目的とした技術です。
エナジーハーベスティングとは? | 環境発電の意味
準備
今回、EnOceanレシーバーはUSBドングルタイプを利用した。
⇩
EnOcean USBゲートウェイ USB400J
PCやミニサーバでEnOceanプロトコルを発する無線スイッチや無線センサーの情報をキャッチするのに便利なUSBドングルタイプのデバイスです。 商品開発・マーケティングに携わる方がEnOcean無線スイッチ・無線センサーの動作を可視化したい場合にお手軽に便利なツールです。
スイッチサイエンス
初めに、コンピュータにUSBドングルを挿入する。

次に、Node-REDでUSBドングルを使用する際はシリアルポートを必要とするため、
「node-red-node-serialport」をインストールする。
⇩詳しいインストール方法については下記の記事で紹介してます。

インストールに成功すると、ネットワークのノード欄にserial系のノードが出現する。

スイッチデータを受信する
「serial in」ノードをドラッグ&ドロップし、フローに追加する。
なお、フローに追加されるさいは「serial in」から「serial」と表示が変わるが問題ない。

次にフローに設置したserialノードをダブルクリックしてノードの編集を行う。
初めてポートを使用する際は赤丸部分のペンマークをクリックし、プロパティの設定を行う。

赤丸部分の「虫眼鏡マーク」をクリックし、通信を行うUSBドングルが挿入されたシリアルポートを選択する。

この時、「COM~」または/dev/cu.usbserial~~が出てくるが、後者であればusbserialの方を選択、前者であれば挿入しているポート番号を選択する。ポート番号が分からない場合はデバイスマネージャーからポートを確認してみると良い。
また、シリアルポート以外のプロパティの設定は画像の様に設定している。
ここまで出来たら一度デプロイしてみて、無事にserialport設定ができていればserialノードの下に「接続済み」と表示される。
EnOceanでスイッチデータを受信する
ノードの設定まで完了したら、debugノードをserialノードに繋げる。
デプロイをクリックし、完了したらデータの受信待ち状態に入る。
今回はEnOcean対応のスイッチ、「Easyfit Single」を使用している。

スイッチを押して話すと、画面右側に数字の配列のようなものが出現する。

しかし、これではデータの内容が分からないため、functionノードを加えて受信したデータを(※1)デコードする。
(※1)エンコードされた情報を元の形式に戻す処理。データが圧縮や暗号化されたり、別の形式に変換されたりすると、それを元の形式に戻すために必要となる。

EnOcean telegram decoderを作成し、受信データをデコードするコードを書き込む。
このコードはアーミン株式会社の服部さんが公開しているものを使用した。
参照:Node-REDでEnOceanの電文をデコードするノードを試作しました
//EnOcean telegram decoder
//2017.10.8 created
//
var date = new Date();
//
var ESP3_Packet = msg.payload;
//
var Header = ESP3_Packet.slice(1, 5);
var DataLength = 256 * ESP3_Packet
+ ESP3_Packet
;
//
var RawData = ESP3_Packet.slice(6, 6 + DataLength);
var ERP2_Header = RawData.slice(0, 1).toString("hex");
var EEP = "RPS";
var OriginatorID = "00000000";
var Data1 = "00";
var Data4 = "00000000";
//
var OptionalData = ESP3_Packet.slice(6 + DataLength, 8 + DataLength);
var SubTelNum = OptionalData.slice(0, 1);
var dBm = OptionalData.slice(1, 2);
//
switch (ERP2_Header) {
//normal telegram
case "20"://RPS telegram
EEP = "RPS";
OriginatorID = RawData.slice(1, 5).toString("hex");
Data1 = RawData.slice(5, 6).toString("hex");
break;
case "21"://1BS normal telegram
EEP = "1BS";
OriginatorID = RawData.slice(1, 5).toString("hex");
Data1 = RawData.slice(5, 6).toString("hex");
break;
case "22"://4BS normal telegram
EEP = "4BS";
OriginatorID = RawData.slice(1, 5).toString("hex");
Data4 = RawData.slice(5, 9).toString("hex");
break;
//teach-in telegram
case "61"://1BS teach-in telegram
EEP = "1BS teach-in";
OriginatorID = RawData.slice(3, 7).toString("hex");
Data1 = RawData.slice(7, 8).toString("hex");
break;
case "62"://4BS teach-in telegram
EEP = "4BS teach-in";
OriginatorID = RawData.slice(3, 7).toString("hex");
Data4 = RawData.slice(7, 11).toString("hex");
break;
default:
break;
}
msg.payload = {
Time: date.toString(),
OriginatorID: OriginatorID,
EEP: EEP,
Data1: Data1,
Data4: Data4,
SubTelNum: SubTelNum,
dBm: dBm
};
return msg;
デプロイをし、再びスイッチデータの受信を行うと、整理されたデータがjson形式で表示されている。

OriginatorIDでスイッチを判別しており、Data1でスイッチの状態(押下/解放)を表している。
Data1: “84” の時はスイッチ押下、Data1: “00” の時はスイッチ解放と表示された。
EnOcean対応リードセンサ、集電センサのデータを取得する


Easyfit Singleのデータ受信と同じく、リードセンサでは磁石を近づけると、集電センサでは人を検知するとデータが送信される。

先ほどのOriginatorIDとは別で、”05002334″と識別されているため、別のスイッチデータとして正しく区別されている。
また、Data1: “09” の時は磁石を近づけたとき、Data1: “08” の時は磁石をと遠ざけたときに表示される。