ブログ

Armadillo-IoTでEnOcean通信のセンサーからデータを取得し、Herokuに送信してWebブラウザで確認

at_kazutaka.bito
2015年7月9日 11時26分

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が受け取った文字列が返信されて、標準出力に見える。