IoT入門！GoogleHomeであったかウキウキLIFE



これは[Yahoo!JAPAN 18 新卒 Advent Calendar 2018](https://adventar.org/calendars/3388)の13日目の記事です。
前回は@hasokonさんの[Flutter入門　〜アプリ初心者がFlutter触ってみた〜](https://qiita.com/hasokon/items/071e7632f3f470fede58)でした。
#はじめに
IoTが楽しそう。
GoogleHomeでリモコン制御とかベタだけどやりたい！

簡単かつ応用がきく方法を探しました。

3ステップでGoogle Homeでエアコンを付けるまでを書いていきます。

# 準備
使ったモノ

- Raspberry Pi 3 Model B+
- ADRSIR　ラズベリー・パイ専用 学習リモコン基板
- Google Home Mini

利用したもの

- IFTTT https://ifttt.com/discover
- Beebotte https://beebotte.com/home
- Node-RED

### 手順

大まかな流れとしては、以下のようになります。
Google Home -> IFTTT -> Beebotte -> RaspberryPi 

実作業としては
エアコンのスイッチを押すところから一歩ずつ離れていくイメージで進めます。

#STEP1: ラズパイのターミナルからエアコンON
ADRSIRとラズパイを結合させます。

今回はADRSIRの2番のスイッチにエアコンの赤外線を登録します。
learnモードに切り替えて(緑で囲った部分)、2番(ピンク)を押したあとに、エアコンのリモコンのスイッチを押したら完了です。

赤外線の登録に成功すると光ります。


![ADSIR.jpg](https://qiita-image-store.s3.amazonaws.com/0/310073/84c27ddd-1684-963f-3e68-3c77ccdc8b77.jpeg)

2番のボタンを押してエアコンが付いたら成功！

ボタンに記憶させるのは10個までですが、赤外線のデータをファイルに書き込んでから、再度別のものを登録すれば、100でも200でも登録できます。(そんなにたくさんリモコンないですが)

次にADRSIRの公式サイトから、ファイルをダウンロードします。
3種類のプログラムが用意されていますが、今回はIR-remocon02-commandline.pyを使います。
詳細は公式の仕様書に記載してあるので、コマンドだけを載せます。


```
# ADRSIRの2番の赤外線情報をファイルに書き込む
$ python3 I2C0x52-IR/IR-remocon02-commandline.py r 1 > 2.dat

# 2番の赤外線データを引数に、実行
$ python3 I2C0x52-IR/IR-remocon02-commandline.py t `cat 2.dat`
```
ボタンは1-10ですが、コマンドで指定するときには0-9なので数字が1ずれることに注意です。


ラズパイのターミナルからエアコンをつけることに成功しました！

#STEP2: Node-REDからエアコンON
ラズパイにNode-REDをインストールします。

```
$ sudo apt-get install nodered
$ update-nodejs-and-nodered 
$ node-red-start
Start Node-RED
 
Once Node-RED has started, point a browser at http://***.***.*.***:1880
On Pi Node-RED works better with the Firefox or Chrome browser

```
ブラウザでアクセスすると、Node-REDのフロー作成画面が出てきます。
このあとは、適切なパーツを組み合わせていきます。

- 入力　ラズパイで左クリック
- 出力　exec (指定したコマンドを実行する)
<img width="1121" alt="スクリーンショット 2018-12-06 7.53.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/310073/fc5f0c51-40f8-80c7-4b6c-0cbdc7f7580a.png">



入力と出力を線でつないで、デプロイボタンを押します。

そしてラズパイで左クリック。
エアコンが付きました！

#####補足
execコマンドですが、ラズパイのターミナルで用いたコマンドでは動かなかったため、``cat 2.dat``の部分を消して、2.datの中身をべた書きしました。もっとスマートな方法があるのかもしれません。

#STEP3: Google HomeからエアコンON
やっとここまで来ました。
Google HomeからNode-REDをつなぐのに、GoogleアシスタントとIFTTTとBeebotteを使いました。
まずは、Beebotteでメールアドレスを登録し、Channelを作ります。
<img width="962" alt="スクリーンショット 2018-12-06 8.01.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/310073/5c2c13bb-75d7-1b87-fdda-2b876d366cb9.png">
ここで作ったChannelのChannel nameとResource nameが後に使うwebhookのURLになります。

`https://api.beebotte.com/v1/data/publish/{Channel name}/{Resource name}?token={token}
`

次にIFTTTに登録します。
IFTTTで連携できる対象がとても広いのに驚きました。
今回はGoogleアシスタントとwebhookを選択します。

Googleアシスタントの設定では
`What do you want the Assistant to say in response?`にGoogle Homeに返してほしい言葉を入れます。

webhookを以下のように設定します。


<img width="413" alt="スクリーンショット 2018-12-05 22.47.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/310073/df0337c3-cef7-4935-8eed-50ffee43d703.png"><img width="389" alt="スクリーンショット 2018-12-12 22.36.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/310073/f23b691a-b895-ac9a-7118-6185bb3db721.png">

最後にNode-REDの設定をします。

TCP/IP上で動くMQTTプロトコルがIoTに適しているらしく、
BeebotteとラズパイがMQTTで通信する用のmqtt-brokerノードを使います。

<img width="1122" alt="スクリーンショット 2018-12-06 7.58.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/310073/d9447e13-d34d-4fa9-d4c3-f43e43627115.png">
サーバのプロパティ設定画面のセキュリティ項目では、ユーザ名を`token:{token}`としました。

これで準備が整いました。

####実践

私　「OK Google, 暖房ON」

Google Home 「あったかくなーれ」

「ピ」

ついたーーーー！！！

IFTTTのAppletを確認するとRunされています。Node-RED上でもOKマークが付いています。


#感想
今回は、ネットで調べるとほしい情報が得られたので、初心者の私でも何とかできました。
Google Homeとラズパイでエアコンを付けるための方法を色々調べてトライしましたが、
この方法で唯一（期限までに）うまくいったので、きっと数ある中で簡単な方法なのだと思います。

Node-REDやIFTTTは色々な連携機能が揃っているので、もっと色々なことができそうです！
今後はセンサで色々なものを、はかってみたいと思います！

# 参考にした記事
http://hero.hatenablog.jp/entry/2018/01/08/094908
https://qiita.com/from_Unknown/items/5cf452cbf0ca74c4248a
https://qiita.com/tetotetote/items/4d6ac866b716695fa4c9
https://signal-flag-z.blogspot.com/2018/01/google-home-raspberry-pi-node-red.html
https://qiita.com/moritalous/items/e1d5c520b07d859889ef