clearIntervalでLINE botの処理を止める（「obnizとLineBotで防犯ツールを作ってみた」の続き）

# この記事で紹介すること
前回の記事では、
[obnizとLineBotで防犯ツールを作ってみた（NO MORE XX 泥棒）](https://qiita.com/shima-07/items/e4d6a33c460da77e25ec)
LINEBotから遠隔で「監視開始」指示を出したのはいいが**「監視終了」の指示が出せなかった。**
そのため、永遠に監視をしてセンサーが反応するたび何通も「誰かいるかも？」とメッセージがきていた。

本記事では「監視終了」の箇所を紹介します。

# どうすれば止められるか
setInterval()を使っていたので、clearInterval()を使って止めます。

[こちらの解説](https://developer.mozilla.org/ja/docs/Web/API/Window/setInterval#example)によるとこういうことらしい。

>setInterval() メソッドは、一定の遅延間隔を置いて関数やコードスニペットを繰り返し呼び出します。これは、インターバルを一意に識別する interval ID を返します。よって clearInterval() を呼び出して、後でインターバルを削除できます。


ふむふむ。
前回まででは登場しなかった``` interval ID ``` が必要らしい。

# interval IDをとってくる

このように取れるようだ。

```var intervalID = scope.setInterval(func, delay[, param1, param2, ...]);```
```var intervalID = scope.setInterval(code, delay);```

前回はsetIntervalの中にまるっと書いていたので、今回はわかりやすいように関数とsetInterval部分を分けてみました。

``` get_intervalId.js
        //intervalid をとってくる
        interval_id = setInterval(monitor,1000);

        async function monitor(){
            // 非同期で取得
            var detected = await sensor.getWait();
            // console.log(detected);
            obniz.display.clear();  // 一旦クリアする
            // obniz.display.print(detected);  // true/falseを表示したいとき
           if(detected == true ){ // 何かを感知したら
              obniz.display.clear();  // 一旦クリアする
              obniz.display.print("someone moving!");
              led.on(); // ライトON
              getAskObniz(event.source.userId);  // message

            }else{
              led.off();
            } 
          }
```

ちなみにinterval_idの変数定義はスコープ考えてかなり上位に置いておきます。
（最後の全コードで確認してください）

# clearInterval()で処理を止める
今回の場合「スタート」とコメントしたらセンサーが稼働し始めて、「エンド」とコメントしたらセンサーの稼働を止める。
なので、こんな感じで書くだけでOK。

```censor_stop.js
if(event.message.text === 'エンド'){
      //clearIntervalで処理を終わらせる
      clearInterval(interval_id);
      mes = '監視終了';
}
```

# 全コード
```line_sensor2.js
'use strict';

// obniz呼び出し
const Obniz = require('obniz');
var obniz = new Obniz("XXXXX");  // Obniz_ID に自分のIDを入れます

const express = require('express');
const line = require('@line/bot-sdk');
const PORT = process.env.PORT || 3000;

const config = {
    channelAccessToken: 'XXXXX',
    channelSecret: 'XXXXX'
};

const app = express();

app.post('/webhook', line.middleware(config), (req, res) => {
    console.log(req.body.events);
    Promise
      .all(req.body.events.map(handleEvent))
      .then((result) => res.json(result));
});

const client = new line.Client(config);

// obniz接続//////////
// スコープ（変数の影響範囲）を最上部に置いておく
var sensor;
var led;
var interval_id ;
// 接続した段階でセンサーの準備はしておく
obniz.onconnect = async function(){
    obniz.display.clear();
    obniz.display.print("obniz LINE bots");
    sensor = obniz.wired("HC-SR505", {vcc:11, signal:10, gnd:9});
    led = obniz.wired("LED",{anode:0,cathode:1});
}

function handleEvent(event) {
  if (event.type !== 'message' || event.message.type !== 'text') {
    return Promise.resolve(null);
  }

  let mes = ''
  //var interval_id ; ←ここだとうまくいかない。
  if(event.message.text === 'スタート'){
    mes = 'OK！監視始めるね！'; //メッセージだけ先に処理
        // ディスプレイ処理
        obniz.display.clear();  // 一旦クリアする
        obniz.display.print("Hello obniz!!!!!!");  // Hello obniz!という文字を出す

        //intervalid をとってくる
        interval_id = setInterval(monitor,1000);

        async function monitor(){
            // 非同期で取得
            var detected = await sensor.getWait();
            // console.log(detected);
            obniz.display.clear();  // 一旦クリアする
            // obniz.display.print(detected);  // true/falseを表示したいとき
           if(detected == true ){ // 何かを感知したら
              obniz.display.clear();  // 一旦クリアする
              obniz.display.print("someone moving!");
              led.on(); // ライトON
              getAskObniz(event.source.userId);  // message

            }else{
              led.off();
            } 
          }
        //console.log(interval_id);

  }else if(event.message.text === 'エンド'){
      //clearIntervalで処理を終わらせる
      clearInterval(interval_id);
      mes = '監視終了';
      //console.log(interval_id);

  }else{  mes = event.message.text; }

  return client.replyMessage(event.replyToken, {
    type: 'text',
    text: mes
  });
}

const getAskObniz = async (userId) => {
  await client.pushMessage(userId, {
      type: 'text',
      text: "誰かいるかも？",
  });
}

app.listen(PORT);
console.log(`Server running at ${PORT}`);
```

# 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121887/ea583c3c-68e0-0407-4f71-01d32bbc428f.png)
「エンド」と言ったらちゃん監視終了してくれました！

これはなかなか使えそうな予感。
こんなに簡単に遠隔操作可能な監視モニターが作れるとは。