我が家のSmartHouse化計画Lv3


# はじめに
## 要約

* Smartボタンを押したら、色々Smart家電を操作したいpart2
    * 今回は、NatureRemo以外のSwitchBotやSesamiのスマートロックにも挑戦します

![pic1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/acc9b77f-732e-70c5-d309-3efb98a33afc.png)


## モチベーション
* [前回の改善](https://qiita.com/kazutxt/items/df5daa363652368e6bdc)でベッドから色々操作ができるようになりました
* でも、NatureRemoがほとんどだったので別のスマート家電も操作したい
* そして、やっぱりボタンって押したくなりますよね

## 関連する記事

* [我が家のSmartHouse化計画](https://qiita.com/kazutxt/items/f56f8eb339fc7da952ea)
* [我が家のSmartHouse化計画Lv2](https://qiita.com/kazutxt/items/df5daa363652368e6bdc)
* [Nature RemoとNode-REDでテレビを操作する](https://qiita.com/kazutxt/items/e7ca6c062eff0f279455)
* [Node-RED系の記事のまとめ](https://qiita.com/kazutxt/items/8c72448eefcba56dabef)

# 実現方法
## 全体の連携イメージ
![pic2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/8b5f9fbc-f7bf-362f-cabe-f5d2bed1e1a2.png)

* SmartButton(Flic)を使って、スイッチ/鍵/空気清浄機を操作します
    * クリック/ダブルクリック/ホールド(長押し)が使えるので、この3種類をそれぞれ割り当てます
* RaspberryPi上のNode-REDと(ライト以外)NatureRemoを使って、各家電を操作します
* ~~ボタンを押して正しく動作したかわからないので、出力先としてGoogleNestHubに通知します~~
    * 自分がわかって押すので、通知は不要だとわかったので、Lv3では作りませんでした。


## ①ボタンを押してNode-REDに通知する
* [我が家のSmartHouse化計画Lv2](https://qiita.com/kazutxt/items/df5daa363652368e6bdc)で紹介したやり方と変わりませんので、こちらをご参照ください。

## ②クリックで壁スイッチを切り替える


### フロー
![pic3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/aa168ad5-d3eb-2a5c-90f3-494fe57967f8.png)

* <サーバURL:PORT>/white_clickにGETメソッドで通知が来ると、On/Offを交互にするためのフラグを設定し、その先のExecノードに進み、SwitchBotの押す/引くを制御します。



### 重要な処理
* TurnOn/TurnOffノード
    * 事前にpythonの[python-host](https://github.com/OpenWonderLabs/python-host)を入れます

```
// 必要なライブラリのインストール
sudo apt-get update
sudo apt-get install python-pexpect
sudo apt-get install libusb-dev libdbus-1-dev libglib2.0-dev 
sudo apt-get install libudev-dev libical-dev libreadline-dev
sudo pip install bluepy

// ライブラリのclone
git clone https://github.com/OpenWonderLabs/python-host.git

// Switchbotのサーチを行う
cd python-host
sudo python switchbot.py 
```

* 上記でSwitchbotの情報を探してくれるのですが、残念ながらこれでは見つけられませんでした。
    * 検索はできませんでしたが、後述するコマンドの実施に必要なのでこれは必要なライブラリです
    * BluetoothのMACアドレスが必要なのですが、アプリから確認できます。
        * アプリダッシュボード⇛機器を選択⇛設定画面の右上の三点リーダ⇛BLEMACの項目

* TrunOnノード：`python <path>/switchbot.py <MACAddress> Turn On`でOnになります
* TrunOffノード：`python <path>/switchbot.py <MACAddress> Turn Off`でOffになります


``` 設定.js
var flag = flow.get("flag")|false;
flag = !flag;
flow.set("flag",flag);
return msg;
```
* 設定はフラグをON/OFFを切り替えているだけです

### 備考
* 事前にMacでBluetoothの設定をOnにしておく必要があります。
* Node-REDのBLEノードを使ってみましたが、瞬断が繰り返される?認証が必要?なためかノードがうまくconnectedになりませんでした。


## ③ダブルクリックで空気清浄機をつける


### フロー
![pic4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/1ad90b42-2016-f4b3-c318-7d56d8dd950f.png)

* 空気清浄機と言いながら実質スマートプラグで電源を入れる/切るを制御しているだけです
* 実はLv2でライトを付けたたのとほぼ同じです。
    * TPlinkのスマートライトもスマートプラグも同じように専用のノードにtrue/falseを渡すだけです。

### 重要な処理

``` ライトオン.js
msg.payload=true // ライトオフの場合はfalse
return msg;
```

* smartplugノード
    * DeviceIP:`<スマートプラグのIP＞`


### 備考
* スマートライトは`tplink-smarthome-api search` で探せた(LV2を参照)のですが、うまく見つけられなかったので、WifiルータにログインをしてHS105の名前になっているやつを探して設定しました


## ④ホールドで玄関の鍵をかける

### フロー
![pic5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/f7012406-1813-b332-52e4-c75abe415f9e.png)

* まず、事前に以下の方法で、APIキーとセサミIDを調べます
    * [公式サイト](https://jp.candyhouse.co/blogs/how-to/api%E3%82%AD%E3%83%BC%E5%8F%96%E5%BE%97%E6%96%B9%E6%B3%95%E3%81%A8%E3%82%BB%E3%82%B5%E3%83%9Fid%E3%81%AE%E7%A2%BA%E8%AA%8D%E6%96%B9%E6%B3%95)に詳しい記載があるため、こちらで設定を行います。

### 重要な処理

``` open.js/close.js
msg.headers = {'Content-Type' : 'application/json', 'Authorization' : "<APIキー>"};
msg.payload = {'command' : 'lock'}; // openの場合はunlock
return msg;
```

* http requestノード
    * https://api.candyhouse.co/public/sesame/<セサミID>

### 備考
* うまくいくと、task_idが帰ってきます。連続で実施するとデバイスがbusyとなっていて、動きません
* wifiモジュールがないと使えず、wifiモジュール無しで操作するとresponsiveがfalseとなります

 
# まとめ
* 今回は、SmartButton(Flic)を使って、NatureRemoではない、壁スイッチ、鍵、空気清浄機を操作できるようにしました。

#　その他
* 認証情報などをハードコーディングしているしているため、ソースの公開ができません。すみません。。。
* その他面白いIoT家電があれば、教えて下さい。
* SmartHomePlatform的なものを作りたいなぁ