Lesson 18 : ก้าวเข้าสู่ IOT – ตอนที่ 8 IFTTT และ Line Notify

ในการส่งข้อมูลจาก Aruino ไปที่ Line มีหลายวิธีนะครับ วันนี้ขอแนะนำการส่งผ่าน IFTTT Platform ครับ

ระดับความยาก :  

สิ่งที่จะได้จากบทเรียนนี้

อุปกรณ์

ลำดับชิ้นส่วนจำนวน
1ESP8266 (NodeMCUV3)1 ชิ้น

เกริ่นนำ IFTTT เป็นบริการสำหรับการเชื่อมต่อ Service ต่างๆ เข้าด้วยกันโดย End-User สามารถกำหนด Trigger หรือเหตุการณ์และสั่งให้ IFTTT ช่วยทำ Action ใดๆ ก็ได้ ซึ่ง Trigger ต่างๆ ในระบบ IFTTT นั้นเราจะเรียกมันว่า Applet นะครับ

ตัวอย่าง

เริ่ม Coding กันเลย!!!
1. สมัครใช้งานก่อนที่เว็บไซต์ https://ifttt.com/

2. เมื่อสมัครใช้งานแล้วระบบจะ login ให้อัตโนมัติ ให้คลิกที่ My Applets และคลิกที่ New Applet เพื่อเริ่มต้นใช้งาน

3. ระบบจะแสดงหน้าจอดังภาพนี้ ให้คลิกที่อักษรสีฟ้าที่เขียนว่า this เพื่อกำหนดเหตุการณ์(Trigger) ที่จะเป็นจุดกำเนินของการแจ้งเตือน

4. สำหรับกรณีนี้เราจะให้ Trigger จาก Arduino และส่งข้อมูลไปที่ Line Notify ดังนั้นให้เรา Search คำว่า Webhooks เป็น Applet ตัวหนึ่งที่ IFTTT เตรียมไว้ให้ Developer ใช้

5. เมื่อเลือกที่ Webhooks แล้วให้คลิกที่ Connect

6. ระบบจะ Connect ไปที่ Server และแสดง Applet ให้เราเลือก ซึ่งปัจจุบันจะมีตัวเดียวคือ “Receive a web request” ให้คลิกเลือกได้เลย

7. กำหนด Event Name เป็น button_Pressed จากนั้นกดปุ่ม Create Tigger

8. ระบบจะย้อนมาที่หน้าหลักเพื่อให้เราสร้าง Action ให้คลิกเลือก that

9. ให้ค้นหาด้วยคำว่า Line และเลือก Line Application ได้เลยครับ

10. จากนั้นให้คลิก Connect ระบบจะเปิดหน้าต่างให้ใส่ Username / Password ของ Line ให้เรากรอก Line Account ของเราครับ

11. ระบบจะขออนุญาตเพิ่ม Line Notify เข้าไปในเพื่อนของคุณ ให้กดปุ่ม Agree and connect ครับ

12. ระบบจะแสดง Applet ที่สามารถใช้งานได้ ให้คลิกเลือกที่ Applet Send Message

13. จากนั้นระบบจะเปิดหน้าจอให้ระบุข้อมูลต่าง ๆ ให้เลือก
• Recipient เป็น 1-On-1 Chat With LINE Notify
• Message กำหนดเป็นค่าดังนี้ “Message from {{EventName}}, your value is {{Value2}} and {{Value3}} occurred at {{OccurredAt}}” หรือจะไม่แก้ไขเลยก็ได้ครับ
• จากนั้นกด Create Action

14. ระบบจะแสดงหน้าจอสรุปอีกครั้งเป็นรอบสุดท้าย ให้เราตรวจสอบอีกครั้งหากถูกต้องแล้ว กดปุ่ม Finish

15. ระบบจะแสดงหน้าจอสรุปว่า Applet ได้เริ่มใช้งานแล้ว สามารถทดลองสถานะด้วยการกดปุ่ม Check now ระบบจะขึ้นข้อความ Applet Checked

*ผล Applet checked

16. จากขั้นตอนนี้จะทดลองว่า Applet ที่เราสร้างขึ้นมาใช้ได้หรือไม่โดยให้คลิกที่สัญญาลักษณ์ Webhook ตามภาพนี้ครับ

17. ระบบจะเปิดหน้าต่างหลักของ Webhook ให้คลิกที่ปุ่ม Documentation

18. ระบบจะเปิดหน้าต่างสำหรับทดสอบ Applet ให้ระบุข้อมูลต่าง ๆ และกด Test It (ช่อง Value ใส่ค่าที่ท่านต้องการได้เลยครับ)

19. ระบบจะแสดงข้อความว่าได้ส่งข้อมูลเรียบร้อยแล้ว

20. ที่ Line Application ของเราก็จะมี Message มาแสดงครับ

21. เมื่อถึงขั้นตอนนี้ระบบ Trigger ผ่าน IFTTT เราพร้อมแล้วครับ สามารถส่งข้อมูลจาก Arduino มาได้เลยครับ

22. ผมใช้ NodeMCUv3 ก็จะไม่ได้มีการต่อวงจรนะครับ ผมจะจำลองข้อมูลส่งไปเท่านั้น ดังนั้นสามารถใช้ Sensor ต่าง ๆ ต่อที่ NodeMCUv3 และส่งค่าไปได้นะครับ

23. Download Code นี้และนำไปใช้ได้เลยครับ

/**
@desc Class นี้ใช้สำหรับเรียนรู้การทำงานเบื้องต้นของ Arduino, ESP8266
รวมทั้งการใช้งาน IOT เพื่อส่งค่าให้ Line Notify ผ่าน IFTTT
@author Prayoon V.,
Email : themakerthailand@hotmail.com
Facebook : @MrMakerThailand
.
*/

#include
#include
//#include

const char* ssid = “access point name”;
const char* password = “password”;

const char* mqttServer = “192.168.1.102”;
const int mqttPort = 1883;
//const char* mqttUser = “mqtt broker username”;
//const char* mqttPassword = “mqtt broker password”;

WiFiClient espClient;
PubSubClient client(espClient);

//HTTPClient http;

//Pin ที่ต่อไฟ LED
const int led = 2;

//Pin ที่ต่อ Light Sensor
const int light = 0;

unsigned long previousMillis = 0;
unsigned long interval = 10000;

void setup() {
Serial.begin(115200);
pinMode(led, OUTPUT);
//pinMode(light, INPUT);

//ESP.restart();

//สั่งให้ไฟดับก่อน
digitalWrite(led, LOW);

//เชื่อมต่อ wifi
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println(“Connecting to WiFi..”);
}

Serial.println(“Connected to the WiFi network”);

//connect ไปที่ mqtt broker
client.setServer(mqttServer, mqttPort);

//กำหนด function เมื่อมีการส่งข้อมูลมาจาก MQTT
client.setCallback(callback);

while (!client.connected()) { //วนลูปจนกว่าจะต่อสำเร็จ
Serial.println(“Connecting to MQTT…”);

if (client.connect(“ESP8266Client” )) { //Connect to MQTT และกำหนดชื่อในการติดต่อ

Serial.println(“connected”);

} else {

Serial.print(“failed with state “);
Serial.print(client.state());
delay(2000);

}
}

//ส่งข้อมูล publish ไปที่ MQTT Broker โดยตั้ง topic เป็น “esp/test”
client.publish(“esp/test”, “Hello from ESP8266”);
//subscribe topic “esp/test”
client.subscribe(“esp/test”);

//ส่งข้อความไปที่ IFTTT
sendMessageToIFTTT();

//กระพริบไฟให้สัญญานว่าทำงานได้
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);

}

//เมื่อมีข้อมูลกลับมาจาก MQTT จะโดนส่งกลับมาที่ Method นี้
void callback(char* topic, byte* payload, unsigned int length) {

Serial.print(“Message arrived in topic: “);
Serial.println(topic);

Serial.print(“Message:”);
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);

//หาก message ที่ส่งกลับมามีค่าเป็น 0 ที่ array index ที่ 10 จะสั่งให้ไฟดับ เช่น {‘hello’:’0′}
//หาก message ที่ส่งกลับมาเป็น 1 จะสั่งให้ไฟติด เช่น {‘hello’:’1′}
//ตรงนี้แล้วแต่เราจะกำหนดครับ แต่ผมอยากทำให้ง่าย ๆ ก่อนเลยใช้วิธีการ fix ค่าไว้ครับ
if (i == 10) {
if ((char)payload[i] == ‘0’) { //turn off light
digitalWrite(led, LOW);
} else {
digitalWrite(led, HIGH);
}
}
}

Serial.println();
Serial.println(“———————–“);

}

void loop() {
client.loop();

delay(10000);
sendMessageToIFTTT();
}

const char* host = “maker.ifttt.com”;
const char *privateKey = “ใส่ค่า Key จาก IFTTT”;
const char *event = “ใส่ค่า Event ที่กำหนดใน IFTTT”;
String value1, value2, value3;
String postData = “”;

//ส่งข้อมูล Alert ไปที่ IFTTT
void sendMessageToIFTTT() {

// Use WiFiClient class to create TCP connections
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println(“connection failed”);
return;
}

// We now create a URI for the request
String url = “/trigger/”;
url += event;
url += “/with/key/”;
url += privateKey;

value1 = “themaker”;
value2 = “555”;
value3 = “999”;

genJSonObject();

Serial.print(“Requesting URL: “);
Serial.println(url);
Serial.println(postData);

// This will send the request to the server
client.print(String(“GET “) + url + ” HTTP/1.1\r\n” +
“Host: ” + host + “\r\n”);

client.println(“Content-Type: application/json”);
client.print(“Content-Length: “);
client.println(postData.length());
client.println();
client.println(postData);
client.println(“Connection: close\r\n\r\n”);

// Read all the lines of the reply from server and print them to Serial,
// the connection will close when the server has sent all the data.
while (client.connected())
{
if (client.available())
{
String line = client.readStringUntil(‘\r’);
Serial.print(line);
} else {
// No data yet, wait a bit
delay(50);
};
}

// All done
Serial.println();
Serial.println(“closing connection”);

client.stop();
}

/**
ต่อค่า Value1-3 เป็น Json Object
*/
void genJSonObject()
{
postData = “{“;

postData.concat(“\”value1\”:\””);
postData.concat(value1);

postData.concat(“\”,”);
postData.concat(“\”value2\”:\””);
postData.concat(value2);

postData.concat(“\”,”);
postData.concat(“\”value3\”:\””);
postData.concat(value3);

postData.concat(“\”}”);

}

24. เมื่อ Run Code แล้วก็จะได้รับข้อความใน Line Notify ดังภาพนี้ครับ

หลังจากจบบทความนี้ผมคิดว่า เราน่าจะส่ง Alert Message จาก Arduino มาที่ Line ผ่าน IFTTT ได้แล้ว บทความต่อไปผมจะแนะนำการรับคำสั่งเข้า Arduino กันบ้างนะครับ

Share ผลงาน
เมื่อน้อง ๆ ทำสำเร็จแล้วอย่าลืมแชร์ให้เพื่อนๆ ดูได้ที่ Facebook MrMakerThailand
และหากน้อง ๆ ทำไม่ได้ ให้ติดต่อมาได้ตลอดเวลาที่ Inbox นะครับ