Google Home からSmartでない家電を動かす


長かったのでの頭の整理と備忘録として。


# 0.1 やりたいことはこれ

Google Homeに声で命令して、Macを通して家電を操作。
（Macじゃなくラズパイでもいいんだけど、MacからiTunesも流したかったので、Macにした。）
![Artboard – 2.png](https://qiita-image-store.s3.amazonaws.com/0/212730/8a48fa37-e82e-b140-b2cf-093d4449c644.png)
参考にしたのはここらへん（ここのをまとめただけw）
https://qiita.com/azipinsyan/items/e5395e5b1dc7254bbbbd
https://jaxx2104.info/homekit-irmagician/
http://www.omiya-giken.com/?page_id=1196

# 0.2 大体の流れ
1. MacでirMagicianのセットアップ
2. MacにHome Assistantのセットアップ
3. IFTTTでGoogle HomeとHome Assistantを繋げる
4. OK Google!

*Google AssistantとHome Assistantは別物です。

# 0.3 必要なもの
Google Home, Mac, <a href="http://www.omiya-giken.com/" target="_blank">irMagician</a>, 赤外線で動く家電とリモコン

前提条件
・Google Home セットアップ済み
・MacでPythonが動く
・ネットに繋がる環境

*もしかしたら、モバイルルータじゃ動かないかもしれないです。


# 1  irMagicianのセットアップ

## 1.1
irMagicianを接続して、
`$ls /dev/ | grep cu.usbmodem`
僕の環境だと
`tty.usbmodem0121`
これで認識できてなかったら、1.2を試す。

## 1.2 ドライバのインストール
irMagician販売元の大宮技研さんサイトを参考
http://www.omiya-giken.com/?page_id=1196

ドライバは<a href="http://www.omiya-giken.com/irMagician/OSx-CDCACM-kext_for_irMagician_based_on_10.4.1.zip" target="_blank">大宮技研さんのとこ</a>から持ってきてください。


解凍したものをここに上書き（バックアップは任せます）。そしてMacを再起動。
/System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns

権限の変更必要みたいです。`
$cd /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns
$sudo chown -R root:wheel AppleUSBCDC.kext
$sudo chown -R root:wheel AppleUSBCDCACMControl.kext
$sudo chown -R root:wheel AppleUSBCDCACMData.kext`
 


## 1.3 irMagicianの学習
大宮技研さんのコードをベースにしたリモコンの学習と制御用のコード<a href="http://netbuffalo.doorblog.jp/archives/4872290.html" target="_blank"> irm.py </a>があったので活用しました。
ここ（11行目くらい）を1.1で見つけたものに変える。
ir_serial = serial.Serial("/dev/tty.usbmodem0121", 9600, timeout = 1)

オプション付きでpythonを走らせると以下のような動きができます。

①赤外線のキャプチャ
`$python irm.py -c`
このコマンドした後に、irMagicianの頭に向けてリモコンを発射で、赤外線の信号を学習。

②赤外線発射
`$python irm.py -o`
①の後にこのコマンドを打つと、キャプチャした赤外線の信号が送れます。

③キャプチャしてバッファに保存されている信号をこれでjsonデータに書き出せます。
`$python irm.py -s -f 適当な名前.json`

④保存した信号をjsonから読みだして赤外線発射
`$python irm.py -p -f 適当な名前.json`




# 2 Home Assistantの準備
基本的にここに法ってます。
https://qiita.com/azipinsyan/items/e5395e5b1dc7254bbbbd

## 2.1 Homeassistantのインストール
`$sudo pip3 install homeassistant`
以下のコマンドで、Home Assistant起動し、UIがブラウザで開きます。デフォルトでは特に面白くないです。
`$hass --open-ui`
こちらがブラウザで開きます。
http://localhost:8123/

## 2.2 設定ファイルの修正
下記ファイルを修正します。
/Users/ユーザ名/.homeassistant/configuration.yaml

```configuration.yaml
http:
  # Secrets are defined in the file secrets.yaml
  api_password: YOURPASSWORD #この行の先頭のコメントアウトを外して、任意のパスワードを設定する
  # Uncomment this if you are using SSL/TLS, running in Docker container, etc.
  # base_url: example.duckdns.org:8123
```

また、下記のように「switch」とそれに属する命令を適当な場所（一番下とか）に追加します。
terminalへの指示が直接書き込めます。

```configuration.yaml
switch:
  platform: command_line
  switches:
    light:
      command_on: "python2 /Users/ユーザー名//Documents/SmartHome/script/py/irm.py -p -f スイッチつける.json"
      command_off: "python2 /Users/ユーザー名//Documents/SmartHome/script/py/irm.py -p -f スイッチ消す.json" 
      # command_itunes: "osascript /Users/ユーザー名/Documents/SmartHome//script/as/itunestest.scpt" 
```
この例だと、command_onが実行されると、pythonファイルが走りますので、ここにirMagicianの命令のpythonを指定すればいいです。

command_itunesは、itunestest.scpt（apple script）が走り、iTunesのプレイリスト「トップ 25」が再生されるようになってます。

```itunestest.sc
tell application "iTunes"
  play playlist "トップ 25"
end tell
```

# 3 IFTTTの準備
IFTTTはGoogleHomeとHomeAssistantを繋ぐサービスです。
https://ifttt.com/discover

## 3.1 ルータのポート開放
<a href="http://192.168.1.1/" target="_blank">192.168.1.1</a>とかにアクセスして、ポートを開放してください。
Home Assistantのデフォルトだと、8123番ですが、適当に変えてもらってOKです。
ルータ（モデム）によって設定が異なると思うんで、ルータ名＋「ポート開放」とかでググってください。

ただし、モバイルルータの場合は、クライアントに192.168.1.100~以降が割り当てられていると思います。
その場合、ポートが開放できないようです。困ってますので、アイデアありませんか？
僕のMacはVPNで固定のネットワークと繋がってるのでできました。

## 3.2 IFTTTの設定
home assistantのconfiguration.yamlファイルで設定したパスワード使います。

```request.py
from requests import get

url = 'http://グローバルIP:開放したポート番号/api/services'
headers = {'x-ha-access': 'さっき指定したYOURPASSWORD',
           'content-type': 'application/json'}
response = get(url, headers=headers)
print(response.text)
```

上記を実行すると、ドメインとそれに含まれるサービスが記載されますので、頑張って探します（いまいちわかってないです）。
・ドメイン名：kitchen_light
・付ける方：turn_on
・消す方：turn_off

また、こちらを実行すると、entity_id（今回はswitch.kitchen_light）なるものがありますので、探します。

```request2.py
from requests import get

url = 'http://グローバルIP:開放したポート番号/api/states'
headers = {'x-ha-access': 'さっき指定したYOURPASSWORD',
           'content-type': 'application/json'}
response = get(url, headers=headers)
print(response.text)
```

## 3.3 IFTTTで新規レシピ作成
<a href="https://ifttt.com/" target="_blank">IFTTT</a>でアカウントを作ってください。
次に、<a href="https://ifttt.com/create" target="_blank">新規でレシピ</a>を作成します。


「this」で「google assistant」を選択。
今回は「Say a simple phrase」でいいでしょう。こんな感じで設定しました。
<img width="427" alt="Screen Shot 2017-11-15 at 13.21.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/212730/cbb36b82-1c63-fa22-5700-3dd0423c7cd2.png">


「that」は「webhooks」を選びます。一個しかないので、「Make a web request」にして、このように設定します。
URLとBODYは3.2の値を入れてください。

<img width="435" alt="Screen Shot 2017-11-15 at 13.26.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/212730/efdcab54-61f7-9f62-202e-19de66aa0d94.png">



# 4 OK Googleしてみる
「テレビつけて」って言ったら、irmagicianから赤外線が出てくると思います。イェイ！

google homeからMacいじれたので、なんでもできそうです。ただ、他のサービス使ってるからディレイがちょっと実用に耐え得らなそう。
google homeをラズパイに入れて、そのラズパイから直接irMagicianいじるのが良さそうです。

Mac母体にするなら、amazonのalexa入れるのが簡単そう。
https://qiita.com/marceline/items/1bcc66336bb7d63bfdc2

全ての家電をSmartにするのはお金もかかるし普及はしないだろうけど、何か間にデバイスをかますことでSmart Homeにできそうで、そっちの方向に発展していくんだと思います。