はじめに
ECHONET Liteは通信のプロトコルであり、機器から取得や操作する事ができるプロパティが決まられている。
しかし、エアコンや空気清浄機のように同一名の機器でも、メーカや機種によって取得できる機器情報や操作の種類が異なる。
そこで、機器から取得できる機器情報や操作方法を調べる方法としてプロパティマップがある。
今回はプロパティマップの解析方法の話
※ ECHONET Lite (ISO/IEC 14543-4-3)国際規格
環境
-対象機器
SHARP : 空気清浄機
TOSHIBA : エアコン
os : windows7
Ruby 2.2.4
プロパティマップの種類
プロパティマップには、「Setプロパティマップ」、「Getプロパティマップ」がある。
Setプロパティマップ
Appendix のアクセルルールで「Set」に該当する部分を取得できる
例) 以下の図はAppendixに記載されているエアコンに関するプロパティである。
オレンジ色で囲まれている範囲は Setプロパティマップで取得できる種類である。
Getプロパティマップ
Appendix のアクセルルールで「Set」に該当する部分を取得できる
例) 上記と同じく図はAppendixに記載されているエアコンに関するプロパティである。
オレンジ色で囲まれている範囲は Getプロパティマップで取得できる種類である。
※アクセルルールの欄にSetのみが記載されているものは取得できない
プロパティマップの取得方法
対象機器にSetマッププロパティ もしくは Getマッププロパティの要求をする電文を送信する
今回は空気清浄機とエアコンを例にとって電文構成を示す
※ なおECHONET Liteの送受信の方法は以下のURLを参照
RubyでECHONET Lite家電を制御する
PythonでECHONET Lite家電を操作
あなたのお家をスマートハウスにしてみませんか? #SSNG編#
※ 電文構成に関しては
ECHONET Liteの電文 作成方法
ECHONET Lite規格書
Setマッププロパティ 電文構成
空気清浄機
1081 0000 05FF 0101 3501 6201 9E00
エアコン
1081 0000 05FF 0101 3001 6201 9E00
Getマッププロパティの電文構成
空気清浄機
1081 0000 05FF 0101 3501 6201 9F00
エアコン
1081 0000 05FF 0101 3001 6201 9F00
解析方法
● プロパティの数が16より少ない場合には、2バイト目以降はそのままEPCとする
● プロパティの数が16以上の場合は以下の手順を行う
1. 2バイト目以降を2進数に変換する
2. Appendixを参照しプロパティマップ対応表をみながら、対応するプロパティを探す
例1 プロパティ数が 16より少ない場合
以下のようなマッププロパティに関するEDTを受け取った場合
04 80 81 A0 F3
1バイト目は プロパティの数を示すので
04 はプロパティが4個であることを表す
プロパティ数が 16個未満なので 2バイト目以降をそそままEPCとする
EPC ⇒ 「0x80 0x81 0xA0 0xF3」
例2 プロパティ数が16より多い場合
以下のようなゲットマッププロパティに関するEDTを受け取った場合23 1F 01 03 0C 0A 00 13 11 01 09 0B 39 01 82 8B 02
1バイト目の23
はプロパティ数を示すので、10進数に直すと25になる。
よってプロパティが全部で25個あることがわかる。
2バイト目
2バイト目の1F
は2進数に変換すると0001 1111
となるので以下のプロパティが該当する
0xC0 0xB0 0xA0 0x90 0x80
3バイト目
3バイト目の01
は2進数に変換すると0000 0001
となるので以下のプロパティが該当する
0x81
4バイト以降も同様の手順でプロパティマップの解析が出来る。以下が解析結果である
0x87,0x88,0xB9,0x89,0xBA,0x9A,0x8A,0xDB,0xCB,0xBB,0x8B,0x8C,0xFD,0x9D,0xFE,0xBE,0x9E,0x8E,0x9F```
## 解析 サンプルコード ( Ruby )
プロパティ数が16個以上になる場合は解析が面倒になるので
以下のサンプルコードを作成した。
1行目の```edt = " "```のところに、解析したいEDTをいれて実行
コマンドプロンプト上に解析されたプロパティが表示されます
edt = "111F01020C0A0003110000001000008000"
pp = ["0xF","0xE","0xD","0xC","0xB","0xA","0x9","0x8"]
px = ["","0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"]
property_name=""
文字列を二文字ずつ割っていく
n_msg = edt.scan(/.{1,#{2}}/)
if n_msg[0].hex >= 16
for count in 1..n_msg.length-1 do
# 16進数を10進に変換
dd = n_msg[count]
ff = dd.hex
# 二進するに変換
binary_number = ff.to_s(2)
# 文字数を表示
bit_count = 8-binary_number.size
for count1 in 0..binary_number.size-1 do
boolean_data = binary_number[count1] #2進数の一文字
if boolean_data == "1" #もし1だった場合
property_name = property_name + pp[bit_count] + px[count] + ","
end
bit_count = bit_count + 1
end
end
puts property_name
end

# 参考文献
[APPENDIX ECHONET機器オブジェクト詳細規定](https://echonet.jp/spec_object_rh/)
## 関連文献
[RubyでECHONET Lite家電を制御する](http://qiita.com/miyazawa_shi/items/4c645315262d5cf5b015)
[ PythonでECHONET Lite家電を操作](http://qiita.com/miyazawa_shi/items/9384f0d2cd1ee255b1c1)
[C言語でECHONET Lite家電を操作](http://qiita.com/miyazawa_shi/items/6d2bd86b19014b0ce161)
[Node-REDを使ってECHONET Lite機器を制御する2](http://qiita.com/KAITHEMS/items/0e02768795174a98d93f)
[ECHONET Lite入門 スマートハウスの通信技術を学ぼう!](https://www.amazon.co.jp/ECHONET-Lite%E5%85%A5%E9%96%80-%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%8F%E3%82%A6%E3%82%B9%E3%81%AE%E9%80%9A%E4%BF%A1%E6%8A%80%E8%A1%93%E3%82%92%E5%AD%A6%E3%81%BC%E3%81%86-%E6%9D%89%E6%9D%91-%E5%8D%9A/dp/4274506320)