見出し画像

人感センサーメール通知システムその4(完結)

試験をしながら動作状況を見てパラメータを変えていますが、日によってセンサーの反応回数にばらつきがあるので良さそうなポイントを見つけてちょくちょく変えていきたいと思います

個人的な備忘録ですが一応GASのコピペサンプルを載せておきたいと思います。
また損害などが発生しても責任を負いかねますのでご了承ください。


// Gmail の検索クエリ
var query = 'newer_than:1d 動体検知イベント';

// メールの到着が何分以上前かの閾値
var threshold = 180;

// 結果の通知を送るメールアドレス
var adminAddress = 'xxxxxxx@gmail.com';


/**
* エントリポイント
* この関数にトリガーを設定して毎日実行する
*/
function myfunc() {
var d = getLatestMailDate(query);
if (isLongerPeriod(d, threshold)) {
sendNotificationMail();
}
}

/**
* 指定したアドレスへメールを送る(タイトルと本文ですが本文には自分用でPLANEXのセンサーのURLが入っています
*/
function sendNotificationMail() {
var subject = '直近 ' + threshold + ' 分以内にメールはありませんでした。(クエリ: ' + query + ' )';
var body = 'https://svcipp.planex.co.jp/iot/wp-admin/admin.php?page=my-ds-submenu';
GmailApp.sendEmail(adminAddress, subject, body);
//メールを2箇所送りたかったので無理やり下の行に追加
//GmailApp.sendEmail("yyyyyyyy@gmail.com", subject, body);
}

/**
* クエリで検索したメールのスレッドから最新のメールを取り出し、日時を取得する
* @param {String} q - 検索クエリ文字列
* @return {Date}
*/
function getLatestMailDate(q) {
var threads = GmailApp.search(q);
var latestThread = threads[0];
var messages = latestThread.getMessages();

// 配列の最後の要素(メール)
var latestMessage = messages[messages.length - 1];
var d = latestMessage.getDate();
return d;
}

/**
* 実行時の現在時刻との差分が指定値よりも大きいか比較する
* @param {Date} d - 日時オブジェクト
* @param {Number} t - 何分以上前か
* @return {Boolean}
*/
function isLongerPeriod(d, t) {
var now = new Date();

// 現在時刻との差分(単位はミリ秒)
var diff = now.getTime() - d.getTime();

// 分に換算
var minutes = diff / (1000 * 60);
return minutes > t;
}


時間を指定する場合は下記追加

//トリガー作成
function startTriggers(){
setTriggerofTrigger();
setTriggerofDeleteTrigger();
}

function setTriggerofTrigger(){
// 9時から開始
ScriptApp.newTrigger("setTrigger")
.timeBased()
.atHour(9)
.everyDays(1) 
.create();
}
function setTriggerofDeleteTrigger(){
// 20時終了
ScriptApp.newTrigger("deleteTrigger")
.timeBased()
.atHour(20)
.everyDays(1)
.create();
}

function deleteTrigger() {
var triggers = ScriptApp.getProjectTriggers();
for(var i=0; i < triggers.length; i++) {
if (triggers[i].getHandlerFunction() == "myfunc") {
ScriptApp.deleteTrigger(triggers[i]);
}
}
}
// 30分ごとにトリガー1、5、10、15、30分のいずれか
function setTrigger() {
ScriptApp.newTrigger("myfunc")
.timeBased()
.everyMinutes(30)
.create();
}
function myfunc(){
Logger.log('hello');
}
//トリガー増えすぎるので削除
function delTrigger() {

const triggers = ScriptApp.getProjectTriggers();
for(const trigger of triggers){
if(trigger.getHandlerFunction() == "myFunction"){
ScriptApp.deleteTrigger(trigger);
}
}

}


この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
1
群馬県、宝台樹スキー場すぐ下の民宿です https://e-yoshinoya.com/ 地域や、観光、個人的ニュースを書いていこうと思います