Nature Remo のデータを自動で取得して記録したい
Nature Remo の API (https://developer.nature.global/) を使って、データを取得する方法は複数のページで公開されているのですが
- 複数台のNature Remoを使いたい
- Nature Remo/ Remo Mini 混在の環境で動かしたい
- GASを使ってデータを集めたい
- Sheetがなかったら自動で作成してほしい
- Remoを途中で追加してもコードを変更しないようにしたい
ということを満たすコードがなかったので、既存のコードをベースに書いてみました
var access_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'//アクセストークン
var spreadsheetId = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'//スプレッドシートID
function remo() {
var data = getNatureRemoData();
for( d_cnt in data ){
// Logger.log (data[d_cnt])
var sheetname = data[d_cnt].name
if (SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetname) ){
writeRemoData(sheetname,data[d_cnt]);
}else{
initRemoData(sheetname,data[d_cnt]);
writeRemoData(sheetname,data[d_cnt]);
}
}
}
function getNatureRemoData() { //Remo API
var url = "https://api.nature.global/1/devices";
var headers = {
"Content-Type" : "application/json;",
'Authorization': 'Bearer ' + access_token,
};
var postData = {
};
var options = {
"method" : "get",
"headers" : headers,
};
var data = JSON.parse(UrlFetchApp.fetch(url, options));
return data;
}
function initRemoData(sheet,data){
SpreadsheetApp.openById(spreadsheetId).insertSheet(sheet)
if (data.firmware_version.match(/mini/)){ //Miniなら室温だけ、Remoなら湿度と照度も書き出し
SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheet).appendRow(["時刻","取得時刻","室温"])
}else{
SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheet).appendRow(["時刻","取得時刻","室温","湿度","照度","人感"])
}
}
function writeRemoData(sheet, data) {
if (data.firmware_version.match(/mini/)){ //Miniなら室温だけ、Remoなら湿度と照度も書き出し
var jtm = Utilities.formatDate(new Date(data.newest_events.te.created_at), 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss');
SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheet).appendRow([new Date(), jtm,data.newest_events.te.val])
}else{
if (dayjs.dayjs(new Date(data.newest_events.te.created_at)).isAfter(new Date(data.newest_events.hu.created_at))){
date1 = new Date(data.newest_events.te.created_at)
}else{date1 = new Date(data.newest_events.hu.created_at)}
if (dayjs.dayjs(new Date(data.newest_events.il.created_at)).isAfter(date1)){
date1 = new Date(data.newest_events.il.created_at);
}
var jtm = Utilities.formatDate(date1, 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss');
SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheet).appendRow([new Date(), jtm,data.newest_events.te.val, data.newest_events.hu.val, data.newest_events.il.val,data.newest_events.mo.val])
}
}```
たいして特徴もないのですが、Remoに設定されている `name` をもとにしてシートを自動で作成するのと
RemoかMiniかを判定して書き込む内容を判断します
あと時刻は取得時間ではなく、Remoの取得時間をJSTに変換して記録するようにしました