littleBitsやArduinoでECHONET Lite家電を動かす方法 (プログラミング不要)

<font color='red'>2017/10/2追記
Kadecotプロジェクトは終了し、その開発ノウハウは、類似の機能を持った[PicoGW](https://github.com/KAIT-HEMS/PicoGW)に引き継がれています。</font>


こんにちは。オープンソース家電サーバ[Kadecot](https://github.com/SonyCSL/Kadecot-JS)を作っている大和田と申します。  

KadecotにArduino連携機能を追加したので、[Arduino bit](http://www.korgonline.com/products/detail.php?product_id=2956)で簡単に家電プログラミングができるようになりました。これを使ったワークショップも2017の１月末から２月頭くらいで開催するので、https://ouch-hack.connpass.com/  もcheckしてください！
※まだ募集開始してないので、ぜひconnpassのコミュニティメンバーに入っておいてくださいませ

こちら[littleBits Advent Calendar 2016](http://qiita.com/advent-calendar/2016/littlebits)の12/23の記事となります。


できることは以下の通りです。

+ littleBitsから家電のON/OFFをする
+ 家電のON/OFFを検知してlittleBitsを動かす

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/RY7UgSIQQwY/0.jpg)](http://www.youtube.com/watch?v=RY7UgSIQQwY)

## 必要なハードウェア
+ [Arduino bit](http://www.korgonline.com/products/detail.php?product_id=2956)
+ Raspberry pi (Kadecotを立ち上げ、Arduino bitを接続するため。ラズパイ３でしか試したことがありませんが、きっと２以前でも大丈夫かと)
+ [ECHONET Lite対応](http://echonet.jp/product/echonet-lite/)エアコンまたは照明。お持ちでない方は、[このエミュレータ](https://github.com/SonyCSL/MoekadenRoom)を使います。エミュレータで動けば実機でも多分動きます。

+ その他お好みのbitモジュール

## やりかた

1. Arduino bitに[このスケッチ](https://github.com/SonyCSL/ArduinoKadecot)を書きこむ。
2. ラズパイのプロンプトで以下のコマンドを打ちこみ、[Kadecot](https://github.com/SonyCSL/Kadecot-JS)をインストール  。かなり時間がかかりますがご了承を。  
```
$ bash <(curl -skL https://git.io/kadecotjs-install)
```  
3. ラズパイにUSB SerialでArduino bitを接続し、対応するシリアルポートを確認。 
通常は```/dev/ttyACM0```です。もしこれ以外の場合は、  
```
~/.kadecot/v1/plugins/net.kadecot.serial/ports.txt
```  
の中身をそのデバイスファイル名に書き換えてください。  
※ちなみに、ラズパイ(てかdebian?)に依存している部分はここだけです。Kadecotも普通のLinuxであればインストールできます。  
4. [エミュレータ](https://github.com/SonyCSL/MoekadenRoom)を用いる場合は、ラズパイと同じネットワーク内で立ち上げる。  
※Kadecotを走らせるラズパイ上で立ち上げてしまうと、ECHONET Liteの仕様上ポートがかぶるので別のマシンにしてください。その場合、ファイアーウォールなどが入っていると家電が見えないことがあるので注意してください。
5. Kadecotを立ち上げる  
``
$ kadecot startfg
``  
だらだら出てくるメッセージの中に  
``Device registartion success:Arduino123456:serial``  
とか  
```
com.sonycsl.kadecot.echonetlite: Registering com.sonycsl.kadecot.echonetlite.procedure.HomeAirConditioner.set
```  
などと出ているのを確認してください。出ていればArduinoや家電が認識されています。
6. 同じネットワーク内のブラウザから、    
``http://[ラズパイIPアドレス]:31413//samples/index.html``  
を開き、「gpio-homeappliances example」と書かれたボタンを押す。  
すると以下のような画面が出る。  
![cap.png](https://qiita-image-store.s3.amazonaws.com/0/125904/962ec862-d3a4-6c81-1ec5-2bfb74bd4755.png)
  
この中で、**GPIO to device**の下に書かれている表では、Arduino bitの入力をどの家電に対応付けるかを設定します。**Device to GPIO**の下では、逆に家電の電源プロパティを、どのArduino bitの出力に対応付けるか設定します。  
例えば、次のように設定したとします。  
![cap2.png](https://qiita-image-store.s3.amazonaws.com/0/125904/8134f981-95ae-b3be-038e-c5c6ee4c9e7d.png)  
対して、littleBitsのほうはこのようにつないだとします。  
![photo1.png](https://qiita-image-store.s3.amazonaws.com/0/125904/227b3c75-0d40-bed1-5944-3623100a3b69.png)  
すると、次のようになります。  
・左のボタンを押すと家電の照明がつきます。
・エアコンをつけるとサーボが回ります。
・照明をつけると、LEDが点灯します。

以上です。

## 注意

### Arduinoの電源が落ちたら
ご存知のようにlittleBitsの磁石は外れやすいので、もしArduino bitの電源が瞬断した場合、ラズパイのシリアルライブラリがArduinoを手放してしまうことがあります。おかしくなったらkadecotをリブートしてください。
### 複数のArduino bitを使う場合
多分使えると思いますが（チェックはしてません）、その場合、[Arduinoに書き込むスケッチ](https://github.com/SonyCSL/ArduinoKadecot)の最初の方にある:

```
String UNIQUE_ID = "Arduino123456" ;
```  
を別の名前にして書きこんでください。

## さらに

### littleBits以外のArduinoを使う場合

入出力のピンIDを追加・削除・変更するだけなら、[Arduinoに書き込むスケッチ](https://github.com/SonyCSL/ArduinoKadecot)の最初の方にある:

```
const int inPorts[] = {D0,A0,A1} ;
const int outPorts[] = {D1,D5,D9} ;
```

を、好きなピン名に変更して書きこめば動くはずです。

### シリアルポート以外でGPIOを使いたい

実は、Kadecotでgpioデバイスとして動かせるのはシリアルにつながったArduinoだけではありません。KadecotにはWebSocketとplain socketのサーバがそれぞれ41316,41317で立ち上がっており、特定の書式にのっとった通信を行うことでsocketクライアントをgpioデバイスとして動かすことができます。  
そのプロトコルについては日を改めて説明したいと思いますが、とりあえず先日@wamisnet さんが[書かれていたCocoaBit](http://qiita.com/wamisnet/items/9bff0d8c4542d905e325)のファンなので、CocoaBitでそれをやる場合のスケッチのみ公開しておきます。[こちらになります](https://github.com/SonyCSL/CocoaBitKadecot)。

CocoaBitだとこんな感じになります。Arduino bitの場合と同様、家電と連携させられます。  
![cocoabit.png](https://qiita-image-store.s3.amazonaws.com/0/125904/ac5bb2c7-eb7d-271b-e6e0-c4d11e38aad9.png)


Arduino bitはいろいろとフレキシブルでいいのですが、USBで繋がる距離にPCがないといけないという大きな制約があります。また、USBをいじっている間に電源瞬断が起きやすいという欠点もあると思います。  
[海外では無線でArduino bitのI/Oを飛ばせるようなものもある](https://littlebits.cc/bits/wireless-transmitter-5-channels)ので、それを使えば遠くの、例えば窓とか襖の中に仕込むことも不可能ではないですが、CocoaBitはそもそも最初からWiFiが使えるので、これだけでソケットでつなぎに行くことが可能です。

また、CocoaBitは[Nefry](https://dotstud.io/projects/nefry-connect-internet/)のバックエンドを流用していて、ESP8266の欠点の一つかもしれない、ソースコード内にWiFiのSSIDやパスワードを書かないといけないという問題を、あとで外からWebインターフェースで変えられるという点で克服されていますし、さらに今回は接続先のKadecotのIPアドレスも同じWebインターフェースで変えられるようにしてあるので、そちらも心配ありません。

CocoaBitの一日も早い商品化をお待ちしております！