Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8879

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

$
0
0

この記事で紹介すること

前回の記事では、
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);asyncfunctionmonitor(){// 非同期で取得vardetected=awaitsensor.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();// ライトONgetAskObniz(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呼び出しconstObniz=require('obniz');varobniz=newObniz("XXXXX");// Obniz_ID に自分のIDを入れますconstexpress=require('express');constline=require('@line/bot-sdk');constPORT=process.env.PORT||3000;constconfig={channelAccessToken:'XXXXX',channelSecret:'XXXXX'};constapp=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));});constclient=newline.Client(config);// obniz接続//////////// スコープ(変数の影響範囲)を最上部に置いておくvarsensor;varled;varinterval_id;// 接続した段階でセンサーの準備はしておくobniz.onconnect=asyncfunction(){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});}functionhandleEvent(event){if(event.type!=='message'||event.message.type!=='text'){returnPromise.resolve(null);}letmes=''//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);asyncfunctionmonitor(){// 非同期で取得vardetected=awaitsensor.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();// ライトONgetAskObniz(event.source.userId);// message}else{led.off();}}//console.log(interval_id);}elseif(event.message.text==='エンド'){//clearIntervalで処理を終わらせるclearInterval(interval_id);mes='監視終了';//console.log(interval_id);}else{mes=event.message.text;}returnclient.replyMessage(event.replyToken,{type:'text',text:mes});}constgetAskObniz=async(userId)=>{awaitclient.pushMessage(userId,{type:'text',text:"誰かいるかも?",});}app.listen(PORT);console.log(`Server running at ${PORT}`);

結果

image.png
「エンド」と言ったらちゃん監視終了してくれました!

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


Viewing all articles
Browse latest Browse all 8879

Trending Articles