BBGWでnode.jsのEnOceanモジュールを使ってゲートウェイを動作させてみたら極めて高品質で使いやすかったのでメモ。Raspberry Piでも同様に動作した。
EnOceanとは
バッテリーなしで動作するセンサ機器と受信機、データフォーマットの総称。現時点で実用的と言える数少ないIoTデバイスの一つ。
EnOceanの利点
電池交換の必要がない。
太陽電池で動作するもの、スイッチの押す力で発電して動作するものが代表的である。プロトタイピングやPOCの段階ではデバイスの電池交換は問題にならないが、実用フェーズに入ると電池交換は人的・物的コストを生み続ける悪魔になる。電池交換作業でデバイスを破壊するような事故も頻発する。
送受信の信頼性が高い。
送受信の信頼性を高めるために、一度にパケットを3つ送信するようになっている。電波状況は色々と変化するが、経験上、受信機との距離が10メートル以内ならデータの取りこぼしはほぼ無い。928MHz帯の電磁波を利用するため、障害物を回りこんで届く。
データフォーマットがよく整理されている。
様々なセンサ機器のデータフォーマットが規定されており、更に機器の登録などのコマンド体系も整備されている。
EnOceanの欠点
デバイスが高価。
電池交換の人的・物的コストがゼロなので、デバイス自体の高価さは長期運用を考えるとあまり問題にはならないが、単純に他のデバイスと較べてしまうと高価。
あまり流通していない。
10 高いからあまり売れない。
20 あまり売れないから高い。
30 GOTO 10
まともなゲートウェイソフトウェアがない(ように見える)。
EnOcean Linkという名のEnOcean公式のゲートウェイソフトウェアライブラリがあるが、C++で書かれているのでコンパイルして動作させるまでが大変面倒である。最近ではrubyやpythonで簡易的なテレグラムパーサを自作してセンサデータを抽出するような使い方が増えてきたようだが、EnOceanの良く整備された機能群を利用できていない。
今回、node.jsで書かれた大変優れたフル機能のゲートウェイソフトウェアライブラリがBBGWやR-Pi上で動作することが検証できたので、まともなゲートウェイソフトウェアが無い問題は私の勝手な幻想だったと言って良い。
日本国内では1ホップまでのリピータしか使えない。
これはあまり問題にならない。2ホップ以上必要ならゲートウェイを増やすべき。
今回使ったハードウェア
Beaglebone Green Wireless
SeeedStudio BeagleBone Green Wireless
他にも、node.jsが動作する機器なら多分なんでもOK。
USB400J
EnOeanのUSBドングル型受信機。これは割りと安い。
ところで某Wi-S○Nの受信機ってなんであんなに高いの?買って試す気が起こらないので誰かくれ。
STM431J
温度センサ。これも割りと安いが、ケースがない。ケースだけを某所で買うと4000円くらいする。うーん・・・。タカチのケースを加工した方が良いだろう。個人利用なら紙や布でケースを作ってしまうのが手軽で良い。
ESM210R
プッシュスイッチ。物理世界からの様々なイベント入力に使える。
EnOcean ロッカースイッチ・シングル ESM210R - スイッチサイエンス
売り切れですかそうですか。
node.jsのEnOceanモジュール
今回の主役。node.jsのEnOceanモジュールは幾つかあるが、BBGWやR-Piでも動作したフル機能のモジュールは
だった。作者は日本の方のようだ。素晴らしいモジュールをありがとうございます。
最初に見つかるnode-enoceanというモジュールはコンパイルに失敗して動作しなかった。
導入準備
今回使うモジュールはnode.jsの4.4以上でのみ動作するので、それより古い環境ではnode.js自体の更新が必要である。今回用いたBBGWでは、OSイメージとして
https://debian.beagleboard.org/images/bone-debian-8.6-seeed-iot-armhf-2016-11-06-4gb.img.xz
を使ったが、これのnode.jsが白亜紀の0.12系だったので更新が必要であった。
sudo apt-get purge bb-node-red-installer nodejs
sudo apt-get update
sudo apt-get install -y curl locales ntpdate avahi-utils python build-essential
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
sudo apt-get install -y nodejs
hash -r
これでBBGW上でnode.jsの6系が使えるようになった。
$ node -v
v6.10.1
$ npm -v
3.8.2
bonescriptもここで再インストールすればちゃんと動く。
導入
動作検証用に適当にディレクトリを掘ってモジュールをローカルインストールする。
mkdir enocean_exp
cd enocean_exp
npm install node-enocean-utils
基本的な動作テスト
まずは、全てのテレグラムを出力する単純なコードを書いてみる。'data'イベントを捕まえて、テレグラムのmessage部分をコンソールに出力する。
2017/07/30追記:data-unknownイベントよりも、dataイベントの方が捕まえられるイベントの範囲が広いのでdataイベントを捕まえるように変更した。
simple1.js
var enocean = require('node-enocean-utils');
// Start to monitor telegrams incoming from the Enocean devices
enocean.startMonitor({'path': '/dev/ttyUSB0', 'rate': 57600});// Set an event listener for 'data' events
enocean.on('data', (telegram) => {
var message = telegram['message'];
console.log(message);
});
これを動作させて
node simple1.js
ロッカースイッチを押して離すと
{ packet_type: 10,
packet_type_desc: 'RADIO_ERP2 (ERP2 protocol radio telegram)',
device:
{ id: '0000002C8674',
eep: '',
name: '',
manufacturer: '',
learned: false },
oid: '00 2C 86 74',
crc: true,
eep: '',
known: false,
rorg: '',
rorg_desc: '',
func: '',
func_desc: '',
type: '',
type_desc: '',
data_dl_buffer: <Buffer 84>,
dbm: -50,
dbm_desc: '-50 dBm' }
{ packet_type: 10,
packet_type_desc: 'RADIO_ERP2 (ERP2 protocol radio telegram)',
device:
{ id: '0000002C8674',
eep: '',
name: '',
manufacturer: '',
learned: false },
oid: '00 2C 86 74',
crc: true,
eep: '',
known: false,
rorg: '',
rorg_desc: '',
func: '',
func_desc: '',
type: '',
type_desc: '',
data_dl_buffer: <Buffer 00>,
dbm: -52,
dbm_desc: '-52 dBm' }
パケット2つぶんが基本的なデコードを経て出力された。eepの指定を行っていないので、ON/OFFのデータはdata_dl_buffer部分に数値として現れている。
今回のロッカースイッチは2ボタンのタイプで、EEPとしてF6-02-04を指定するとテレグラムの完全な解釈ができる。このEEPタイプはnode.jsモジュール内で定義されているのでそのまま利用できる。
デバイスIDが 00 2C 86 74 のロッカースイッチを、EEP: F6-02-04としてteach(登録)して、data-knownイベントで解釈済みのデータを出力する機能を追加すると以下のようになる。
simple2.js
var enocean = require('node-enocean-utils');
//// Teach the information of Enocean devices
enocean.teach({
'id' : '00 00 00 2C 86 74',
'eep' : 'F6-02-04',
'name': 'Rocker Switch, 2 Rocker'
});
// Start to monitor telegrams incoming from the Enocean devices
enocean.startMonitor({'path': '/dev/ttyUSB0', 'rate': 57600});// Set an event listener for 'data-known' events
enocean.on('data-known', (telegram) => {
var message = telegram['message'];
console.log(message['device']['id'] + ': ' + message['device']['name'] + ': ' + message['desc']);
});
これを動作させて、ロッカースイッチを左右(上下?)押して離すと以下のように完全に意味までデコードされた情報が出力される。
$ node simple2.js
0000002C8674: Rocker Switch, 2 Rocker: B0 pressed
0000002C8674: Rocker Switch, 2 Rocker: released
0000002C8674: Rocker Switch, 2 Rocker: BI pressed
0000002C8674: Rocker Switch, 2 Rocker: released
ボタン0が押されて離され、ボタンIが押されて離されたことが記録された。releaseはどちらのボタンからのものかは区別できないようだ。DolphinViewで見てもそうなので、デバイスから出る信号そのものが同じと考えられる。
温度センサも全く同様に、teachでEEPを登録してデータを解釈できた。
ここまで理解できれば、モジュールのドキュメントを読み進める知識が整ったので
を参照して機能の全貌を理解できる。
M2Xへのアップロードも普通にできたが省略。
次は
これをNode-Redから使えるようにして管理や運用を容易にして実用性を高める。teach-inテレグラムの扱いとteachメソッドの呼び出しといったデバイスの登録処理、クラウドへのデータ送信などはNode-Redのノードとして構成すれば、コツメカワウソちゃんでも扱えるようになるはずである。
まとめ
これでシングルボードコンピュータ上でEnOceanのフル機能のまともなゲートウェイをやっと作れる見通しが立った。