Raspberry Pi(IFTTT連携)

目次Raspberry Piロボット|センサー(温度・気圧・湿度人感)|赤外線リモコン読み上げMQTT連携IFTTT連携

IFTTT(イフト)は、異なるソーシャルメディアやプラットフォームを連携させるWebサービスです。
「IFTTT」という名称は、「IF This Then That」の頭文字で、 直訳すると「もし、これをしたら、あれをする」といった意味合いです。
「これをしたら」は、IFTTTを起動させる条件を「トリガー」、「あれをしたら」は、それによって自動的に行われる動作を「アクション」と呼びます。
アプレット(Applet)はトリガーとアクションを合わせた、「IF This Then That」全体のことです。
IFTTTはWindows/Mac/iOs/Androidなどで使用でき、このほか、Googleアシスタント(携帯)、Google HomeやAmazon Echoなどのスマートスピーカーとの連携も可能です。
連携できるサービスは400種類以上あり、そのサービス同士を組み合わせで色々な対応が出来ます。
主なサービスは Twitter、Instagram、Facebook、LINE、Evernote、Spotify、YouTube、Dropbox、Googleカレンダー、 Google Spreadsheets、Gmail などです。
出来る事のイメージは下記の通りです。

ここでは、IFTTTの機能を使ってRaspberry Piと連携して、接続しているGPIO機器の操作やセンサー情報の取得を試して見ます。

IFTTT概要

IFTTTを介して、Raspberry Piの入力をGoogle AssistantやMailでWebhookよりBebotte(MQTT Broker)にメッセージを送って、Raspberry Piに渡し、接続機器の制御が可能です。
また、Raspberry Piの出力(接続機器のセンサー情報など)をWebhook経由でMailやLineにメッセージ送信したり、google spreadsheetに書き込みが出来ます。

Raspberry Piにメッセージを送る

IFTTT(Googleアシスタントによるメッセージ送信)の設定

携帯の音声をGoogleアシスタントを使って、Raspberry Piにメッセージを送ります。
Beebotteのサービスを使いますので、事前設定が必要です。

IFTTT(メールによるメッセージ送信)の設定

メールでメッセージをRaspberryPiに送ります。
Beebotteのサービスを使いますので、事前設定が必要です。

RaspberryPiのメッセージ受信処理

下記のプログラム(bbtsub.py)で、Bebotteに渡されたメッセージを受信します。

#!/usr/bin/python3
# -*- coding: utf-8 -*- 
#smartremocon.py
 
import paho.mqtt.client as mqtt  # MQTTのライブラリをインポート
import subprocess
import json
from time import sleep
 
HOST = 'mqtt.beebotte.com'
PORT = 8883
CA_CERTS = 'mqtt.beebotte.com.pem'
TOKEN = 'token_xxxxxxxx'    #Beebotteで作成したチャンネルのトークンを入力
TOPIC = 'xxxxx/xxxxxxxx'    #Beebotteで作成したトピック名を入力
 
def on_connect(client, userdata, flags, respons_code):  # ブローカーに接続できたときの処理
    print('status {0}'.format(respons_code))
 
def on_disconnect(client, userdata, flags, respons_code):# ブローカーが切断したときの処理
    print("Unexpected disconnection.")
    client.loop_stop()
 
def on_message(client, userdata, msg):  # メッセージが届いたときの処理
    print(msg.payload.decode("utf-8"))
    try:
        data = json.loads(msg.payload.decode("utf-8"))["data"]
        for dat in data:
            print(dat)
    except :
        print("jsonフォーマットエラー")
#   finally:

if __name__ == '__main__':
    client = mqtt.Client()        # クラスのインスタンスの作成
    client.on_connect = on_connect     # 接続時のコールバック関数を登録
    client.on_disconnect = on_disconnect   # 切断時のコールバックを登録
    client.on_message = on_message  # メッセージ到着時のコールバック
    client.username_pw_set('token:%s' % TOKEN)
    client.tls_set("/etc/ssl/certs/ca-certificates.crt")
    client.connect(HOST, PORT)   # 接続
    client.subscribe(TOPIC)
    client.loop_forever() # 永久ループして待ち続ける

Googleアシスタントによるメッセージ受信

pi@raspberrypi:~ $ python3 mqtt/bbtsub.py
status 0
{"data":" 部屋 の 温度 を 教え て","ispublic":true,"ts":1646109075200}
 
 部屋 の 温度 を 教え て

メールによるメッセージ受信

pi@raspberrypi:~ $ python3 mqtt/bbtsub.py
status 0
{"data":["RaspberryPi","部屋の温度は?","xxxx@gmail.com"],"ispublic":true,"ts":1646110709033}
RaspberryPi
部屋の温度は?
xxxx@gmail.com

Raspberry Piから処理結果の取得

IFTTTのシナリオを使ってRaspberry Piのセンサー情報などの処理結果を、メールやLINEで知らせたり、Googleのスプレッドシートに書き込みが出来ます。

IFTTT(Gmailで通知)の設定

IFTTT(LINEで通知)の設定

IFTTT(Googleスプレットシートに書き込み)の設定

Webhookの設定確認

My Appletsのトップ画面の右上のアイコンをクリックして、My servicesを選択します。
その中からWebhookを選択してDocumentationボタンを押します。
下記の仕様が取得出来ます。

To trigger an Event with 3 JSON values
Make a POST or GET web request to:
https://maker.ifttt.com/trigger/{event}/with/key/アクセスキー
With an optional JSON body of:
{ "value1" : "", "value2" : "", "value3" : "" }
The data is completely optional, and you can also pass value1, value2, and value3 as query parameters or 
form variables. This content will be passed on to the action in your Applet.

上記で示されているurl「https://maker.ifttt.com/trigger/Event名/with/key/アクセスキー」にアクセスして、
「{ "value1" : "データ1", "value2" : "データ2", "value3" : "データ3" }」様式のデータを渡せば、IFTTTで作成したEvent名のシナリオを実行します。

Raspberry Piの処理

Pythonスクリプト

import requests
def webhook(eventid,payload) : key = "bx41sm_nHIaWEwX7SXPoyO" url = "https://maker.ifttt.com/trigger/"+ eventid + "/with/key/" + key response = requests.post(url,data=payload) if __name__ == '__main__': # Subject->{{value1}},Body->{{value2}} data = {"value1":"Raspberry Pi より","value2":"テストメールです。"} webhook("gmail",data)

上記プログラムを実行すると、下記の様に、指定のメッセージがメールに届きます。

同様に上記のプログラムのEvent名とdataの指定を下記の様に変更して実行すると、指定のメッセージが、LINEに届きます。

    data = {"value1":"Raspberry Pi からのテストメッセージです。"}
    webhook("line",data))

同様に上記のプログラムのEvent名とdataの指定を下記の様に変更して実行すると、指定のデータが、Googleスプレットシートに追記できます。

    data = {"value1":"セルデータ1","value2":"セルデータ2","value3":"セルデータ3"}
    webhook("sheet",data)

Raspberry Piよりセンサー情報を取得する

IFTTTの設定

前回設定した、IFTTTアプレット(Googleアシスタントによるメッセージ送信)の設定と、IFTTTアプレット(Gmailで通知)の設定を使います。
また、Raspberry Piのセンサー情報取得は「Raspberry Pi(温度・気圧・湿度センサー)」を参照してください。

Raspberry Piの処理

Pythonスクリプト(bbtsensor.py)は下記の通りです。

#!/usr/bin/python3
# -*- coding: utf-8 -*- 
#smartremocon.py
 
import paho.mqtt.client as mqtt  # MQTTのライブラリをインポート
import subprocess
import json
from time import sleep
import requests
import datetime
import smbus2
import bme280
bus = smbus2.SMBus(1)
 
HOST = 'mqtt.beebotte.com'
PORT = 8883
CA_CERTS = 'mqtt.beebotte.com.pem'
TOKEN = 'token_xxxxxxxx'    #Beebotteで作成したチャンネルのトークンを入力
TOPIC = 'xxxxx/xxxxxxxx'    #Beebotteで作成したトピック名を入力
 
def on_connect(client, userdata, flags, respons_code):  # ブローカーに接続できたときの処理
    print('status {0}'.format(respons_code))
 
def on_disconnect(client, userdata, flags, respons_code):# ブローカーが切断したときの処理
    print("Unexpected disconnection.")
    client.loop_stop()
 
def on_message(client, userdata, msg):  # メッセージが届いたときの処理
    print(msg.payload.decode("utf-8"))
    try:
        data = json.loads(msg.payload.decode("utf-8"))["data"]
        print(data)
    except :
        print("jsonフォーマットエラー")
#   finally:
######################################
#   ここにRaspberryPiの処理を書きます。
######################################
####温度・気圧・湿度の取得
    dat = bme280.sample(bus, 0x76)
    spl = str(dat).split(",")
    temp=spl[2]
    pressure=spl[3]
    humidity=spl[4][:-1]
    now = str(datetime.datetime.now())[:-7]
    data = now + "<br>" + temp + "<br>" + pressure + "<br>" + humidity
####メールで送信
#   Subject->{{value1}},Body->{{value2}}
    data = {"value1":"Raspberry Pi より","value2":data}
    webhook("gmail",data)
    print(data)
def webhook(eventid,payload) :
    key = "bx41sm_nHIaWEwX7SXPoyO"
    url = "https://maker.ifttt.com/trigger/"+ eventid + "/with/key/" + key
    response = requests.post(url,data=payload)

if __name__ == '__main__':
    client = mqtt.Client()        # クラスのインスタンスの作成
    client.on_connect = on_connect     # 接続時のコールバック関数を登録
    client.on_disconnect = on_disconnect   # 切断時のコールバックを登録
    client.on_message = on_message  # メッセージ到着時のコールバック
    client.username_pw_set('token:%s' % TOKEN)
    client.tls_set("/etc/ssl/certs/ca-certificates.crt")
    client.connect(HOST, PORT)   # 接続
    client.subscribe(TOPIC)
    client.loop_forever() # 永久ループして待ち続ける

実行結果

Json形式でメッセージを受信して。Json形式で取得データーを編集して、メールの送信依頼をします。

pi@raspberrypi:~ $ python3 mqtt/bbtsensor.py
status 0
{"data":" 室内 温度 教え て","ispublic":true,"ts":1645944842193}
 室内 温度 教え て
{'value1': 'Raspberry Pi より', 'value2': '2022-02-27 15:54:02<br> temp=18.771 °C<br> pressure=1007.88 hPa<br> humidity=0.00 % rH'}

IFTTTで設定したメールアドレスに送信します。

目次Raspberry Piロボット|センサー(温度・気圧・湿度人感)|赤外線リモコン読み上げMQTT連携IFTTT連携