本日(2016/09/29)開催されたLINE Developer Dayで発表されたLINE Notifyというサービスで、IFTTTにLINE Channelが開設され、IFTTTからLINEにメッセージを送ることができるようになりました。
IFTTTは今までスイッチサイエンスマガジンでも何度か取り上げてきましたが、Maker Channelを使うとさまざまな機器から情報を発信できる、大変便利なサービスです。
今回はESP-WROOM-02搭載のESPr Door Sensorを使って、ドアの開け閉め情報をLINEに通知する仕組みを作ってみます。
まずはIFTTT側の設定をしておきます。LINE ChannelからCONNECTボタンを押してLINEのサイトで認証して戻ってきます。
次にレシピを作りましょう。Thisから始めます。
Recieve web requestを選択します。
次はThatです。
Event Nameを入力 Door-OPENにします。
LINE Channel を選択します。
Send messageを選択します。
Recipient を1:1でLINE Notifyから通知を受け取るにし、Messageを Door {{Value1}}! にします。
Create Recipeで完成です。
そしてドアセンサ側のスケッチです。ESPr Door Sensorはドアの開け閉めでリセットがかかりますから、setup()だけですべて終わらせます。(スケッチは長いので最後に)
完成しました!
今回、送信データについては深く追求しませんでした。始めは日本語メッセージを送信したんですが、化けたので英語にしました。またNotifyだから仕方ないのかもしれないですが、That側だけでThis側になれないのは少し残念です。This側にできるとBotが作れてしまうので、そこはだめですよということなのかも。
Notifyは自分だけでなく自分が入っているグループトークにも送れるので、いろいろな使い道がありそうです。簡単にいろいろなことができるようになるのは楽しいですね。
extern "C" { #include "user_interface.h" } #include #define IFTTT_MAX_SIZE_STRING 512 #define WLAN_SSID "xxxxx" #define WLAN_PASS "xxxxx" // This will send POST to IFTTT server char str[IFTTT_MAX_SIZE_STRING] = {0}; char str_open[] = "Open"; char str_close[] = "Close"; char v2[16] = ""; char v3[16] = ""; char header[100] = "POST /trigger/Door-OPEN/with/key/xxxxxxxxxxxxxxx HTTP/1.1\r\n"; const char* host = "maker.ifttt.com"; char contentLen[50] = {0}; const char* contentType = "Content-Type: application/json\r\n\r\n"; char valueData [150] = {0}; void setupWiFi() { Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(WLAN_SSID); WiFi.begin(WLAN_SSID, WLAN_PASS); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void setup() { //デバッグ用にシリアルを開く Serial.begin(115200); delay(10); //ドアセンサのつながるGPIO5を入力に pinMode(5, INPUT); // LEDのつながるGPIO4を出力に pinMode(4, OUTPUT); digitalWrite(4, LOW); // WiFiセットアップ setupWiFi(); WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } int magnet = digitalRead(5); digitalWrite(4, HIGH); if (magnet == LOW) { sprintf(valueData, "{\"value1\":\"%s\",\"value2\":\"%s\",\"value3\":\"%s\"}\r\n", str_close, v2, v3); // digitalWrite(4,LOW); } else { sprintf(valueData, "{\"value1\":\"%s\",\"value2\":\"%s\",\"value3\":\"%s\"}\r\n", str_open, v2, v3); // digitalWrite(4,HIGH); } sprintf(contentLen, "Content-Length: %d\r\n", strlen(valueData)); sprintf(str, "%sHost: %s\r\n%s%s%s", header, host, contentLen, contentType, valueData); client.print(str); delay(1000); } void loop() { }