<!-- .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>←</kbd> <kbd>↑</kbd> <kbd>↓</kbd> <kbd>→</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"> 自動化溫室監控系統 **⇨** </a>
<a class="btn btn-primary" style="width:100%;" href="/s/nSEz4RewSzC2CPuY6tYfDw" role="button"> **⇦** 進階排程自動控制
</a>
{"metaMigratedAt":"2023-06-16T15:04:49.276Z","metaMigratedFrom":"YAML","title":"Line訊息異常通報","breaks":true,"slideOptions":"{\"transition\":\"slide\",\"transitionSpeed\":\"fast\",\"theme\":\"league\"}","contributors":"[{\"id\":\"a1db0c29-d848-4070-be84-9191a2398ca8\",\"add\":6986,\"del\":3095}]"}