はじめに
出先からおうちの家電を動かしたい!ということで、
LINE の Messaging API (webhook) を利用し、
Raspberry pi 3 経由で、赤外線を使って、
おうちの家電製品を操作するような仕組み作りました。
備忘録として、思い出しながら記載します。
今回の構成は以下の通りです。
LINE -> raspberry pi(httpsサーバ) -> 赤外線リモコン -> エアコン
以下のとおり、3回に分けて説明します
- 赤外線リモコン から エアコン を操作(前々回)
- httpsサーバ(apache + mod_wsgi) の構築(前回)
- LINE から 赤外線リモコンを操作(今回)
環境
OS: Raspbian 9.1
バージョンによって、設定方法など変わることに注意
LINE developerの登録
LINE developerの公式ページ からdeveloperアカウント、プロバイダ、チャネルを作成ください。
チャネル での設定
今回の設定は以下の通りです。
webhook URL は後述するため、ここではそれ以外の設定を記載します。
メッセージ送受信設定 -> Webhook送信 : 利用する
メッセージ送受信設定 -> Botのグループトーク参加 : 利用しない
LINE@機能の利用 -> 自動応答メッセージ : 利用しない
LINE@機能の利用 -> 友だち追加時あいさつ : 利用しない
チャネル で必要な情報を取得
pythonで callback関数を作成する時に利用するため、以下の情報はメモして置く。
基本情報 -> Channel Secret
メッセージ送受信設定 -> アクセストークン(ロングターム)
python 版のLINE SDK のインストール
$ pip install line-bot-sdk
callback関数のサンプルコード
callback関数(callback.wsgi) は python で記載しており、
具体的には、application関数 で、作成したチャネルに対して特定の文字を入力したら、以下の3つの処理を実現している。
- hot と入力したら、暖房を入れ、"hot ok" と line(作成したチャネル) に返す
- ice と入力したら、冷房を入れ、"ice ok" と line(作成したチャネル) に返す
- off と入力したら、エアコンを止め、"aircon off ok" と line(作成したチャネル) を返す
#!/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を起動するディレクトリ に置く。
(例では、/home/pi/public_html/cgi-bin/)
LINE のチャネル設定にある "メッセージ送受信設定 -> Webhook URL" を以下の通り指定する。
※ abcdefg.xyz.ne.jp は前回取得したraspberry piのホスト名
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" と 返信がある