Raspberry PiからコマンドラインでRM mini3（スマートリモコン）を制御する

# この記事でやること

Raspberry PiからコマンドラインでスマートリモコンのRM mini3を制御します。

<a href="https://www.amazon.co.jp/dp/B07JG97SW8">RM minie3</a> (amazon.co.jp)

制御にはBlackBeanControlを使用します。

コマンドラインからリモコンが制御できるようになると、cronで照明のON/OFFを制御したり外出先からTwitterで命令を送ったらエアコンをつける、といったことが簡単にできるようになります。

本稿ではRM mini3の制御にBlackBeanControlを使います。BlackBeanControlはPython2で書かれており、Python3からはうまく動かなかったので、今回はpython2を使って行います。

# 前提

RM mini3のセットアップは済んでいる前提なので、まだの方は**[こちらの記事](https://qiita.com/canadie/items/3110a0f0ff4f4749e039)**を参考にしてください。RM mini3とWiFiとのペアリングが完了し、RM mini3のIPアドレスとMACアドレスが分かっていれば良いです。

またRaspberry PiはRM mini3と同じLANに接続するようにしてください。


# 環境

今回使用したRaspberry Piの環境は以下のとおりです。

```ini:/etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 7 (wheezy)"
NAME="Raspbian GNU/Linux"
VERSION_ID="7"
VERSION="7 (wheezy)"
ID=raspbian
ID_LIKE=debian
ANSI_COLOR="1;31"
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
```

本体は2015年8月に購入した[Raspberry Pi 2 Model B](https://www.amazon.co.jp/dp/B00T356SFO)です。

# インストール

## python2.7-dev

Raspberry Piにはデフォルトで素のpython2が入っていると思いますが、devel版(python2.*-dev)がないと後述するbroadlinkライブラリの構築に失敗するので改めてインストールします。

```bash
# python2のdevel版が必要なのでインストール

$ sudo apt-get update
$ sudo apt-get upgrade # 時間がかかるので省略可
$ sudo apt-get install python2.7-dev
```

私の環境では`python`コマンドにはpython3.6系が割り当てられているので、本稿では明示的に`python2`コマンドを使います。

シェルで`python`や`python2`とタイプしてエンターすると簡単なバージョン情報が見られます。

```
pi@raspberrypi ~/work/BlackBeanControl $ python2
Python 2.7.3 (default, Nov 24 2017, 21:13:24) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
```

`>>>`というプロンプトが出て止まるので、そのまま`Ctrl-D`か`exit()`でインタプリタモードから抜けられます。

## pipのインストール

次にpipをインストールします。pipはpythonのパッケージを管理をするものです。

```bash
$ curl -O https://bootstrap.pypa.io/get-pip.py
$ sudo python2 get-pip.py
$ sudo python2 -m pip install --upgrade pip # pip自身の更新
```

## broadlinkライブラリのインストール

BlackBeanControlはpython-broadLinkというBroadLink社のデバイス（今回はRM mini3）を操作するためのライブラリを使用するのでインストールします。`git clone`するとsetup.pyというファイルが得られるので`install`コマンド付きで実行するとインストールされます。

```bash
# 外部ライブラリのインストール(devel版のインストール後に行うこと)

$ sudo python2 -m pip install configparser
$ sudo python2 -m pip install netaddr
$ sudo python2 -m pip install pycrypto

# python-broadlinkのインストール

$ git clone https://github.com/mjg59/python-broadlink.git
$ cd python-broadlink
$ sudo python2 setup.py install
```
## BlackBeanControlのインストール

続いてBlackBeanControlをインストールします。GitHubからクローンするだけです。RM mini3のIPアドレスやMACアドレスを設定します。

```bash
$ git clone https://github.com/davorf/BlackBeanControl.git
$ cd BlackBeanControl
```

```ini:BlackBeanControl.ini
[General]
IPAddress = 192.168.10.4
Port = 80
MACAddress = 34:EA:34:40:XX:XX
Timeout = 30
[Commands]
```

設定ファイルが書けたら、リモコンを準備してBlackBeanControlを`-c command_name`オプション付きで起動します。`command_name`は何でも良いですが、後で学習データを呼び出す時にも使用するのでわかりやすいものが良いでしょう。今回は`aircon_off`を割り当ててみます。

起動したらRM mini3のLEDが白く点灯するのでmini3の方にリモコンを向けてボタンを押します。何も表示されませんが、成功するとすぐにmini3のLEDランプが消え、しばらく経ってからコマンドプロンプトが帰ってきます。

```bash
$ python2 BlackBeanControl.py -c aircon_off
$ 
```

もう一度`BlackBeanControl.ini`を見てみましょう。リモコンの信号が保存されていれば成功です。

```ini:BlackBeanControl.ini

[General]
IPAddress = 192.168.10.4
Port = 80
MACAddress = 34:EA:34:40:XX:XX
Timeout = 30

[Commands]
aircon_off = 2600bc01723a0e0e0e2b0e0f0d0f0d100d0f0d0f0d100d0f0d0f0d100d0...
```

信号が保存されたら、また同じコマンドを叩くと今度はRM mini3がリモコンの信号を発信します。

```bash
$ python2 BlackBeanControl.py -c aircon_off
$ 
```

BlackBeanControlはこのように「iniファイルに設定がなければ信号を学習し、設定があれば信号を発信する」という少し変わった仕様になっています。

# 参考

* [Amazon Echoとラズパイで、音声で照明をon/offする - Qiita](https://qiita.com/kikuzo/items/753b5065dde9633bda18)
* [RM mini3(eRemote mini)とHomebridgeを使ってSiriでリモコン制御する - Qiita](https://qiita.com/canadie/items/3110a0f0ff4f4749e039)
* [Google Home で家電をコントロールしてみる(RM mini + BlackBeanControl + raspberry pi) - Qiita](https://qiita.com/harimmas/items/cd07b562bbf1154e625b)
* [GitHub - mjg59/python-broadlink: Python module for controlling Broadlink RM2/3 (Pro) remote controls, A1 sensor platforms and SP2/3 smartplugs](https://github.com/mjg59/python-broadlink)
* [GitHub - davorf/BlackBeanControl: BlackBeanControl - Broadlink RM 3 Mini (aka Black Bean) control script](https://github.com/davorf/BlackBeanControl)