mory

Node-REDでEnOceanのスイッチデータを受信する(2日目)

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

引用元:EnOcean GmbH

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」を使用している。

引用元:Easyfit

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

しかし、これではデータの内容が分からないため、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” の時は磁石をと遠ざけたときに表示される。