google homeでテレビをつける（普通の家電版）

# 概要
raspiに赤外線学習リモコン[irMagician](https://www.switch-science.com/catalog/2150/)を繋げて， スマート家電ではないテレビの電源を操作するプログラムをgoogle homeから実行させてみました
かなり殴り書きです。ごめんなさい。。。

# ゴール
google homeに話しかけて普通のテレビの電源を制御します
　<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">IFTTT×raspi×irMagician<br>raspiとgoogle homeでテレビの電源操作してもらうようにした <a href="https://t.co/zcGeh4UDGi">pic.twitter.com/zcGeh4UDGi</a></p>&mdash; mori takuto(gump) (@m___04v) <a href="https://twitter.com/m___04v/status/1022693234181529602?ref_src=twsrc%5Etfw">2018年7月27日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 用意するもの
- [Raspberry Pi](https://www.raspberrypi.org/)
- [irMagician](https://www.switch-science.com/catalog/2150/)
- [google home](https://store.google.com/product/google_home_mini_family?utm_source=ja_jp-ha&utm_medium=GoogleSearch-hybrid&utm_content=all&utm_campaign=google_Home_JP&gclid=CjwKCAjw4uXaBRAcEiwAuAUz8EllDOy0Gy3Nzt4t5kBjSBnlTmXAU812uzSb4AeUxb3iPeiV5vVbvBoCqmcQAvD_BwE&dclid=CKP5gKKhvtwCFUrOvQodDoAG7g)

# システム構成図
今回のシステムの流れを簡単な図にすると
![スクリーンショット 2018-09-16 17.56.22.png](https://qiita-image-store.s3.amazonaws.com/0/192773/1c8196d4-0f8e-2c7d-7aa3-e746bb113a57.png)

1. 「OK,google　テレビつけて」でgoogle assistantからIFTTTのApplet起動
2. webhookからMQTTのbrokerへpulishする
3. brokerにsubscribeしているraspiのNode-redがメッセージを受け取りプログラムを実行
4. irMagicianから赤外線を照射してテレビをつける

参考：[IFTTT から Raspberry Pi に指示を出す](https://qiita.com/minatomirai21/items/4c4e777b43ede1e42900)



# ステップ
1. irMagicianの使い方
2. irMagicianでテレビの電源を操作
3. [Beebotte](https://beebotte.com/home)の登録＆設定
4. IFTTTの登録＆設定
5. raspiに[Node-RED](https://nodered.jp/docs/hardware/raspberrypi)をインストール&起動

## irMagician
スマート家電ではないテレビをつけるために赤外線学習モジュールである、「irMagician」を使います
（赤外線で操作できる家電は基本的に操作可能。今回はテレビにしたがエアコンでも動作した）

Amazon:https://www.amazon.co.jp/%E5%A4%A7%E5%AE%AE%E6%8A%80%E7%A0%94-irMagician-%E9%AB%98%E6%80%A7%E8%83%BD-%E4%BD%8E%E4%BE%A1%E6%A0%BC-%E8%B5%A4%E5%A4%96%E7%B7%9A%E3%83%AA%E3%83%A2%E3%82%B3%E3%83%B3/dp/B074Z3TZ1R/ref=sr_1_1?s=industrial&ie=UTF8&qid=1537088718&sr=1-1&keywords=irmagician

### 使い方
設定はこちらを参考：[Raspberry Pi と irMagician（赤外線モジュール）で家電を操作する](https://qiita.com/minatomirai21/items/7581777065f27621ee0c)
raspiでirMagicianが使用可能になったらgithubから以下のリポジトリをclone
https://github.com/netbuffalo/irmcli

```
$ git clone https://github.com/netbuffalo/irmcli
```

pipがなければinstall
pipで必要なパッケージをinstall

```
$ sudo apt-get install python-pip
$ sudo pip install pyserial
```

### 赤外線の保存と実行
以下のようにプログラムを実行して照射した赤外線をファイルに保存します
実行中にテレビのリモコンをirMagicianに向けて電源ボタンを押します

```
$ python irmcli.py -s  -f tv.json
Saving IR data to tv.json ...
Done !
```

これでテレビの電源を制御する赤外線をファイルに保存することができたはず

保存ができたら実行して照射してみます

```
$ python irmcli.py -p -f tv.json
Playing IR with tv.json ...
... Done !
```

テレビの電源が切り替われば成功
テレビの電源はトグルのため、ついていれば消え、消えていればつくはず
一方、エアコンは電源入、電源切で異なる赤外線を発しているためそれぞれ保存する必要があります

## Beebotte
今回は、「OK,google.テレビつけて」の命令をraspiに送るためにMQTTを使います
そしてMQTTのbroker（データを受け取るところ？）として[beebotte](https://beebotte.com/home)を使います
参考：[MQTT入門(導入編)](https://qiita.com/pocket8137/items/0205b7a1c0b38890523e)

### 設定
こちらは、ほとんど参考記事と同じことをしています
が、channel名などが異なるものを使用しているので載せさせていただきます

#### channelの作成
[Create New]を押して新しいチャンネルを作成します
![スクリーンショット 2018-09-16 18.27.47.png](https://qiita-image-store.s3.amazonaws.com/0/192773/521a434b-74a8-625c-a8bf-eb5f24ecf1e3.png)

画像のように入力して[Create channel]を押してチャンネル作成を完了します

作成したチャンネルを選択しTokenを確認します
![スクリーンショット 2018-09-16 18.28.29.png](https://qiita-image-store.s3.amazonaws.com/0/192773/0cd4739b-cfbd-ba31-4dc1-1c3648e411ec.png)
紫色で隠れているとこをコピーしておきましょう


参考：[IFTTT から Raspberry Pi に指示を出す](https://qiita.com/minatomirai21/items/4c4e777b43ede1e42900#beebottemqtt-broker%E3%81%AE%E8%A8%AD%E5%AE%9A)


## IFTTT
google assistantで認識した結果から[Beebotte](https://beebotte.com/home)にデータを送るために[IFTTT](https://ifttt.com/discover)を使います
IFTTTはさまざまなサービスを簡単につなぎ合わせることができます
LINEやTwitter,SlackなどのSNSツールからSpotifyなど非常にたくさんのサービスをつなぎ合わせることができます
今回はIFTTTを使って[google assistant]と[[webhook]を繋げたいと思います

### Appletの作成
IFTTTを使用するにあたり[Applet]と呼ばれるものを作成します
[New Applet]を押して作成を開始します
thisにはgoogle assistantを設定します

![スクリーンショット 2018-09-16 18.44.40.png](https://qiita-image-store.s3.amazonaws.com/0/192773/2ea64f9a-a851-7411-0787-e24223c2523a.png)

Say a phrase with a text ingredientを選択します
（＄で文字列パターンを使用できます）
![スクリーンショット 2018-09-16 18.44.52.png](https://qiita-image-store.s3.amazonaws.com/0/192773/c4eb12a0-ae8a-318c-0d6c-c3a35a65a33e.png)
今回は「テレビつけて」と「テレビ消して」に対応させるため以下のように設定します
これでgoogle homeが「しゃーなし消してやるで」とか返してくれるようになります
![スクリーンショット 2018-09-16 18.45.42.png](https://qiita-image-store.s3.amazonaws.com/0/192773/1bc0feae-79b3-6e92-5a3b-ac310cd0a0f1.png)
thisの設定は終わりです
thatには以下のようにwebhookを使います
![スクリーンショット 2018-09-16 18.45.58.png](https://qiita-image-store.s3.amazonaws.com/0/192773/34affffc-f884-db91-feba-455637221afa.png)
以下のように設定してください
「先ほどコピーしたToken」のところには先ほどコピーしたBeebotteのChannel Tokenを入力してください
![スクリーンショット 2018-09-16 18.47.24.png](https://qiita-image-store.s3.amazonaws.com/0/192773/07a74e83-1313-8aad-f855-52099dc170e8.png)

これで、「OK,google テレビつけて」と言ったら
Beebotteに

```json
{
  "message": "つけて"
}
```
というjsonがpublish（送信）されます

## Node-RED
以上までの手順でpublishされたjsonを読み取れるように今回はNode-redを使います
最新のOS(raspbian)にはすでにNode-redがインストールされているみたいなのでインストール手順は割愛させていただきます

### 起動
sshでraspiにログインして以下のコマンドでNode-redを起動します

```
$ node-red-start
Once Node-RED has started, point a browser at http://192.168.xx.xx:1880
On Pi Node-RED works better with the Firefox or Chrome browser

Use   sudo systemctl enable nodered.service  to autostart Node-RED at every boot
Use   sudo systemctl disable nodered.service to disable autostart on boot

To find more nodes and example flows - go to http://flows.nodered.org
16 Sep 10:03:55 - [info]

Welcome to Node-RED
===================

16 Sep 10:03:55 - [info] Node-RED version: v0.18.7
16 Sep 10:03:55 - [info] Node.js  version: v6.14.3
16 Sep 10:03:55 - [info] Linux 4.14.34-v7+ arm LE
```

http://192.168.xx.xx:1880 をブラウザで開きます

### フローの作成
1. 入力からmqttを選択して配置します
![スクリーンショット 2018-09-16 19.09.00.png](https://qiita-image-store.s3.amazonaws.com/0/192773/8d5f9cb2-a2b2-1f67-5beb-72210ac03ca5.png)

2. ダブルクリックで設定を開き
以下のように設定します
![スクリーンショット 2018-09-16 19.08.51.png](https://qiita-image-store.s3.amazonaws.com/0/192773/99a34d33-8dab-72c7-445c-ac974c758ee6.png)
(tv/tvのところはBeebotteで設定した[channel名]/[action名]になっています)

3. 画像の赤いところをクリックして詳細設定をします
![スクリーンショット 2018-09-16 19.12.56.png](https://qiita-image-store.s3.amazonaws.com/0/192773/56835917-4d02-2c4b-7e67-8a89ed759c8a.png)
![スクリーンショット 2018-09-16 19.15.58.png](https://qiita-image-store.s3.amazonaws.com/0/192773/0e35f05c-d7f5-08bd-f085-bb347ebd95ae.png)
紫のところに先ほどと同じようにchannel tokenを入力します

4. jsonとfunctionの配置
画像のようにjsonとfuncを配置してください
jsonは何も変更しなくてOKです
functionでは画像のように設定して完了してください
![スクリーンショット 2018-09-16 19.41.07.png](https://qiita-image-store.s3.amazonaws.com/0/192773/6fdda909-36e9-96a0-f433-beb0a3a93349.png)


5. 分岐をさせるSwitchの追加
「つけて」と「けして」だけに反応するように画像のように設定して完了します
![スクリーンショット 2018-09-16 19.22.59.png](https://qiita-image-store.s3.amazonaws.com/0/192773/245389d2-6ef7-52f1-ab44-ed23d1d5ae0c.png)

6. プログラムを実行させるexecの追加
execノードに実行させたいコマンドを入力してプログラムを実行させます
![スクリーンショット 2018-09-16 19.26.57.png](https://qiita-image-store.s3.amazonaws.com/0/192773/c1743799-17af-056f-5d67-6c7efbb2472f.png)
このときコマンドは、できるだけ絶対パスで入力してください

```python
/usr/bin/python /root/IFTTT/irmcli/irmcli.py -p -f /root/IFTTT/irmcli/tv.json
# python irmcli.py -p -f tv.json
```

以上で設定が完了です

うまくいけば以下の動画のように動いてくれるはずです
動画では「仕方ないのでつけてあげます」と言わせています
　<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">IFTTT×raspi×irMagician<br>raspiとgoogle homeでテレビの電源操作してもらうようにした <a href="https://t.co/zcGeh4UDGi">pic.twitter.com/zcGeh4UDGi</a></p>&mdash; mori takuto(gump) (@m___04v) <a href="https://twitter.com/m___04v/status/1022693234181529602?ref_src=twsrc%5Etfw">2018年7月27日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


是非 Google Home × IFTTT × irMagician で普通の家電をスマート家電に変身させちゃいましょう！