Posted at

Raspberry pi 3 を使って、 LINE から 赤外線リモコンを操作(その3:LINE から 赤外線リモコンを操作)

More than 1 year has passed since last update.


はじめに

出先からおうちの家電を動かしたい!ということで、

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 のインストール


terminal

$ 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(作成したチャネル) を返す


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を起動するディレクトリ に置く。

(例では、/home/pi/public_html/cgi-bin/)

LINE のチャネル設定にある "メッセージ送受信設定 -> Webhook URL" を以下の通り指定する。

※ abcdefg.xyz.ne.jp は前回取得したraspberry piのホスト名


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公式ページ

(2)LINE の pythonサンプル