テレビ局員の独学プログラム

ともきちの日曜プログラムとガジェット

最近プログラムにはまっているので、はてなブログもやってみる。プログラムは完全独学なのでいろいろご愛嬌。

GASからNatureRemoのAPIを叩く!

目覚ましと同時に電気をつけたい

私を朝が弱い&遮光カーテンを使っているせいで、目覚めがとても悪い。
そこで、目覚ましと同時に電気をつければ、少しは体が反応して目覚めがよくなるのではと思った。

Nature Remoとは

Nature Remoはスマートリモコンの1つで、あらゆる家電の赤外線リモコンの代わりを担ってくれる。
私はNatureRemoかなり昔から使っているが、今までは主にアレクサ経由での操作しかしていなかった。

アレクサ、電気つけてー
アレクサ、テレビつけてー

Nature Remoの自動化

Nature Remoアプリ自体にスケジュール機能のようなものは、IFTTTを使用すれば簡単なスケジューリングならすることが可能である。
ただし、IFTTTの「Date&Time」は決まった時間に実行することができない。

私は規則正しい生活をしていないので、毎日決まった時間に電気をつけられても困る。
寝る前に「明日は○時に起きる」と決めたいのだ。

そこで、NatureRemoにAPIがあるので、これをいい感じに叩けば、目覚ましと同時に電気をつけることができるのではないか!?

GASから Nature RemoのAPIを叩いてみる

前置きが長くなったが、ようやく本題に入る。
今回も素人コードなので、ご容赦ください。もっとこうした方がいいよ等あればアドバイスください。

トークン取得

まずはNature RemoのAPIを叩いてみるのだが、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
      }
    }
  }
}

実行するとスプレッドシートはこんな感じ。
f:id:mtomo661:20200610001413p:plain

照明を操作してみる

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のトリガーはいろいろとクセがあったので、その話は次回。