ノーコードで作るカーテンスヌーズ機能

この記事は[NTTコムウェア Advent Calendar 2021](https://qiita.com/advent-calendar/2021/nttcomware) 2日目の記事です。

NTTコムウェアの掛内です。
普段は、AWSを使ったアジャイル開発のSM兼テックリード兼開発メンバとして、開発を行っています。
POや他の開発メンバと一緒に、一般のお客様に利用して頂くシステムの開発及び価値向上について日々励んでいるところです。
クラウドもツールもプログラミングも大好きなのですが、今回は、少し変わり種を紹介させて頂きたいと思います。

# はじめに
突然ですが、みなさんは朝シャキっと起きられますか？

私は、寝起きが悪いということはないのですが、在宅になり、朝のルーティンを一部省略できる様になったため、よくも悪くもダラダラするようになってしまいました。

良い仕事するためには、朝シャキっと起きることはとても重要です。

<img width="300px" alt="asa.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311160/82f93029-4e4f-740a-8292-565a112e80ba.png">

ということで、今回は朝シャキっと起きる方法を、あえてノーコードで実現する方法を紹介したいと思います。

## 概要
スマートボタン/IFTTT/スマートカーテンを組み合わせて、カーテンの自動開閉にスヌーズ機能を作っていきます。

### カーテンのスヌーズ機能とは？
目覚まし時計にはスヌーズ機能(一定時間後にもう一度鳴らす)というものがあり、お馴染みかと思います。
これをカーテンに応用させて、以下のような機能をカーテンのスヌーズ機能として作ります

1. 開きかけのカーテンを閉める
2. 一定期間待つ
3. カーテンを開ける

## きっかけ
1. 朝シャキっと起きるためには、起きてすぐに日光を浴びると良いと聞きました
2. そこで、朝起きたらまずカーテンを開けることにしているのですが、カーテンまでたどり着くのに眠気が勝ってしまいます
3. そのため、時間になったら自動でカーテンを開けてくれるスマートカーテンを買って付けてみました
4. それ自体は良かったのですが、あと5分だけ寝たいときにちょっと困ります
5. どうしてカーテンにはスヌーズ機能が無いのか。エンジニアなら無いなら作ろう！  // 今ここです

## 対象読者
* カーテンにスヌーズ機能が欲しい方
* スマート家電/おうちハックが好きな方
* IFTTTが好きな方

## スタート(前提条件)
実現のためにIoT機器を使うため、下記の製品が必要となります。

* [スマートカーテン(SwitchBotカーテン)](https://www.switchbot.jp/products/switchbot-curtain)
* [スマートハブ(SwitchBotHubMini)](https://www.switchbot.jp/products/switchbot-hub-mini)
* [スマートボタン(Flic)](https://flic.io/)

:::note info
今回はノーコードで実現するため、特定のパブリッククラウドやプログラミング言語、IDE/SDKに関する知識は必要ありません。
:::

## ゴール(達成できること)
スマートボタンを押すと、スマートカーテンを操作しカーテンの開閉をコントロールする仕組みを、ノーコードで実現できるようになります。

## スコープ外(ふれないもの)
各製品やIFTTTのアカウント作成が必要ですが、本稿では触れません。
(難しい操作ではありませんがうまく行かない場合は、公式サイトをご確認ください)
また、製品そのものの詳細には深入りしません。

## 開発環境/再現環境/バージョンなど
各製品のアプリ及びSaaSにて実現するため開発環境は不要です。

# 本編(概要)
## 全体のイメージ
まず、全体像は以下のようになります。
スマートボタンを操作すると、IFTTTを経由してスマートカーテンを操作します。
(ツールの連携をするために、スマートフォンとスマートハブも途中経由します)

![abstract.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311160/50a29ee3-6b3f-1e50-9318-b2a8d28f8a63.png)


:::note warn
スマートフォンの代わりにFlicHubでも代替可能です。
FlicHubを使えばスマートフォンがなくても動作できるようになります。
スマートフォンでペアリングする場合は、スマートボタンとスマートフォンがBluetoothで通信できる必要があります。
:::


## スマートボタンとは
スマートボタンは、インターネットに繋がる汎用的で多目的なボタンです。
製品はいくつかありますが、今回はFlicという製品を利用します。
専用アプリがあり、連携先も多くあります。今回はWebHook経由でIFTTTのイベントを呼び出します。
ボタンのイベントは「①ボタンをクリックする」「②ダブルクリックする」「③ホールドする(長押しする)」の3種類があるため、それぞれ設定します。

## IFTTTとは

「if this then that」の略で、異なるプラットフォームのWebサービスを連携するSaaSです。
今回はこのサービスを用いて、スマートボタンとスマートカーテンのイベントを紐付けます。


## スマートカーテンとは

名前が少し誤解を生みやすいのですが、カーテンそのものではありません。
カーテンレールに設定し、カーテンを引きずることで、カーテンの開閉を行ってくれるIoT機器です。

<img width="200px" alt="カーテン.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311160/43744e04-37f1-812b-e77a-5be7a34d11f5.jpeg" title="xxx">

:::note warn
スマートカーテン1台では、1方向への移動しかできません。
中央から両開きのカーテンの場合は、2台必要となりますので、ご注意ください。
:::

# 本編(実装)
それでは、いよいよ実装に入っていきます。
最初に記載したとおり、今回はノーコードで実現します。

## Step1. ボタンをクリックしたらカーテンを開ける
まずは、一番シンプルにボタンを押したらカーテンを開けるところを作っていきます。

### IFTTTのアカウントを作る
https://ifttt.com にアクセスし、IFTTTのアカウントを作成します。
※すでにお持ちの方はこのステップは飛ばしてください。

### スマートボタンとスマートフォンのペアリング
1. まずは、flicのアプリをダウンロードします
2. ボタンをペアリングするために、PHONE > Add Flic to Phoneを選択します
3. ボタンを押して、アプリとペアリングさせます

<img width="200px" alt="ボタン1.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311160/ae5a156c-80d8-033f-422c-fd2b45be68c3.png">

### スマートハブ/スマートカーテンの設定
1. こちらも、SwitchBotのアプリをダウンロードします
2. ホーム画面の右上の「＋」からSmartHubMiniとSmartCurtainをペアリングします
    1. 日本語で案内がありますので、指示に従えば設定を完了できます
3. スマートカーテンを選択し、詳細を選択したあとに、設定(アイコン)からクラウドサービスを選択します
4. クラウドサービスを有効にし、IFTTTをタップし、IFTTTの画面でログインをします

<img width="400px" alt="カーテン1.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311160/a844ed1f-844d-c54c-f339-60fe2c440d66.png">


### IFTTTの設定
まず、実現したいことは、Webhookを受け付けたらSwitchbotのカーテンを開く機能を呼び出すことです。

:::note warn
Flicにも専用のサービスがあるのですが、実装を疎結合にするためにWebHookを使ってイベントを作ります
:::

1. 自分のWebHookのkeyを確認します
    * https://ifttt.com/maker_webhooks のdocumentationを選択し、自分のKeyをメモします
2. IFTTTのCreateでアプリを作ります
3. 「If This」をクリックし、「Webhooks」を選択し、「Receive a web request」を選択します
4. EventNameにわかりやすいイベント名(openなど)を付け、「Create trigger」を押下します
5. 「Then That」をクリックし、「SwitchBot」を選択し、「カーテンをコントロール」を選択します
6. カーテンを選択し、アクションを選択するで「開く」を選び、「Create action」を押下します

![IFTTT1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311160/d3a67452-0d28-6364-7c2e-e50733d458db.png)

### スマートボタンのアプリの設定
ここでは、スマートボタンがクリックされたときに、上記のWebHookを呼び出せるようにします
1. ペアリングしたボタンを選択し、Clickイベントを選択します
2. 「Advanced」から「Internet Request」を選択します
3. メソッドから「GET」を選択し、 URLに下記を設定します
　・https://maker.ifttt.com/trigger/{イベント名}/with/key/{key}
5. その他は入力せずに、「SaveACTION」を押下します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311160/fd22ee8e-7947-17ce-3677-291c5ec64745.png)

### 動作確認
1. ボタンをクリックして、カーテンが開くことを確認します

## Step2. ボタンをダブルクリックしたらカーテンを閉める
ほぼ同じなので、省略させていただきます。
Step1との差異は下記のとおりです
・カーテンの操作が、開くではなく閉じる(IFTTTの設定のスマートカーテンの操作)
・イベントの紐付けが、クリックではなくダブルクリックで行う(スマートボタンのアプリの設定)


## Step3. ボタンをホールドしたら、スヌーズする
では、最後に一番やりたかったカーテンのスヌーズ機能を作っていきます。

### 情報整理
まず、流れを確認しておきます。

1. 開きかけのカーテンを閉める
2. 一定期間待つ(今回は5分)
3. カーテンを開ける

:::note info
開きかけのカーテンを閉めるのは、ボタンをホールドするまでの間にカーテンが開いてしまうので、一旦閉めるためです。
:::

つづいて、今までに作ったものを確認します。

* ボタンをクリックすると、カーテンを開ける
* ボタンをダブルクリックすると、カーテンを閉める

最後に、実現のために必要な残りの機能を確認します。

* 遅延処理を作る
* 複数の処理を連続して呼び出す

:::note warn
Flicアプリにも、遅延のイベントがありますが、Flic2でないと利用ができないため、今回は、IFTTT/WebHook側で実現しています。
:::

情報が整理できたところで、実現するホールドの機能や順番を下記に整理します。
①、②の順番を作る部分と、黄色の遅延用URLを呼ぶという部分が新規になります。

![スヌーズ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311160/1bc076bc-357d-a952-a9cb-60080558e30f.png)


### 遅延処理を作る
IFTTTで遅延を作る場合は、下記の記事に従って、特定のURLを呼び出すことで実現できます。

* [How to add a delay to an IFTTT action](https://help.ifttt.com/hc/en-us/articles/360059005834-How-to-add-a-delay-to-an-IFTTT-action)

具体的には、下記のURLを呼び出します

* https://lab.grapeot.me/ifttt/delay?event={EVENTNAME}&t={DELAYINMINUTES}&key={WEBHOOKSKEY}
    * EVENTNAME:WebHookの作成時に指定したイベント名(openなど)
    * DELAYINMINUTES:遅延時間
    * WEBHOOKSkey:WebHookのシークレットキー

そのため、今回は、「https://lab.grapeot.me/ifttt/delay?event=open&t=5&key={KEY} 」とすれば、呼び出してから5分後にopenイベントのWebHookを呼び出してくれます。

### 複数の処理を連続して呼び出す
イベントを複数設定する方法は簡単で、アプリで複数個設定すると順番に実行してくれます。
以下のように、closeのイベントと遅延後にカーテンを開けるWebHookを順番に設定します。

![スヌーズ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311160/a952a0dd-ff89-5d24-a1ba-bc45bf94bc38.png)


:::note info
遅延時間は5分としています。t=5の部分をお好きな時間にすることでスヌーズ時間が変わります。
なお、遅延には1.5(1分30秒)のような指定も可能です
:::

### 動作確認
ボタンを長押しすると、カーテンスヌーズ(カーテンが閉じて5分後に開く)ができました。

# 補足/備考
 今回は一つの具体的な例として、スマートボタンとスマートカーテンを使いましたが、工夫次第で様々な機器を入出力にすることができます

* [いろいろなスマート機器とその連携を紹介している記事](https://qiita.com/kazutxt/items/f56f8eb339fc7da952ea)

:::note alert
本稿に記載されている情報は、2021年11月時点のもので、各製品やサービスは常に機能追加/変更が行われているため、ご留意ください
:::


記載されている会社名、製品名、サービス名は、各社の商標または登録商標です。