clearIntervalでLINE botの処理を止める(「obnizとLineBotで防犯ツールを作ってみた」の続き)
この記事で紹介すること
前回の記事では、
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部分を分けてみました。
//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。
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}`);
結果
'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}`);
これはなかなか使えそうな予感。
こんなに簡単に遠隔操作可能な監視モニターが作れるとは。
Author And Source
この問題について(clearIntervalでLINE botの処理を止める(「obnizとLineBotで防犯ツールを作ってみた」の続き)), 我々は、より多くの情報をここで見つけました https://qiita.com/shima-07/items/47e10cc217964bce6e90著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .