(2016.2.9:ESPとEEPの資料名が逆に表記されていたのを修正) Armadillo-IoT+EnOceanアドオンモジュールで、 下記のEnOcean通信のCTセンサー(Pressac製)を使って、電流、電力データを受信してみた。
EnOcean通信のCTセンサーからのデータの確認方法、サンプルプログラムを下記に示す。 (サンプルプログラムで取得した電流、電力データを、簡易的にHerokuに送信してWebブラウザで確認する方法も示す。)
2相式CTセンサー(EnOcean通信)
製品紹介のページ
ユーザーガイド
3相式CTセンサー(EnOcean通信)
製品紹介のページ
ユーザーガイド
1.CTセンサーの用法の確認
上記URLの情報より、動作確認に必要な個所を抜粋する。
・2相式、3相式とのことから、3相3線式の計測用?
・通信にはクランプに一定の電流が必要
2相式:2つのクランプの合計が0.3A以上
3相式:3つのクランプの合計が2A以上
・測定範囲
2相式:0.3A~63A
3相式:2A~200A
・通信間隔は30秒
・通信データからは下記のように電流が読み取れる。AC100V換算。
2相式:2つのクランプから計算した電力(W)
3相式:3つのクランプそれぞれの電流(A)
・データは、EEP(EnOcean Equipment Profiles)の形式で、
2相式:A5-12-01
3相式:D2-32-02
になっている。
・通信開始には、Learn Buttonを押す。このときLEDが一瞬点灯する。
2.機材の準備
・Armadillo-IoT+EnOceanアドオンモジュール
今回は、Armadillo-IoTのアドオンインタフェースのコネクタ"CON1"にEnOceanアドオンモジュールを接続した。
下記説明内のEnOcean通信時のデバイスファイル"/dev/ttymxc3"の箇所は、アドオンモジュールを接続するコネクタ
CON1、CON2に応じて、
CON1使用時:/dev/ttymxc3
CON2使用時:/dev/ttymxc0
と読み替える必要がある。
注)上記1で確認したとおり、CTセンサーの通信のために、
2相式:2つのクランプの合計が0.3A以上
3相式:3つのクランプの合計が2A以上
を満たすことができる配線に取り付けること。
3.とりあえずCTセンサーのデータを読んでみる
3.1.CTセンサーのLearnButtonを押して、EnOcean通信を開始する。
筐体の穴の奥にボタンがあるので、導電性のない細い棒で押す。
穴の近くのLEDが一瞬点灯すれば、通信開始成功。
点灯しない場合は、通信開始していない、
2相式:2つのクランプの合計が0.3A以上
3相式:3つのクランプの合計が2A以上
を満たしていないと考えられる。
3.2.Armadillo-IoTを起動して、ログインする。
3.3.EnOceanで受信したデータを読む。
Armadillo-IoT ゲートウェイスタンダードモデル製品マニュアル 6.12.1. EnOcean無線データを受信する
を参考に
[root@armadillo-iotg (ttymxc1) ~]# stty -F /dev/ttymxc3 57600 raw [root@armadillo-iotg (ttymxc1) ~]# hexdump -Cv /dev/ttymxc3
と実行すると、下記のようなログ(3相式の場合)が得られる。 (CTセンサーの通信間隔(30秒)ごとに1~2行追加される。)
00000000 55 00 0c 02 0a e6 24 04 01 51 19 40 04 b0 4c 04 |U.....$..Q.@..L.| 00000010 b0 05 01 29 ca 55 00 0c 02 0a e6 24 04 01 51 19 |...).U.....$..Q.| 00000020 40 04 c0 4c 04 b0 37 01 29 ca 55 00 0c 02 0a e6 |@..L..7.).U.....| 00000030 24 04 01 51 19 40 04 c0 4c 04 a0 47 01 29 ca 55 |$..Q.@..L..G.).U| 00000040 00 0c 02 0a e6 24 04 01 51 19 40 04 c0 4c 04 a0 |.....$..Q.@..L..| 00000050 47 01 29 ca 55 00 0c 02 0a e6 24 04 01 51 19 40 |G.).U.....$..Q.@| 00000060 04 c0 4c 04 b0 37 01 29 ca 55 00 0c 02 0a e6 24 |..L..7.).U.....$| 00000070 04 01 51 19 40 00 60 06 00 60 2c 01 29 ca 55 00 |..Q.@.`..`,.).U.|
4.EnOcean通信で取得したデータを確認
下記のEnOcean規格を参考にデータを解析する。
・ESP(EnOcean Serial Profiles)
EnOceanSerialProtocol3.pdf
・ERP2(EnOcean Radio Profiles 2)
EnOceanRadioProtocol2.pdf
・EEP(EnOcean Equipment Profiles)
EnOcean_Equipment_Profiles_EEP_V2.6.3_public.pdf
4.1.ESP(EnOcean Serial Profiles)
EnOceanSerialProtocol3.pdf
1.6.1 Packet description
を参考に上記3.3.のダンプデータの頭の0x55はSyncByteと考えられる。(CRCで確認をとる)
つまり、
00000000 55 00 0c 02 0a e6 24 04 01 51 19 40 04 b0 4c 04 |U.....$..Q.@..L.| 00000010 b0 05 01 29 ca
は、下記のような意味になる。
Dataの部分は、Packet Typeで定義される。今回のデータでは、 Packet Type: 0x0a なので、 EnOceanSerialProtocol3.pdf 1.14 Packet Type 10: RADIO_ERP2 より、Dataの部分は、ERP2の最初のByte(Length)を省いたデータだとわかる。
4.2.ERP2(EnOcean Radio Profiles 2)
上記4.1のData部分
0x24 04 01 51 19 40 04 b0 4c 04 b0 05
の長さは6Byteを超えているので、データの構造は、
EnOceanRadioProtocol2.pdf
4.5 Data contents for Length > 6 Bytes
のようになっている。
Header(先頭の1Byte:今回の場合は0x24)を解析すると、
Address Control: 010 -> Originator-ID 32 bit; no Destination-ID
Extended header available: 0 -> No extended header
Telegram type: 0100 -> Valiable length data telegram(0xD2)
であることから、今回のデータは、下記のような構造であることがわかる。
4.3.EEP(EnOcean Equipment Profiles)
上記4.2のData部分
40 04 b0 4c 04 b0
を
EnOcean_Equipment_Profiles_EEP_V2.6.3_public.pdf
を参考に解析する。
上記1で確認したとおり、
・データは、EEP(EnOcean Equipment Profiles)の形式で、
3相式:D2-32-02
であることから、
EnOcean_Equipment_Profiles_EEP_V2.6.3_public.pdf
の
D2-32: A.C. Current Clamp
PORG: D2 : VLD Telegram
FUNC: 32 : A.C. Current Clamp
TYPE: 02 : Type 0x02
を参考に解析すると、今回のデータは下記を意味する。
Power Fail: 0 -> False
Divisor: 1 -> x/10
CH1: 0x04b -> 75 -> 7.5[A] (Divisorの値より、アンペアにする際には、1/10倍)
CH2: 0x04c -> 76 -> 7.6[A] (Divisorの値より、アンペアにする際には、1/10倍)
CH3: 0x04b -> 75 -> 7.5[A] (Divisorの値より、アンペアにする際には、1/10倍)
5.EnOceanで受信したCTセンサーのデータをファイルに出力するサンプルプログラム
Armadillo-IoTでEnOceanで受信したCTセンサーのデータを解析し、ログファイルに出力するサンプルプログラム serial_enocean_ct_20151115.tar.gz を添付する。
<サンプルプログラムの補足>
・Armadillo-IoTとEnOceanアドオンとはシリアル通信であることから、
Armadillo実践開発ガイド第2部6.5.1. シリアルエコーサーバー
をベースに、シリアル通信で受信したデータを、今回のCTセンサー用にEnOceanのプロトコル(注)で解釈するように改造した。
注)任意のEnOcean通信には対応していない。ヘッダサーチ、CRC計算などは有していない。
上記4の3相式CTセンサーのデータ解析結果および、末尾に記載の2相式CTセンサーのデータ解析結果より、
Originator-IDを固定にして、受信したデータの配列内で、ヘッダ、Originator-IDがマッチする場合に
CTセンサーのデータとして解析している。
<サンプルプログラムの用法>
添付のサンプルプログラムをATDE上に解凍して、serial_enocean_ct_20151115ディレクトリ内でmakeすると、
serial_enocean_ctという実行ファイルができる。
この実行ファイルをArmadillo-IoTに置いて、シリアル通信のデバイスファイルを引数として実行する。 (下記はEnOceanアドオンをArmadillo-IoTのアドオンインタフェースのCON1に接続した場合のため、/dev/ttymxc3を指定。)
[root@armadillo-iotg (ttymxc1) ~]# stty -F /dev/ttymxc3 57600 -icanon min 1 [root@armadillo-iotg (ttymxc1) ~]# /root/serial_enocean_ct /dev/ttymxc3
上記コマンドを実行後、CTセンサーからデータを受信すると、 3相式CTセンサーのデータは、"/root/log_ct3p.txt"ファイルに
ID:04015119: CT(3 phase): PF(0), DIV(x1/10), 7.7[A], 7.7[A], 7.5[A]
2相式CTセンサーのデータは、"/root/log_ct2p.txt"ファイルに
ID:04009f4e: CT(2 phase): Tariff(0), LRN(1), TYPE(1), DIV(x1/10), 90.0[W]
のようにログが出力される。
6.EnOcean通信で取得したセンサーのデータをHerokuに送って、Webブラウザで見る
上記5のサンプルプログラムを使って、 2相式/3相式CTセンサーのデータを出力したファイル"/root/log_ct3p.txt"、"/root/log_ct2p.txt"の内容を Herokuに送信という仕組みを追加してみた。 Herokuへの送信は3秒間隔で"/root/log_ct3p.txt"、"/root/log_ct2p.txt"の内容を交互に送信することにする。 また、Herokuへの送信中はArmadillo-IoTの側面の緑LED(led3)を点灯するようにもする。
まず、 Armadillo-IoTからHerokuに送信した文字をWebブラウザで見るを一通り実行して Armadillo-IoTからHerokuに送信した文字がWebブラウザで見えることを確認する。 (下記文中の"***.herokuapp.com"は自分で作成したHerokuのURLに読み替える。)
Armadillo-IoTに下記スクリプトを作成する。(ここでは、send_enocean_ctというファイル名とする)
send_enocean_ct
#!/bin/sh stty -F /dev/ttymxc3 57600 -icanon min 1 echo "ct sensor(3 phase) is not exist" > /root/log_ct3p.txt echo "ct sensor(2 phase) is not exist" > /root/log_ct2p.txt VAR1=0 /root/serial_enocean_ct /dev/ttymxc3 & while : do VAR1=`cat /root/log_ct3p.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_ct2p.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/ttymxc3 57600 -icanon min 1
と
/root/serial_enocean_ct /dev/ttymxc3 &
の箇所は、 ・Armadillo-IoTのCON1にEnoceanアドオンモジュールを接続 ・"serial_enocean_ct"を/rootディレクトリに置いた 場合を想定している。
Armadillo-IoTのCON2にEnoceanアドオンモジュールを接続した場合は、/dev/ttymxc3を/dev/ttymxc0に変更する。 "serial_enocean_ct"を/root以外に置いた場合は、/root/serial_enocean_ctの箇所を変更する。
上記スクリプト(send_enocean_ct)に実行権限を付けて実行する。
[root@armadillo-iotg (ttymxc1) ~]# chmod +x send_enocean_ct [root@armadillo-iotg (ttymxc1) ~]# ./send_enocean_ct
Webブラウザで、https://***.herokuapp.comにアクセスすると、Armadillo-IoTが送信したEnOcean通信のセンサーの
データが表示される。
注意)Webブラウザの表示の更新には再読み込みが必要。
2相式/3相式センサーのデータが交互にHerokuに送信しているため、Webブラウザで見えるセンサーのデータは
読み込みのタイミングによる。
補足)Armadillo-IoTからHerokuに送信した文字をWebブラウザで見るのHerokuで動作しているアプリ(app.js)により、
Armadillo-IoTにはHerokuが受け取った文字列が返信されて、標準出力に見える。
参考)
今回使用した2相式CTセンサーのデータの解析結果を以下に示す。
2相式CTセンサーのEnOcean通信で受信したデータ
55 00 0c 02 0a 9b 22 04 00 94 4e 00 39 d0 0d 89 01 37 90
上記のデータをEnOcean規格に基づいて解釈すると下記のようになる。
・ESP(EnOcean Serial Profiles)
・ERP2(EnOcean Radio Profiles 2)
Header(先頭の1Byte:今回の場合は0x22)を解析すると、
Address Control: 010 -> Originator-ID 32 bit; no Destination-ID
Extended header available: 0 -> No extended header
Telegram type: 0010 -> 4BS teregram(0xA5)
・EEP(EnOcean Equipment Profiles)
上記1で確認した通り
データは、EEP(EnOcean Equipment Profiles)の形式で、
2相式:A5-12-01
となっていることから、
A5-12: Automated Meter Reading
PORG: A5 : 4BS Telegram
FUNC: 12 : Automated Meter Reading
TYPE: 01 : Electricity
を参考に解析すると、今回のデータは下記を意味する。
Tariff info: 0
LRN Bit: 1 -> Data telegram
Data type: 1 -> Current value (W)
Divisor for value: 1 -> x/10
Meter reading: 0x0039d0 -> 14800 -> 1480[W] (Divisorの値より、ワットにする際には、1/10倍)