ブログ

Armadillo-IoT:EnOcean通信のCTセンサー(Pressac製)を使ってみる

at_kazutaka.bito
2015年11月15日 9時58分

(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
 と読み替える必要がある。

2相式CTセンサー(EnOcean通信)

3相式CTセンサー(EnOcean通信)

注)上記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倍)