Google Home / Slack を使って RM mini3 で家電制御

#システム構成
"[Firebaseを使って RM mini3 で家電制御](https://qiita.com/f_nishio/items/f6b14d88a2b2a25f3165)"と同様に、Google Homeに「部屋の明かりをつけて」と話しかけると赤外線リモコン対応シーリングライトを点灯させるシステムを実装してみます。
![slack-home.png](https://qiita-image-store.s3.amazonaws.com/0/88598/7767fdc6-2c66-94f5-b09d-ae8855cab7d5.png)

##必要なもの
1. Google Home - IFTTTのGoogle Assistant - Slack連携をトリガーします。
2. Raspberry Pi - Slackを監視して赤外線リモコンを制御するのに使います。
3. RM mini3とかeRemote mini - 赤外線リモコンの制御可能なら他も可。

#Google Assistant - Slack 連携
Google Home に話しかけるとSlackのチャンネルにリモコン制御コマンドを送るまで。

## Slackの設定
ユーザ名 rm-mini3 で Bots を登録します。リモコン制御コマンドはIFTTTからrm-mini3 botへのdirect messageとして送ります。
![slackbot.jpg](https://qiita-image-store.s3.amazonaws.com/0/88598/cd8f16e9-58a5-4171-5b98-d960bdabc097.jpeg)

## IFTTTの設定
Google Assistantに「部屋の明かりをつけて」と話しかけると、Slack botへDirect messageで制御コマンドを送るAppletを作成します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/88598/3462a5e4-f234-c4a8-a0a0-0de2b91e2367.png" width=30% />

## slackリモコン制御コマンド
Slackに送るリモコン制御コマンドを以下のように定義します。

|Command|Device|IR command|Description|
|:------|:-----|:---------|:----------|
|send   |light |on| on/off toggle |
|       |      |bright| brighter |
|       |      |dark| darker |

DeviceとIR commandの間は「:」で区切り、複数のコマンドを「,」で連結可能とします。例えば、電気をつけて明るくする制御コマンドはこんな感じ。

```text
send light:on, light:bright
```
##テスト
Google Homeに「部屋の明かりをつけて」と話しかけるとIFTTTを経由してslackにdirect messageが送られます。
![ifttt-slack.jpg](https://qiita-image-store.s3.amazonaws.com/0/88598/a2edb418-7c31-5d68-d7d7-028e795c447f.jpeg)

# Slackの監視とIRコマンドの送信
## Slack監視
Slack bot への direct message を監視するのに[slackbot](https://github.com/lins05/slackbot)を使うことにします。

```sh
$ pip3 install slackbot
```

IFTTTのdirect messageを監視するためには[dispatcher.py](https://github.com/fnishio/rm-slack/blob/master/patch/dispatcher.py)の修正・差し替えが必要です。IFTTTから送られてくるメッセージは 'text' property ではなく'attachements' の 'pretext' に入っているので、これを取り出すよう修正します。

```json:IFTTTから送られてくるmessage
{
  'username': 'IFTTT',
  'attachments': [{
    'pretext': 'send light: on',
    'fallback': 'send light: on',
    'mrkdwn_in': ['text', 'pretext']}],
  ...
}
```

direct message の中から'send'で始まる message を取り出して、その中からIR commandを取り出します。

```python
from slackbot.bot import respond_to
from libs import ir_code as ir
import re

@respond_to('send (.*)')
def send(message, command):
    #message.reply('accept command:' + command)
    commands = parse(command)
    for c in commands:
        ir.send_ir_command(c)

def parse(cmd_string):
    return [ x.strip() for x in cmd_string.split(',') ]
```

## IRコマンド送信

IR commandの送信には [python-bloadlink](https://github.com/mjg59/python-broadlink)を使います。direct messageから取り出したコマンド (light: on) をIR codeに変換してRM mini3に送ります。

```sh
$ pip3 install bloadlink
```

```python
import broadlink

# IR codes
ceiling_light = {
    'on' : '2600580000012...',
    'bright' : '26005800000129...',
    'dark' : '26005000000...'
}
codes = {
    'light' : ceiling_light
}

def send_ir_command(cmd_string):
    if (discover()):
        op, val = [ x.strip() for x in cmd_string.split(':') ]
        code = codes[op][val]
        send(code)
    else:
        print('no devices')

def discover():
    global devices
    if (devices is None):
        devices = broadlink.discover(timeout=5)
        devices[0].auth()
    return (devices is not None)

def send(code):
    data = bytearray.fromhex(code)
    devices[0].send_data(data)
```

# Integrate
これで、Google Homeに「部屋の明かりをつけて」と話しかけるとIFTTTを経由してslackにdirect messageが送られ、direct messageに指定されたIR制御コマンドをIRコードに変換してRM mini3に送る系が完成します。
あとは、IFTTT applet、制御コマンド、IRコードを拡張していけばOK.
例えば、TVを制御するのに以下のようなコマンドを定義して実装していけばよいでしょう。

|Command|Device|IR command|Description|
|:------|:-----|:---------|:----------|
|send|tv|on| on/off toggle|
|||1-12|Channel|
|||t|Telestrial|
|||bs|BS|
|||cs|CS|

サンプルコードは https://github.com/fnishio/rm-slack にas isで

# References
* [PythonのslackbotライブラリでSlackボットを作る](https://qiita.com/sukesuke/items/1ac92251def87357fdf6)
* [slackbot](https://github.com/lins05/slackbot)
* [python-bloadlink](https://github.com/mjg59/python-broadlink)
* [Firebaseを使って RM mini3 で家電制御](https://qiita.com/f_nishio/items/f6b14d88a2b2a25f3165)