ECHONET Lite のプロパティマップの解析

# はじめに
ECHONET Liteは通信のプロトコルであり、機器から取得や操作する事ができるプロパティが決まられている。
しかし、エアコンや空気清浄機のように同一名の機器でも、メーカや機種によって取得できる機器情報や操作の種類が異なる。
そこで、機器から取得できる機器情報や操作方法を調べる方法としてプロパティマップがある。

今回はプロパティマップの解析方法の話

※　ECHONET Lite （ISO/IEC 14543-4-3）国際規格

# 環境
-対象機器
SHARP　　: [空気清浄機](http://www.sharp.co.jp/kuusei/products/kiex100.html)
TOSHIBA　: エアコン

os : windows7
Ruby 2.2.4
#プロパティマップの種類
プロパティマップには、「Setプロパティマップ」、「Getプロパティマップ」がある。
##Setプロパティマップ
[Appendix](https://echonet.jp/spec_object_rh/) のアクセルルールで「Set」に該当する部分を取得できる

例）　以下の図はAppendixに記載されているエアコンに関するプロパティである。
オレンジ色で囲まれている範囲は　Setプロパティマップで取得できる種類である。
![セットプロパティマップAppendix.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/a65d9b42-d7d3-755b-15b7-521d28c37f0c.jpeg)



##Getプロパティマップ
[Appendix](https://echonet.jp/spec_object_rh/) のアクセルルールで「Set」に該当する部分を取得できる

例）　上記と同じく図はAppendixに記載されているエアコンに関するプロパティである。
オレンジ色で囲まれている範囲は　Getプロパティマップで取得できる種類である。
※アクセルルールの欄にSetのみが記載されているものは取得できない
![ゲットマッププロパティ.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/165eeaa4-7d61-c361-6a75-265f065b85b8.jpeg)


# プロパティマップの取得方法
対象機器にSetマッププロパティ　もしくは　Getマッププロパティの要求をする電文を送信する
今回は空気清浄機とエアコンを例にとって電文構成を示す

※　なおECHONET Liteの送受信の方法は以下のURLを参照
[RubyでECHONET Lite家電を制御する](http://qiita.com/miyazawa_shi/items/4c645315262d5cf5b015)
[PythonでECHONET Lite家電を操作](http://qiita.com/miyazawa_shi/items/9384f0d2cd1ee255b1c1)
[あなたのお家をスマートハウスにしてみませんか？　＃SSNG編＃](http://qiita.com/sugi05/items/500aa560d3202ebf4530)

※　電文構成に関しては
[ECHONET Liteの電文　作成方法](http://qiita.com/miyazawa_shi/items/725bc5eb6590be72970d)
[ECHONET Lite規格書](https://echonet.jp/spec_v112_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を参照しプロパティマップ対応表をみながら、対応するプロパティを探す

##例１　プロパティ数が　16より少ない場合
以下のようなマッププロパティに関するEDTを受け取った場合
```
04 80 81 A0 F3
```
1バイト目は　プロパティの数を示すので
０４　はプロパティが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
```１バイト目の```23```はプロパティ数を示すので、10進数に直すと25になる。
よってプロパティが全部で25個あることがわかる。

2バイト目以降は以下の表でプロパティの確認を行う。![プロパティ確認表.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/def5c43f-28af-1c82-4e5a-7a69f2075261.jpeg)

###2バイト目
2バイト目の```1F```は2進数に変換すると```0001 1111```となるので以下のプロパティが該当する
```0xC0 0xB0 0xA0 0x90 0x80```
![1バイト目.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/21ba3aad-2063-434d-8789-ee5fbd1a24b3.jpeg)
###3バイト目
3バイト目の```01```は2進数に変換すると```0000 0001```となるので以下のプロパティが該当する
```0x81```
![2 バイト目.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/82021acb-5470-fbc8-4c46-9f2e355623e8.jpeg)

4バイト以降も同様の手順でプロパティマップの解析が出来る。以下が解析結果である
```0xC0,0xB0,0xA0,0x90,0x80,0x81,0x92,0x82,0xB3,0xA3,0xB4,0x94,0xC6,0x96,0x86,0xC7,
0x87,0x88,0xB9,0x89,0xBA,0x9A,0x8A,0xDB,0xCB,0xBB,0x8B,0x8C,0xFD,0x9D,0xFE,0xBE,0x9E,0x8E,0x9F```

## 解析　サンプルコード　（　Ruby　）
プロパティ数が16個以上になる場合は解析が面倒になるので
以下のサンプルコードを作成した。

１行目の```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
```
![解析結果.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/0326bbb9-fd12-1883-baa9-e499e96ac8d1.jpeg)

#参考文献
[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)