Google Homeに話しかけてエアコンを操作してみる


# はじめに
「[RM mini3](https://www.amazon.co.jp/broadlink-RM-Broadlink-%E9%BB%92%E8%B1%86-%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%9B%E3%83%BC%E3%83%A0%E7%84%A1%E7%B7%9ALAN%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88IR%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9/dp/B01K4B2BBA)」というWi-Fi付き赤外線学習リモコンが安価であるにも拘らず、irMagicianでメモリオーバーしてしまったエアコンも操作できたので感激して本記事を投稿します。
ちなみにメモリは900バイトまで学習できるようです。

![201711165151_min.JPG](https://qiita-image-store.s3.amazonaws.com/0/207109/a9fe2e24-4888-0588-5b4c-81847db9ae51.jpeg)

Wi-Fi付き赤外線学習リモコンといえば「IRkit」やその後継機の「Nature Remo」が有名ですが、値段が張るのがネックです。
しかしRM mini3なら安価にゲットできます。
私はAmazonで2000円ほどで買いましたが、海外通販とかでもちっと安くあったりもします。

Apple製品を利用した説明はいくつかあったのですが、Windows & Android（Apple製品未所持）環境での利用方法についてぱっと見情報が見当たらなかったのでまとめておこうと思います。
RM mini3からの赤外線送信にはラズパイ(Node.js)を使用します。



# RM mini3とは
以下の記事で詳しく紹介されています。
[スマートリモコンの価格破壊。eRemote(RM mini)なら1300円で家電をSiriで操作できる](http://obakasanyo.net/siri-ir-remote-rm-mini3/)

この記事にもあるように「eRemote mini」という日本の輸入代理店が販売している製品もあります。
違いとして大きいのは、

* eRemote miniは技適マーク取得済み
* RM mini3では日本語版公式アプリが使えない（日本語版以外は使える）
* eRemote miniはお値段3倍以上

気になるのは技適マークですが、eRemote miniについていようがやっぱRM mini3に明確にない以上は国内での使用は電波法違反なのでしょうか…

技適マークのない機器の使用については以下の記事が参考になります。
[技適マークのない機器で無線を使っていたので自首してきた。](http://tojikomorin.sakura.ne.jp/blog/2016/08/09/%E6%8A%80%E9%81%A9/)

安全に使いたいならeRemote miniを使用したほうがいいですね。



# Wi-Fi設定
箱から出したばかりのRM mini3を電源につなぐとLEDが青色でチカチカします。
この状態が初期状態でまずはWi-Fiにぶら下げる必要があります。

Wi-Fiにぶら下げるには公式アプリを使います。
[e-Control(Google Play)](https://play.google.com/store/apps/details?id=com.broadlink.rmt&hl=ja)

このアプリは規制でRM mini3はデバイス登録できないようになってます。
けどWi-Fi設定自体はできちゃいます。

まずはインストールして起動。
ログイン画面になりますがここは華麗にSkip。
![image](https://qiita-image-store.s3.amazonaws.com/0/207109/44ae1c3d-6bd7-3492-5e68-9d514f632eaf.png)

続いて「メニュー(ハンバーガーアイコン)」→「デバイス+」と進みましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/207109/2c3017fd-e042-1a83-e484-77235db3474e.png)

SSIDとパスワードを入力しSET。
![image](https://qiita-image-store.s3.amazonaws.com/0/207109/3d207e11-cd8e-57c3-9313-ae2ceec0d6d2.png)

するとこんな感じで弾かれます。
けどこれでWi-Fi設定自体はできてます。
RM mini3が青点滅しなくなってたら成功です。
![image](https://qiita-image-store.s3.amazonaws.com/0/207109/34c36ac8-93dd-96d7-3f1d-6b0a83494d9d.png)

公式アプリを使うのはここまでです。
ちなみにAndroidのOS言語を英語にするとデバイス登録できるようになり、そのままアプリも使えちゃいます。



# 赤外線信号の取得
続いて赤外線信号の取得方法について説明します。
以下の流れで操作していきます。

1. Android端末へ「RM Bridge」をインストール
1. Webページより赤外線信号取得

## Android端末へ「RM Bridge」をインストール
Google PlayよりRM BridgeをAndroidへインストールします。
[RM Bridge(Google Play)](https://play.google.com/store/apps/details?id=de.fun2code.android.rmbridge&hl=ja)

このアプリは赤外線信号取得時のみ使用するためのものです。

起動すると以下の画面が立ち上がるので、真ん中の○をタップし実行します。
それと画面上のURLを控えておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/207109/08838992-2716-a46c-46a6-629e94948d03.png)

## Webページより赤外線信号取得
RM BridgeのWebページへアクセスします。
[RM Bridge - Code Learning](http://rm-bridge.fun2code.de/rm_manage/code_learning.html)

### Step 1: Set RM Bridge Address
Androidアプリに表示されてるURLを入力し、「Load Devices」を押します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/207109/c22afbbd-fbc4-d167-62e0-300aa625c31c.png)

すると認証を求められるので以下の情報を入力して下さい。

* ユーザー名: admin
* パスワード: bridge

この情報は既定値で、Androidアプリの設定画面から変更もできます。

### Step 2: Select RM BroadLink Device
Step1の操作により「Device」に「RM mini3」とデバイス名が表示されたと思います。
なお↓の画像のモザイクがかかってる部分にRM mini3のMACアドレスが表示されます。
後ほど必要になるので控えておきましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/207109/21b14d7f-8d1a-6ab8-24e5-ef3820c7c8bb.png)

### Step 3: Learn Code
「Code Name」に赤外線信号の名前を適当につけて「Learn Code」を押します。
そして5秒以内にRM mini3に向け取得したいリモコンのボタンを押します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/207109/0848e474-4c24-d9b6-549b-b04db454246a.png)

### Step 4: Test the Result
赤外線信号を正常に取得できたらStep4が表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/207109/a6ac643b-d5b1-6f45-1549-c44d80151eee.png)

ここの「Shortcut URL」にアクセスすると取得された赤外線信号をRM mini3より送信することができます。
しかしここで大事なのはそれよりも「Plain Command」のJSONデータにある「data」の値です。
この値が実際の赤外線信号となります。
この値を控えつつ一通りリモコンの赤外線信号を取得していきましょう。

一通り取得してしまえばAndroidアプリもWebページももう使いません。



# ラズパイからRM mini3を操作
次にラズパイからRM mini3を操作して取得した赤外線信号を飛ばしてみましょう。
Node.jsのモジュールを使ってRM mini3を操作したいと思います。
以下の流れで進めていきます。

1. プロジェクト作成
1. Node.jsモジュールのインストール
1. 赤外線信号ファイルの作成
1. index.jsの作成
1. index.js実行

## プロジェクト作成
適当にディレクトリきってプロジェクト作成してください。

```
$ mkdir rm-mini3
$ cd rm-mini3
```

## Node.jsモジュールのインストール
RM mini3を操作するための「broadlinkjs-rm」というNode.jsモジュールをインストールします。

```
$ npm i broadlinkjs-rm
```

## 赤外線信号ファイルの作成
`rmlist.js`というファイルを作成し、赤外線信号名（リモコンのボタン名とか好きな名前）とRM Bridgeにて取得した赤外線信号情報を入れていきます。
結構な長さになると思います。

```js:rmlist.js
module.exports = {
  "heat": "xxxxxxxx...",
  "cool": "xxxxxxxx...",
  "dehumidify":  "xxxxxxxx...",
  "fan":  "xxxxxxxx...",
  "up":  "xxxxxxxx...",
  "down":  "xxxxxxxx...",
  "speed":  "xxxxxxxx...",
  "direction":  "xxxxxxxx...",
  "off": "xxxxxxxx..."
}
```

## index.jsの作成
Nodeから赤外線信号を飛ばすコードです。
`index.js`というファイルを作って以下のソースを貼っつけてみてください。

`command`に送信したい赤外線信号名を入れます。
`rmMac`にはRM mini3のMACアドレスかIPアドレスを入れてください。

```js:index.js
//RM-mini3
const broadlink = require("./getDevice")
const rmlist = require("./rmlist")

//RM mini3 ir send
const command = "heat"
const rmMac = "xx:xx:xx:xx:xx:xx"
let rm = false
const timer = setInterval(function() {
  rm = broadlink({host: rmMac})
  if (rm) {
    const hexDataBuffer = new Buffer(rmlist[command], "hex")
    rm.sendData(hexDataBuffer)
    clearInterval(timer)
  }
}, 100)
```

それとRM mini3のデバイス接続用に以下のjsもコピって同ディレクトリに置いておきます。
[ homebridge-broadlink-rm/helpers/getDevice.js
](https://raw.githubusercontent.com/lprhodes/homebridge-broadlink-rm/f84790550028ef2dd7170443a400c877e10c7a5a/helpers/getDevice.js)

## index.js実行
それではindex.jsを実行してみましょう。

```
$ node index.js
```

無事赤外線信号を飛ばせましたでしょうか。



# Google Homeから操作する
ついでに過去記事に倣ってGoogle Homeから音声操作できるようにしてみます。

## 処理の流れ
![image](https://qiita-image-store.s3.amazonaws.com/0/207109/5e9ec38e-a8d5-b9be-bab0-4bfaeb01adb4.png)

↑の図のようにIFTTTとFirebaseを経由し、Google Homeからラズパイ(Node.js)を操作します。

## 各種設定とNode.jsの実装
以下の記事の「Firebaseの設定」から先を実施します。

[Google Home、IFTTT、Firebase、Node.js、irMagicianを使ってシーリングライトを音声操作する](https://qiita.com/miso_develop/items/c2008235cb4a8567cfa9#firebase%E3%81%AE%E8%A8%AD%E5%AE%9A)

1. Firebaseの設定
    * WebhookのBodyは`"aircon {{TextField}}"`とかにしときます。
1. IFTTT Applet作成
1. Node.jsの実装

## RM mini3への対応
まずは「broadlinkjs-rm」をインストールします。

```
$ npm i broadlinkjs-rm
```

次にRM mini3を操作できるようindex.jsへ以下のコードを追記します。

```js:index.js

...

//RM-mini3
const broadlink = require("./getDevice")
const rmlist = require("./rmlist")

//RM mini3 Device Set
const rmMac = "xx:xx:xx:xx:xx:xx"
let rm = {}
const timer = setInterval(function() {
  rm = broadlink({host: rmMac})
  if (rm) {clearInterval(timer)}
}, 100)

//RM mini3 ir send
const rmSend = (command) => {
  const hexDataBuffer = new Buffer(rmlist[command], "hex")
  rm.sendData(hexDataBuffer)
}



//database更新時
const path = "/googlehome"
const key = "word"
const db = firebase.database()
db.ref(path).on("value", function(changedSnapshot) {
  //値取得
  let value = changedSnapshot.child(key).val()
  if (!value) return
  console.log(value)
  
  //option word index
  let index = 1
  //助詞を除外
  value = value.replace(/ [のをが]/g, "")
  
  //コマンド生成
  const command = getJsonData(value.split(" ")[0], {
    
    ...
    
    //エアコン
    "aircon": () => {
      const command = getJsonData(value.split(" ")[index], {
        "暖房": "heat",
        "冷房": "cool",
        "除湿": "dehumidify",
        "送風": "fan",
        "温度": getJsonData(value.split(" ")[index+1], {
          "上げ": "up",
          "下げ": "down",
          "default": false
        }),
        "上げ": "up",
        "下げ": "down",
        "風速": "speed",
        "風向き": "direction",
        "消し": "off",
        "けし": "off",
        "止め": "off",
        "とめ": "off",
        "停止": "off",
        "default": false
      })
      return command ? () => rmSend(command) : command
    },
    
    ...
    
    //default
    "default": () => false,
    
  })()
  console.log(command)
  
  //コマンド実行
  if (command) {
    //typeof
    if (typeof command === "string") {
      
      ...
      
    } else if (typeof command === "function") {
      command()
    }
    
    //firebase clear
    db.ref(path).set({[key]: ""})
  }
})

```

RM mini3デバイス接続用jsのコピーも忘れず。
[ homebridge-broadlink-rm/helpers/getDevice.js
](https://raw.githubusercontent.com/lprhodes/homebridge-broadlink-rm/f84790550028ef2dd7170443a400c877e10c7a5a/helpers/getDevice.js)

あとは普通に実行するなりforeverやサービス化して使ってみて下さい。



# おわりに
RM mini3のおかげでスマートホームの完成にまた一歩近づきました。
というかirMagicianいらなかったんじゃね状態です。

ただirMagicianも温度センサ付きのものを買っており、現在10分おきに室温をログ出力させています。
このログと連携させて閾値を超えたらをエアコンつけたり止めたりなんて自動化をしてみてもいいかもしれません。