2
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-04-07

この記事で紹介すること

前回の記事では、
obnizとLineBotで防犯ツールを作ってみた(NO MORE XX 泥棒)
LINEBotから遠隔で「監視開始」指示を出したのはいいが「監視終了」の指示が出せなかった。
そのため、永遠に監視をしてセンサーが反応するたび何通も「誰かいるかも?」とメッセージがきていた。

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

どうすれば止められるか

setInterval()を使っていたので、clearInterval()を使って止めます。

こちらの解説によるとこういうことらしい。

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
「エンド」と言ったらちゃん監視終了してくれました!

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1