SwitchBot / Raspberry Pi / SORACOM Air for セルラーで「どこでもボタンを押してくれるロボット」

家のガレージの遠隔操作に **SwitchBot** と **Raspberry Pi** と **SORACOM Air for セルラー** を組み合わせて、「どこでもボタンを押してくれるロボット」を使うようにしました。

## 構成

Raspberry Pi に SSH ログインして SwitchBot を操作しています。

![SwitchBot / Raspberry Pi / SORACOM Air for セルラーで「どこでもボタンを押してくれるロボット」 / overview](https://docs.google.com/drawings/d/e/2PACX-1vQriN6gmg6rbujnHtPkiLi1nCqoq4w7HraRfX3aa4GAGOQejsBZAjyyOT3Lc4EiIn0Fnr8V8gqgpIHL/pub?w=1079&h=402)

* [SwitchBot](https://www.switchbot.jp): ボタンを押すロボット、BLE で動作する。
* [Raspberry Pi](https://www.raspberrypi.org): シングルボードコンピューター、Linux ベースの OS (Raspbian) が動く

以下３つはオプションです (Wi-Fi で動かす場合は不要)

* [AK-020](https://soracom.jp/products/module/ak-020/): USB ドングル型 3G モデム
* [SORACOM Air for セルラー](https://soracom.jp/services/air/): IoT 向けセルラー通信サービス (今回は plan-D という日本国内/NTT docomo回線を利用するサブスクリプションを利用)
* [SORACOM Napter](https://soracom.jp/services/napter/): セルラー通信をしているデバイスに対してセキュアなグローバル IP アドレスを割り当てるサービス

SORACOM Air を使うことで、Wi-Fi などの環境が無くてもインターネットに接続できますし、SORACOM Napter で安全なグローバル IP アドレスの払い出しを受けることができます。

## 実際の作業

### Raspberry Pi

Raspbian は **Raspbian Buster Lite** (July 2019) を使用。

#### ライブラリのセットアップ

```console
$ sudo apt install -y python3-dev python3-pip
$ sudo pip3 install --upgrade pip
$ sudo pip install bluepy
```

AK-020 および SORACOM Air を使ってインターネット接続したい場合は、以下を追加で実行します。

```console
$ curl https://soracom-files.s3.amazonaws.com/setup_air.sh | sudo bash -
```

#### switchbot.py

同じものを [gist にも掲載](https://gist.github.com/ma2shita/f5cafe63d54ffb74b318836f0da674e0)してあります。

※ `on` と `off` は未実装です (とりあえず `press` だけ実装しました)

```switchbot.py
#!/usr/bin/env python3

import binascii
from bluepy.btle import Peripheral

class SwitchBot:
    def __init__(self, mac_address):
        self.p = Peripheral(mac_address, "random")
        hand_service = self.p.getServiceByUUID("cba20d00-224d-11e6-9fb8-0002a5d5c51b")
        self.hand = hand_service.getCharacteristics("cba20002-224d-11e6-9fb8-0002a5d5c51b")[0]

    def press(self):
        self.hand.write(binascii.a2b_hex("570100"))
        self.p.disconnect()

    def on(self):
        self.p.disconnect()
        raise NotImplementedError()

    def off(self):
        self.p.disconnect()
        raise NotImplementedError()

if __name__ == "__main__":
    from optparse import OptionParser
    parser = OptionParser()
    parser.add_option("-a", "--address", dest="addr", help="MAC address of SwitchBot")
    parser.add_option("-c", "--command", dest="cmd",  help="Command for SwitchBot (press|on|off)")
    (options, args) = parser.parse_args()

    getattr(SwitchBot(options.addr), options.cmd)()

```

```console
$ python3 switch_bot.py -a XX:XX:XX:XX:XX:XX -c press
```

※ `XX:XX:XX:XX:XX:XX` は SwtichBot の MAC アドレスです。

##### SwitchBot の MAC アドレスの見つけ方

```
$ sudo hcitool lescan
```

で表示される MAC アドレス一覧を基に `switch_bot.py` を実行してみてください。

### SORACOM Napter

SORACOM Napter を使って SSH ログインする方法は https://dev.soracom.io/jp/start/napter_ssh/ に掲載されています。

## あとがき

いままでは [MicroBot Push](https://microbot.is/ja/push/) を用いてガレージのリモート開け閉め※1 をやってましたが、2019年7月くらいから MicroBot Push と IFTTT の連携が終了(?)してしまい、動かなくなってしまいました。

MicroBot Push を遠隔で動かす仕組みに Prota Pi を使っていたのですが、それも[2019年の2月くらいには動きがあったよう](https://www.labohyt.net/blog/server/post-3970/)で、結論はスマホとか使ってな！という状況のようです。

なので SwitchBot 君に引っ越したという経緯。

※1 [Wio LTE君とSORACOM Beamで「だっしゅぼたん」を作る](https://qiita.com/ma2shita/items/3846b9ec9c27babaab86)

### このあと。

MQTT を使って、SORACOM LTE-M Button との連携で遠隔ガレージ操作を実現する予定です。

### 参考資料

* [OpenWonderLabs/python-host](https://github.com/OpenWonderLabs/python-host)
* [ラズパイ(Raspberry Pi)からSwitch Bot(スイッチボット)を操作する手順を解説](https://www.takeiho.com/raspberry-switchbot)

EoT