はじめに
ESP32 - MicroPythonを使い、IFTTT-Webhooksへのリクエスト方法について記載します。
※IFTTTの紹介や設定手順は割愛します。
開発環境
以下が確認した環境となります。
- ホストPC
- windows10 64bit Home
- VSCode - 1.41.1
- Pymakr 1.1.5
- NodeJS - 12.14.1 LTS
- ターゲット
- MicroPython v1.12 on 2019-12-20; ESP32 module with ESP32
機材
項目 | 型名 | 備考 |
---|---|---|
ESP32-WROOM-32 開発ボード | [NodeMCU-32S ESP32-WROOM-32] |
コード
動作確認したコードは以下となります。
ファイル名:sample_ifttt.py
import urequests as requests
import time
SSID = "xxxxxxxxx" # アクセスポイントのSSID
PASSWORD = "xxxxxxxxx" # アクセスポイントのパスワード
MY_KEY = "xxxxxxxxx" #IFTTT - webhooks - tokenを指定
EVENT_ID = "xxxxxxxxx" # 登録したwebhooksのイベント名を指定
def do_connect():
import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('connecting to network...')
wlan.connect(SSID, PASSWORD)
while not wlan.isconnected():
pass
time.sleep(1)
print('network config:', wlan.ifconfig())
# IFTTT_Webhook
def ifttt_webhook(eventid):
# valueに載せる情報
payload = "value1="
payload += "dummy1"
payload += "&value2="
payload += "dummy2"
payload += "&value3="
payload += "dummy3"
url = "http://maker.ifttt.com/trigger/" + eventid + "/with/key/" + MY_KEY
response = requests.post(url, headers={"Content-Type": "application/x-www-form-urlencoded"}, data=payload)
# value指定が不要な場合は↓でok
# response = requests.post(url)
response.close()
# wifiへの接続
do_connect()
# ifttt-webhooksへのトリガー
ifttt_webhook(EVENT_ID)
実行方法
>>> import sample_ifttt
→コードで指定したイベントがよばれること確認
メモ
valueの指定について
ここが一番はまりました。
以前、Python3.7でIFTTTへのリクエストを行うコードを以下のように書きました。。
import requests
def ifttt_webhook(eventid, values):
payload = {"value1": "",
"value2": "",
"value3": "" }
payload["value1"] = values[0]
payload["value2"] = values[1]
payload["value3"] = values[2]
url = "https://maker.ifttt.com/trigger/" + eventid + "/with/key/" + my_key
print(url)
response = requests.post(url, data=payload)
これをMicroPythonでそのまま記載すると、エラーにはなりませんが、valueが適用されません。
urequestsのコードを確認したところ、jsonで指定しないとダメなのかなという感じでした。
そこで、json指定したのですが、urequestsの中で、ヘッダが固定文字で渡されており、
"Content-Type: application/x-www-form-urlencoded"
がのらないことが分かりました。
というわけで、headersとdataをそれぞれ指定して、
valueに適用させしました。