ECHONET Lite家電をいきなりブラウザから動かす方法

<font color='red'>2017/10/2追記
Kadecotプロジェクトは終了し、その開発ノウハウは、類似の機能を持った[PicoGW](https://github.com/KAIT-HEMS/PicoGW)に引き継がれています。この応用を目指す[Pico Community](http://pico.lifedesign.tech/)というグループも立ち上がっています。[Peatix](http://pico.peatix.com/)から更新情報やイベント情報も流していく予定ですのでぜひフォローしてください！</font>


# ECHONET Lite家電をいきなりブラウザから動かす方法

本記事では、Sony CSLが作っている[Kadecot|JS](https://github.com/SonyCSL/Kadecot-JS)のJSONP APIを使い、URLを叩くだけで簡単にECHONET Lite家電を動かす方法を説明します。これができると、[MESHと家電を連携させる](http://qiita.com/sgrowd/items/6a3e8576be49760db5eb)などが簡単にできます。JSONPに対応しているので、クロスドメインでも使えます。  

必要なものは以下の通りです。

+ Kadecotを動かすためのLinuxマシン([Raspbbery Pi 3 Model B](https://www.amazon.co.jp/Raspberry-Pi-896-8660-Model-Element14/dp/B01CCOXV34/ref=sr_1_2?ie=UTF8&qid=1484801354&sr=8-2&keywords=raspberry+pi+3)で動作確認しています)
+ ECHONET Lite家電 (エアコンや照明など、電源ON/OFFがはっきりしたもの。ない場合は[Sony CSLのECHONET Liteエミュレータ](https://github.com/SonyCSL/MoekadenRoom)が使えます)

# 方法

まずKadecotのインストール＆実行を行います。Linuxマシンのシェルで以下を実行してください。デフォルトのラズパイだと、nodeをアップデートしたりして一行目に５分～１０分くらいかかることもありますのでご了承を。  

```bash
$ bash <(curl -skL https://git.io/kadecotjs-install)
$ kadecot start
```

同じネットワーク内にECHONET Lite機器が存在すれば、自動的に使えるようになります。  

### Kadecot設定画面から、API URL Generatorを開く

次に、ブラウザからKadecotにアクセスします。KadecotのIPアドレスを仮に192.168.10.3とした場合、こちらを開いてください。  
```
http://192.168.10.3:31413/
```
すると以下のような画面が出てきます。認識されている機器の一覧が出ています。  

![Kadecot1.png](https://qiita-image-store.s3.amazonaws.com/0/125904/ae8c1a1f-9417-c69a-c10b-37a35d2c1080.png)

もし所望の機器がリストされていないようなら、それは接続の問題もあり得ますが、発見に時間がかかっているだけかもしれません。Kadecot起動後30秒くらいは待ってリロードしてみてください。それでも見つからないようなら、接続を疑ってください。エミュレータ使用の場合は、そのマシンの3610ポート(UDP)が開いているか再確認してください。

また、Kadecotをフォアグランド実行するとメッセージが出るので状態がわかりやすいかもしれません。そのためにはまず```kadecot stop```で実行を止めたのちに```kadecot startfg```としてください。

機器が見つかっていたら、URL Generatorを起動します。下の方にスクロールしていくと、JSONP API URL Generatorというリンクがあるのでクリックします。  

![api1.png](https://qiita-image-store.s3.amazonaws.com/0/125904/13065eb0-0c2e-166d-ff21-f420a87012b6.png)

すると、別タブでAPI Generatorアプリが開きます。  

![api2.png](https://qiita-image-store.s3.amazonaws.com/0/125904/4fd8f0d9-b2b8-5636-abc4-5870634447f1.png)

### 機器一覧をJSONで得る

ここでいきなり、右上の青いボタンを押してみましょう。

![api2b.png](https://qiita-image-store.s3.amazonaws.com/0/125904/ec571240-ce32-14b4-b47b-92f1426882a1.png)

するとクリップボードにURL文字列がコピーされるので、さらに別タブを開き、コピーしたURLを開いてみます。

![api3.png](https://qiita-image-store.s3.amazonaws.com/0/125904/41a0e808-fa60-33ef-5696-f9e3fb981fc2.png)

すると、機器一覧がJSONオブジェクトとして得られます。機器一覧を得るためのURLが生成されていたわけです。  

### 家電の電源をONにする

では次に、家電に電源を入れるURLを生成してみましょう。先程のタブに戻り、Deviceからエアコンを見つけます。ドロップダウンを開くと、例えば以下のようになるでしょう。  

![api4.png](https://qiita-image-store.s3.amazonaws.com/0/125904/c07eb021-e09f-89ef-5da0-ae98bf1d5c32.png)

一番下に「HomeAirConditioner@..」という項目があるので、これを選びます。  

![api5.png](https://qiita-image-store.s3.amazonaws.com/0/125904/f08fba0c-2323-80fc-c25f-db790d27a852.png)

すると、実行するメソッドを選択せよと言われるので、さらにドロップダウンを開いてみます。  

![api6.png](https://qiita-image-store.s3.amazonaws.com/0/125904/7e361563-94f9-63ae-ec95-a73ed8484a75.png)

ものすごくたくさんのメソッドがありますが、電源変更は上から二番目のOperationStatusSetなので、これを選びます。すると、Parametersの項目とともにこのメソッドのドキュメントが出ます。  

![api7.png](https://qiita-image-store.s3.amazonaws.com/0/125904/8993b71c-1716-3681-03b3-a30ae6972615.png)

これによるとONは0x30とのこと。そこで、ParametersのpropertyValueに0x30を入れます。ECHONET Liteの場合、propertyValueは常にバイト数値の配列になるので（複数バイト必要なメソッドもあるため）、配列の要素として設定してください。  

![api8.png](https://qiita-image-store.s3.amazonaws.com/0/125904/0aa48c31-7ce7-7e5e-a259-de1cbb56f902.png)

これで上部のURLが変化し、電源ONのためのAPIが生成されました。今回は試し実行してみましょう。それには右上の緑の三角ボタンを押します。  

![api9.png](https://qiita-image-store.s3.amazonaws.com/0/125904/14435e5b-5462-6204-71ed-2e3c20fbb75f.png)

これだけです。エアコンの電源が入りましたか？  

先程と同じように、青のコピーボタンを押してURLをクリップボードに入れ、別タブなどでそのURLを張り付けてロードすれば同じことができます。

### 家電の電源状態の取得

最後に、電源状態を取得してみましょう。これは電源設定よりも簡単です。Methodに戻って、今OperationStatusSetになっているところをOperationStatusGetにしてください。  

![api10.png](https://qiita-image-store.s3.amazonaws.com/0/125904/3a53c195-13c2-4e11-c732-9ea591728d3e.png)

電源状態取得は、追加指定パラメータはないので、このままURLを青ボタンでコピーし、別タブで開いてみましょう。  

![api2b.png](https://qiita-image-store.s3.amazonaws.com/0/125904/ec571240-ce32-14b4-b47b-92f1426882a1.png)

すると電源状態を取得できます。

![api11.png](https://qiita-image-store.s3.amazonaws.com/0/125904/eec9881c-fdb7-aad3-0349-45a78bf3943b.png)

JSONの中にpropertyValueが[48]と表示されていますね。この49は、１６進数で言えば0x30。先程のドキュメントを見れば、0x30はONであることがわかります。

### その他のメソッドについて

電源以外のプロパティの設定や取得についても、Methodを変化させていけば同じようにURL生成できます。ただ、機器によって実装されていない昨日もあるのでご了承下さい。

### 状態変化の読み取りについて

JSONPの枠組みでは、クライアントが値を読みにいかないと現在の状態を取得することができません。ECHONET Liteには、重要な状態変化を機器側から通知するための状変通知という枠組みがあります。JSONP APIではこれを扱うことはできませんが、KadecotのWAMP API(WebSocketを用いたAPI)を使えば通知をそのタイミングで受け取ることもできます。  
WAMP APIの使い方は、[KadecotのGitHubの解説](https://github.com/SonyCSL/Kadecot-JS/blob/master/README.md)をご覧いただいたり、先ほどのKadecotのメニューにあるWAMP API Samplesをたどって開けるサンプルなどをあたってみてください。  

![api12.png](https://qiita-image-store.s3.amazonaws.com/0/125904/638ba705-7e99-f7d3-a0d7-ccd22cf8e054.png)

### クロスドメインアクセス・セキュリティについて

今回使用したAPIはJSONPアクセスに対応しているので、他ドメインからリソースにアクセスすることが可能になっています。  

しかし、このAPIには何のセキュリティもかかっておらず、クロスドメインアクセスも可能なので、KadecotのIPアドレスさえ分かってしまえばだれでも簡単に家電にアクセスできることになります。家電の中には使い方を間違うと危険なものもありますし、正常に使用していても、その使用ログを得ることで、在宅状態や施錠状態など、あなたの生活情報がわかってしまうことにもなります。NAT内の使用であればアクセスにある程度の制約がかかることになりますが、宅内におかしなプログラムがあるかもしれませんので、使用には十分お気を付け下さい。

なお、WAMP APIには認証が必要であり、多少セキュリティが強化されています。