見出し画像

【セサミロック】鍵が一定時間以上開いたままなら通知する設定【パート4/4】今度こそ最終回

※コード生成にはAIを利用しています。ご利用は自己責任でお願います。


いやぁこのネタ、パート4まで来るとは流石に思わなかったです。

GAS(Google Apps Script)でやったら簡単に出来たのでUPしておきます。
ロジック的にはSesameAPIを使って定期的に開閉状態をチェックします。


手順

用意するものはGoogleアカウントだけです。もちろん無料。

・Google Driveにアクセスします。
パソコンで作業しています。スマホからでも出来ない事はないと思う。



・「新規」を選んで、「その他」→「Google Apps Script」をクリック。



・もともと書いてある3行くらいのコードは削除します。プロジェクト名とかはお好みで変えてください。


// 設定情報
const API_KEY = 'あなたのAPIキー';
const DEVICE_UUID = 'あなたのデバイスUUID';
const NOTIFY_EMAIL = '通知先メールアドレス';
const THRESHOLD_MINUTES = 60; // 通知する放置時間(分)


function checkSesameStatusAndNotify() {
  const url = `https://app.candyhouse.co/api/sesame2/${DEVICE_UUID}`;
  const options = {
    'method': 'get',
    'headers': { 'x-api-key': API_KEY }
  };

  try {
    // 1. セサミの状態を取得
    const response = UrlFetchApp.fetch(url, options);
    const status = JSON.parse(response.getContentText());
    const isLocked = status.CHSesame2Status; // locked: 施錠, unlocked: 解錠
    console.log(isLocked);

    const props = PropertiesService.getScriptProperties();
    const lastOpenTime = props.getProperty('LAST_OPEN_TIME');
    const now = new Date().getTime();

    if (isLocked != 'locked') {
      // 解錠状態の場合
      if (!lastOpenTime) {
        // 初めて解錠を検知した時間を保存
        props.setProperty('LAST_OPEN_TIME', now.toString());
      } else {
        // 経過時間を計算
        const durationMin = (now - parseInt(lastOpenTime)) / (1000 * 60);
        if (durationMin >= THRESHOLD_MINUTES) {
          // 一定時間を超えたらメール送信
          GmailApp.sendEmail(NOTIFY_EMAIL, "警告:セサミが開いたままです", 
            `${THRESHOLD_MINUTES}分以上、鍵が開いたままになっています。確認してください。`);
          // 重複通知を防ぐため一旦リセット、または通知済みフラグを立てる
          props.deleteProperty('LAST_OPEN_TIME'); 
        }
      }
    } else {
      // 施錠されたら記録をリセット
      props.deleteProperty('LAST_OPEN_TIME');
    }
  } catch (e) {
    console.log('エラーが発生しました: ' + e.message);
  }
}

・削除した空白のところへコードを貼り付けます。


・APIキー、UUIDの箇所はセサミのサイトで取得して書き換えて下さい。
・通知したいメールアドレスを入力します。
Googleドライブを開いた同じアカウントでOKです。
Discordに通知でもよいのですが、ここは手軽さを重視してメールにしました。
・通知するリミットを分単位で指定します。
チェック間隔があるので、この時間を超えたからといって即時通知はされるわけでありません。
通知がされるのはスケジュールされたコードが実行されたタイミングです。

・必要な箇所を書き換えたら実行ボタンを押下してみてください。
ログに「locked: 施錠, unlocked: 解錠」どちらかの情報が出力される筈です。
もしエラーが出るようなら何処かが間違ってます。


条件を満たせばメールで通知されます。



・動作を確認したらスケジュールします。一番左の時計マークをクリック。



実行する関数は先ほどコピペした奴です。はじめてGASを触るなら一つしかない筈です。



パート1の記事内でも書きましたが、現実的にはAPIの使用回数制限(無料枠)があるので、1時間に1回か2回のチェックが限界でしょう。
ここでは1時間としています。



  // --- 時間判定の追加 ---
  const now = new Date();
  const hour = now.getHours(); // 現在の「時」を取得 (0〜23)

  // AM8時から深夜AM1時まで実行したい場合:
  // =「AM1時〜AM7時59分」の間であれば処理を終了(スキップ)する
  if (hour >= 1 && hour < 8) {
    console.log("現在は実行時間外です(深夜1時〜朝8時)。処理を終了します。");
    return; 
  }
  // ---------------------

GASのスケジュールでは8時~25時の間だけ実行というような設定ができないみたいなので、APIの実行回数を減らすのであれば、コード内に時間制限処理を入れるなりしてください。

それからGAS自体にも実行制限はあるんですが、この処理は1回2秒以下で終わっているので、引っかかる事は無いと思います。



最後に

パート5は絶対ないはず。

しっかしAIの世界はあと10年したらどうなっちゃうんだろう。
進化がすごいですね。


今回は以上です。


いいなと思ったら応援しよう!