Beebotteを使ってLINEメッセージでLEDをON/OFFする(その3)LINEリッチメニューからRaspberryPiのLEDを点灯
LINEからRaspberryPiのLEDを点灯させてみようと思います。💪
たぶん(その1)、(その2)のプログラムを組み合わせれば、簡単にできてしまいそうですが、当初の設計ではRaspberryPiからLINEまでメッセージを戻すことが難しいlことに気が付きました。
そこで、通信の流れを以下のように変更しました。
その2ではGASのAPIでメッセージの解析や返信をやっていたのですが、GASはLINEmessageAPIからのHTTP:POSTをBeebotteのHTTP:POSTに変換するだけのプログラムとしました。
こうすることによって、プログラムの開発はRaspberryPi側だけでよくなりますね。
1、改良されたGAS
function doPost(e) {
// WebHookで受信した応答用Token
var replyToken = JSON.parse(e.postData.contents).events[0].replyToken;
// ユーザーのメッセージを取得
var userMessage = JSON.parse(e.postData.contents).events[0].message.text;
pubData = '{"TOKEN":"'+replyToken+'","MESG":"' + userMessage+'"}';
mqttPub(pubData);
return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}
function mqttPub(ledMessage) {
var headers = {
"Content-Type": "application/json",
"X-Auth-Token": "token_EPQeCSWdNwi950h1"
};
var json = '{"data":['+ ledMessage +']}';
var options = {
"headers": headers,
"method": "post",
"payload": json
};
UrlFetchApp.fetch("https://api.beebotte.com/v1/data/publish/lineChatBot/message", options);
}
RaspberryPiからLINEへメッセージを送るためにはreplyTokenが必要になるので、これもMQTTで送信します。
ちなにみ、replyTokenの有効時間は30分だそうです。
2、RaspberryPiのプログラム
下記のリンクに記載した基本プログラムのon_message()に通信後の処理を追加しました。
import paho.mqtt.client as mqtt
import json
import requests
import RPi.GPIO as GPIO
ledPort =4
# -*- coding: utf-8 -*-
host = 'mqtt.beebotte.com'
username = "token_xxxxxxxxxxxxx"
password = ""
clientID = "Raspberry456"
name ="raspberry"
port = 1883
topic = 'lineChatBot/message'
def on_connect(client, userdata, flags, respons_code):
print('status {0},{1}'.format(respons_code,userdata))
client.subscribe(topic)
def on_message(client, userdata, msg):
#topic QOS payloadを取得
print(msg.topic + " " + str(msg.qos) + " " + str(msg.payload))
lineData = json.loads(msg.payload.decode())
token = lineData['data'][0]['TOKEN']
message = lineData['data'][0]['MESG']
stickerId ='125'
packageId = '1'
resMessage ='了解しました!'
print(f'{token} - {message}')
if message == 'LED ON':
stickerId ='138'
packageId = '1'
GPIO.output(ledPort, 1)
if message == 'LED OFF':
stickerId ='125'
packageId = '1'
GPIO.output(ledPort, 0)
Url = 'https://api.line.me/v2/bot/message/reply'
ACCESS_TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
headers ={
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + ACCESS_TOKEN,
}
#https://developers.line.biz/ja/reference/messaging-api/#leave-room
obj = {
'replyToken': token,
'messages': [
#{
#'type': 'text',
#'text': resMessage,
#},
{
'type':'sticker',
'stickerId':stickerId,
'packageId':packageId,
}
]
}
json_data = json.dumps(obj).encode("utf-8")
response = requests.post(Url,headers=headers, data = json_data)
print(response)
if __name__ == '__main__':
#setup
GPIO.setmode(GPIO.BCM)
GPIO.setup(ledPort, GPIO.OUT)
# Publisherと同様に v3.1.1を利用
#client = mqtt.Client(client_id = clientID,clean_session=True,userdata=name,protocol=mqtt.MQTTv311,transport="tcp")
client = mqtt.Client(client_id = clientID,clean_session=True,protocol=mqtt.MQTTv311,transport="tcp")
client.username_pw_set(username, password=password)
client.on_connect = on_connect
client.on_message = on_message
client.connect(host, port=port, keepalive=60)
# 待ち受け状態にする
client.loop_forever()
json データはバイナリーなので下記でデコードします。
lineData = json.loads(msg.payload.decode())
LINEへの返信はテキストデータの他、スタンプや画像データなども送れます。詳細はLINEMessagingAPIのリファレンスを参考にしてみて下さい。
RaspberryPi側のpythonスプリクトはパソコンでも動きますが、その場合はGPIOに関わる部分を削除します。
実行結果は、こんな感じになりました。
LEDを赤外線にすれば、外出先からエアコンをコントロールしたり、RaspberryPiからメッセージ送信するので部屋の温度なども送信できます。💯
この程度の処理であればRaspberryPi ZEROでも動くかと。😆
次回はESP32をコントロールしてみますね。ここまでくれば簡単ですが。
では🤚
この記事が気に入ったらサポートをしてみませんか?