ECHONET Lite対応の空気清浄機から温湿度を取得する

#はじめに
　我が家ではSHARP製の加湿空気清浄機([KI-HS50](https://jp.sharp/kuusei/products/kihs50.html))を使用しています。
　この機種はネットワークに接続が可能で、本体のモニターでは温度、湿度、PM2.5濃度を切り替えて表示することができます。
　温湿度が取得できたらスマートハウスがはかどるなーと思い、なんとかネットワーク経由で温湿度を取得する方法がないか調べてみました。
　製品HPを見ると、[ECHONET Lite](https://echonet.jp/about/features/)という家電をネットワークで制御する規格に対応していることが分かったため、ECHONET Liteパケットでの情報取得について調査を行いました。
　※なお、本記事では最終的に温湿度の取得に成功しますが、メーカ独自に規定しているデータを利用したため、本機種以外では同様の手法での温湿度取得はできません。

#環境
- 加湿空気清浄機([SHARP KI-HS50](https://jp.sharp/kuusei/products/kihs50.html)) 
- Windows
- ECHONET Liteパケットの送受信ツール([SSNG Ver.3.0.1](http://sh-center.org/sdk))
 - SSNGの使い方については[こちら](https://qiita.com/ghoisjvgbek/items/500aa560d3202ebf4530)に詳しく記載されています。

#ECHONET Liteで取得できる情報の解析
##1.ECHONET Lite対応機器の検索
とりあえずSSNGを起動してみます。
SSNGは、GUIでECHONET Liteの電文を作成し、対象機器に送受信できます。
 ![SSNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98071/88e0c415-c7b2-7111-0fe5-1e00aeb01804.png)

ひとまず、通信開始ボタンを押し、機器検索をしてみます。
赤枠の送信パケット欄に機器検索ボタンで送信されたECHONET Liteの電文が表示され、緑枠の受信データ欄に空気清浄機が応答した内容が表示されています。
![機器検索](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98071/ea6cfd0e-32e1-fd01-d44f-248faa327e43.png)
ここで受信データの各パラメータは以下の内容を表しています。
詳しくは[ECHONET Lite規格書](https://echonet.jp/spec_v113_lite/)を参照してください。

|パラメータ|意味|
|:--|:------------------|
| EHD1(ECHONET Lite ヘッダ1)　|EHD1とEHD2の組み合わせでECHONETのプロトコル種別を表す。<br>EHD1:10、EHD2:81はECHONET Liteプロトコルであることを示す。|
| EHD2 (ECHONET Lite ヘッダ2) |EHD1参照|
| TID (トランザクションID)     |送信側の要求に対する応答であることを紐づけするためのパラメータであり、記述内容に規定はない。<br>応答側は送信側の電文に記載されたTIDと同じ値を返す。|
| SEOJ (送信元オブジェクト指定)|送信元の機器を示すパラメータである。<br>`0x0EF001`はノードプロファイルオブジェクトであることを示す。<br>詳細は[APPENDIX ECHONET機器オブジェクト詳細規定](https://echonet.jp/spec_object_rl/)を参照。|
| DEOJ (相手先オブジェクト指定)|送信先の機器を表すパラメータである。<br>`0x05FF01`はコントローラ(PC)であることを示す。<br>詳細は[APPENDIX ECHONET機器オブジェクト詳細規定](https://echonet.jp/spec_object_rl/)を参照。|
| ESV (ECHONET Liteサービス)  |EPCで指定されるプロパティに対する操作を指定するパラメータである。操作には「要求」・「応答」（応答／不可応答）・「通知」の3種類がある。<br>`0x72`は受信時の値であり、プロパティ値読み出し要求に対する応答であることを示す。|
| OPC (処理プロパティ数)       |一度の電文で処理するプロパティ数を指定する。受信データであれば、応答のプロパティ数である。|
| EPC1 (ECHONET Liteプロパティ)|動作状態や、運転モードといった取得したい情報(プロパティ)を指定するパラメータである。<br>`0xD6`は自ノードインスタンスリストを示しており、[APPENDIX ECHONET機器オブジェクト詳細規定](https://echonet.jp/spec_object_rl/)に規定された機器のうち、どの機器に対応しているかの情報を応答している。|
| PDC1 (EDTのバイト数)         |EDTのバイト数を示している。|
| EDT1 (プロパティ値データ)    |EPCで指定されたプロパティに対するデータが格納されている。<br>`0x01013501`の1バイト目はオブジェクト数を示している。そのあと3バイトの`0x013501`は空気清浄機のオブジェクトを持つことを示している。|

というわけで、機器検索に対する応答から、この空気清浄機はECHONET Liteの規格としては空気清浄機(`0x013501`)として登録されていることがわかりました。(当たり前)

ここで、[APPENDIX ECHONET機器オブジェクト詳細規定](https://echonet.jp/spec_object_rl/)の空気清浄機のページを見てみます。
>![空気清浄器クラス規定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98071/0a17e92a-3c0c-8c23-d197-00bd66f407bd.png)

ふんふん、風量設定や、空気汚れ検知状態が取れるのね…。あれ？**温湿度は…？**
というわけで、いきなり頓挫しそうですがもう少しあがいてみます。

##2.応答可能プロパティの確認
まずは、この空気清浄機が返せるプロパティが本当にこれだけなのかを調べます。
そのためにEPCにGetプロパティマップというものを指定して、どんなプロパティを応答できるのかを要求してみます。
プロパティマップについては、[こちら](https://qiita.com/miyazawa_shi/items/4f11493079b5191bd5d5)で詳しく解説されています。

赤枠の通り、DEOJに空気清浄機(`0x013501`)、ESVに読み出し(`0x62`)、EPCにGetプロパティマップ(`0x9F`)を指定して、要求送信してみたものが以下です。
![Getプロパティ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98071/95ddfcfe-3665-99a9-b944-1bd3bd846b56.png)
ここで、緑枠の受信データのうちEDT1が応答できるプロパティです。
Getプロパティマップで取得したEDTデータの見方は、[APPENDIX ECHONET機器オブジェクト詳細規定](https://echonet.jp/spec_object_rl/)に記載されています。
1バイト目がプロパティの数を示しており、2～17バイト目は以下の表に当てはめてプロパティとの対応を確認します。
>![プロパティ表.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98071/c78dc1f6-af5c-d829-4cbb-886ee28ec63b.png)

というわけで、先ほど取得した`15 95 81 81 80 01 01 01 00 01 01 01 01 01 82 02 02`を当てはめてみます。
まず1バイト目の`0x15`は10進数で21なので、プロパティ数は21個あることがわかります。
そして、2バイト目以降を2進数に直すと以下のようになります。

|   　　　| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|:-:     |:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| 2バイト目| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 |
| 3バイト目| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 4バイト目| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 5バイト目| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 6バイト目| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 7バイト目| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 8バイト目| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 9バイト目| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|10バイト目| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
|11バイト目| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
|12バイト目| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
|13バイト目| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
|14バイト目| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
|15バイト目| 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
|16バイト目| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
|17バイト目| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |

よって下記の緑枠で示したプロパティを取得できることがわかりました。
![プロパティ表2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98071/5e5ffb7c-b6ee-0133-2897-5a38c56e87e0.png)

それぞれのプロパティは下記の意味のようです。

|番号|プロパティ値|意味|
|:--|:--|:--|
| 1|0x80|動作状態|
| 2|0x81|設置場所|
| 3|0x82|規格Version情報|
| 4|0x84|瞬時消費電力計測値|
| 5|0x85|積算消費電力計測値|
| 6|0x86|メーカ異常コード|
| 7|0x88|異常発生状態|
| 8|0x89|異常内容|
| 9|0x8A|メーカコード|
|10|0x8B|事業場コード|
|11|0x8C|商品コード|
|12|0x9D|状変アナウンスプロパティマップ|
|13|0x9E|Setプロパティマップ|
|14|0x9F|Getプロパティマップ|
|15|0xA0|風量設定|
|16|0xC0|空気汚れ検知状態|
|17|0xF0|メーカ独自プロパティ|
|18|0xF1|メーカ独自プロパティ|
|19|0xF2|メーカ独自プロパティ|
|20|0xF3|メーカ独自プロパティ|
|21|0xFD|メーカ独自プロパティ|

残念ながら、応答可能プロパティの中に、温湿度がずばりとれるものはなさそうです。
頼みの綱は`0xFX`のメーカ独自プロパティです。

##3.メーカ独自プロパティの解析
メーカ独自プロパティで取得できるデータに温湿度が含まれていないか見てみます。
まずは、`0xF0`です。
独自プロパティはGUIで指定できないため、オレンジ色の枠の送信パケットにチェックを入れ、送信パケットを直接指定します。
ここでは、緑線で示す箇所を変更しEPCを`0xF0`にしています。
![F0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98071/a71c2a46-af8f-1b0a-3a20-6ab5c98a0de4.png)
同様に、EPCを`0xF1 0xF2 0xF3 0xFD` とした場合についても応答を確認します。

プロパティを取得した際に、空気清浄機のモニタで表示された温度は`25度`、湿度は`55%`でした。
とりあえず、温湿度の最小分解能を1と仮定して、モニタで表示された値の16進数値(`25 -> 0x19、55 -> 0x37`)が取得したデータに含まれていないか検索してみます。

**ありました。**
EPCが`0xF1`の時の応答に含まれているようです。(下記の赤線と緑線)
![F1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98071/3d00a9e6-9211-6d49-4a52-b9d18a7dacef.png)

本当にこれが温湿度を示しているのか確認するため、空気清浄機にドライヤーを当て、温度と湿度を変化させた状態でも確認しました。
変化時の温度は`26度`、湿度は`54%`です。それぞれ16進数では`26 -> 0x1A、54 -> 0x36`となります。
下記がその時の取得データです。値が一致しているので、これが温湿度でよさそうです。
![F1_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98071/4a4bbeb4-7355-18b5-333e-f9a1d09854dd.png)

#まとめ
- ECHONET Lite対応機器に対し、取得できるプロパティを調査した。
- 対象とした空気清浄機(SHARP製 KI-HS50)にはメーカ独自プロパティがあり、EPC:`0xF1`で温湿度が取得できることを確認した。 

#参考文献
- [ECHONET Lite規格書](https://echonet.jp/spec_v113_lite/)
- [APPENDIX ECHONET機器オブジェクト詳細規定](https://echonet.jp/spec_object_rl/)
- [あなたのお家をスマートハウスにしてみませんか？　＃SSNG編＃](https://qiita.com/ghoisjvgbek/items/500aa560d3202ebf4530)
- [ECHONET Lite のプロパティマップの解析](https://qiita.com/miyazawa_shi/items/4f11493079b5191bd5d5)