Beebotteを使ってLINEメッセージでLEDをON/OFFする(その3)LINEリッチメニューからRaspberryPiのLEDを点灯

LINEからRaspberryPiのLEDを点灯させてみようと思います。💪

たぶん(その1)(その2)のプログラムを組み合わせれば、簡単にできてしまいそうですが、当初の設計ではRaspberryPiからLINEまでメッセージを戻すことが難しいlことに気が付きました。

そこで、通信の流れを以下のように変更しました。

スクリーンショット 2021-02-01 20.56.11

その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に関わる部分を削除します。

実行結果は、こんな感じになりました。

画像2

LEDを赤外線にすれば、外出先からエアコンをコントロールしたり、RaspberryPiからメッセージ送信するので部屋の温度なども送信できます。💯

この程度の処理であればRaspberryPi ZEROでも動くかと。😆

次回はESP32をコントロールしてみますね。ここまでくれば簡単ですが。

では🤚










この記事が気に入ったらサポートをしてみませんか?