電源不要で動くEnOceanスイッチをRaspberry PiのEnOcean USBゲートウェイ経由でNode-REDをつなげるメモ
電源不要で動くEnOceanスイッチをRaspberry PiのEnOcean USBゲートウェイ経由でNode-REDをつなげるメモです。
経緯
Digital-light.jp 中畑さんお声がけで、以前より使いたかった電池不要でつながるEnOceanスイッチをしっかりさわる機会ができました。スイッチサイエンスから購入できます。→X3200HB-W-R-928(ロッカースイッチ・ダブル)
EnOceanとはこんな技術。→EnOceanとは | 基礎知識 | ROHM TECH WEB
とっても低電力で動作し発電技術も併せもったもので、さきほどのEnOceanスイッチなどは「押すときのエネルギーで無線でスイッチデータを送る」という電源不要でどうさする魔法のようなことが出来ます。
そして、そのデータはスイッチサイエンスから購入できるEnOcean USBゲートウェイ経由で取得可能でNode-REDをつなげてみます。

Raspberry Pi セットアップ
ますはRaspberry Pi セットアップです。EnOcean USBゲートウェイをつなぎます。

あまり情報がうまく検索できず困ったのですが、ERMINE Corporation さんのRaspberry PiをEnOceanゲートウェイにする記事で進めることが出来ました。
こちらの記事をもとにつなげました。

2016年の記事ですが、そのときよりもRaspberry Piの中身自体はより進んでいるので、2017/7現在の最新のRaspberry PiですとUSBポートにEnOcean USBゲートウェイを挿すだけで問題なく使えました。
細かい挙動としては、記事を見るかぎり、USBポートにEnOcean USBゲートウェイを挿した瞬間にインターネットにつながっているとドライバがダウンロードされ無事に機能するようです。(インターネットにつながっていない場合に、どうなるかはちょっとわからないので、機会があればテストしてみます。)
Node-REDのフローを組む

このようなフローを作ります。serialport受信ノード→functionノード→debugノードの流れです。
serialport受信ノードがEnOcean USBゲートウェイの情報を読み取り、functionノードでArrayBufferをArrayに変換したものを、debugノードで表示します。
serialport受信ノード

Raspberry PiをEnOceanゲートウェイにする記事を見てみると、シンプルにUSBポートからシリアル通信で読み取れるのでserialport受信ノードを
EnOcean規格・プロトコルの解説ページ | ERMINE Corporationとともに、

文中にある「ESP:EnOcean SerialProtocol:最新版はESP3」のPDFリンクからより詳細の情報が載っています。いろいろ難儀しましたが、PDFでのtimeoutの情報を組み合わせて、結論としては「57600バンドで8,N, 100ms timeoutで読むとのこと」と解釈し、以下のように設定しました。

- SerialPort
- /dev/ttyUSB0 (右の虫眼鏡ボタンで追加されたそれっぽいUSBポートを探す)
- Settings
- Baud Rate
- 57600
- Data Bits
- 8
- Parity
- None
- Stop Bits
- 1
- Baud Rate
- Input
- Split Input
- after a timeout of
- 100ms
- and deliver
- binary buffers
- Split Input
特に、timeoutの時間設定は悩みましたが、PDFにも書かれていましたし、100msでうまくいくので、いったんこれで。

functionノード

つづいて、functionノードです。

ArrayBufferだと今後の扱いが難しくなりそうなので、Javascript typed arraysの「通常の配列に転換する」を参考にArrayに変換しておきます。
こちらも「String と ArrayBuffer の相互変換 」「Array と ArrayBuffer の相互変換 」「Node.jsのバッファで文字列化」などいろいろ調べましたが、自分に最適なのはこれなのでいったんこれで。
ソースはこんな感じです。
var buf = msg.payload;
msg.payload = Array.prototype.slice.call(buf);
return msg;
実際に動かしてみる

このフローをデプロイするとconnectedになるのでうまく接続されたようです。

準備します。EnOceanドアセンサーは電池不要でつながるので遠くに持っていきましょう。

同じ部屋ですが離れたところに置きます(本棚遮蔽物あり、3mほど離れている)。

押します!カコっとしたクリック感!

うまく設定されていればdebugノードに配列値が飛んできます。今回は押して離したのでON・OFFの1つずつの情報が来ています。

最近のNode-REDではデバック時に見やすくツリーにしてくれるので良いですね。ほどいていきます。
この間、色々解析したのは割愛してざっくりいうと、配列11~12個めあたりがボタンをおすことで変化しています。

配列の0~9個めくらいは固定値で、おそらく機器情報やステータスが入っていると思われます。後半の値 14~15個目は、どうも置く場所によって変化したように見えますが、そのあたりはまたいずれ解析してみます。
また、押しっぱなしにしててもデータがとれ、2ボタンをいっぺんに押してもデータが来ました。手厚い。
ということで無事つながりました!
Node-REDフロー
Node-REDフローデータも置いておきます。
[
{
"id": "4804b596.d1bf6c",
"type": "serial in",
"z": "38f9aa23.c3e836",
"name": "",
"serial": "c5d2351b.ae8378",
"x": 145,
"y": 558,
"wires": [
[
"7256959d.a6edfc"
]
]
},
{
"id": "99286599.1e3758",
"type": "debug",
"z": "38f9aa23.c3e836",
"name": "",
"active": true,
"console": "false",
"complete": "false",
"x": 666,
"y": 653,
"wires": []
},
{
"id": "7256959d.a6edfc",
"type": "function",
"z": "38f9aa23.c3e836",
"name": "ArrayBufferをArrayに変換",
"func": "var buf = msg.payload;\nmsg.payload = Array.prototype.slice.call(buf);\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 395,
"y": 604,
"wires": [
[
"99286599.1e3758"
]
]
},
{
"id": "c5d2351b.ae8378",
"type": "serial-port",
"z": "",
"serialport": "/dev/ttyUSB0",
"serialbaud": "57600",
"databits": "8",
"parity": "none",
"stopbits": "1",
"newline": "100",
"bin": "bin",
"out": "time",
"addchar": false
}
]
まとめ
念願だったEnOcean機器を使える機会が来て良かったです。中畑さんありがとうございました。
EnOceanはこのように低電力で今回のスイッチのようにうまく行けば電源不要でIoTのきっかけを作ることが可能で、IoTへのアプローチにさらなる一手が加えられますね。
それではよく EnOcean & Node-RED & IoT Lifeを!