ESP8266 và IOT (Part 8): Nhận Motion Alarm Notifications trong Slack

8_1

Cảm biến chuyển động

Trong bài tutorial này tôi chỉ cho các bạn làm cách nào để tạo ra một flow trong Node-RED editor sẽ gửi báo động chuyển động đến tài khoản Slack của bạn. Giống như trước, Node-RED app sẽ được host trong Bluemix. Nếu bạn không quen thuộc với Node-RED, Bluemix platform và cách để kết nối ESP8266 với nó, xem tutorial này.

Thiết bị ESP8266 của chúng ta sẽ gửi MQTT message đến Bluemix, và dữ liệu đó sẽ được gửi đến Slack thông qua giao thức HTTP.

Về cảm biến chuyển động chúng ta sử dụng module loại cảm biến PIR rẻ tiền, loại này đủ tốt và nhạy, và giá tốt. Nó có 3 chân, 2 chân cấp nguồn và 1 chân dữ liệu. Chân dữ liệu output ra tín hiệu số. Khi nào cảm biến phát hiện ra chuyển động trong khoảng phát hiện của nó, chân dữ liệu được set lên HIGH. Module nên được cấp nguồn 5V. Vì ESP8266 sử dụng 3.3V, nếu bạn muốn tránh việc sửa dụng một nguồn khác cho cảm biến PIR, bạn nên làm một sửa một điểm nhỏ trong hardware. Để hoạt động tốt, nguồn phải được cấp cho pad ‘H’ (xem ảnh). Vài module đã có được hàn chân vào nó, nhưng một số thì không và bạn phải hàn một jumper nối với nó.

8_1
Soldered 3.3V power supply wire

Nối đất và nguồn, chân dữ liệu vào một chân GPIO của ESP8266.

Schematics
Schematics

Thiết bị của chúng ta sẽ liên tục kiểm tra tín hiệu tại chân GPIO, và chỉ một chuyển đổi trạng thái từ low sang high xảy ra, nó sẽ publish message tương ứng tới Bluemix.

#include <ESP8266WiFi.h>
#include <PubSubClient.h> // https://github.com/knolleary/pubsubclient/releases/tag/v2.3

const char* ssid = "";
const char* password = "";

#define ORG "<yourOrganization>"
#define DEVICE_TYPE "ESP8266"
#define DEVICE_ID "<yourDeviceID>"
#define TOKEN "<yourToken>"

char server[] = ORG ".messaging.internetofthings.ibmcloud.com";
char topic[] = "iot-2/evt/motionSensor/fmt/json";
char authMethod[] = "use-token-auth";
char token[] = TOKEN;
char clientId[] = "d:" ORG ":" DEVICE_TYPE ":" DEVICE_ID;

#define pir_sensor 12

WiFiClient wifiClient;
PubSubClient client(server, 1883, callback, wifiClient);

const double lat = 42.444299;
const double lon = 19.236563;

String lat_str = String((int)lat) + "." + ((int)(1000000 * lat))%1000000;
String lon_str = String((int)lon) + "." + ((int)(1000000 * lon))%1000000;

void setup() {
 Serial.begin(115200);
 Serial.println();

 pinMode(pir_sensor, INPUT);
 
 Serial.print("Connecting to ");
 Serial.print(ssid);
 WiFi.begin(ssid, password);
 while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
 } 
 Serial.println("");

 Serial.print("WiFi connected, IP address: ");
 Serial.println(WiFi.localIP());

 if (!client.connected()) {
   Serial.print("Reconnecting client to ");
   Serial.println(server);
   while (!client.connect(clientId, authMethod, token)) {
   Serial.print(".");
   delay(500);
   }
   Serial.println();
   }
}

bool old_state = LOW;

void loop(){

 bool current_state = digitalRead(pir_sensor);

 if(current_state == HIGH && old_state == LOW){
   
   if (!client.connected()) {
   Serial.print("Reconnecting client to ");
   Serial.println(server);
   while (!client.connect(clientId, authMethod, token)) {
   Serial.print(".");
   delay(500);
   }
   Serial.println();
   }
  
   String payload = "{\"d\":{\"Name\":\"18FE34D81E46\"";
   payload += ",\"sensor_event\":";
   payload += "\"Motion detected\"";
   payload += ",\"lat\":";
   payload += lat_str;
   payload += ",\"lon\":";
   payload += lon_str;
   payload += "}}";

   Serial.print("Sending payload: ");
   Serial.println(payload);
   
   if (client.publish(topic, (char*) payload.c_str())) {
   Serial.println("Publish ok");
   } else {
   Serial.println("Publish failed");
   }
  
   client.loop();
 }

 old_state = current_state;
}

void callback(char* topic, byte* payload, unsigned int length) {
 Serial.println("callback invoked");
}

Thiết lập Slack Channel

Để nhận message từ Bluemix trong tài khoản Slack của bạn, bạn sẽ phải thêm một tích hơp vào một channel bạn muốn dùng cho mục đích này. Tôi đã tạo ra một channel là #sensors.

New channel
New channel

Vào Channel settings và click Add a App or Intergration.

Channel settings
Channel settings

Tìm kiếm webhooks tới cái mà sẽ cho phép bạn nhận message từ các nguồn ngoài

Search for Incoming WebHooks
Search for Incoming WebHooks

Bạn phải thêm một configuration mới.

Add configuration
Add configuration

Chọn channel của bạn và click add incomming webhooks intergration.

Choosing a channel
Choosing a channel

Bạn sẽ thấy một page với integration settings. Có một Webhook URL chúng ta cần dùng trong Node-RED để gửi HTTP request đến Slack.

Webhook URL
Webhook URL

Đồng thời, bạn có thể thấy một dịnh dạng của json payload nên được dùng. Property text được dùng cho nội dung message. Co một vài cái khác như username, icon… Khi bạn hoàn thành với configration, click save settings ởi cuối của page và bạn nên xem cái thông báo thích hợp trong channel của bạn.

Integration added
Integration added

Node-RED Flow

Slack chnnel của bạn sẵn sàng để nhận message từ nguồn ngoài. Bây giờ chúng ta phải tạo một flow trong Node-RED. Tạo một app mới trong Bluemix theo cách trong bài 3 và mở Node-RED editor. Flow của chúng ta chứa IoT input node thu thập các MQTT message đến, function node cho việc tạo message và một node cho việc gửi HTTP request đến Slack.

Flow
Flow

Thiết lập IoT node của bạn

IoT in node
IoT in node

Function node được dùng để xác đinh tất cả các parameter của HTTP request như nội dung message, channel name, username và icon. ESP8266 cũng gửi dữ liệu latlon, chúng dùng để gửi link đến google maps với vị trí thiết bị. Đây là code trong function node:

var sensor_event = msg.payload.d.sensor_event;
var lat = msg.payload.d.lat;
var lon = msg.payload.d.lon;
var date = new Date();
var loc = "<http://maps.google.com/maps?q=loc:" + lat + "," + lon + ">";

var text = sensor_event + "!\n";
text +="Time: " + date + "\n";
text +="Location: " + loc;

msg.payload =

{
    "channel": "#sensors",
    "username": "MotionSensor",
    "text": text,
    "icon_emoji": ":exclamation:"
};

return msg;

HTTP node nhận các parameter và gửi POST request đên URL được tạo trong quá trình configure Slack channel.

HTTP request node
HTTP request node

Vậy đó, mỗi lần thiết bị của bạn publish một event, bạn sẽ thấy một message mới trong channel Slack của bạn

Alarm notifications
Alarm notifications

Các bài cùng Series

(Part 1): Làm quen với ESP8266
(Part 2): ESP8266 với MQTT
(Part 3): Kết nối ESP8266 với IBM Bluemix
(Part 4): Dùng Cloudant DB trong IBM Bluemix để lưu trữ dữ liệu
(Part 5): Gửi Email và SMS thông báo khi bị trigger từ dữ liệu cảm biến
(Part 6): Hiển thị dữ liệu cảm biến với IBM Bluemix
(Part 7): Vị trí Devices trên Map
(Part 8): Nhận Motion Alarm Notifications trong Slack
(Part 9): Điều khiển thiết bị trong nhà bằng Slack

Tham khảo: Codingo

Comments

linhkienbachkhoa

Comments