Nature RemoとGoogle Cloud Functionsをつかって日報を送ったら家の電気をつけるようにしてみた

はじめに

どうもこんにちはいかろちゃんです。最近自宅のスマートホーム化をはじめました。その第一弾として帰ることを検知して家の照明をつけようというのが今回の目的です。

個人用に研究室でBacklogをつかって日報という形で日々のまとめをその日の最後に書いています。また、家に帰ったら照明がついていてほしいですよね。日報が送って照明がつくようになればやる気も返った時のテンションも爆上がり間違いなしです。そこでBacklog→Google Cloud Functions(GCF)→Nature Remo→照明という流れで日報を送ったら家の照明をつける仕組みをつくってみました。

ハードウェアと使うサービスの概要

まずはNature Remoについて。これはいわゆる学習リモコンと呼ばれるもので、赤外線で動く電化製品のリモコンの信号を登録することによりそのリモコンとして振る舞えることができるようになるリモコンのことです。もちろん複数の電化製品の信号を学習させることも可能です。スマートフォンや、Google Home等のスマートスピーカーはもちろんリモコンとしてつかうことができます。そして一番嬉しい特徴がNature Remoはインターネット経由でアクセスできるWeb APIが公開されているという点です。このAPIをつかうことで任意のプログラムから赤外線信号を受け取る電化製品を操作することができるようになります。Nature RemoとNature Remo miniが存在しますが今回は安いRemo miniを利用しました(下記製品)。搭載しているセンサーと大きさ以外の機能は基本的に同一です。

Nature Remo mini 家電コントロ-ラ- REMO2W1

Nature Remo mini 家電コントロ-ラ- REMO2W1

次に照明のスマート化について。もともと自宅にあった照明はペンダント型照明(ようするに紐をひっぱるやつ)でした。紐を引くような機構をつくるのもありですが、よのなかには照明と電源の間に割って入って赤外線リモコンで操作可能にしてくれる製品も存在します。今回は「照明リモコンスイッチ OCR-CRS01W」を利用しました(下記製品)。この製品の嬉しいところは電灯に状態をもたせてボタンでトグルするのではなくonとoffボタンが存在することです。これにより面倒な状態管理をせずに操作できます。

次に日報管理です。これはBacklogを使っています。Backlogがどういうサービスかは今回とは関係ないので省きます。今回重要なのはコメントの追加をフックするWeb hockを登録できるという点です。これをNature Remoにつなげれば今回の目的は達成です。

Nature RemoのWeb APIはWeb HockではないのでBacklogと直接はつなげません。そこで今回はGoogle Cloud Functions(GCF)を仲介役としてはさみます。GCFはFunction as a Service(FaaS)の一つです。FaaSについての詳細な解説はここでははぶきますが、サーバレスであるイベントをうけてあるイベントを発火することが可能です。今回はBacklogからGCFを叩き、GCFがRemoのWeb APIを叩くという構成にします。

プログラムの流れ

Nature Remoをインターネット越しに操作するためにはアクセストークンを発行する必要があります。まずはhttps://home.nature.global/にアクセスしてログインします。その後、"Generate Access Token"でアクセストークンを発行しましょう。アクセストークンは後から確認できないようになっているのでメモを忘れずに。

Nature Remoに登録されている家電に対するそれぞれの操作はSignal IDとして管理されています。したがって、家電を操作するためにはSignal IDを特定する必要があります。下記コマンド(取得したアクセストークンの部分は適宜変更してください)で登録されている電化製品とその情報を得ることができます。nicknameを手がかりに対象の電化製品を特定しましょう。私の環境の場合は下記のような部分がありましたのでこれの電源onのSignal ID(dc1642ea-1d35-47bb-9ead-ab4aa8a51ac9")を使います。

curl -X GET "https://api.nature.global/1/appliances" -H "accept: application/json" -k --header "Authorization: Bearer 取得したアクセストークン"
(前略)
   "model": null,
    "type": "IR",
    "nickname": "照明",
    "image": "ico_light",
    "settings": null,
    "aircon": null,
    "signals": [
      {
        "id": "dc1642ea-1d35-47bb-9ead-ab4aa8a51ac9",
        "name": "電源on",
        "image": "ico_lightup"
      },
      {
        "id": "4ec42e50-b764-470a-963a-48a44e6ca364",
        "name": "消灯",
        "image": "ico_lightdown"
      }
(後略)

いよいよGCFをつかって連携部分を作っていきます。やることは単純で特定プロジェクトに投稿されたらNature RemoのAPIを叩くだけです。まずはGCFにログインし(この手順は省きます)、「関数を作成」をクリックします。関数名はdaily_report,メモリは128 MB,トリガーはHTTPとしました。表示されている「URL」という項目がBacklogに登録するWeb Hockとなります。ソースコードは下記のようにしました。下記のaccess_token, target_signal, project_keyを適切に設定すると動きます。project_keyはBacklogから調べてください。

import requests

access_token = '取得したアクセストークン'
target_signal = '取得したSignal ID'
project_key =  '日報投稿先のプロジェクトキー'

def daily_report(request):
    request_json = request.get_json()
    if  str(request_json["project"]["projectKey"]) == project_key:
        headers = {
            'accept': 'application/json',
            'Authorization': 'Bearer {}'.format(access_token),
        }
        response = requests.post('https://api.nature.global/1/signals/{}/send'.format(target_signal), headers=headers)


    return ""

最後にBacklogににWeb HockとしてGCPのURLを追加します。「プロジェクト設定」→「インテグレーション」→「Webhook」→「設定」をクリックしていきます。「WebHook URL」は先程GCFでえたURLとしましょう。また、通知するイベントは「課題にコメント」のみとしました。

これで完成です。投稿してみて実際に家の電気がつくか試して遊びましょう。

まとめと展望

今回はBacklogからRemoをGCFを使ってつなぐということを行いました。これによって日報を出し忘れると家が暗いままというかなしいことになり日報を出すモチベーションがアップです。今回はBacklogということでしたがWebhookに対応してれば同じパターンが使えますのでSlackやその他のものとも同様な手法でつなぐことができると思います。また、Remoは多様な電化製品に対応しており温度センサー等をそなえているので暑い時期ならついでにクーラーをつけるというようなことも可能です。いろいろアイディア次第で楽しいことができそうなのでたのしんでいきましょう!