たねやつの木

Photographs, Keyboards and Programming

Broadlink RM mini3(黒豆)をRaspberry Piで動かす

f:id:ibuquicallig:20190313171642p:plain

こんにちは、たねやつです。

現在家で使っている赤外線送受信装置がIRKitというものなのですが、送受信のたびにLEDがチカチカしたり、夜中に謎の再起動のようなものが発生して眩しい!ので数年使用した今、新しいものに変えようと思います。

Amazonなどで見ていると2000円ちょっとでこんなものがありました。これでも少し値上げしているようです。ネットで見ても参考となるような情報がわんさかありましたので乗り換えてみようと思います。

ちなみに以下の商品もありますが、今回の目的には必要ない機能(アプリから操作できる)なので値段の安い黒いほうです。アプリから操作できるというよりは黒いほうは日本の正規販売代理店経由のモノではないのではじかれるという感じらしいです(;'∀')

Raspberry Piも家で絶賛稼働中なので外部からリクエストを受け取って赤外線操作できるようにする一連の記事です。

必要なもの

Raspberry Pi

もちろんこれが必要です。種類はどれでも大丈夫ですが安いのはRaspberry Pi Zero系です。ネットで買うよりも日本橋(大阪)や秋葉原で購入するほうが圧倒的に安いです(゜_゜)

スイッチサイエンスからでもリーズナブルに手に入れることができます(一人1個まで)

Broadlink RM mini3

今回はこれを使用しますが、Broadlink社のモノであればほとんど使用できるはずです。以下ページのgendevice()という関数に存在している製品であればOKです。

初期セットアップ用アプリ

(python-broadlinkからでも設定可能なようです。すでにこちらで進めてしまったので後日追記します)

RM mini3自体を自宅のWi-Fiに接続するためには純正アプリが必要となります。AndroidのAPKファイルであれば本家サイトから取得できるようです。野良APKも落ちていますが。。。

Download APK for Androidから取得できます。

アプリを起動して、ユーザー登録(必須。。)を済ませるとデバイスを追加することができるようになるので実行。手順に従ってRM mini3の起動 > アクセスポイントの認証情報の入力 > 接続と進めていく。

数回試してみていずれも失敗した(RM mini3が見つからない)が、接続済みデバイス一覧を見てみるとちゃんと登録されていました。もちろんルータ側の管理画面からも存在しているので使える状態になっている様子です。

どのタイミングで成功したのか不明ですが、おそらく接続に成功した時点で本体のLEDの激しい点滅が停止して緩やかに点滅するようになる用です。(要詳細確認)

若干心残りはありますがとりあえずこれで進めていきます。再起動のたびにIPアドレスが変わっても困るので、ルーター側の設定からDHCPで割り当てるアドレスを固定しておきます。同時に割り当てられたアドレスとMACアドレスも確認できるはずなのでメモしておきます。MACアドレスに関してはRM mini3本体底面にもシールで貼ってあるはずです。

python-broadlinkの導入

python-broadlinkをRaspberry Pi上に導入してコマンドラインからRM mini3を操作できるようにします。あとあとREST APIサーバーをNode.js + Expressで作るため言語を合わせたかったのですが、いい感じのパッケージを見つけることができずとりあえずpython-broadlinkを使用します。

gitリポジトリから取得します。gitがRaspberry Piに導入されていない場合はsudo apt-get install gitでインストールします。基本的な使い方は別記事でも紹介しています。

ユーザーのホーム直下での作業を想定しています。依存パッケージのインストールと既に接続しているRM mini3の検知まで行います。

$ git clone https://github.com/mjg59/python-broadlink.git
$ cd python-broadlink
$ sudo python setup.py install
...
$ cd cli
$ ./broadlink_discovery
Discovering...
###########################################
Unknown
# broadlink_cli --type 0x27c2 --host 192.168.11.xx --mac xxxxxxxxxxxx
Device file data (to be used with --device @filename in broadlink_cli) :
0x27c2 192.168.11.xx xxxxxxxxxxxx

無事にRM mini3が接続できていれば上のような感じでデバイスのIPアドレスとMACアドレスが表示されているはずです!

赤外線の受信 ~ 送信まで

(特にプログラミングを覚えたいとか仕組みがどうなっているかが気になるのでなければ、次の章のbroadlink_cliを使って送信などを実行まで飛ばしてもらって大丈夫です)

準備は整ったのでリモコンの信号を受信してそれを送信するコードを実行します。テスト的にコマンドライン上で対話的に進めていきます。対話モードでは一行ずコマンドを実行しながらあれこれできます。pythonコマンドで対話モードに入ります。>>>と表示されている間は対話モードになります。抜けるにはexit()と入力するかCtrl + Dを押します。

$ cd ~/python_broadlink
$ python
>>> import broadlink                            # モジュールのインポート
>>> devices = broadlink.discover(timeout=5)     # 変数にRM mini3の情報を格納
>>> print(devices)                      # 取得できているか確認
[<broadlink.rm instance at xxxxxxxx>]   # こんな感じであればOK
>>> devices[0].auth()                   # 認証が必要(らしい)
>>> devices[0].enter_learning()         # 記録モードにする
(ここでリモコンをRM mini3に向けて押してみる)
>>> ir_packet = devices[0].check_data() # 受信したデータを変数に格納
>>> print(ir_packet)                    # 内容の確認
             ))(() # なんかバイナリ?
>>> devices[0].send_data(ir_packet)     # 記録した内容で送信する

対話的にコードを実行していけるのが普段のコーディングではなかなか味わえなくて新鮮で楽しいですね!

途中で確認用のコードを挟んだりしていますがdevices[0].check_data()で取得できる値をdevices[0].send_data()の引数にわたしてあげると送信できます。複数台のRM mini3などが検知できる場合はdevices[]のインデックスを変えることによって動作させることができるはずです。

これでコマンドライン上からRM mini3での学習と送信ができました。この方法でスクリプトを書いていってもいいかもしれませんがより便利なbroadlink_cliというスクリプトが用意されています。

broadlink_cliを使って送信などを実行

このスクリプトを使用するとより簡単に、ワンラインで信号の記録や送信を行うことができます。まずはヘルプを見てみましょう。

$ cd ~/python_broadlink/cli
$ ./broadlink_cli -h
usage: broadlink_cli [-h] [--device DEVICE] [--type TYPE] [--host HOST]
                     [--mac MAC] [--temperature] [--energy] [--check]
                     [--checknl] [--turnon] [--turnoff] [--turnnlon]
                     [--turnnloff] [--switch] [--send] [--sensors] [--learn]
                     [--learnfile LEARNFILE] [--durations] [--convert]
                     [data [data ...]]

positional arguments:
  data                  Data to send or convert

optional arguments: (一部省略)
  -h, --help            show this help message and exit
  --device DEVICE       device definition as 'type host mac'
  --turnon              turn on device
  --turnoff             turn off device
  --send                send command
  --learn               learn command
  --learnfile LEARNFILE
                        learn command and save to specified file

コマンドラインのオプションでデバイスと信号を記録したファイルを指定して送信することができます。

デバイスを指定

まずデバイスの指定ですが、ちょっと前に実行したbroadlink_discoveryで表示される一番最後の行の値を使用します。

$ ./broadlink_discovery
Discovering...
###########################################
Unknown
# broadlink_cli --type 0x27c2 --host 192.168.11.xx --mac xxxxxxxxxxxx
Device file data (to be used with --device @filename in broadlink_cli) :
0x27c2 192.168.11.xx xxxxxxxxxxxx

0x27c2 192.168.11.xx xxxxxxxxxxxxの部分です。前から製品コードIPアドレスMACアドレスとなっています。これをbroadlink_cliと同じ場所にファイルとして保存します。vimなどで保存してもいいですがechoコマンドなどを使用してこちらもワンラインで行うことができます。

$ echo '0x27c2 192.168.11.xx xxxxxxxxxxxx' > device
$ ls -la
drwxr-xr-x 2 hoge hoge 4096 Mar  9 18:00 .
drwxr-xr-x 5 hoge hoge 4096 Mar  9 00:23 ..
-rwxr-xr-x 1 hoge hoge 5830 Mar  9 00:21 broadlink_cli
-rwxr-xr-x 1 hoge hoge 1055 Mar  9 00:21 broadlink_discovery
-rw-r--r-- 1 hoge hoge   34 Mar  9 18:00 device
-rw-r--r-- 1 hoge hoge 1716 Mar  9 00:21 README.md
$ cat device
0x27c2 192.168.11.xx xxxxxxxxxxxx

catなどでしっかり保存できているか確認します。ここで保存したファイルを./broadlink_cli --device @[ファイル名]で指定することで使用できます。ファイル名の前には@をつける必要があります。

信号をファイルに記録する

次に受信した信号を同じようにファイルに記録して使いまわすことができるようにします。--learnfile [ファイル名]オプションで受信した信号を指定したファイル名で保存することができます。--learnオプションでは標準出力(コンソール上)にそのまま信号を文字列を吐きます。

今回はシーリングライトをONにする信号を保存するのでlight_onという感じのファイル名にします。機器名_動作機器名.動作という感じにしておくと判別しやすいかと思います。

$ ./broadlink_cli --device @device --learnfile light_on
Learning... (ここでリモコンを押す)
Saving to light_on
$ cat light_on
26000201...

ファイルに出力されていることを確認してください。--deviceと同じくこのファイルは--send @[ファイル名]で指定すると送信できます。

信号をファイルから送信する

最後に今保存した信号を送信してみます。

$ ./broadlink_cli --device @device --send @light_on
(電気がつく)

標準出力は特にないのでコンソールには何も表示されないです。これで一連の保存~送信までの処理が完了しました!

信号ファイルはどんどん増えていくと思うのでcli内にディレクトリを一つ作成して管理したほうが運用しやすいかもしれません。

$ mkdir sig
$ mv light_on sig/
$ ./broadlink_cli --device @device --send @sig/light_on
(電気がつく)

最後に

これでRaspberry Pi上でRM mini3を制御できるようになりました!次はREST APIサーバーを作成してHTTPリクエストのみでコマンドを実行できるようにします。より簡単に言えばhttp://raspi.taneyats.com/light_onにブラウザからアクセスすれば家のライトがつくようにしようと思います。

次の記事

参考

https://qiita.com/canadie/items/3110a0f0ff4f4749e039

http://poohkids.com/raspberrypi/raspi_pipinstall/

https://qiita.com/Tadahiro_Yamamura/items/2cbcd272a96bb3761cc8

https://qiita.com/spiderx_jp/items/8f04019c83fabdc336d4