NatureRemo の Cloud API を使って Google Home からテレビを HDMI4 に変更する

スマートリモコンデバイスとして有名な IRKit の後継として去年発売された NatureRemo ですが、先日ついに NatureRemo の API が公開されました。

テレビのチャンネルを HDMI4 にするためには、複数回のリモコン操作を連続的に行なう必要があり、 IRKit の頃は API を使うことで実現できていたのですが、 NatureRemo は発売当初 API が公開されていなかった為出来ていませんでした。そのため、我が家のリビングには NatureRemo と、連続操作用に IRKit が設置されていましたが、 NatureRemo が API 対応した結果 IRKit を撤去することが出来ました (実際には寝室に持っていきました) 。

Cloud API と Local API について

NatureRemo には Cloud APILocal API があり、インターネット越しにリクエストする場合は Cloud API を使います。

Cloud API とは自宅にある NatureRemo デバイスをインターネット越しに操作することの出来る API です。この機能を持つ Cloud API は IRKit の頃からありましたが、 NatureRemo ではリモコン情報を記憶することができるようになっているので、例えば登録したリモコン ID を API で呼び出すだけでリモコン操作が行なえるようになっています (IRKit のころは赤外線データを Cloud に保存していないので API で赤外線データを送る必要があった) 。

Local API とは、同じセグメント内から呼び出せる API です。これは IRKit を持っていた人には馴染み深いのでは無いでしょうか。先ほど述べたリモコン情報は Cloud 側に持っているので、 Local API では IRKit と同じように「赤外線信号を送信する」「直前に設定した赤外線信号の情報を返却する」の 2 つの機能のみとなっています。

操作したいリモコンを登録する

スマホアプリでリモコンを登録していきます。ここで登録したリモコン情報はアプリそのものや IFTTT から利用できますが、 Cloud API からも利用することが出来ます。

Cloud API の access token を取得する

この token 管理サービスに、スマホアプリで作成した NatureRemo アカウントを利用してログインすると access token を発行することが出来ます。 すでに、 IFTTT や Google Home などで利用している場合は画面に表示されていると思いますが、間違えて Revoke をしないようにしてください。

生成した access token で Cloud API を呼び出す

正しく access token が使えるか、まずは手元で curl を使って確認してみましょう。 {YOUR_ACCESS_TOKEN} の部分を先ほど取得した token に置き換えて次のコマンドを実行します。

curl -H "Authorization: Bearer {YOUR_ACCESS_TOKEN}" "https://api.nature.global/1/users/me"
{"id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","nickname":"shunirr"}

このように Response が返ってくれば成功です。

リモコン情報の一覧を取る

以下のコマンドを実行します。

curl -H "Authorization: Bearer {YOUR_ACCESS_TOKEN}" "https://api.nature.global/1/appliances"

登録しているリモコン数が多いとレスポンスが大きくなりますが、適宜 jq などで見易くしてみてください。

[
  {
    "id": "APPLIANCE_ID",
    "device": {
      "name": "Remo",
      "id": "DEVICE_ID",
      "created_at": "2017-10-20T01:31:04Z",
      "updated_at": "2018-02-10T14:34:48Z",
      "firmware_version": "Remo/1.0.62-gabbf5bd",
      "temperature_offset": 0,
      "humidity_offset": 0
    },
    "model": null,
    "nickname": "テレビ",
    "image": "ico_tv",
    "type": "IR",
    "settings": null,
    "aircon": null,
    "signals": [
      {
        "id": "550e8400-e29b-41d4-a716-446655440000",
        "name": "電源オンオフ",
        "image": "ico_io"
      },
      {
        "id": "550e8400-e29b-41d4-a716-446655440001",
        "name": "入力切替",
        "image": "ico_display"
      },
      {
        "id": "550e8400-e29b-41d4-a716-446655440002",
        "name": "地上波",
        "image": "ico_display"
      },
      {
        "id": "550e8400-e29b-41d4-a716-446655440003",
        "name": "ミュート",
        "image": "ico_display"
      },
...

id の部分は伏せてありますが、だいたいこんな感じになると思います。 signals の item 内の id を利用することで Cloud API からリモコンを操作することが出来ます。

API からリモコン赤外線を送信する

送信したいリモコンがテレビの「電源オンオフ」だった場合には、 550e8400-e29b-41d4-a716-446655440000 という ID ということが分かりますので、それを送信してみましょう。

curl -X POST "https://api.nature.global/1/signals/550e8400-e29b-41d4-a716-446655440000/send" -H "Authorization: Bearer {YOUR_ACCESS_TOKEN}"
{}

実際にテレビの電源がオンオフされたら成功です。

Google Apps Script でリモコンを複数回操作する API を作る

さて、私が持っているテレビでは HDMI4 にするためには「地デジ」「入力切替」「入力切替」「入力切替」「入力切替」と押していくことで、どのチャンネルにいても HDMI4 にできますが、 NatureRemo でこれを実現するためにはリモコン操作を連続的に行なう装置が必要です。

ザッと調べた感じ皆 GAS (Google Apps Script) で実現していたので、今回私もそのようにしましたが、正直ハマりどころ多いので AWS Lambda とか使えばよかったんじゃ無いかと後悔…。もう出来たので、とりあえずこのまま運用しています。

GAS では GET か POST リクエストを受け、また別の HTTP リクエストを発行することが出来ます。が、なぜか私の環境では POST が上手く動かなかったので GET リクエストでリモコンを操作できるようにしました。

gist.github.com

script 内に token や signal_id を直接書いていくことも出来ますが、 GAS は正直そんなに操作したくないので、 Query parameter で指定するようにしています。

token で {YOUR_ACCESS_TOKEN} だった部分、 signal_ids で赤外線 ID を , 区切りで書いていくことで 300ms ごとに赤外線送信をリクエストします。

curl -L "https://script.google.com/macros/s/aaaa-bbbb-cccc-dddd/exec?token={YOUR_ACCESS_TOKEN}&signal_ids=aaaa,bbbb,cccc,dddd"

このようにすると aaaa -> 300ms -> bbbb -> 300ms -> cccc -> 300ms -> dddd のように NatureRemo Cloud API に対してリクエストが行なわれます。

Google Home から使えるように IFTTT に登録する

IFTTT には WebHooks というプラグインがあり、それを利用することで任意の HTTP リクエストを発生させることが出来ます。今回 GAS で作成した API を、 Google Assistants から呼び出せるようにしましょう。

応用編

この API を利用することで NatureRemo に登録した赤外線操作を連続して行なうことが出来ます。

  • 「全部消して」でシーリングライトやテレビ、エアコンなどの操作を一度に行なう
    • 同じ呼び出し方法で複数のレシピを登録すれば実現可能だが実際面倒
  • 「ホットカーペット付けて」で電源を一旦オフにしてからオンにする
    • うちではホットカーペットの電源をリモコンセントでオンオフしているのですが、ホットカーペット自体が数時間で電源オフ状態になる仕様になっています
    • この状態になるとリモコンセント的には電源オンとして認識していますが、実際には電源が切れているので、一度オフにしてからオンにすることで解決している