myThingsを使ってLINE BOT APIで家電を操作する

以下の技術を使って、LINE BOT APIから家電を操作してみようと思います。

- [LINE BOT API](https://business.line.me/services/products/4/introduction)
- [myThings](http://mythings.yahoo.co.jp/)
- [IDCFチャンネル](http://www.idcf.jp/cloud/iot/)
- [iRemocon](http://i-remocon.com/)
- [webscript.io](https://www.webscript.io/)

myThingsは様々なWebサービスやIoT製品を相互連携させることができるサービスです。
執筆時点で連携可能なサービスは45種類あるのですが、その中にLINE BOT APIは含まれていません。
ただIDCFチャンネルを使うことによって、myThingsが公式にはサポートしていないサービスや自分で電子工作したデバイスも連携させることができます。

今回はそのmyThingsとIDCFチャンネル、市販されているiRemoconというネットワーク接続が可能な学習リモコン、そしてLINE BOT APIを使って、LINEから家電を操作してみようと思います。

連携のフローは以下のとおりです。LINE BOT APIから直接IDCFチャンネルにリクエストを送ることが困難であるためwebscript.ioというサービスを中継させています。（IDCFチャンネルには指定のヘッダーを付与しなければならないのですが、LINE BOT APIにそのヘッダを付与させるのができないため）
* * *
LINE BOT API --（メッセージ送信）--> webscript.io --(メッセージ送信)-->IDCFチャンネル <--（15分に1回のトリガー確認）-- myThings --（アクション実行）--> iRemocon --（赤外線送信）--> 家電
* * *

## 前提知識
各技術要素については以下のサイトを参考にしてください。

- LINE BOT API
[LINE BOT API Trialでできる全ての事を試してみた](http://qiita.com/betchi/items/8e5417dbf20a62f2239d)

- myThings
[【myThingsハンズオン】myThingsアプリの概要を理解しよう](http://qiita.com/yamamotomanabu/items/efb8ce3756b5a4929d59)

- IDCFチャンネル
[【myThingsハンズオン】IDCFクラウドをセットアップしよう](http://qiita.com/yamamotomanabu/items/3fce62d8b271e6968fea)

- iRemocon
前提知識的なものは不要なのですが、市販のハードウェアなので、購入が必要なのと、インターネット連携のために有料会員になる必要があります。

- webscript.io
[サーバー不要で Lua 言語な webscript.io で ChatWork API を叩いてみる](http://c-note.chatwork.com/post/70464431401/webscript)

## 前提作業
上の前提知識でもって、LINE BOT API、myThings、IDCFチャンネル、iRemocon、webscript.ioのセットアップを完了させてください。
順序としては、
1. webscript.ioをセットアップ
2. LINE BOT APIをセットアップ（1で作成したURLをコールバックURLに設定する）
3. IDCFチャンネルをセットアップ
4. myThingsをセットアップ（IDCFチャンネルとiRemoconチャンネルをアクティベート）

という順番で進めるとスムーズです。
1,2に関しては、[webscript.ioでLINE BOT APIの事始め](http://yamamotomanabu.hatenablog.com/entry/2016/04/08/webscript.io%E3%81%A7LINE_BOT_API%E3%81%AE%E4%BA%8B%E5%A7%8B%E3%82%81)が参考になると思います。

## myThingsで組み合わせ作成
以下のように組み合わせを作成します。ポイントはIDCFチャンネルのトリガーに「trigger-1」を使っていることです。「trigger-1〜5」のいずれかが設定可能ですが、何を使うかによって、後述するwebscript.ioのスクリプトに設定するmyThingsの認証情報が変わりますので注意してください。
![6bb8b4cfbe3d3c155697.jpg](https://qiita-image-store.s3.amazonaws.com/0/51093/482de243-9004-89e3-3578-1f863deea20c.jpeg)

## webscript.ioでスクリプト作成
以下のようにスクリプトを作成します。

```rua:myThings連携
-- LINE BOT API の認証情報
ChannelID = あなたのLINE BOT APIのChannel ID
ChannelSecret = あなたのLINE BOT APIのChannel Secret
MID = あなたのLINE BOT APIのMID

-- myThingsの認証情報
ip = あなたのIDCFチャンネルのIPアドレス
meshblu_auth_uuid = あなたのIDCFチャンネルのtrigger-1のUUID
meshblu_auth_token = あなたのIDCFチャンネルのtrigger-1のtoken

-- 受信メッセージから送信メッセージを構築
body = json.parse(request.body)
reply = body.result[1].content.from
data = {
	['to'] = {reply},
	['toChannel'] = '1383378250', -- 固定値
	['eventType'] = '138311608800106203', -- 固定値
	['content'] = {
		['contentType'] = 1,
		['toType'] = 1,
		['text'] = '電気消します'
	}
}

-- myThingsに通知
local status = http.request {
	url = 'http://' .. ip .. '/data/' .. meshblu_auth_uuid,
	method = 'POST',
	headers = {
		['meshblu_auth_uuid'] = meshblu_auth_uuid,
		['meshblu_auth_token'] = meshblu_auth_token
	}
}

-- メッセージ送信
local response = http.request {
	url = 'https://trialbot-api.line.me/v1/events',
	method = 'POST',
	data = json.stringify(data),
	headers = {
		['Content-Type'] = 'application/json; charser=UTF-8',
		['X-Line-ChannelID'] = ChannelID,
		['X-Line-ChannelSecret'] = ChannelSecret,
		['X-Line-Trusted-User-With-ACL'] = MID
	}
}

return true
```

## まとめ
これで作成したBOTにメッセージを送るとiRemoconから赤外線が送信され、家電を制御することができるようになりました。（ただmyThingsが15分に1回のポーリングで動くため、LINEでメッセージを送っても最大15分遅延して赤外線が送信されます。。）

今はどんなメッセージを送っても特定の赤外線しか送信できませんが、webscript.ioの中でメッセージを解析して、電源ONの時はtrigger-1、電源OFFの時はtrigger-2にリクエストを送るといったように振り分けて、myThingsアプリの組み合わせもそれを踏まえた内容にすることで、バリエーションに富んだ家電制御が可能になると思います。

今回myThingsやIDCFチャンネルについては説明をだいぶ端折ってしまいましたが、この記事を読んで興味が湧いたという方はこちらも併せてお読みください！
[myThingsハンズオンの参考資料](http://qiita.com/yamamotomanabu/items/4812d5a5574219eb03af)