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を介して、Raspberry Piの入力をGoogle AssistantやMailでWebhookよりBebotte(MQTT Broker)にメッセージを送って、Raspberry
Piに渡し、接続機器の制御が可能です。
また、Raspberry Piの出力(接続機器のセンサー情報など)をWebhook経由でMailやLineにメッセージ送信したり、google
spreadsheetに書き込みが出来ます。
携帯の音声をGoogleアシスタントを使って、Raspberry Piにメッセージを送ります。
Beebotteのサービスを使いますので、事前設定が必要です。
メールでメッセージをRaspberryPiに送ります。
Beebotteのサービスを使いますので、事前設定が必要です。
下記のプログラム(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() # 永久ループして待ち続ける
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
IFTTTのシナリオを使ってRaspberry Piのセンサー情報などの処理結果を、メールやLINEで知らせたり、Googleのスプレッドシートに書き込みが出来ます。
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名のシナリオを実行します。
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)
前回設定した、IFTTTアプレット(Googleアシスタントによるメッセージ送信)の設定と、IFTTTアプレット(Gmailで通知)の設定を使います。
また、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で設定したメールアドレスに送信します。