「ねえgoogle、電気をつけて！」SwitchBotAPIをラズパイからコールする

Switch Botを買いました！

https://www.amazon.co.jp/exec/obidos/ASIN/B06X92KHPV/chasuke0c-22/

物理ボタンを遠隔で操作げきる優れものです。
しかし残念なことに、こいつ、専用のハブを別途購入しないといけなくて、それがまたお高めです。。
ただし、APIが公開されているとのことなので、今回はラズパイから操作してみました。

以下はその作業ログです。

# 構成図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/c082b07f-67ec-b663-3add-32e7d74f836e.png)


# 環境情報

```shell
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 9.8 (stretch)
Release:	9.8
Codename:	stretch
```

自分のラズパイのosの情報は上記のコマンドで検索できます。
`Raspbian Stretch`だと成功しないとの記事もあったのですが、この方法では大丈夫でした。ラズパイは3Bです。

# ラズパイ側の設定

ほぼ[参考サイト](https://www.takeiho.com/raspberry-switchbot#4MAC)の通りにやります。

```shell
$ 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
```

公式サイトからソースを落とします。

```shell
$ git clone https://github.com/OpenWonderLabs/python-host.git
```

`python-host`というフォルダができるので、そこへ移動します。

```
$ cd python-host
```

ここから、参考サイトではSwitchBotの検索のスクリプトを実行していたのですが、自分は何回かやってもデバイスを見つけてもらえなかったのでMACアドレスをアプリから直接みに行く方法をとりました。
→参考：https://chasuke.com/switchbot-raspi/

アプリをインストールすると勝手に周辺のSwitchBotを見つけてくれるのでそこからMACアドレスを見に行きます。
歯車アイコンから次に「・・・」を押すと出てくる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/439950aa-5770-2312-69a9-531a0a609d70.png)

このアドレスを直接指定して以下を実行。

```shell
$ python switchbot.py 12:34:56:78:9a:bc Press
```

うぃーーーーーーん

となったら成功！

次はこれをMQTTでgoogle homeから繋ぎます。

# MQTTブローカー

MQTTをこれまでよく理解せずにとりあえずで使ってたので一応整理。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/ccc2804b-7e02-1f84-d8b9-066accdc6570.png)

# 以下、細々した設定

初めのセットアップなどは昔やってしまっているので別記事でまとめます。
（ネット探せば落ちているはずです。）

## beebotteの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/ea9041da-efcb-f51a-bbe0-7c58d600ad50.png)

* サイドバーの`Channels`からチャンネルとトピックを作成→トークンが発行されます。

## IFTTTの設定

* this:google assistantを指定して、トリガーとなる言葉を設定。
* that:webhooksを指定し、先ほどのurlを設定。形式はPOST、aplication/jsonを指定して、postする内容には`{"data":[{"device":"switchbot","action":"press"}]}`を指定。

## Node-Redの設定

ドラッグアンドドロップで紐づけていくだけでフローが完成します。楽。

ラズパイでnode-redを起動した状態で、ブラウザから `http://raspberrypi.local:1880` にアクセス。

### 全体構成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/46b62eb0-769d-958f-753a-9288a88717e9.png)


### mqttノードの設定

|設定項目|設定値|
|---|---|
|サーバ:ポート番号|mqtt.beebotte.com:8883|
||SSL/TLS接続を使用|
|セキュリティ（ユーザ名）|トークン|
|セキュリティ（パスワード）|空欄|
|トピック|チャンネル名/トピック名|

### jsonノード

jsonに変換。おわり。

### switchノード

jsonに変換したのち、`payload.data[0].device`で`device`の値を、`payload.data[0].action`で`action`の値を受け取れます。

### execノード

ここでは実行するコマンドを入れる。
ルートディレクトリから参照しているので、先ほどの`switchbot.py`のパスに注意。

```shell
python ~/switchbot.py 12:34:56:78:9a:bc Press
```

※ デフォルトでpayloadが引数になっているのでチェックを外すこと。

## テスト

僕 「ねえgoogle、電気をつけて！！」

g「電気をつけます」

s「うぃーーーーーん」

成功！

# 参考

* https://www.takeiho.com/raspberry-switchbot#4MAC
* https://chasuke.com/switchbot-raspi/

# 追記

デフォルトの状態だと、以下のどのコマンドを打っても同じ挙動でこれではOn/Offで押す引くが逆になるタイプのスイッチに対応できません。

```shell-session
$ python ~/switchbot.py 12:34:56:78:9a:bc Press
$ python ~/switchbot.py 12:34:56:78:9a:bc Turn On
$ python ~/switchbot.py 12:34:56:78:9a:bc Turn Off
```

これはアプリの設定から「壁のスイッチを使用します」を選択することで、このタイプのスイッチに対応できるようになりました。