ifttt
GoogleHome
NatureRemo

Nature Remoを使って時間差で連続シグナルを送る

Nature Remoが届いた

1週間ほど前に注文していたNature Remoが届いたので手元にある赤外線で操作可能なものを動かしてみた。
と言ってもよくよく考えるとエアコンとシーリングライトぐらいしかないので、とりあえずこれらとGoogle Homeを連携させてみることにした。

シーリングライトの制御がうまくいかない

エアコンは難なく設定できたのだけれど、うちにあるシーリングライトはリモコンのボタンを押すたびに明るさが切り替わるタイプで4回押してようやく電源が切れる。
これではスマホアプリから4回ボタンを押すかGoogle Homeに4回「OK Google, 電気消して」と言うしかない。

IFTTT

IFTTTを使ってThisにGoogle Assistantを、ThatにNature Remoをそれぞれ設定すれば「電気消して」などをトリガーにしてNature Remoの操作を行うことができる。
しかしThatに何個も追加でアクションを登録するようなことはできないようで、1つのトリガーに対して複数のアクションを定義したい時は同じ内容のトリガーでAppletを複数作成し、それらにそれぞれアクションを割り当てる必要があるらしい。
今回の場合はシーリングライトに対して4回同じシグナルを送信したいので同じAppletを4つ作ってみた。
しかしシーリングライト側が連続でシグナルを処理できないせいかうまく動かない。

Cloud Functions for Firebase

IFTTTを使って数秒ごとにリクエストを送る方法がないかと調べてみたが見つからなかった。
Nature RemoのAPIを見つけたので仕方なくIFTTTのWebhook機能を使ってCloud Functionsを叩くことにした。
Access Tokenはここで取得しておく。
Clound functionsにdeployしたファイルはこんな感じ。
無事動いた。

import * as functions from 'firebase-functions';
import {Observable} from 'rxjs';
import axios from 'axios';

exports.turnOffLight = functions.https.onRequest((request, response) => {
   //...
   //省略
   //...
   Observable.interval(6000).timeInterval().take(4).subscribe(val => axios.post('https://api.nature.global/1/signals/YOUR_SIGNAL_ID/send', null, { headers: { Authorization: "Bearer YOUR_ACCESS_TOKEN" } }).then(function (res) {
      console.log(val);
   }).catch(function (error) {
      console.log(error);
   }));
   //...
   //省略
   //...
});

感想

今回の場合は素直にHueとか買った方が早いけど、家に赤外線で操作できる機器が多い人はこういうwebhookを用意しておくと便利かも。
Cloud Functions for Firebaseから外のAPIを叩きたい場合は有料プランを使わないとダメらしくちょっとハマった。
https://firebase.google.com/pricing/?hl=ja