NatureRemoAPIを使用してRESTで家電を操作する


目的

NatureRemoを買ってみたのはいいけどアプリの起動が遅く直接電源を入れたほうが早い。
インターフェースだけ作っておけばいろいろ遊べそう。

利用サービス・言語

  • NatureRemo&NatureRemoAPI(https://developer.nature.global/)
    • 記憶式の赤外線リモコン、テレビやエアコンの信号を記憶してこの端末から赤外線信号を送ることができます。
  • GoogleAppsScript(https://developers.google.com/apps-script/)
    • Googleの提供するGoogleサーバ上で動作するスクリプトでJavaScriptをベースにGoogleのアレンジが加わっています(以下GAS)。

tl;dr

  • NatureRemoにリモコンを登録
  • アクセストークン取得
  • https://api.nature.global/1/signals/[デバイスID]/send にPOST

NatureRemoに信号を登録

公式のチュートリアルを確認してください。
https://nature.global/jp/gettingstarted/

私は照明を一番使用しているので照明を例にしたいと思います。
スマホアプリの画面では↓のようになっています。

ここまででスマホアプリから家電が動作することを確認しておいてください。

アクセストークン取得

https://home.nature.global/
にアクセスしてログインすると↓の画面に飛びます。

+Gererate access tokenをクリックして表示されたトークンを控えておいてください。
POSTするときの認証情報に使用します。
このトークンは絶対に流出しないよう管理してください。

NatureRemoにRESTでアクセス

GASの準備

細かい説明は省略します、Googleドライブ→新規→GoogleAppsScript(ない場合はその他→GoogleAppsScript)で新規作成してください。

デバイスIDの取得

GetDeviceId.js
function GetDeviceId(){
    var url = BASE_URL + "appliances"
    var options = {
      "method" : "get",
      "headers" : {"Authorization" : "Bearer [アクセストークン]"}
    };
    var reply = UrlFetchApp.fetch(url, options);
    Logger.log(reply)
}

このコードをGAS上で実行するとログがこんな感じで出ます。

[
  {
    "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "device": {
      "name": "Remo",
      "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "created_at": "2018-03-18T07:16:06Z",
      "updated_at": "2019-01-23T22:38:45Z",
      "mac_address": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "serial_number": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "firmware_version": "Remo/1.0.62-gabbf5bd",
      "temperature_offset": 0,
      "humidity_offset": 0
    },
    "model": null,
    "type": "IR",
    "nickname": "リビング照明",
    "image": "ico_light",
    "settings": null,
    "aircon": null,
    "signals": [
      {
        "id": "ここのIDを使用します。",
        "name": "全灯",
        "image": "ico_lightup"
      },
      {
        "id": "ここのIDを使用します。",
        "name": "消灯",
        "image": "ico_off"
      },
      {
        "id": "ここのIDを使用します。",
        "name": "明",
        "image": "ico_arrow_top"
      },
      {
        "id": "ここのIDを使用します。",
        "name": "暗",
        "image": "ico_arrow_bottom"
      }
    ]
  },
  {
    "_comment":"複数機器登録しているとまだまだ続きます"
  }
]

POSTして電気をつけてみる

GASで下記コードを実行してみてください。
うちの場合は照明のリモコンの全灯ボタンをNatureRemoが送信してくれるため、部屋の明かりがつきます。

POST.js
// 全灯ボタン
function Light_On(){
    var url = "https://api.nature.global/1/signals/[ここに操作したいsignalsのIDを入力]/send"
    var options = {
      "method" : "post",
      "headers" : {"Authorization" : "Bearer [アクセストークン]"}
    };
    var reply = UrlFetchApp.fetch(url, options);
}

APIを公開して外からアクセスできるようにする

エントリ関数がないためGAS側でgetの受け口を作ります。

POST.js
// Rest:Getアクセス時のエントリハンドラ
function doGet(e) {
  Light_On()
  return 0
}

getの関数を作ったあとはGASのメニューから公開→Webアプリケーションをして導入→導入でAPIを公開することができます。
動作確認用のコードでセキュリティもクソもないのでアクセスユーザは全員(匿名ユーザー含む)にしておきます

これで、現在のウェブアプリケーションのURLにアクセスするとGASが実行され、部屋の明かりをどこでもつけられるようになります。
https://script.google.com/macros/s/xxxxxxxxxxxxxxxxxxxxxxxx/exec

さいごに

これでLambdaからでもIFTTTからでもLINEやSlackのbotからでもアクセスできますね!
家を魔改造してどんどんハックしていきましょう!!!