Nature remoで部屋の温度と湿度を見える化。そこから不快指数を計算し、外気のそれと比較して窓を開けるべきか判断するまで。(1)

これから季節の変わり目になりだんだんと涼しくなってくる。すると昼は暑いが、夕方になると知らないうちに外のほうが涼しくなっていて、エアコンが必要なくなっていたということがよく起こりうる。エアコンの電力消費量を抑えてエコに使いたいというときによく起こる現象である。また外気の温度は低くても、湿度が依然として高い場合は不快に感じてやはりエアコンが必要だったりする。

基本的な疑問としては
・エアコンは強すぎないか、弱すぎないか
・気温を下げるべきか、湿度を下げるべきか(冷房がいいのか、除湿がいいのか)

外気との比較では
・エアコンをつけている方が涼しいのか、窓を開けても十分涼しいのか
・また温度だけでなく湿度も考慮すると、窓を開けても涼しいのか

ほかにも、
・寝る前はエアコンをつけているべきだったが、寝ている間の外気温低下はどの程度か
・外気温の低下を考慮すると窓を開けて寝るべきなのか
・特に乳幼児がいる場合、問題ない室温に保てているだろうか(大人には快適でも赤ちゃんには不快な温湿度ゾーンが存在する。肌感覚だけでなく、数字に基づいた判断が行えれば乳幼児のトラブルも防げるだろう)

などなど考えることが多い。(春はその逆。)

Nature remoは市販されているスマートホーム用のリモコン及びセンサーであり、同製品を使った簡単な室温ダッシュボードの作成記事などはインターネット上にも転がっていたが、不快指数の計算や外気との比較、興味のそそられるであろう同時期通年比較や時間帯比較などまでダッシュボード化している例は見つからなかった。
そこで、今回はNature remoを使った室内の気温室温および外気温のモニタリング、及び不快指数を利用したエアコンのオンオフ・窓の開閉の意思決定を行ったので紹介する。

必要なもの

・Nature remo
・Googleアカウント(Google spread sheet、Google data studioを利用)

Nature remo周りの準備

・Nature remoのアクセストークンを取得する

Nature remoのアクセストークンの取得は公式に書いてあったり、様々な記事も見つかると思うのでここでは省略する。
重要なことはアクセストークンが他人に知られてしまうとNature remoにアクセスされてしまうので流出に注意が必要だが、普通にしていれば流出しない。

・Nature remoで取得できるデータの種類

取得できるデータの種類は温度、湿度、明るさ、人感およびそれらの検知時間が取得できる。今回はこの内、温度、湿度、明るさを取得しモニタリングしてみる。

Google spreadsheet とGoogle app script(GAS)

まずnature remoからのRaw dataを記録していくspread sheetを作成する。
・ブック名はnature-remo-monitor_RAW、シート名はlogとしておく。

・カラムは上の写真のようにDate、Year、、、、、、、と入れておく。
- Date, Year, MMDD, HHmm, MM, DD, HH, mm, Week:
データが記録された日付関連のカラム。後でデータを可視化する際に必要になる
-humidity_created_at:
データがNature remo内で生成された日付データ。illumination,temparatureも同様。
-humidity, illumination, temparature:
それぞれ湿度、照度、温度

GASとトリガーを編集、設定していく
・ToolsからScript editorをクリック

・エディターが開くので順番に下記のスクリプトを貼り付ける

・Nature remoのアクセストークンとgoogle spreadsheetのidを上記のXXXXの部分に貼り付ける。これは人それぞれに違っているかつ流出してほしくない部分なのでXXXXとしています。各々で編集。

var access_token = ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’
var spreadsheetId = ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’
var log_sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(‘log’)

・Time-driven tiggerを用いて一定時間ごとに走らせる部分

function main() {
var data = getNatureRemoData();
var lastRow = getLastRow();
setLatestData(data, lastRow+1);
}

・Nature remo APIにアクセストークンを渡してデータをJSON形式で取得する部分

// 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 = log_sheet.getDataRange().getValues()
var data = datas[datas.length — 1]
return datas.length;
}

・Nature remoから取得したJSON形式のデータを加工してスプレッドシートに落とし込む部分。もっとスマートに書きたい部分。

function setLatestData(data, row) {
var date = new Date()
//dateJST,YYYY,MMDD,HHmm,MM,DD,HH,mm,week,hu,hu_created_at,il,il_created_at,te,te_created_at
var dateJST = date
YYYY = (“0000” + date.getFullYear()).slice(-4)
MM = String((“00” + (date.getMonth()+1)).slice(-2))
DD = (“00” + date.getDate()).slice(-2)
HH = (“00” + date.getHours()).slice(-2)
mm = (“00” + date.getMinutes()).slice(-2)
week = getWeek(date)
MMDD=””+MM+DD
HHmm=””+HH+mm
hu = data[0].newest_events.hu.val
hu_time = new Date(data[0].newest_events.hu.created_at)
hu_created_at = UTCtoJST(hu_time).toISOString()
il = data[0].newest_events.il.val
il_time = new Date(data[0].newest_events.il.created_at)
il_created_at = UTCtoJST(il_time).toISOString()
te = data[0].newest_events.te.val
te_time = new Date(data[0].newest_events.te.created_at)
te_created_at = UTCtoJST(te_time).toISOString()
var arr = []
arr.push([dateJST,YYYY,MMDD,HHmm,MM,DD,HH,mm,week,hu,hu_created_at,il,il_created_at,te,te_created_at])
var i = arr.length; //タテ(行数)
var j = arr[0].length; //ヨコ(列数)
log_sheet.getRange(row,1,i,j).setValues(arr)
}

・時間の書式を整えたり、曜日の取得したりするひと手間

function UTCtoJST(date){
var date_out = new Date(date)
date_out.setHours(date_out.getHours()+9)
return date_out;
}
function getWeek(date){
var dayOfWeek = date.getDay()
var dayOfWeekStr = [“Sun”,”Mon”,”Tue”,”Wed”,”Thu”,”Fri”,”Sat”]
var week = dayOfWeekStr[dayOfWeek]
return week
}

・全部つなげるとこうなります

var access_token = ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’
var spreadsheetId = ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’
var log_sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(‘log’)

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 = log_sheet.getDataRange().getValues()
var data = datas[datas.length — 1]
return datas.length;
}

function setLatestData(data, row) {
var date = new Date()
//dateJST,YYYY,MMDD,HHmm,MM,DD,HH,mm,week,hu,hu_created_at,il,il_created_at,te,te_created_at
var dateJST = date
YYYY = (“0000” + date.getFullYear()).slice(-4)
MM = String((“00” + (date.getMonth()+1)).slice(-2))
DD = (“00” + date.getDate()).slice(-2)
HH = (“00” + date.getHours()).slice(-2)
mm = (“00” + date.getMinutes()).slice(-2)
week = getWeek(date)
MMDD=””+MM+DD
HHmm=””+HH+mm
hu = data[0].newest_events.hu.val
hu_time = new Date(data[0].newest_events.hu.created_at)
hu_created_at = UTCtoJST(hu_time).toISOString()
il = data[0].newest_events.il.val
il_time = new Date(data[0].newest_events.il.created_at)
il_created_at = UTCtoJST(il_time).toISOString()
te = data[0].newest_events.te.val
te_time = new Date(data[0].newest_events.te.created_at)
te_created_at = UTCtoJST(te_time).toISOString()
var arr = []
arr.push([dateJST,YYYY,MMDD,HHmm,MM,DD,HH,mm,week,hu,hu_created_at,il,il_created_at,te,te_created_at])
var i = arr.length; //タテ(行数)
var j = arr[0].length; //ヨコ(列数)
log_sheet.getRange(row,1,i,j).setValues(arr)
}
function UTCtoJST(date){
var date_out = new Date(date)
date_out.setHours(date_out.getHours()+9)
return date_out;
}
function getWeek(date){
var dayOfWeek = date.getDay()
var dayOfWeekStr = [“Sun”,”Mon”,”Tue”,”Wed”,”Thu”,”Fri”,”Sat”]
var week = dayOfWeekStr[dayOfWeek]
return week
}

スクリプトの編集は一旦完了し、一定時間ごとに上記のscriptが走るようにトリガーを設定する
・左上の時計マークをクリック。

・右下のAdd Triggerをクリック

・下の写真のようにTime-drivenにして保存。
15分ごと、日毎にお知らせ、にしているがここはお好みで調整。

これで、spreadsheetにnature remoからデータを取得してspread sheetにデータを溜め込んでいくようになる。次回は溜め込んだデータから少し加工、更に処理してモニターしやすくしていく。

--

--

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store