【ESP32專欄】LINE通知:倉庫溫度異常機器人

作者:尤濬哲

前一章(上傳資料到ThingSpeak 製作雲端監看圖表)我們學習到如何將資料傳輸到雲端做紀錄,也可以隨時觀看數據,不過假設環境發生異常時,例如溫度過高或有害氣體濃度過高,卻還是要自己去網站上看才知道,如果可以在異常時主動通知我們,那不就更好了。

因此本章將介紹如何讓ESP32成為一個小幫手,能幫我們監看環境的溫濕度,並在發生異常時發LINE訊息通知我們,讓我們能立即處理異常,避免災害擴大。

開啟LINE Notify服務

平常我們都會用LINE傳訊息,不僅免費還有很多可愛貼圖,三五好友還可以組成群組,讓分散在各地的親朋好友聊天打鬧,真的很方便。不過ESP32是要如何透過LINE來傳訊息呢?ESP32又沒有手指是要如何打字呢?

LINE有提供一個官方的工具,可以讓我們透過該工具傳遞訊息,不過傳遞之前必須先取得傳訊對象的密碼,密碼也稱為權杖,當網站收到這些密碼及訊息後,就會將訊息轉送到指定的LINE群組。也就是說,ESP32並不是直接把訊息傳到某個人手機的LINE裡面,而是透過LINE官方工具協助中間轉傳訊息。

通常這類的網站就通稱為API(Application Programming Interface),使用這些API工具我們就可以省去學習LINE APP內複雜的通訊協定、機制、格式、架構…等等,只需要把資料傳給API,API就會處理所有的通訊過程,讓我們省下很多程式開發的時間。

整理上面的內容,也就是說首先我們利用ESP32及DHT11監看現場的溫濕度(也可以再加上有害氣體偵測MQ2、水位感測…等),當發現異常時(例如溫度>40或濕度>85)就發送到LINE的API網站,LINE API收到我們的訊息之後,就會轉傳到指定的LINE群組中,讓相關的管理人員收到訊息,然後立即處理。

要完成以上的任務,本節分成四個步驟:
1. 申請LINE Notify權杖
2. 手冊測試LINE Notify
3. ESP32+DHT11接線
4. 程式設計

1. 申請LINE Notify權杖

首先我們先到LINE Notify的網站申請開通服務,首先在瀏覽器中輸入網址:https://notify-bot.line.me/,並點選右上角的登入。


輸入自己的LINE帳號密碼後,按下方的登入。


完成登入,點選右上角的登入帳號/個人頁面,即可進入「已連動服務」管理頁面。


在頁面下方,點選發行權杖按鈕,權杖原意為通行碼,可視為與特定LINE群組通訊的密碼,若無此密碼,我們的LINE可能每天都會收到一堆廣告訊息。

在設定權杖頁面分別輸入:
a.名稱:未來發訊訊息通知時,會出現的名稱
b.對象:要發送訊息的群組,此處練習時先選擇「透過1對1聊天接收LINE Notify通知」,也就是傳訊給自己,

另外這裡你會發現在清單中找不到你某個特定的朋友,而只能選「群組」來發送訊息,這是因為我們目前使用的LINE通知是免費的Notify功能,若您要通知特定的「人」則必須申請LINE Bot,這部份則較為複雜,本文先略過。

完成輸入後,按下方的發行即可獲得一組密碼,此即為權杖。

拿到權杖後,點選下方的複製按鈕將密碼複製起來,並貼在記事本上,避免遺失,若遺失也不用緊張,重新申請一次即可,不過就算申請的對象是同一個,每次的權杖密碼都是不相同的,但功能是一樣的,後面申請的也不會使之前申請的權杖失效。

確認申請完成,將會產生一個連動服務。

(2) 手動測試LINE Notify

完成申請權杖後,我們就先用手動測試剛剛申請的LINE Notify權杖是否正常,也順便了解LINE API的運作方式,如需要更詳細的LINE Notify API可參閱網址:https://notify-bot.line.me/doc/

首先我們先到連線到知名的API測試網址API Tester:https://apitester.com/(或者安裝POSTMAN API測試軟體),並依照規定輸入LINE Notify的相關設定如下:
a.修改傳遞方式POST
b.輸入LINE Notify API網站:https://notify-api.line.me/api/notify
c.輸入傳遞的訊息內容:message=這是測試
d.點選「+」號,增加一個表頭Request Header,我們會將密碼放在表頭與LINE API做驗證:

  • 輸入表頭名稱:Authorization
  • 輸入認證內容:Bearer 權杖密碼,要注意的是Bearer與權杖密碼中間有一個空白。

完成設定後後,按下下方的藍色Test按鈕,即可在手機收到LINE傳來的訊息。

下圖中前面【】內的名稱就是一開始申請時的名稱(倉庫監看機器人),而後方的訊息「這是測試」則是在API tester網站輸入的內容。

經由上面的測試可以發現,用ESP32傳LINE的方式就是將資料傳遞到LINE的API網站https://notify-api.line.me/api/notify,並將訊息內容及權杖密碼以參數方式夾帶給網站,網站收到後就會將訊息傳遞給權杖所對應的使用者。

下一節我們使用ESP32自動傳LINE時,也是一樣要指定這些訊息,就可以資訊傳遞給相關的人員。
另外如果您選擇傳訊的對象是一個群組,那麼要多一個動作:邀請LINE Notify進入群組內,否則會出現一個錯誤訊息是:此帳號尚未被邀請至已連動的群組。

邀請LINE Notify機器人進入要傳遞的群組中。


(3) ESP32 DHT11線路佈置

本部份參考前篇內容:上傳資料到ThingSpeak 製作雲端監看圖表,完成線路佈置,並測試讀取成功後,再進行下一個步驟

(4) 程式撰寫

就如第二節所展示,這次我們的程式將使用wificlientsecure進行實做,wificlientsecure跟上一章的httpclient不同的地方在於wificlientsecure可以支援https加密協定,而httpclient只能用HTTP GET協定做參數傳遞,wificlientsecure及wificlient可以用來做POST協定。

程式主要分成幾4個流程:
a.初始化設定:設定無線網路SSID, Password, LINE API網址, 權杖密碼等資訊
b.連線Wifi網路
c.在Loop中重複監看DHT11溫濕度資料
d.發現DHT11溫度或濕度過高,則利用wificlientsecure將資料POST到LINE網址

除了傳遞文字之外,也可以傳遞貼圖或照片喔,此外也可使用LINE Library的方式則更為簡單,使用者可自行Google 「Line-Notify-ESP32」就會有更多的資訊喔。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include
#include
#include
//請修改以下參數--------------------------------------------
char SSID[] = "You";
char PASSWORD[] = "0933932774";
String Linetoken = "WtDKBVVVFXag0ElRim8cOh9le7AnINWjctMe3R1xfvI";
int pinDHT11 = 14;//假設DHT11接在腳位GPIO14,麵包板左側序號8
//---------------------------------------------------------
SimpleDHT11 dht11(pinDHT11);
WiFiClientSecure client;
char host[] = "notify-api.line.me";
void setup() {
Serial.begin(115200);
//連線到指定的WiFi SSID
Serial.print("Connecting Wifi: ");
Serial.println(SSID);
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
//連線成功,顯示取得的IP
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
IPAddress ip = WiFi.localIP();
Serial.println(ip);
}
void loop() {
//嘗試讀取溫濕度內容
byte temperature = 0;
byte humidity = 0;
int err = SimpleDHTErrSuccess;
if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
Serial.print("Read DHT11 failed, err="); Serial.println(err); delay(1000);
return;
}
//讀取成功,將溫濕度顯示在序列視窗
Serial.print("Sample OK: ");
Serial.print((int)temperature); Serial.print(" *C, ");
Serial.print((int)humidity); Serial.println(" H");
//設定觸發LINE訊息條件為溫度超過30或濕度超過80
if ((int)temperature >= 30 || (int)humidity >= 80) {
//傳遞Line訊息
String message = "檢測環境發生異常,請協助儘速派人查看處理,目前環境狀態:";
message += "\n溫度=" + String(((int)temperature)) + " *C";
message += "\n濕度=" + String(((int)humidity)) + " H";
Serial.println(message);
if (client.connect(host, 443)) {
int LEN = message.length();
//組成POST訊息
String url = "/api/notify";
client.println("POST " + url + " HTTP/1.1");
client.print("Host: "); client.println(host);
//client.println("Connection: close");
//權杖
client.print("Authorization: Bearer "); client.println(Linetoken);
client.println("Content-Type: application/x-www-form-urlencoded");
client.print("Content-Length: "); client.println( String((LEN + 8)) );
client.println();
//訊息內容
client.print("message="); client.println(message);
client.println();
delay(500);
String response = client.readString();
//顯示送出結果(200表示成功)
Serial.println(response);
}
else {
//傳送失敗
Serial.println("connected fail");
}
}
//每5秒讀取一次溫濕度
delay(5000);
}

(作者為本刊共筆作者,原文連結,其專欄文章同步發表於作者部落格;責任編輯:謝涵如)

Author: 尤濬哲

身兼助理教授/專欄作家/知名部落客,以及點點滴滴科技研發總監等身份,專長包括人工智慧、多媒體互動(Unity)、智慧互動裝置(APP、Arduino)、虛擬實境與擴增實境互動、IoT 實做開發。 學歷:中山大學資訊管理研究所 博士

Share This Post On

發表

跳至工具列