--- title: Line訊息異常通報 slideOptions: transition: slide transitionSpeed: 'fast' theme: league --- <!-- .slide: data-background="https://i.imgur.com/gJLfldF.jpg" data-background-color="#111111" data-background-opacity="0.2" --> ###### tags: `iot-greenhouse` `lab` 返回[物聯網自動化溫室監控系統](/s/PJIS24sFR76axKI0xOrnjQ) ## <span style="color:#F9BF45;">Line訊息異常通報</span> ###### [點我開啟簡報模式](/@BEExANT-ta/HJmDNE9uY#) ###### <kbd>ESC</kbd> 鍵進入總覽模式 ###### <kbd>&#8592;</kbd> <kbd>&#8593;</kbd> <kbd>&#8595;</kbd> <kbd>&#8594;</kbd> 切換頁面 --- ## 目標 **讓裝置連接外部網路,當超過所設定的感測範圍時,從網頁發送IFTTT的請求,將異常報告透過IFTTT發送至管理者的Line上,能夠在第一時間進行故障排除。** --- ## 設計原理 - 將溫室端與幫浦端裝置的外部網路設定為==手機分享的網路==(亦可使用wifi分享器)。 - 透過手機網路可以取得三個裝置的IP位址。 - 依據[IFTTT帳號申請與Line連動教學](/s/pe8JFAkNT8u3EhP4tytELA)申請一組IFTTT的帳號,並與個人Line帳號連動。 - 可以從網頁上發送http請求至IFTTT的webhook中,再由IFTTT轉發訊息至LineNotify上。 ---- :::info :globe_with_meridians: 參考資源 - [使用IFTTT串聯網路自動化服務](https://swf.com.tw/?p=1262) - [IFTTT 發送 LINE 訊息通知](https://www.oxxostudio.tw/articles/201803/ifttt-line.html) ::: --- ## 範例程式碼 新增程式檔並命名 ==環境感測異常通報==,將以下程式碼複製貼上程式編輯區執行。 > 以溫室端為例 ```javascript= let key = ""; function postData(data) { return fetch("https://maker.ifttt.com/trigger/line/with/key/" + key, { body: "value1="+data, headers: new Headers({ "Content-Type": "application/x-www-form-urlencoded", "Access-Control-Allow-Origin": "*", }), method: 'POST', mode: 'no-cors', }) } window.state = "初始化"; window.count = 0; let time = 15000; let id = ""; if(state == "初始化") { state = "偵測模式"; postData(id+ ": 裝置程式啟動"); delay(1000); } if(DATA.air_T_output > 25 && state == "偵測模式" && count == time) { postData(id+ ": 空氣溫度過高," + "值 " + DATA.air_T_output); delay(3000); } if(DATA.air_H_output < 50 && state == "偵測模式" && count == time) { postData(id+ ": 空氣濕度過低," + "值 " + DATA.air_H_output); delay(3000); } if(DATA.soil_H_output < 50 && state == "偵測模式" && count == time) { postData(id+ ": 土壤濕度過低," + "值 " + DATA.soil_H_output); delay(3000); } if(count < time) { count += 300; } else { count = 0 ; } ``` --- ## 程式解說 逐行講解程式意義。 ---- ```javascript= let key = ""; function postData(data) { return fetch("https://maker.ifttt.com/trigger/line/with/key/" + key, { body: "value1="+data, headers: new Headers({ "Content-Type": "application/x-www-form-urlencoded", "Access-Control-Allow-Origin": "*", }), method: 'POST', mode: 'no-cors', }) } ``` - 定義區域變數key,輸入從==IFTTT上webhook中所取得的key==。 - 定義函式postData,代入訊息使用,將==訊息發送至Line上==。 ---- ```javascript= window.state = "初始化"; window.count = 0; ``` - 定義全域變數state,作為記錄狀態的變數。 - 定義全域變數count,作為計時器的變數。 ---- ```javascript= let time = 15000; let id = ""; ``` - 定義區域變數time,代表每次偵測的間隔,預設為15秒。 - 定義區域變數id,輸入使用網頁的裝置名稱,在Line上收到訊息時能辨識來自哪一個裝置。 ---- ```javascript= if(state == "初始化") { state = "偵測模式"; postData(id+ ": 裝置程式啟動"); delay(3000); } ``` - 當狀態為初始化時,將狀態設為偵測模式,發送Line訊息後等待3秒。 ---- ```javascript= if(DATA.air_T_output > 25 && state == "偵測模式" && count == time) { postData(id+ ": 空氣溫度過高," + "值 " + DATA.air_T_output); delay(3000); } if(DATA.air_H_output < 50 && state == "偵測模式" && count == time) { postData(id+ ": 空氣濕度過低," + "值 " + DATA.air_H_output); delay(3000); } if(DATA.soil_H_output < 50 && state == "偵測模式" && count == time) { postData(id+ ": 土壤濕度過低," + "值 " + DATA.soil_H_output); delay(3000); } ``` - 當狀態為偵測模式時,判斷三種感測結果是否異常,結果為異常則發送Line訊息通知並等待3秒。 ---- ```javascript= if(count < time) { count += 300; } else { count = 0 ; } ``` - 每次迴圈執行間隔為300毫秒,count由0開始往上加,直到大於預設的time後(15秒後),再將count設為0,從頭開始循環。 --- ## 範例影片 {%youtube BIu1QNz5yGk %} ---- {%youtube vHuQ5IhLuUs %} <a class="btn btn-warning" style="width:100%;color:#333333;" href="/s/jgTA940UQ6OgMsn89AjY_Q" role="button"> 自動化溫室監控系統 **&#8680;** </a> <a class="btn btn-primary" style="width:100%;" href="/s/nSEz4RewSzC2CPuY6tYfDw" role="button"> **&#8678;** 進階排程自動控制 </a>