Raspberry Pi と Node-RED と IFTTT と Twitter で外から家電操作

スマートホーム楽しいですね。

1. Echo Dot購入
2. 「天気が聞ける目覚まし」だともったいない
3. 家電を操作したい
4. できた！感動！！
5. さらにスマホのAlexaアプリで外からも操作できる！！！
6. でもAlexaアプリが使いにくい⤵⤵⤵
7. Googleアシスタントでもできるようにしよう！！！！

ここまで来ました。

# Echoからの家電操作

Echoからの家電操作は以下の投稿が参考になると思います。
Node-REDがキモです。初代Raspberry Piでも問題なく動作します。

Raspberry Pi での Node-RED 利用
https://qiita.com/minatomirai21/items/184e04bab76bee70470e

ラズベリー・パイ専用 学習リモコン基板 ADRSIRを動かす(AlexaやNode-REDも使って)
https://qiita.com/michan06/items/08514e8e67960e45ff69

Amazon Echoで「○○をつけて」と言って家電を操作する
https://qiita.com/machu/items/122c8403b35748bd5f4c

Amazon Echoとラズパイで、音声で照明をon/offする
https://qiita.com/kikuzo/items/753b5065dde9633bda18

irMagician + Node-RED + Amazon Echo (互換機) - 設定編
https://qiita.com/ooo_6502/items/da30035e41b3dbe5391b

# Googleアシスタントからの家電操作

さて、Googleアシスタントを使った家電操作について調べたところ、大きく２つの方法が見つかりました。

* Raspberry PiをWebサーバーにしてDDNSで公開
* Beebotteというサービスを使う

Google HomeでRaspberry Piを経由してリモコンをコントロールする
https://qiita.com/from_Unknown/items/5cf452cbf0ca74c4248a

IFTTT から Raspberry Pi に指示を出す
https://qiita.com/minatomirai21/items/4c4e777b43ede1e42900

LINEをトリガーに家のGoogleHomeを喋らせる
https://qiita.com/ktetsuo/items/5cd3cc72f18fa885affd


[ポートの開放することなく、Respberry Piに外からアクセスする](https://qiita.com/moritalous/items/6ddd36f895ca656eac80)と投稿している以上、ポートを開放しない縛りでいきたいのと、単純に模倣するだけでは面白くないのでBeebotteを使わずTwitterを使うことにしました。

# 仕組み

![スマートホーム (2).png](https://qiita-image-store.s3.amazonaws.com/0/41574/a33231a7-cdcf-8d0e-8a27-e6d6b8ee1ee0.png)


| No | 説明 | 番号 |
|---|---|---|
|1|Googleアシスタントに「テレビつけて」と言う|①
|2|Googleアシスタントで「テレビつけて」を受けたら、Twitterに「テレビつけて」とツイートする|②③
|3|Node-REDでTwitterを監視。自分のアカウントが「テレビをつけて」とつぶやいたら家電操作|④⑤

簡単！ノンプログラミング！サーバーレス！マイクロサービス！

# IFTTTの設定

トリガーにGoogleアシスタント、アクションにTwitterを設定したのですが、一つ問題が発生しました。
Twitterの制限で同じ内容のツイートは１回しか呟けないようです。
そこで末尾にタイムスタンプをつけて回避します。

トリガーがGoogleアシスタントのときには{{CreatedAt}}というパラメーターを付与できるのですが上手くいかなかったので以下のようにして回避しました。

| No | トリガー | アクション |
|---|---|---|
| 1 | Googleアシスタントに「テレビつけて」 | Webリクエストで次のNo.2を呼ぶ |
| 2 | WebhookでNo.1のリクエストを受ける | Twitterに「テレビつけて{{OccurredAt}}」とツイート |

# Node-REDの設定

Twitter in ノードを使うことで、特定のユーザーのツイートを監視することができます。ツイートをトリガーにして、フローを作っていきます。

![スクリーンショット (288).png](https://qiita-image-store.s3.amazonaws.com/0/41574/55471d04-ee86-caca-7710-2ed79fead769.png)

![スクリーンショット (289).png](https://qiita-image-store.s3.amazonaws.com/0/41574/21a549fc-d689-9c25-a826-407f8827d688.png)

switchで「テレビつけて」が含まれるものだけにフィルターをかけ、execノードでテレビを付けるスクリプトを実行します。

![スクリーンショット (290).png](https://qiita-image-store.s3.amazonaws.com/0/41574/d8df50fa-e34e-84ad-368d-3fd67ec97b2a.png)


スクリプトだけは自力で作りました。
スクリプト実行後は、「つけました」と呟くもいいですし、更にIFTTTのWebhookにリクエストするなど、もう、なんでもできます。

# 終わりに

ポートの開放もないですし、各サービスのアカウントを乗っ取られない限り、
比較的セキュリティも確保できるのではないでしょうか？

注意点としてはTwitterのアカウントを専用に用意しツイートを非公開にすることをオススメします。そうしないと「テレビ消します」＝外出中がバレてしまいますので。

ちょっとタイムラグはありますが、実用的です。

# 番外編

私の朝食は食パンですが、よく買い忘れます。
上で紹介した仕組みを改良して、食パンがないときにスマホに通知が来るようにしました。
もうスマートホームではありません。スマート食パンです。

|No | トリガー&アクション | サービス |
|---|---|---|
| 1 | 家の近くのコンビニに近づいたら、Twitterに「食パンある？」と呟く|IFTTT + Android Location|
| 2 | Twitterの「食パンある？」つぶやきを監視し、HC-SR04(超音波距離センサー)で食パンとの距離を計測。30cm以上だったら「食パンなし」とする | Raspberry Pi + HC-SR04 |
| 3 | 食パンがないときは、Webhookを呼ぶ | IFTTT + Webhook |
| 4 | Webhookを受けたらLINE Notifyで「食パンないよ」と通知 | IFTTT + LINE Notify |
| 5 | 食パン買い忘れない！！ |

![スクリーンショット (292).png](https://qiita-image-store.s3.amazonaws.com/0/41574/ac024552-5bd1-9e23-7213-32022cc12038.png)

次は冷蔵庫の中監視したいな。。