スマート家電も赤外線家電もGoogle Homeでまとめて操作

[Google Home](https://scrapbox.io/smart-home/Google_Home)に声をかけるだけで、赤外線では操作できないスマート家電も、赤外線でしか操作できない赤外線家電も、まとめて操作できるシステムを開発しました。
複雑な操作も簡単に実現できるので、シンプルにスマートホームを構築できます。
（他のシステムでは、家電のON/OFFのような単純な操作しかできなかったり、複雑な操作のためには複雑怪奇な設定が必要だったりします。）
「初心者でもできた！」という報告もたくさん頂いているので、ぜひお気軽にお試しください。

#できること
- 「OK Google、行ってきます」の一言で、スマート家電も、赤外線家電も、まとめてOFFにする
- 「OK Google、暖房 **`22`** 度」で、エアコンの設定温度を **`22`** 度にする
- 「OK Google、エアコンを **`6時半`** につけて」で、**`6時半`** にエアコンをつける
- 「OK Google、エアコンを **`7時間後`** につけて」で、**`7時間後`** にエアコンをつける
- 「OK Google、テレビの音量を **`4`** 上げて」で、音量アップを **`4`** 回繰り返す
- Twitterの通知を、[Google Home](https://scrapbox.io/smart-home/Google_Home)に喋ってもらう
- 外出先から、自宅のエアコンを、スマホで操作する

他のスマートリモコンとの比較はこちら → [スマートリモコンの比較表](https://scrapbox.io/smart-home/%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%AA%E3%83%A2%E3%82%B3%E3%83%B3%E3%81%AE%E6%AF%94%E8%BC%83)

#必要なもの
![necessary.png](https://gyazo.com/dda93e093247bcd30658a690f6e8bbd2/raw)

- [Google Home](https://scrapbox.io/smart-home/Google_Home) （グーグルホーム）
  - [Amazon Echo](https://scrapbox.io/smart-home/Amazon_Echo)でも可能ですが、IFTTT連携が使いづらい
  - IFTTTと連携できるなら、ほかのスマートスピーカーでもOK
- スマートリモコン
  - [RM Mini3](https://scrapbox.io/smart-home/RM_Mini3)
     - 格安のWiFi付き赤外線スマートリモコン（別名: 黒豆、Black Bean）
     - 海外通販なら千円強、国内通販だと3千円弱
     - ただし、RM Mini3は技適を取っていないことに注意
         - 技適のないWiFi機器でも、総務省に届け出れば、半年だけ実験的に使えるよう、[電波法が改正](https://twitter.com/tak_jg/status/1195287895373778944)(2019年11月20日に施行)されました
         - 半年以上、実験以外の目的で使う場合は、技適を取った同等の機種（[eRemote mini](https://scrapbox.io/smart-home/RM_Mini3)、約5千円）をお使いください
  - 自作も可能
     - 材料費は、たったの400円　→　[格安スマートリモコンの作り方](https://qiita.com/takjg/items/e6b8af53421be54b62c9)
- 自宅サーバ
  - Node.jsとRedisが動けばOK
  - [Raspberry Pi](https://scrapbox.io/smart-home/Raspberry_Pi)がお手軽
     - ラズパイZero WHなら、省エネかつ安価（1,800円）
  - Amazon　[Fire TV Stick](https://scrapbox.io/smart-home/Fire_TV_Stick%E3%82%92hubot%E3%82%B5%E3%83%BC%E3%83%90%E5%8C%96%E3%81%97%E3%81%A6RM_Mini3%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B)もサーバ化できます！
     - 第1世代でも、第2世代でも、動作報告を頂いています

#システム構成
下図のように、[Google Home](https://scrapbox.io/smart-home/Google_Home)　→　Google Assistant　→　IFTTT　→　Slack　→　自宅のhubotサーバ　→　[RM Mini3](https://scrapbox.io/smart-home/RM_Mini3)を経由して、赤外線家電を操作できるようになります。
![overview.png](https://qiita-image-store.s3.amazonaws.com/0/232397/8e214f09-b3f1-5ea1-6bfd-003de7d02868.png)
Slackのおかげで、自宅サーバに固定グローバルIPがなくても使えます。
（[ngrok](https://ngrok.com/)などで自宅サーバをネットに晒す必要がないので、安全で簡単です。）

hubotから[RM Mini3](https://scrapbox.io/smart-home/RM_Mini3)を操作するための拡張スクリプト（[hubot-broadlink-rm](https://github.com/takjg/hubot-broadlink-rm)）を私が作りました。

システムの構築方法は[[こちら]](https://scrapbox.io/smart-home/10%E3%83%89%E3%83%AB%E3%81%AERM_Mini3%E3%81%A8Google_Home%E3%81%A7%E5%AE%B6%E9%9B%BB%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)で詳しく解説していますが、まずは以下の本文を読んで、雰囲気を掴むことをおすすめします。

#赤外線家電の操作方法
**赤外線リモコンの学習と発信**
例えば、照明をつける赤外線リモコンを学習するには、
`learn light:on`
というメッセージを、Slack経由でhubotに送ります。
すると、[RM Mini3](https://scrapbox.io/smart-home/RM_Mini3)が学習モードになるので、照明のリモコンの点灯スイッチを押すと、学習が完了します。
学習した赤外線は`light:on`という名前でhubotが覚えてくれます。

学習した赤外線を発信するには、
`send light:on`
というメッセージをhubotに送ります。

**Google Homeから家電を操作**
IFTTTで、[Google Home](https://scrapbox.io/smart-home/Google_Home)に「OK Google、明かりをつけて」と話したら、
`send light:on`
をSlackに送るようにすれば、[Google Home](https://scrapbox.io/smart-home/Google_Home)から照明を点灯できるようになります。
（ちなみに「OK Google」と言わなくても、[見つめるだけでスマートスピーカーを起こす](https://qiita.com/takjg/items/afc6348ceed67868d41f) こともできます。）

**外出先からのエアコン操作**
IFTTTのButtonトリガーで、
`send aircon:on`
をSlackに送るようにすれば、スマホのウィジェットを押すだけで、外出先からエアコンをONにできます。
また、スマホの位置情報やWiFi接続の有無をトリガーにすれば、自動でONにすることもできます。

**複数の家電をまとめて操作**
`send`メッセージには、複数の赤外線信号を渡すこともできます。例えば、
`send light:on tv:on aircon:on`
とすれば、照明とテレビとエアコンを、まとめてONにできます。

**発信間隔の調整**
赤外線信号を発信する間隔を調整したければ、
`send light:on [2s] tv:on [1500ms] aircon:on`
というように微調整できます。（詳細は[こちら](https://scrapbox.io/smart-home/%E8%B5%A4%E5%A4%96%E7%B7%9A%E4%BF%A1%E5%8F%B7%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%92%E8%AA%BF%E6%95%B4%E3%81%99%E3%82%8B)）

**発信を繰り返す**
赤外線を発信する回数を`*3`と指定すれば、
`send  tv:vol:up*3`　　⇒　　`send  tv:vol:up  tv:vol:up  tv:vol:up`
というように、音量アップを3回繰り返すこともできます。
さらに、繰り返しの間隔も調整したければ、
`send  tv:vol:up[300ms]*3`　　⇒　　`send  tv:vol:up  [300ms]  tv:vol:up  [300ms]  tv:vol:up`
というように微調整できます。（詳細は[こちら](https://scrapbox.io/smart-home/%E7%99%BA%E4%BF%A1%E5%9B%9E%E6%95%B0%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B)）

この繰り返し機能を使えば、音量アップのIFTTTアプレットを1つに集約できるので、設定が楽になります。
「OK Google、テレビの音量を **`#`** 上げて」と言ったら、
`send tv:vol:up*{{NumberField}}`
をSlackに送信するIFTTTアプレットを1つ用意するだけで、「音量を **`3`** 上げて」も「音量を **`10`** 上げて」も実現できます。

**RM Mini3の使い分け**
複数台の[RM Mini3](https://scrapbox.io/smart-home/RM_Mini3)を所有している場合には、台所を消灯して寝室を点灯するというような、使い分けもできます。
それにはまず、個々の[RM Mini3](https://scrapbox.io/smart-home/RM_Mini3)を、MACアドレスやIPアドレスで識別して、台所（`@kitchen`）や寝室（`@bedroom`）という名前を付けます。
`set @kitchen aa:bb:cc:dd:ee:ff`
`set @bedroom 192.168.135.246` 
すると、`send`メッセージの中で、赤外線を発信させる[RM Mini3](https://scrapbox.io/smart-home/RM_Mini3)を指定できるようになります。
`send light:off@kitchen light:on@bedroom`

格安の[RM Mini3](https://scrapbox.io/smart-home/RM_Mini3)なら、家中のすべての部屋に設置しても、財布に優しいので、家全体のスマート化に打って付けです。

**きめ細かな操作も簡単**
これらの機能を組み合わせれば、きめ細かな操作も、簡単に実現できます。
例えば、「OK Google、外部入力 **`#`** 番」で、テレビの表示を **`#`** 番目の外部入力に切り替えるには、
`send tv:dttv [2s] tv:source[3s]*{{NumberField}}`
というメッセージを送るIFTTTアプレットを用意します。

「OK Google、外部入力 **`2`** 番」と言えば、
`send tv:dttv [2s] tv:source[3s]*2`　⇒　`send tv:dttv [2s] tv:source [3s] tv:source`
となって、地デジ切替（`td:dttv`）の2秒後に、入力切替（`tv:source`）が送信され、さらに3秒後に入力切替（`tv:source`）が送信されるので、テレビには2番目の外部入力が表示されます。

また、「OK Google、外部入力 **`0`** 番」と言えば、
`send tv:dttv [2s] tv:source[3s]*0`　⇒　`send tv:dttv`
となって、地デジ切替（`td:dttv`）だけが送信されます。そこで、Homeアプリのショートカット機能で、「地デジ」を「外部入力 **`0`** 番」に置き換えれば、「OK Google、地デジ」と言うだけで、テレビが地デジに切り替わります。

たった1つのIFTTTアプレットだけで、複雑かつ、きめ細かな操作を、簡単に実現できました。

#スマート家電の操作方法
赤外線では操作できないスマート家電も、赤外線家電と同じように、`send`メッセージで操作できます。

例えば、WebAPIで操作できるスマート家電を考えてみましょう。

このスマート家電の電源をONにするWebAPIのURLが、
`https://SMART.DEVICE/API/on`
だとすると、以下のようなUNIXのコマンド：
`curl -s https://SMART.DEVICE/API/on`
を実行すれば、電源をONにできます。

このコマンドを`send`メッセージで扱うには、まず、
`command  smart:on  curl -s https://SMART.DEVICE/API/on`
というメッセージを送って、`smart:on`という名前で、hubotにコマンドを登録します。

あとは、赤外線家電と同じように、
`send  smart:on()`
というメッセージを送れば、hubotがコマンドを実行して、スマート家電がONになります。

間隔調整や繰り返しも、同じように指定できます。
`send [7h] smart:on()[15m]*3`

なお、WebAPIのないスマート家電でも、IFTTTにさえ対応していれば、IFTTT経由でWebhookを簡単に設置できます。（詳細は[こちら](https://scrapbox.io/smart-home/IFTTT%E5%AF%BE%E5%BF%9C%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%82%92Webhooks%E3%81%8B%E3%82%89%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B)）

#スマート家電と赤外線家電をまとめて操作する方法
スマート家電と赤外線家電をまとめて操作するには、単に、
`send  smart:on() tv:on light:on`
と並べるだけです。どんな種類の家電も、分け隔てなく、同じように扱えます。

#まとめ
[RM Mini3](https://scrapbox.io/smart-home/RM_Mini3)と[hubot-broadlink-rm](https://github.com/takjg/hubot-broadlink-rm)を使えば、たった1つのIFTTTアプレットだけで、[Google Home](https://scrapbox.io/smart-home/Google_Home)から、様々なデバイスを、ひとまとめに、きめ細かく操作できます。
IFTTTアプレットを無駄にたくさん作らずに済むので、スマートホームをシンプルに構築できます。

生活に直結するものなので、シンプルに、簡単に、運用できることは、このシステムの大きな強みです。
公開から2ヶ月でまだ数千ダウンロード程度ではありますが、「簡単に構築できた！」という声をたくさん頂いています。

より多くの方々に、快適なスマートホームを、手軽に、格安で体験していただければ、開発者冥利に尽きます。
まずは手始めに、赤外線家電のスマート化、スマート電球、スマートコンセントなどから、ご自宅をスマート化してみてはいかがでしょうか。
システムの構築方法は、こちらで詳しく説明しています →　[RM Mini3とGoogle Homeで家電を操作する方法](https://scrapbox.io/smart-home/10%E3%83%89%E3%83%AB%E3%81%AERM_Mini3%E3%81%A8Google_Home%E3%81%A7%E5%AE%B6%E9%9B%BB%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)

#おまけ（Twitterの通知をGoogle Homeに喋らせる方法）
（注：[Fire TV Stick](https://scrapbox.io/smart-home/Fire_TV_Stick%E3%82%92hubot%E3%82%B5%E3%83%BC%E3%83%90%E5%8C%96%E3%81%97%E3%81%A6RM_Mini3%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B)では、残念ながら[Google Home](https://scrapbox.io/smart-home/Google_Home)に喋らせられません。）

まず、「[テキストをGoogle Homeに喋らせるUNIXコマンド](https://scrapbox.io/smart-home/Google_Home%E3%81%AE%E5%96%8B%E3%82%89%E3%81%9B%E6%96%B9)」を用意します。
次に、このコマンドを`say`という名でhubotに登録します。
すると、喋らせたいテキストを`say`に与えるだけで、
`send say(太郎さんからフォローされました！)`
[Google Home](https://scrapbox.io/smart-home/Google_Home)が「太郎さんからフォローされました！」と喋ってくれます。

あとは、IFTTTで、twitterでフォローされたら、
`send  say({{FullName}}さんからフォローされました！)`
をSlackに送るよう設定すれば、Twitterの通知を[Google Home](https://scrapbox.io/smart-home/Google_Home)が教えてくれるようになります。