NFCタグ×MacroDroid×Switch Botで機器を制御

# はじめに
日頃よくSwitch Botを使用して快適に機器の制御をしています。
Switch BotはHubを使用することで、音声インターフェースなどと組み合わせて使用することも多いと思いますが、私はあまり好きではないのでアプリから制御をしています。
ただ、その方法だとまずアプリを毎回開く必要があります。加えて、一定期間でアプリとサーバとのセッションが切れるため、ログインをし直す必要があります。TV、エアコン、照明のON/OFFなどの頻繁に行う制御だと少々使いにくいところがありました。
そこでNFCタグで制御する方法があることを知ったので、試してみることにしました。


# 使用したもの
* Switch Bot機器,Hub
* IFTTT
* NFC Tools
* MacroDroid
* Android スマホ端末
* NFCタグ

# 試したこと
まずiPhoneユーザの方であればショートカットがあるのでそちらでレシピを作成すればすぐにできるらしいのですが、Androidではそれができず、別の手段で設定しなければなりません。。
そんなのIFTTTでいいじゃないかと思われた方もいらっしゃると思います。実際、YouTubeにIFTTTを使用して、Android端末でNFCタグからSwitch Botを制御している動画がありそれを参考に試してみました。

試した手順は以下です
1. IFTTのif thisの部分にwebhooksでリクエストのevent nameを設定する
2. then thatの部分でSwitch Botを選択し、turn on(off)application with Hub IR remoteというを選択
3. Hubに登録している機器名がプルダウンメニューに表示されるので、対象機器を選択する
4. finishで作成終了
5. Exploreからwebhooksを選択し、documentationを選択
6. request urlの設定画面に遷移するので、urlの{event}のところをタップし、先ほど作成したevent nameを入力する
7. 画面下にcurlが表示されるのでそのurl部分をコピー
8. NFC Toolsを開き、「書く」→「レコードを追加」→「カスタム URL/URI」を選択
9. URL入力画面に遷移するので、コピーしたURLを張り付ける
10. 「書く」→「書く」を選択すると、NFCタグにアクセスするので、NFCタグに登録する


上記の方法で実際に登録し、試してみました。
試してみて感じたことは、正直使いにくいなということでした。
webhookを使用して制御するという方法で試したのですが、
NFCにかざしたときにブラウザが起動してしまいます。制御するたびにいちいち新しいタブでブラウザが起動されては、制御する気が失せてしまいかねません。
また、無料版だとレシピが3つまでしか作成できないので、そこも個人的にネックでした。
私自身あまりIFTTTを使い慣れていないので他にやり方があったかもしれませんが、もうシェルスクリプトとかでSwitch BotのAPIをたたいて直接制御したらいいんじゃね？と思ったのでその方法で試してみることにしました。
いろいろ模索したところ、MacroDroidというアプリがあるということを知りました。
簡単に説明すると、内容としてはIFTTTのようなもので、トリガーとアクション(と条件)を設定してマクロを作成して、トリガー発生時にアクションを実行してくれるというものです。


# MacroDroidについて
個人的には、IFTTTは用意されている別のアプリなどの設定がしやすいイメージがあります。実際Switch Botもif this,then thatの設定にデフォルトで用意されているため、そういったアプリと紐づけたりする際に、あまり慣れていない人でも操作しやすいのが特徴なのかなというイメージがあります。(正直全然使っていないのでイメージです。。)
MacroDroidはIFTTTみたいに連携するアプリが設定しやすいように用意されているということはなく、自分でロジックを組むことになります。Android端末の細かいトリガーやアクションが設定できるため、自由度が高く、自分で細かいことまで設定したいという方には向いているのかなという気がしました。
テンプレートといって、他の方が作成したマクロが、新着、高評価、最新順などになってみることができるので、気になった方はそういうのも参考にして使ってみてもいいと思います。ちなみにIFTTTは無料版だと3つまでしか作成できないと述べましたが、MacroDroidも無料版だと5つまでという制限があります。
ついハマってしまい課金をしてしまったので、さっきのIFTTTは無料版だと～というのが説得力がなくなってしまいますが、無料版でも十分価値はあると思います。また、課金する場合は500円一回きり払えば作成できるマクロが無制限になります。

# 設定方法

**機器制御の流れ**
![機器制御の流れ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546084/45a4d08d-817c-d55d-e964-59dbf1624fc8.png)

まず、Switch BotのAPIから仕様を確認する必要があります。
https://github.com/OpenWonderLabs/SwitchBotAPI

APIを使用するにはSwitch Botのアプリからオープントークンを取得する必要があります。
オープントークンの取得方法は「プロフィール」→「設定」を開き、「アプリバージョン」を10回タップすると、「開発者向けオプション」が画面に表示され、その画面でオープントークンを取得できます。
私はSwitch Botのアプリでシーンを作成して、そのシーンをPOSTするという方法で制御しました。その際は、アクション条件を手動実行にして登録します。
また、シーンを使用して制御する方法ではシーンIDがリクエストに必要になるので、シーンIDを取得します。

### シーンIDを取得
まず、コマンドプロンプトでシーン一覧を取得します。
取得したオープントークンはリクエストヘッダーに挿入します。

```
curl -H "Authorization:{token}" -X GET https://api.switch-bot.com/v1.0/scenes
```


```:出力結果
{
"statusCode":100,
"body":[
    {"sceneId":"T01-202102211837-11256265","sceneName":"air conditioner on"}, 
    {"sceneId":"T01-202102211838-38812579","sceneName":"air conditioner off"}, 
    {"sceneId":"T01-202102211839-30390367","sceneName":"tv on off"}...
]
```


### マクロの設定
シーンIDを取得したら、MacroDroidにシーンを制御するマクロを作成していきます。[^1]
[^1]: 作成時のMacroDroidはv5.8.15です。


まず、「マクロを追加」からマクロを作成します。
![トップ画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546084/4ca94e64-581e-6d78-6da7-8389adf9447d.png)


作成画面からマクロ名の設定とトリガー、アクション、条件を設定します。
![マクロ作成画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546084/2d61baae-6209-f41e-dcab-97aa675bd56a.jpeg)

まずトリガーの設定をしていきます。
「トリガー」→「機器のイベント」→「NFCタグ」→[NFCタグを新規作成]を選択し、OKを選択
NFCタグをかざすと登録が完了します。
![トリガー作成画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546084/86f32699-1507-1535-fa80-cda7aeb3b0e0.png)


次にアクションの設定をします。
「アクションを追加画面」で「アプリ」から「シェルスクリプト」を選択
![アクション作成画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546084/410c5561-f572-337a-c466-7f8a541d850c.png)


スクリプトの入力フォームにスクリプトを入力し（貼り付け）ます。
![シェルスクリプト例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546084/078192d3-f971-5683-8cc2-a5df4044e1c9.jpeg)

OKを押して、マクロを登録すれば完了です。「アクションを試す」を選択すると、シェルスクリプトが実行されるので、テストをすることもできます。

ちなみに、端末はルート化しなくても使用はできるので、非ルート化を選択します。基本端末のルート化はされてないと思うので、これだけの使用であれば、わざわざする必要もないと思います。
ただ、他のアクションでルート化のみ実行できるものもあるので、それらをされる場合はルート化が必要になります。
あと、URLの[v=token]や[v=scenes_ctl]についてですが、MacroDroidでは変数を設定できるため、複数回使いまわす値は変数にしています。トップ画面で設定できる変数とマクロの作成画面で設定できるローカル変数があります。私の場合は通常の変数にオープントークンとシーン制御の共通部分のURLを設定したため、画像のようなスクリプトになっています。ローカル変数の場合は[v=hoge]のところが[lv=hoge]になるらしいです。


# おわりに
MacroDroidを使用して、NFCタグからSwitch Bot機器を制御する方法をご紹介しました。
IFTTTでの実行に比べると、自分で設定しなければならないことが多いため、若干の面倒くささは否めませんが、やっていること自体は複雑ではないのですぐにできると思います。
ちなみに、私はトリガーにNFC以外にウィジェットも設定しています。このように、MacroDroidは他にも端末を自由にカスタマイズできるので、Switch Botとの連携以外でも楽しめると思うので、今後もいろいろ試してみようと思います。