Armadillo-IoT+Armadillo-IoT EnOceanアドオンモジュール EN00で、 EnOcean通信のセンサーからデータを取得して、Herokuに通知する仕組みを作ってみた。
Armadillo-IoT+EnOceanアドオンモジュール
ここでは、アイテック株式会社のEnOcean通信のセンサーのアーミンシリーズの
左から あけしめセンサー 温湿度センサー 人感センサー(壁付けタイプ) ロッカースイッチ シングル で動作確認を行った。
1.EnOcean通信センサーのデータを取得するアプリの作成
ソースコード、Makefileを含めたserial_enocean_fixid.tar.gzを添付する。 serial_enocean_fixid.tar.gzをATDE5に展開して、makeを実行。 実行ファイルは、serial_enocean_fixidという名前で生成される。
ソースコード"serial_enocean_fixid.c"の簡単な説明) Armadillo-IoT ゲートウェイスタンダードモデル製品マニュアル6.12. Armadillo-IoT EnOceanアドオンモジュール EN00より、 EnOceanアドオンモジュールで受信したデータはシリアル通信で取得できる。
そこで、Armadillo実践開発ガイド 第2部6.5.1. シリアルエコーサーバーのserial_echo_server1.cに下記のような変更を施して作成した。
/**** sample:Device ID:begin ****/
/**** sample:Device ID:end ****/
で囲んだ範囲では、今回使用したセンサーのデバイスIDを指定。
/**** sample:variable:begin ****/
/**** sample:variable:end ****/
で囲んだ範囲では、変数の定義。
/**** sample:initial value:begin ****/
/**** sample:initial value:end ****/
で囲んだ範囲では、変数の初期化。
/**** sample:receive:begin ****/
/**** sample:receive:end ****/
で囲んだ範囲では、ヘッダの検出と、デバイスIDの判定、センサーデータの取得。
注)
実際の用途では、ヘッダサーチ、CRCチェック等が必要であるが、
今回のサンプルでは使用するセンサーのヘッダのパターンを決め打ちで判定してデータを取得している。
なお、ヘッダおよびデータのフォーマット(デバイスID、温湿度、あけしめ状態等)は、 アイテック株式会社様より提供いただいた仕様書を参考にした。
2.EnOcean通信で取得したセンサーのデータを取得してみる
Armadillo-IoTにEnOceanアドオンモジュールOP-AGA-EN00-00を接続して起動する。
上記手順1で作成した実行ファイル"serial_enocean_fixid"をArmadillo-IoTに置いて、実行権限を付けておく。 以下の説明においては、/rootディレクトリに"serial_enocean_fixid"を置いたものとする。
[armadillo ~]# ls serial_enocean_fixid [armadillo ~]# chmod +x serial_enocean_fixid
serial_enocean_fixidの実行に当たり、ttyデバイスファイル名を指定する。 ttyデバイスファイル名は、EnOceanアドオンモジュールを接続したコネクタに依存する。 EnOceanアドオンモジュールをArmadillo-IoTのCON1に接続した場合、下記のようにコマンドを実行。
[armadillo ~]# ./serial_enocean_fixed /dev/ttymxc3
EnOceanアドオンモジュールをArmadillo-IoTのCON2に接続した場合、下記のようにコマンドを実行。
[armadillo ~]# ./serial_enocean_fixed /dev/ttymxc0
上記コマンド実行後、EnOcean通信で取得したデータについて、
今回使用のセンサーがとりうるヘッダの頭の3Byteのパターン
0x55,0x00,0x07
0x55,0x00,0x09
0x55,0x00,0x0a
0x55,0x00,0x0c
のいずれかと、データ領域にあるデバイスID
ロッカースイッチ:0x00,0x2d,0xcc,0x89
あけしめセンサー:0x04,0x00,0x50,0x6c
温湿度センサー:0x04,0x00,0x0c,0x78
人感センサー:0x04,0x00,0x18,0x39
の組み合わせを検出した場合に、/rootディレクトリの"log_***.txt"というファイルにセンサーから取得したデータが出力される。
"log_***.txt"内の***の箇所とファイルの内容は、下記のようにセンサーの種類による。
あけしめセンサー:log_open.txt
デバイスID、センサーの種類、開いた回数、現在の状態(開/閉)
例)
ID:0400506c: MagnetSW: open:1, status:close
温湿度センサー:log_th.txt
デバイスID、センサーの種類、温度、湿度
例)
ID:04000c78: TEMP-HUM: 23.87[degree], 57.65[percent]
人感センサー:log_jin.txt
デバイスID、センサーの種類、人感検出の回数、現在の状態(人感あり/人感なし)
例)
ID:04001839: JINKAN: detect:1, status:detect
ロッカースイッチ:log_lock.txt
デバイスID、センサーの種類、スイッチを押した回数、もう片方のスイッチを押した回数
例)
ID:002bcc89: LockerSW: Switch84:2, Switch88:4
3.EnOcean通信で取得したセンサーのデータをHerokuに送って、Webブラウザで見る
各センサーのデータを出力したファイル"/root/log_***.txt"の内容をHerokuに送信という仕組みを追加する。
各センサーは
あけしめセンサー:状態変化時
温湿度センサー:20秒間隔
人感センサー:状態変化時
ロッカースイッチ:スイッチを押されたとき
にデータを送信するが、Herokuへの送信は3秒間隔で"/root/log_***.txt"の内容を順番に送信することにする。
また、Herokuへの送信中はArmadillo-IoTの側面の緑LED(led3)を点灯するようにもする。
まず、 Armadillo-IoTからHerokuに送信した文字をWebブラウザで見るを一通り実行して Armadillo-IoTからHerokuに送信した文字がWebブラウザで見えることを確認する。 (下記文中の"***.herokuapp.com"は自分で作成したHerokuのURLに読み替える。)
Armadillo-IoTに下記スクリプトを作成する。(ここでは、send_enocean_fixidというファイル名とする)
send_enocean_fixid
#!/bin/sh stty -F /dev/ttymxc0 57600 -icanon min 1 echo "lock sensor is not exist" > /root/log_lock.txt echo "open-close sensor is not exist" > /root/log_open.txt echo "temperature-humidity sensor is not exist" > /root/log_th.txt echo "jinkan sensor is not exist" > /root/log_jin.txt VAR1=0 /root/serial_enocean_fixid /dev/ttymxc0 & while : do VAR1=`cat /root/log_lock.txt` echo echo 1 > /sys/class/leds/led3/brightness wget -O- -q --post-data="data=$VAR1" https://***.herokuapp.com/series echo 0 > /sys/class/leds/led3/brightness sleep 3 VAR1=`cat /root/log_open.txt` echo echo 1 > /sys/class/leds/led3/brightness wget -O- -q --post-data="data=$VAR1" https://***.herokuapp.com/series echo 0 > /sys/class/leds/led3/brightness sleep 3 VAR1=`cat /root/log_th.txt` echo echo 1 > /sys/class/leds/led3/brightness wget -O- -q --post-data="data=$VAR1" https://***.herokuapp.com/series echo 0 > /sys/class/leds/led3/brightness sleep 3 VAR1=`cat /root/log_jin.txt` echo echo 1 > /sys/class/leds/led3/brightness wget -O- -q --post-data="data=$VAR1" https://***.herokuapp.com/series echo 0 > /sys/class/leds/led3/brightness sleep 3 done
補足)
上記スクリプトにおいて
stty -F /dev/ttymxc0 57600 -icanon min 1
と
/root/serial_enocean_fixid /dev/ttymxc0 &
の箇所は、
- Armadillo-IoTのCON2にEnoceanアドオンモジュールを接続
- "serial_enocean_fixid"を/rootディレクトリに置いた
場合を想定している。
Armadillo-IoTのCON1にEnoceanアドオンモジュールを接続した場合は、/dev/ttymxc0を/dev/ttymxc3に変更する。 "serial_enocean_fixid"を/root以外に置いた場合は、/root/serial_enocean_fixidの箇所を変更する。
上記スクリプト(send_enocean_fixid)に実行権限を付けて実行する。
[armadillo ~]# chmod +x send_enocean_fixid [armadillo ~]# ./send_enocean_fixid
Webブラウザで、https://***.herokuapp.comにアクセスすると、Armadillo-IoTが送信したEnOcean通信のセンサーのデータが表示される。 注意)Webブラウザの表示の更新には再読み込みが必要。 各センサーのデータが順番にHerokuに送信しているため、Webブラウザで見えるセンサーのデータは読み込みのタイミングによる。
補足)
Armadillo-IoTからHerokuに送信した文字をWebブラウザで見るのHerokuで動作しているアプリ(app.js)により、
Armadillo-IoTにはHerokuが受け取った文字列が返信されて、標準出力に見える。