GASからNatureRemoのAPIを叩く!
目覚ましと同時に電気をつけたい
私を朝が弱い&遮光カーテンを使っているせいで、目覚めがとても悪い。
そこで、目覚ましと同時に電気をつければ、少しは体が反応して目覚めがよくなるのではと思った。
Nature Remoとは
Nature Remoはスマートリモコンの1つで、あらゆる家電の赤外線リモコンの代わりを担ってくれる。
私はNatureRemoかなり昔から使っているが、今までは主にアレクサ経由での操作しかしていなかった。
アレクサ、電気つけてー
アレクサ、テレビつけてー
Nature Remoの自動化
Nature Remoアプリ自体にスケジュール機能のようなものは、IFTTTを使用すれば簡単なスケジューリングならすることが可能である。
ただし、IFTTTの「Date&Time」は決まった時間に実行することができない。
私は規則正しい生活をしていないので、毎日決まった時間に電気をつけられても困る。
寝る前に「明日は○時に起きる」と決めたいのだ。
そこで、NatureRemoにAPIがあるので、これをいい感じに叩けば、目覚ましと同時に電気をつけることができるのではないか!?
GASから Nature RemoのAPIを叩いてみる
前置きが長くなったが、ようやく本題に入る。
今回も素人コードなので、ご容赦ください。もっとこうした方がいいよ等あればアドバイスください。
Signal IDの一覧取得
https://api.nature.global/1/appliancesへgetすると、現在自分が登録しているアクションに対応するSignal IDの一覧が取得できる。
[ { "id":"08ba7104-0486-4008-9a9a-0d02a0547d66", "device":{ "name":"Remo1go","id":"ccc22cfc-fd1e-4acf-bb89-94279778345a", "created_at":"2018-07-25T16:12:58Z", "updated_at":"2020-06-09T11:16:26Z", "mac_address":"dc:4f:22:3e:da:10", "serial_number":"2W8602345", "firmware_version":"Remo-mini/1.0.87-g8b06f0e", "temperature_offset":0, "humidity_offset":0 }, "model":null, "type":"IR", "nickname":"電気", "image":"ico_light", "settings":null, "aircon":null, "signals":[ { "id":"6a8ea820-fc34-461c-a27e-0c7989584595", "name":"点灯","image":"ico_on" }, { "id":"1608f92c-2fcc-4e0d-a295-17f6083555c0", "name":"消灯", "image":"ico_off" }, { "id":"e99653cb-1e35-46ab-a6f0-cfde33b92e5a", "name":"常夜灯", "image":"ico_record" } ] } ]
取得した結果の必要そうな情報はスプレッドシートへ書き込んでおく。
アクセストークンとスプレッドシートのIDはスクリプトのプロパティで設定している。
// 最新のsignalidを取得 function getSignalIdList() { var token ="Bearer " + PropertiesService.getScriptProperties().getProperty('REMO_ACCESS_TOKEN'); var sheetid = PropertiesService.getScriptProperties().getProperty('SHEET_ID_SIGNALS'); // 機器情報を取得 var options = { 'method': 'get', 'headers': { 'Authorization': token } }; var response = UrlFetchApp.fetch('https://api.nature.global/1/appliances', options); Logger.log(response) r = JSON.parse(response.getContentText()) //Logger.log(r) // 書込み用スプレッドシートを開いて、全クリア var spreadsheet = SpreadsheetApp.openById(sheetid); var sheet = spreadsheet.getActiveSheet(); sheet.clear() var today = new Date(); sheet.getRange(1, 1).setValue("更新日時"); sheet.getRange(1, 2).setValue(today); // 取得したデータを解析、スプレッドシートに書き込み var rownum = 2 for (let i=0; i<r.length; i++) { var name = r[i]["nickname"] if (r[i]["signals"].length !== 0) { for (let j=0; j<r[i]["signals"].length; j++) { var signal_name = r[i]["signals"][j]["name"] var signal_id = r[i]["signals"][j]["id"] sheet.getRange(rownum, 1).setValue(name); sheet.getRange(rownum, 2).setValue(signal_name); sheet.getRange(rownum, 3).setValue(signal_id); Logger.log(name+signal_name+signal_id) rownum = rownum + 1 } } } }
実行するとスプレッドシートはこんな感じ。
照明を操作してみる
signal_idを引数と渡して、そのsignal_idをRemoへ送る関数を作っておく。
// Remoにsignalidを送信 function doRemo(signal_id) { var token ="Bearer " + PropertiesService.getScriptProperties().getProperty('REMO_ACCESS_TOKEN'); var options = { 'method': 'post', 'headers': { 'Authorization': token } }; var url = "https://api.nature.global/1/signals/" + signal_id + "/send" var response = UrlFetchApp.fetch(url, options); return response; }
照明を消すsignal_idを送ってみる。
function test() { var signal_id = "1608f92c-2fcc-4e0d-a295-17f6083555c0" result = doRemo(signal_id)
おー、消えた!簡単だ。
GASのトリガーを使って、指定の時間に実行
あとはトリガーセットするだけ!と思ったが、GASのトリガーはいろいろとクセがあったので、その話は次回。