【子育てTech】部屋の室温の変化を通知する仕組みを作った

こんにちは。
先日初めての娘が生まれた[HAL](https://twitter.com/HAL1986____)です。

タイトルの通り、部屋の室温の変化を通知する仕組みを作ったので公開します。

# 何を作ったのか
新生児期は、体温調節を自分でできないため、大人が室温や服装を調節してあげる必要があります。
冬の時期については、暖房を使用して20度〜25度くらいをキープする必要があります。
（月齢・服装にもよるのであくまで目安）

ある程度はエアコンが自動で温度を調節してくれますが、人が調節する必要がある場合もあります。
そんなときのために、室温が閾値を超えた・下回った場合に、LINEに通知をする仕組みを作りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571256/01fa3464-a625-533d-26b2-84f5c9a66fc0.png)

こんな感じで通知が来ます。

# どう作ったのか
仕組みとしては、Nature Remo + Google Apps Script + LINE Notifyを組み合わせました。

まず、子供が寝るベッドの脇にNature Remoを設置します。
（奥の白とグレーの箱がNature Remo。確認しやすいのでアナログな温湿度計も設置）

<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571256/004aece0-df59-d796-b757-cf648e89efbe.jpeg" alt="ベッド脇にNature Remoを設置">

Nature RemoではAPI経由で温度・湿度・照度を取得することが可能です。
これを利用し、GASを使って定期的に以下の処理を実行します。

1. Nature RemoのAPIから温度を取得
1. Spreadsheetに値を記録
1. Spreadsheetから前回の温度の記録を取得
1. 通知条件に合致した場合、LINE NotifyのAPIを呼んで通知を送信

通知条件は以下のようにしました。

* 温度が20未満 かつ 前回の温度の記録が20以上の場合通知
* 温度が25より大きい かつ 前回の温度の記録が25以下の場合通知
* 温度が17未満 かつ 前回の温度の記録が17以上の場合は警告
* 温度が28より大きい かつ 前回の温度の記録が28以下の場合は警告

前回の温度を使用しているのは、何度も何度も通知が来てしまうのを避けるためです。
それを気にしないのであれば、前回の温度を使用する必要はないので、Spreadsheetも不要です。

ちなみに、自分はSpreadsheetに記録して、グラフも見られるようにしてあります。

![温度・湿度のグラフ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571256/a87b8c77-3f97-756a-e24a-e5c1c3077328.png)

# 具体的な実装

GASのコードはこんな感じです。
（動けば良い自家用コードなのであまりキレイじゃないのはご愛嬌）

```js
const API_KEY = 'Nature Remoで発行されるAPI Key'
const NOTIFY_TOKEN = 'LINE Notifyで発行される API Token'

function myFunction() {

  // Nature Remo cloud APIからデータを取得
  var requestUrl = 'https://api.nature.global/1/devices'
  var requestHeaders = {
    'Authorization': 'Bearer ' + API_KEY
  }
  var requestOptions = {
    'headers': requestHeaders
  }

  var response = UrlFetchApp.fetch(requestUrl, requestOptions)
  var responseCode = response.getResponseCode()
  var responseText = response.getContentText()
  var responseJson = JSON.parse(responseText);
  console.log(responseJson[0].newest_events)
  const now = new Date()
  const sensor = responseJson[0].newest_events

  const sheet_id = '対象のSheet ID'
  const sheet_name = 'data'

  const sheet = SpreadsheetApp.openById(sheet_id).getSheetByName(sheet_name);
  console.log(sensor, now)

  const prevValue = sheet.getRange(2, 2).getValue();

  // 取得したデータを記録
  sheet.insertRows(2, 1);
  sheet.getRange(2, 1).setValue(now);
  sheet.getRange(2, 2).setValue(sensor.te.val); // 温度
  sheet.getRange(2, 3).setValue(sensor.hu.val); // 湿度
  sheet.getRange(2, 4).setValue(sensor.il.val); // 照度

  // 20度未満、25度より高くなったら通知、17度未満、28度より高くなったら警告
  const lineNotifyUrl = 'https://notify-api.line.me/api/notify'
  var requestHeaders = {
    'Authorization': 'Bearer ' + NOTIFY_TOKEN,
    "Content-Type": "application/x-www-form-urlencoded",
  }
  var data = null;

  if (sensor.te.val < 20 && prevValue >= 20) {
    data = {
      message: "和室の室温が20度を下回りました。"
    };

  } else if (sensor.te.val < 17 && prevValue >= 17) {
    data = {
      message: "【警告！！】和室の室温が17度を下回りました。すぐに確認してください！！"
    };
  } else if (sensor.te.val > 25 && prevValue <= 25) {
    data = {
      message: "和室の室温が25度を上回りました。"
    };
  } else if (sensor.te.val > 28 && prevValue <= 28) {
    data = {
      message: "【警告！！】和室の室温が28度を上回りました。すぐに確認してください！！"
    };
  }

  // 条件に合致しない場合は通知しない
  if(data === null){
    return
  }

  var lineRequestOptions = {
    'headers': requestHeaders,
    payload: data
  }

  var response = UrlFetchApp.fetch(lineNotifyUrl, lindRequestOptions)

}

```

これをWEBアプリケーションとしてデプロイして、トリガーで5分おきに実行するようにしました。

![トリガーの設定画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571256/668647a3-a931-813b-0f31-795c2ef03b08.png)

Nature RemoのAPI Keyの発行は[こちらのページ](https://developer.nature.global/)を参考にしてください。

https://developer.nature.global/

[LINE Notify](https://notify-bot.line.me/ja/)の方は開発者向けのアクセストークンを使用しました。
自宅利用だけならこれで十分かと思います。

https://notify-bot.line.me/ja/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571256/ddba55ea-e68e-9e10-e806-f5abb658e3e1.png)

# 終わりに
子育ては心配事や気にしなければならないことが多く、人間だけで対応しようとすると大変ですし疲れてしまいます。
こういった仕組みを導入することで、負担を減らしてより別のことに注力できるようにしていきたいですね。