家の鍵の閉め忘れを防止する Part1

#はじめに
家の鍵を閉め忘れる　ということがちょいちょいあります。
防犯面でよろしくないので、閉め忘れを防止するのが目的です。
我が家はオートロック付きマンションですが、それでも玄関の鍵はいわゆるサムターン式です。

#なぜ鍵を閉め忘れるのか
理由は単純明快で、***鍵を閉めなければならない***ことを忘れるから。

#まずやったこと
鍵の状態を把握するために、セサミの[スマートロック](https://jp.candyhouse.co/)を導入しました。
![コメント 2020-01-03 112231.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545683/7d9398ad-dda0-94a4-f521-1362e7fb531f.png)

これにより、現在鍵がOpen/Closeのどちらの状態にあるのかを、***スマホから確認***できるようになりました。 

#セサミのスマートロックでできること
- 鍵のOpen/Close状態の把握
- IFTTTとの連携
- 遠隔からOpen/Close制御
- オートロック
- 詳細は[公式サイト](https://jp.candyhouse.co/)や[レビュー](https://www.watch.impress.co.jp/docs/review/review/1196144.html)を参照

***付属のオートロック機能を使えば、鍵の閉め忘れに対する対策になる***とは思う。

しかし、***閉め出されるリスク***があるため、あくまでも***鍵があいていることを気づかせ、その人の手で閉めさせる***ことを目的にした。
閉め出されてしまうと[***とても大変***](https://www.gizmodo.jp/2019/06/smartlock-lock-out-goodby-gafam.html)なようである。

#対策
つまり対策は鍵を操作した人に対して、以下のことをする必要がある。
1. 今鍵が開いていることを気づかせる
2. 閉めるように促す
3. 鍵が閉まったことを確認する

#動作フロー
1. IFTTTでスマートロックがOpen/Closeしたら、スプレッドシートへ記録する。こんな感じ。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545683/24c5c68d-ba14-5019-ac4a-06379a4d764e.png)

2. スプレッドシートが更新されたら、Open/Closeの状態をGAS(Google Apps Script)で取得する。
3. Openの状態が5分以上続く場合、家庭内Slackへ鍵が開きっぱなしであることを通知する。
（ゆくゆくはLINEやNest Hubにも通知したい）
![おうちハック.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545683/2db7382a-f0f9-093f-4e1f-c24d2237bdca.jpeg)

こんな感じ。
![コメント 2020-01-03 152919.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545683/3b668a33-dff5-6290-3703-08577d0d47f6.png)

#関連箇所のコード
```Java:MyHome.gs
//スプレッドシートが更新されたらトリガーがかかる
function myHomekey() {
  
  //listシートを指定
  var url = "https://docs.google.com/spreadsheets/d/XXXXXXXXXXXXXXXXX/gid=0";
  var SpreadSheet_Input = SpreadsheetApp.openByUrl(url);
  var Sheet_Input = SpreadSheet_Input.getSheetByName("key");

  //タイマー設定(5min)
  var timer = 5;
  //最新の鍵の状態を取得
  var keystatus = getKeystatus(Sheet_Input);
  
  //OpenならSlackへ投稿
  if(keystatus == 1){
    for(var minute = 0; minute <= timer; minute++){
      waitSecond(60);  //60秒Wait
      keystatus = getKeystatus(Sheet_Input); //鍵の状態を更新
      
      if(keystatus == 1 && minute == timer){
        //timerで設定した時間が経ったら警告
        postSlack("鍵が開いています。" + "\n" + "すぐに閉めてください！" + "\n");
      }
    }  
  }else if(keystatus == 0){
    //鍵が閉まったので何もしない
    //postSlack("鍵がしまりました");
  }else{
    postSlack("myHomekey error!!" + "\n" + keystatus);
  }
}

//〇秒のSleep
function waitSecond(sec){
  Utilities.sleep(sec * 1000);
}

//OpenかCloseかチェックする
function checkStatus(status){
  var ret = 0;
  
  if(status == "Locked"){
    ret = 0;
  }else if(status == "Unlocked"){
    ret = 1;
  }else{
    ret = -1;
  }
  return ret;
}

function getKeystatus(Sheet_Input){
  var lastrow = Sheet_Input.getLastRow();                    //最終行取得
  var status = Sheet_Input.getRange(lastrow, 2).getValue();  //最終行のステータスを取得
  var ret = checkStatus(status);                             //最終行の状態がOpenかCloseか判断

  return ret;
}

function postSlack(word){
  var token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN');
  var slackApp = SlackApp.create(token);
  var options = {
    channelId: "#notice", //チャンネル名
    userName: "家の鍵を守るマン", //投稿するbotの名前
    message: word //投稿するメッセージ
  };
  slackApp.postMessage(options.channelId, options.message, {username: options.userName});
}
```


#学んだこと
GASでのWaitは以下でできる。(msなので*1000する）

```Java
Utilities.sleep(sec * 1000);
```

#その他
今回実装したのは、鍵が開いていたら、それを検知して、閉めるように促す機能まで。
次回は閉まったのかどうかを確認するように機能改善を図ろうと思う。