はじめに
この記事はSLP KBIT Advent Calendar 2021、14日目の記事です。
IoTデバイスをパソコンで操作できるようにしてみたいと思って、Nature Remoを使ってセンサーの情報を取得したり、赤外線信号を送信したりしてみました。
Javascriptで書いていこうと思ったのですが、今回はGoogleが提供しているGoogle Apps Sscript(GAS)を使っていきます。GASには便利な機能もあり、前準備も少ないためオススメです。
目次
- Nature RemoのAPIにアクセスするためにAccess tokenを生成する
- Nature Remoのセンサーからデータを取得する
1.Access tokenの生成
まずは、こちらからNature Remoのサイトにログインしてください。
下にある + Generate access tokenを押すと、Access tokenが表示されます。
余談ですが、Access tokenとはNature Remo以外の外部サービスと接続するために生成されるものです。すでにGoogleやAmazonのスマートスピーカーと連帯している方はAccess tokenが生成されていると思います。
これでAccess tokenが生成できました。
生成したAccess tokenはここでしか表示されないため、Copyを押して、メモ帳などにコピペしておいてください。
※アクセストークンは公開しないようにしてください
公開してしまうと外部から家電を操作されてしまいます(他人事)
コピペし忘れた場合は、前のページに戻り、先ほど生成したAccess tokenのRevokeを押して、新たに生成し直してください。
2.センサーのデータを取得
まずはNature Remoのセンサーからデータを取得していきます。
コマンドの参照はhttps://swagger.nature.global で確認できます。
まずはコマンドラインを利用して、以下のコマンドを実行します。
curl -X GET "https://api.nature.global/1/devices" -H "accept: application/json" -H "Authorization: Bearer 取得したアクセストークン"
実行すると以下のようにNatureRemoのセンサー情報が出力されます。
[
{
"name":"Nature Remo 2",
"id":"__________",
"created_at":"2021-05-18T10:49:51Z",
"updated_at":"2021-11-15T07:44:11Z",
"mac_address":"__________",
"serial_number":"__________",
"firmware_version":"Remo/1.0.79-gbbcb0e8",
"temperature_offset":0,
"humidity_offset":0,
"users":[
{
"id":"__________",
"nickname":"aiueo700",
"superuser":true
}
],
"newest_events":{
"hu":{
"val":44,
"created_at":"2021-11-16T12:36:11Z"
},
"il":{
"val":245,
"created_at":"2021-11-16T08:11:51Z"
},
"mo":{
"val":1,
"created_at":"2021-11-14T17:48:10Z"
},
"te":{
"val":26.8,
"created_at":"2021-11-16T13:37:14Z"
}
}
}
]
上からhuが湿度、ilが光度、moが人感センサー、teが温度となっています。
これをGoogle App Scriptで実行していきます。
まずは、Google Apps Scriptにアクセスして、新しいプロジェクトを作ります。
HTTPリクエストの方法についてはこちらを参考にしました。
Nature Remo Cloud APIを通して、サーバーから情報を取得するためにmethod
を'get'
に指定し、承認するためにheaders
内にアクセストークンを入れておきます。
const access_token = '取得したアクセストークン';
function nature_remo() {
const data = getNatureRemoData();
Logger.log(data[0].newest_events.te.val);
Logger.log(data[0].newest_events.hu.val);
Logger.log(data[0].newest_events.il.val);
Logger.log(data[0].newest_events.mo.val);
}
function getNatureRemoData() {
const options = {
method : 'get',
headers : {
'Authorization': 'Bearer ' + access_token
}
};
const data = JSON.parse(UrlFetchApp.fetch('https://api.nature.global/1/devices', options));
return data;
}
実行する関数をnature_remoに設定して、実行するとそれぞれの値のみ表示されます。
これでデータの取得は完了です。
##信号の送信
まずは信号のデータを取得しておきましょう。以下のコマンドを実行します。
curl -X GET "https://api.nature.global/1/appliances" -H "authorization: Bearer アクセストークンを入力"
実行すると設定しているリモコン(特にエアコン)の情報がたくさん出てきます。
今回は一番簡単なシーリングライトを操作をしていこうと思うので、出力された一部を抜粋しておきます。
{
"id": "__________",
"device": {
},
"model": {
"id": "__________",
"country": "JP",
"manufacturer": "panasonic",
"remote_name": "hk9478-ch2",
"name": "Panasonic LIGHT 019",
"image": "ico_light"
},
"type": "LIGHT",
"nickname": "aiueo700",
"image": "ico_light",
"settings": null,
"aircon": null,
"signals": [],
"light": {
"buttons": [
{
"name": "on",
"image": "ico_on",
"label": "Light_on"
},
{
"name": "off",
"image": "ico_off",
"label": "Light_off"
},
{
"name": "on-100",
"image": "ico_light_all",
"label": "Light_all"
},
{
"name": "on-favorite",
"image": "ico_light_favorite",
"label": "Light_favorite"
},
{
"name": "night",
"image": "ico_light_night",
"label": "Light_night"
},
{
"name": "bright-up",
"image": "ico_arrow_top",
"label": "Light_bright"
},
{
"name": "bright-down",
"image": "ico_arrow_bottom",
"label": "Light_dark"
},
{
"name": "colortemp-down",
"image": "ico_arrow_right",
"label": "Light_warm"
},
{
"name": "colortemp-up",
"image": "ico_arrow_left",
"label": "Light_cold"
}
],
"state": {
"brightness": "100",
"power": "on",
"last_button": "on"
}
}
}
一番上のid
はappliance_id(家電のID)なので、これもメモっておきます。
※もちろん公開はしないでください。
次にコマンドラインで信号を送信してみます。
先ほどメモったappliance_idを付け加え、送信したい信号を入力します。-d "button=(ボタンのname)"
で実行できます。
今回はシーリングライトをオンにしたいので、-d "button=on"
と入力します。
curl -X POST "https://api.nature.global/1/appliances/(appliance_id)を入力/light" -H "authorization: Bearer アクセストークンを入力" -d "button=on"
これでシーリングライトがオンになりました。
では、これをGASで実行させてみたいと思います。
サーバーに情報を送るために、method
を'post'
に指定し、payload
と呼ばれる情報を付け加えます。
const access_token = 'アクセストークンを入力';
const id = {
light : '(appliance_id)を入力/light'
}
function nature_remo() {
const data = getNatureRemoData();
const setData = {
te : data[0].newest_events.te.val,
hu : data[0].newest_events.hu.val,
il : data[0].newest_events.il.val,
mo : data[0].newest_events.mo.val
}
postNatureRemo(id.light, 'on');
}
function getNatureRemoData() {
const options = {
method : 'get',
headers : {
'Authorization': 'Bearer ' + access_token
}
};
const data = JSON.parse(UrlFetchApp.fetch('https://api.nature.global/1/devices', options));
return data;
}
function postNatureRemo(id, name){
const url = 'https://api.nature.global/1/appliances/' + id;
const options = {
method : 'post',
headers : {
'Authorization': 'Bearer ' + access_token
},
payload : 'button=' + name
}
UrlFetchApp.fetch(url, options);
}
これで完成しました。あとはpostNatureRemo()
に任意のコードを入れることで様々な家電を操作することができます。
最後に
今回、GASを使った理由はGoogleのGmailやスプレッドシートなどのサービスと連帯することができるからです。ただ、時間がなかったため今回は断念しました。大変モシャモシャセン!
記事を書くのも初めてなので、内容が曖昧なところがあります。今後、随時修正していきますのでよろしくお願いします。