Raspberry pi 3 を使って、 LINE から 赤外線リモコンを操作（その３：LINE から 赤外線リモコンを操作）

# はじめに
出先からおうちの家電を動かしたい！ということで、
LINE　の Messaging API （webhook） を利用し、
Raspberry pi 3 経由で、赤外線を使って、
おうちの家電製品を操作するような仕組み作りました。
備忘録として、思い出しながら記載します。

今回の構成は以下の通りです。
LINE -> raspberry pi(httpsサーバ) -> 赤外線リモコン -> エアコン

以下のとおり、３回に分けて説明します
- [赤外線リモコン から エアコン を操作(前々回)](https://qiita.com/na59ri/items/aea452f2487a393537dd)
- [httpsサーバ（apache + mod_wsgi） の構築（前回）](https://qiita.com/na59ri/items/01c6b5c08b4b2e9e4486)
- LINE から 赤外線リモコンを操作(今回)

# 環境
OS: Raspbian 9.1
**バージョンによって、設定方法など変わることに注意**

## LINE developerの登録
[LINE developerの公式ページ](https://developers.line.me/ja/docs/line-login/getting-started/) からdeveloperアカウント、プロバイダ、チャネルを作成ください。

## チャネル での設定
今回の設定は以下の通りです。
webhook URL は後述するため、ここではそれ以外の設定を記載します。

```text:チャネル
メッセージ送受信設定 -> Webhook送信　： 利用する
メッセージ送受信設定 -> Botのグループトーク参加　： 利用しない
LINE@機能の利用 -> 自動応答メッセージ ： 利用しない
LINE@機能の利用 -> 友だち追加時あいさつ　： 利用しない
```

## チャネル で必要な情報を取得
pythonで callback関数を作成する時に利用するため、以下の情報はメモして置く。

```text:チャネル
基本情報 -> Channel Secret
メッセージ送受信設定 -> アクセストークン（ロングターム）
```

## python 版のLINE SDK のインストール

```terminal:terminal
$ pip install line-bot-sdk
```

## callback関数のサンプルコード

callback関数（callback.wsgi） は python で記載しており、
具体的には、application関数 で、作成したチャネルに対して特定の文字を入力したら、以下の３つの処理を実現している。

- hot と入力したら、暖房を入れ、"hot ok" と line（作成したチャネル） に返す
- ice と入力したら、冷房を入れ、"ice ok" と line（作成したチャネル） に返す
- off と入力したら、エアコンを止め、"aircon off ok" と line（作成したチャネル） を返す

```python:callback.wsgi
#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import os, sys, json
from eventlet import wsgi
import eventlet

from builtins import bytes
from linebot import (
    LineBotApi, WebhookParser
)
from linebot.exceptions import (
    InvalidSignatureError, LineBotApiError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage
)
from linebot.utils import PY3

# Get instance
line_bot_api = LineBotApi('取得した アクセストークン（ロングターム） を記載')
parser = WebhookParser('取得した Channel Secret を記載')

def create_body(text):
    if PY3:
        return [bytes(text, 'utf-8')]
    else:
        return text
    
# application
def application(env, start_response):

    # check request method
    if env['REQUEST_METHOD'] != 'POST':
        start_response('405 Method Not Allowed', [('Content-Type', 'text/plain')])
        return create_body('Method Not Allowed')

    # get X-Line-Signature header value
    signature = env['HTTP_X_LINE_SIGNATURE']

    # get request body as text
    wsgi_input = env['wsgi.input']
    content_length = int(env['CONTENT_LENGTH'])
    body = wsgi_input.read(content_length).decode('utf-8')

    # parse webhook body
    try:
        events = parser.parse(body, signature)
    except InvalidSignatureError:
        start_response('400 Bad Request', [('Content-Type', 'text/plain')])
        return create_body('Bad Request')

    # analytics
    for event in events:
        if not isinstance(event, MessageEvent):
            continue
        if not isinstance(event.message, TextMessage):
            continue

        replyMessage = ''
        text = event.message.text
        
        # line で hot と入力したら、暖房を入れ、"hot ok" とlineを返す 
        if( text == "hot" ):
            replyMessage = 'hot ok'
            os.system("irsend SEND_ONCE aircon hoton")
        # ice と入力したら、冷房を入れ、"ice ok" とlineを返す
        elif( text == "ice" ):
            replyMessage = 'ice ok'
            os.system("irsend SEND_ONCE aircon iceon")
        # off と入力したら、エアコンを止め、"aircon off ok" とlineを返す
        elif( text == "off" ):
            replyMessage = 'aircon off ok'
            os.system("irsend SEND_ONCE aircon off")
        else:
            replyMessage = text
            
        try:
            line_bot_api.reply_message(event.reply_token,TextSendMessage(text=replyMessage))
        except LineBotApiError as e:
                
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return create_body('200 OK')
```

## チャネルにwebhook URL を登録
上記した callback.wsgi を　[前回指定したcgiを起動するディレクトリ](https://qiita.com/na59ri/items/01c6b5c08b4b2e9e4486) に置く。
（例では、/home/pi/public_html/cgi-bin/）

LINE のチャネル設定にある "メッセージ送受信設定 -> Webhook URL" を以下の通り指定する。
※ abcdefg.xyz.ne.jp は[前回取得したraspberry piのホスト名](https://qiita.com/na59ri/items/01c6b5c08b4b2e9e4486)

```text:WebhookURL
https://abcdefg.xyz.ne.jp/~pi/cgi-bin/callback.wsgi
```

Webhook URL の脇にある ”接続確認”ボタン を押して正常に動作するか確認する。

## チャネルを友達に追加して、実際の動作確認

チャネルの一番下に、「LINEアプリへのQRコード」　があるので、
スマホのLINE起動 -> 一番左のタブを選択 -> 右上の人型アイコンをタップ -> QRコード
を選択し、QRコードリーダーで読み込ませる。

すると、チャネルをともだちとして追加できる。

トークから、チャネルを選択し、以下の言葉を入力して、動作を確認する。

- hot と入力したら、暖房が入り、"hot ok" と 返信がある
- ice と入力したら、冷房が入り、"ice ok" と 返信がある
- off と入力したら、エアコンが止まり、"aircon off ok" と 返信がある


# 参照ページ
[(1)LINE developer公式ページ](https://developers.line.me/ja/) 
[(2)LINE の pythonサンプル](https://github.com/line/line-bot-sdk-python)