[PYTHON] Envoyer un message Push à LINE Bot lorsque le bouton LTE-M est enfoncé [SORACOM]

introduction

Cet article est le deuxième chapitre d'un article de quatre chapitres.

  1. Création d'un système "non seulement" pour surveiller les maisons de personnes âgées en utilisant pleinement l'IoT [SORACOM Summer Challenge 2020]
  2. Envoyer un message Push au LINE Bot lorsque le bouton LTE-M est enfoncé [SORACOM]: arrow_backward: Now here
  3. [Raspberry Pi] Lorsque le capteur humain le détecte, stockez l'horodatage dans la base de données Firebase Realtime
  4. Associez SORACOM aux appareils électroménagers et au LINE Bot [Python / Flask / Raspberry Pi] ** Toutes les sources publiées **

Déclencheur

On suppose que le bouton LTE-M est enfoncé quand quelque chose arrive à un parent âgé qui habite loin. Il y a une fonction pour notifier LINE Notify de SORACOM Lagoon, mais j'ai décidé de faire un LINE Bot car je ne peux pas sélectionner l'action après que la notification soit venue uniquement par SMS. C'est bien d'avoir un mécanisme simple avec un seul bouton comme celui-ci, car même les personnes âgées qui ne sont pas douées pour les machines peuvent le voir visuellement. LTE-M Button

Environnement d'exploitation

Raspberry Pi 3 Model B Python 3.7.3 Flask==1.1.2 line-bot-sdk==1.16.0

Jusqu'à ce que le bouton LTE-M et le bot LINE soient liés

① Envoyer une alerte depuis SORACOM Lagoon

Pour un usage spécifique, les officiels Créer un tableau de bord à l'aide de SORACOM Lagoon et [Alerte à l'aide de SORACOM Lagoon] Il est décrit en détail dans Setting, donc je vais l'omettre.

Le bouton LTE-M envoie des données de type Int telles que 1 pour 1 clic, 2 pour double clic et 3 pour appui long. Puisqu'il s'agit d'une urgence, je ne sais pas quel type d'opération de bouton sera effectué. Par conséquent, nous avons décidé d'envoyer une alerte lorsque la valeur est égale ou supérieure à 0,5 (toutes les opérations sur les boutons) (voir image).

Sélectionnez également «Webhook» pour le canal de notification. L'URL sera définie plus tard, donc pour l'instant, utilisez simplement `` https: // test.example ''.

② Enregistrez LINE Bot

Créez une nouvelle chaîne à partir de LINE Developers. Dans "Choisissez un type de canal pour continuer", utilisez l'API de messagerie. Notez le "Channel secret" dans les "Basic settings" et le "Channel access token" dans "Messaging API" pour une utilisation ultérieure.

③ Utilisez Raspeye comme serveur

Exécutez Flask sur le Raspberry Pi pour recevoir des webhooks et renvoyer des messages. Pour différents paramètres, [Essayez de créer un LINE BOT avec Python / Raspeye! ](Essayez de créer un LINE BOT avec Python / Raspeye!).

point important

Vous pouvez ignorer les paramètres du site ci-dessus et de pyenv-virtualenv, mais assurez-vous de réécrire les autres .bash_profile, etc. Sinon, cela ne fonctionnera pas. Veillez également à définir le secret du canal et le jeton d'accès au canal dans les variables d'environnement comme décrit dans le site ci-dessus.

④ Envoyer un message Push

Vous devez connaître ʻuserId pour envoyer un message Push. Cet ʻuserId est différent de l'ID défini personnellement utilisé lors de l'ajout d'amis, vous devez donc le connaître d'une autre manière. Le code suivant renverra ʻuserId` lorsque vous envoyez un message texte.

line_bot.py


from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
import os

app = Flask(__name__)

LINE_BOT_ACCESS_TOKEN = os.environ["LINE_BOT_ACCESS_TOKEN"]
LINE_BOT_CHANNEL_SECRET = os.environ["LINE_BOT_CHANNEL_SECRET"]

line_bot_api = LineBotApi(LINE_BOT_ACCESS_TOKEN)
handler = WebhookHandler(LINE_BOT_CHANNEL_SECRET)

@app.route("/callback", methods=['POST'])
def callback():
    signature = request.headers['X-Line-Signature']

    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)
    
    return 'OK'

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    profile = line_bot_api.get_profile(event.source.user_id)
    messages = str(profile.user_id)
    line_bot_api.reply_message(event.reply_token, TextSendMessage(text=messages))

if __name__ == "__main__":
    port = int(os.getenv("PORT", 6000))
    app.run(host="0.0.0.0", port=port)

Si vous pouvez le configurer correctement, vous devriez obtenir un identifiant commençant par U comme celui-ci.

Une fois que vous avez fait cela, il est enfin temps de travailler avec SORACOM Lagoon. J'ajouterai un peu au code précédent. Vous permet d'envoyer un message Push à l'utilisateur lorsqu'il y a un POST dans le / webhook. Veuillez noter que ʻimport` est également ajouté.

line_bot.py


from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
import os
import json  #ajouter à

app = Flask(__name__)

LINE_BOT_ACCESS_TOKEN = os.environ["LINE_BOT_ACCESS_TOKEN"]
LINE_BOT_CHANNEL_SECRET = os.environ["LINE_BOT_CHANNEL_SECRET"]

line_bot_api = LineBotApi(LINE_BOT_ACCESS_TOKEN)
handler = WebhookHandler(LINE_BOT_CHANNEL_SECRET)

#Ajouté ci-dessous
@app.route("/webhook", methods=['POST'])
def webhook():
    print(json.dumps(request.get_json(), indent=2))
    object = request.get_json()
    if object['title'] == "[Alerting] Emergency alert":
        user_id = "U03xxxxxx(Le userId obtenu plus tôt)"
        messages = TextSendMessage(text="J'ai une alerte")
        line_bot_api.push_message(user_id, messages=messages)

    return request.get_data()
#Jusque là

@app.route("/callback", methods=['POST'])
def callback():
    signature = request.headers['X-Line-Signature']

    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)
    
    return 'OK'

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    profile = line_bot_api.get_profile(event.source.user_id)
    messages = str(profile.user_id)
    line_bot_api.reply_message(event.reply_token, TextSendMessage(text=messages))

if __name__ == "__main__":
    port = int(os.getenv("PORT", 6000))
    app.run(host="0.0.0.0", port=port)

Enfin, définissez le canal de notification pour SORACOM Lagoon. Entrez l'URL du ngrok fonctionnant sur le Raspberry Pi et ajoutez / webhook à la fin. Cela vous permettra de recevoir des webhooks de Lagoon.

Vidéo de démonstration

[YouTube] Le bouton SORACOM LTE-M notifiera LINE La réaction est plus rapide que prévu! Avec cela, vous pouvez agir aussi rapidement qu'une seconde en cas d'urgence.

Recommended Posts

Envoyer un message Push à LINE Bot lorsque le bouton LTE-M est enfoncé [SORACOM]
Je souhaite envoyer un message de Python à LINE Bot
Envoyer un message à LINE avec Python (LINE Notify)
Comment envoyer un message à LINE avec curl
[LINE Messaging API] Je souhaite envoyer un message du programme à tout le monde LINE
Comment installer NPI + envoyer un message à la ligne avec python
Que faire lorsqu'un message d'avertissement est affiché dans la liste des pip
Hanashi qui est devenu un BOT en lecture en essayant de faire un BOT d'analyse morphologique en utilisant la populaire API LINE BOT
Envoyez un e-mail d'amour direct à un nouvel utilisateur lorsqu'un nouvel utilisateur rejoint l'équipe Slack
Envoyer un message de Slack à un serveur Python
[Python] Lancer un message sur le canal Slack
Une commande pour vérifier si quelque chose ne va pas lorsque le serveur ne fait rien
L'explication la plus simple au monde sur la création de LINE BOT (1) [Account preparation]
Le robot en ligne le plus simple au monde pour perdre du poids
Créer une liste lorsque la nomenclature est pour une certaine période de temps
Envoyer un message du serveur à l'extension Chrome à l'aide de Google Cloud Messaging pour Chrome
Lorsqu'une chaîne de caractères d'une certaine série se trouve dans la clé du dictionnaire, la chaîne de caractères est convertie en valeur du dictionnaire.
Comment créer un LINE BOT 004 interactif (répondre à la date de clôture d'une société cotée)