見出し画像

暑くて眠れないので温度を自動記録するNature Remo API/GASアプリを作った

背景

僕の家庭では一晩中エアコンをつけているのですが、それでも夜中暑さで目覚めることがあります。
室温と外気温の差が小さくなる夜の時間帯は、エアコンが『目的の温度に達したぜ!』と感じやすく、結果として夜は良く止まってしまうという最悪な事態に陥りやすいのだそうです。

熱帯夜の対策としては『夜中の設定温度を日中よりも低くすること』らしく、自分の知識とは逆でした。夜って日中よりも温度上げますよね普通。

さて、ここでふと『そもそも夜中の室温は何度なんだろう?』と思い、室温を自動記録してみようと思い立ちました。

Nature Remo APIで温度を取得

室温を取得する方法は色々あると思います。

1. 温度計を定期的に見て記録する(現実的に無理…)
2. Raspberry piで自動取得する

今回は家にあった多機能リモコンのNature Remoを使いました。
Nature Remoは温度・湿度・人感センサーが付いているので、Raspberry Piみたいに電子工作する必要もないですし、一番楽かと思いまして。

構成としてはこのような形です。

GASを中心に、Nature Remoから取得した温度データをスプレッドシートに記録する機能を実装します。

Nature Remo APIの準備

こちらの記事を参考にしてNature Remoの設定を行います。

途中Jsonコマンドを楽に扱えるjqモジュールをインストールする部分は、今回環境であるWindowsに合わせて以下のインストール処理を行いました。

コマンドを打ってみるとうまく取得できました。
以下コマンドと結果です。

curl -X GET "https://api.nature.global/1/devices" -H "accept: application/json" -k --header "Authorization: Bearer XXX" | jq
[
  {
    "name": "Remoリビング",
    "id": "XXX",
    "created_at": "2018-01-28T01:28:19Z",
    "updated_at": "2018-07-11T00:19:30Z",
    "firmware_version": "Remo/1.0.62-gabbf5bd",
    "temperature_offset": 0,
    "humidity_offset": 0,
    "users": [
      {
        "id": "XXX",
        "nickname": "XXX",
        "superuser": true
      }
    ],
    "newest_events": {
      "hu": {
        "val": 50,
        "created_at": "2018-07-11T01:29:40Z"
      },
      "il": {
        "val": 242.19,
        "created_at": "2018-07-10T23:40:45Z"
      },
      "te": {
        "val": 30.59,
        "created_at": "2018-07-11T00:57:11Z"
      }
    }
  }
]

teは温度、huは湿度だろうけど、ilって何だろう。人感センサーかな。
さて、温度だけを取得します。こちらも順調です。

curl -X GET "https://api.nature.global/1/devices" -H "accept: application/json" -k --header "Authorization: Bearer TokenID" | jq .[].newest_events.te.val
30.59

GAS(Google App Script)を利用して
温度をスプレッドシートに記録する

今回はNature Remoで取得した温度データをGASを用いてスプレッドシートに記録することにしました。
最初はローカル環境のPCで実行しようと思ったのですが、サーバーとして起動させるのが面倒だなと思っていたら、GASに行きつきました。

GoogleAppScript(略してGAS)はGmailやSpreadSheetなどGoogleの様々なシステムと連携するシンプルなWebアプリをjavascriptで簡単に書けるサービスです。
メリットとしては
・サーバーレス
・なのに無料(神)
・Googleの他のサービスと連携するAPIが多数用意されている。
var access_token = 'XXX'
var spreadsheetId = 'XXX'
 
function main() {
  var data = getNatureRemoData();
  var lastRow = getLastRow();
  setLatestData(data, lastRow+1);
}
 
// Nature RemoへGETリクエストを送信します。
function getNatureRemoData() {
  var url = "https://api.nature.global/1/devices";
  var headers = {
    "Content-Type" : "application/json;",
    'Authorization': 'Bearer ' + access_token,
  };
  var options = {
    "method" : "get",
    "headers" : headers,
  };

  var data = JSON.parse(UrlFetchApp.fetch(url, options));
  return data;
}
 
// スプレッドシートの最終セルを取得します。
function getLastRow() {
  var datas = SpreadsheetApp.openById(spreadsheetId).getSheetByName('log').getDataRange().getValues()
  var data = datas[datas.length - 1]
 
  return datas.length;
}
 
function setLatestData(data, row) {
  SpreadsheetApp.openById(spreadsheetId).getSheetByName('log').getRange(row, 1).setValue(new Date())
  SpreadsheetApp.openById(spreadsheetId).getSheetByName('log').getRange(row, 2).setValue(data[0].newest_events.te.val)
  SpreadsheetApp.openById(spreadsheetId).getSheetByName('log').getRange(row, 3).setValue(data[0].newest_events.hu.val)
}

いざスクリプトを実行しようとしたら「承認」なる言葉で怒られたので以下の記事の手続きの通りに行ったら回避できました。

うまくシートに記録できました!
ちなみにヘッダーは手動で入力しています。

このプログラムを15分毎に定期的に実行するように設定しました。
設定方法はこちらを見て覚えました。GASって本当に便利ですね。

まとめ

熱帯夜を回避するつもりが温度を自動記録することになってしまいました。
でもこれによって『暑さで目が覚めたときの気温』を取得できるようになりました。

応用すればエアコンの細かな制御にまで繋げられそうです。
とりあえず現状把握できる環境は整ったので、次回はエアコンを制御してみようかなと思います。楽しみです。

この記事が気に入ったらサポートをしてみませんか?